From cf4edc16a181aa9925de304be4a9f1b54d218929 Mon Sep 17 00:00:00 2001 From: aboyko Date: Tue, 17 Dec 2024 10:19:22 -0500 Subject: [PATCH] Fix bean completion invocation case --- .../java/beans/BeanCompletionProvider.java | 2 +- .../data/jpa/queries/JpqlSemanticTokens.java | 2 +- .../data/jpa/queries/MySqlSemanticTokens.java | 2 +- .../handlers/BootJavaCompletionEngine.java | 4 +- .../test/BeanCompletionProviderTest.java | 41 +++++++++++++++++++ 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java index d399979e4..cdd440805 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java @@ -66,7 +66,7 @@ public class BeanCompletionProvider implements CompletionProvider { @Override public void provideCompletions(ASTNode node, int offset, TextDocument doc, Collection completions) { if (config.isBeanInjectionCompletionEnabled() - && (node instanceof SimpleName || node instanceof Block || node instanceof FieldAccess)) { + && (node instanceof SimpleName || node instanceof Block || node instanceof FieldAccess || node instanceof ThisExpression)) { try { if (node instanceof SimpleName) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/JpqlSemanticTokens.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/JpqlSemanticTokens.java index 7dcafc47d..f361a8d8e 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/JpqlSemanticTokens.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/JpqlSemanticTokens.java @@ -50,7 +50,7 @@ import org.springframework.ide.vscode.parser.jpql.JpqlParser.State_fieldContext; public class JpqlSemanticTokens implements SemanticTokensDataProvider { private static List TOKEN_TYPES = List.of("keyword", "type", "class", "string", "number", "operator", - "variable", "method", "regexp", "parameter"); + "variable", "method", "parameter"); private final Optional optSpelTokens; diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/MySqlSemanticTokens.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/MySqlSemanticTokens.java index 3dbff6849..c9495795f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/MySqlSemanticTokens.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/MySqlSemanticTokens.java @@ -46,7 +46,7 @@ import org.springframework.ide.vscode.parser.mysql.MySqlParserBaseListener; public class MySqlSemanticTokens implements SemanticTokensDataProvider { private static List TOKEN_TYPES = List.of("keyword", "type", "string", "number", "operator", - "variable", "regexp", "comment", "parameter", "method"); + "variable", "comment", "parameter", "method"); private final Optional optSpelTokens; private final Optional> parseErrorHandler; diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCompletionEngine.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCompletionEngine.java index 48571ab20..6baef3d3c 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCompletionEngine.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCompletionEngine.java @@ -21,6 +21,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.NodeFinder; import org.eclipse.jdt.core.dom.SimpleName; +import org.eclipse.jdt.core.dom.ThisExpression; import org.springframework.ide.vscode.boot.java.snippets.JavaSnippetManager; import org.springframework.ide.vscode.boot.java.utils.CompilationUnitCache; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine; @@ -90,7 +91,8 @@ public class BootJavaCompletionEngine implements ICompletionEngine, LanguageSpec if (numberOfSpaces > 0) { ASTNode leftNode = NodeFinder.perform(cu, offset - numberOfSpaces, 0); - if (leftNode instanceof SimpleName && $MISSING$.equals(((SimpleName)leftNode).getIdentifier())) { + if ((leftNode instanceof SimpleName && $MISSING$.equals(((SimpleName)leftNode).getIdentifier())) + || leftNode instanceof ThisExpression) { node = leftNode; } } diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/BeanCompletionProviderTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/BeanCompletionProviderTest.java index 6b0c152fe..3a26a26c5 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/BeanCompletionProviderTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/BeanCompletionProviderTest.java @@ -1069,6 +1069,47 @@ public class TestBeanCompletionClass { """); } + @Test + public void methodReturnStatementAfterThisStatementWithoutPrefix() throws Exception { + String content = """ + package org.sample.test; + + import org.springframework.web.bind.annotation.RestController; + + @RestController + public class TestBeanCompletionClass { + String TestBeanCompletionClass() { + this.<*> + return new String("oo"); + } + } + """; + + + assertCompletions(content, new String[] {"ownerRepository", "ownerService", "petService", "testIntBean", "visitRepository", "visitService"}, 0, + """ + package org.sample.test; + + import org.springframework.samples.petclinic.owner.OwnerRepository; + import org.springframework.web.bind.annotation.RestController; + + @RestController + public class TestBeanCompletionClass { + + private final OwnerRepository ownerRepository; + + TestBeanCompletionClass(OwnerRepository ownerRepository) { + this.ownerRepository = ownerRepository; + } + String TestBeanCompletionClass() { + this.ownerRepository<*> + return new String("oo"); + } + } + """); + } + + @Test public void constructorNoThisNoPrefix() throws Exception { String content = """