Skip to content

Commit 2694037

Browse files
authored
Replace OR query annotation addition with JDT (#1866)
* WIP Signed-off-by: BoykoAlex <alex.boyko@broadcom.com> * Fix up Signed-off-by: BoykoAlex <alex.boyko@broadcom.com> * Polish and tests Signed-off-by: BoykoAlex <alex.boyko@broadcom.com> * Remove Rewrite recipe Signed-off-by: BoykoAlex <alex.boyko@broadcom.com> * Cleanup Signed-off-by: BoykoAlex <alex.boyko@broadcom.com> * Cleanup Signed-off-by: BoykoAlex <alex.boyko@broadcom.com> * Fix tests Signed-off-by: BoykoAlex <alex.boyko@broadcom.com> --------- Signed-off-by: BoykoAlex <alex.boyko@broadcom.com>
1 parent cfb892c commit 2694037

16 files changed

Lines changed: 1713 additions & 322 deletions

File tree

headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/AddAnnotationOverMethod.java

Lines changed: 0 additions & 146 deletions
This file was deleted.

headless-services/commons/commons-rewrite/src/test/java/org/springframework/ide/vscode/commons/rewrite/java/AddAnnotationOverMethodTest.java

Lines changed: 0 additions & 71 deletions
This file was deleted.

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/RewriteConfig.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.springframework.context.annotation.Configuration;
1616
import org.springframework.ide.vscode.boot.java.data.DataRepositoryAotMetadataService;
1717
import org.springframework.ide.vscode.boot.java.data.QueryMethodCodeActionProvider;
18+
import org.springframework.ide.vscode.boot.java.jdt.refactoring.JdtRefactorings;
1819
import org.springframework.ide.vscode.boot.java.reconcilers.JdtReconciler;
1920
import org.springframework.ide.vscode.boot.java.reconcilers.ReconcileProblemCodeActionProvider;
2021
import org.springframework.ide.vscode.boot.java.rewrite.RewriteRecipeRepository;
@@ -45,9 +46,9 @@ public class RewriteConfig {
4546
return new SpringBootUpgrade(server, recipeRepo, projectFinder);
4647
}
4748

48-
@ConditionalOnBean(RewriteRefactorings.class)
49-
@Bean QueryMethodCodeActionProvider queryMethodCodeActionProvider(DataRepositoryAotMetadataService dataRepoAotService, RewriteRefactorings refactorings, BootJavaConfig config) {
50-
return new QueryMethodCodeActionProvider(dataRepoAotService, refactorings, config);
49+
@ConditionalOnBean(JdtRefactorings.class)
50+
@Bean QueryMethodCodeActionProvider queryMethodCodeActionProvider(DataRepositoryAotMetadataService dataRepoAotService, JdtRefactorings jdtRefactorings, BootJavaConfig config) {
51+
return new QueryMethodCodeActionProvider(dataRepoAotService, jdtRefactorings, config);
5152
}
5253

5354
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
import org.springframework.ide.vscode.boot.java.requestmapping.WebConfigCodeLensProvider;
6565
import org.springframework.ide.vscode.boot.java.requestmapping.WebfluxHandlerCodeLensProvider;
6666
import org.springframework.ide.vscode.boot.java.requestmapping.WebfluxRouteHighlightProdivder;
67-
import org.springframework.ide.vscode.boot.java.rewrite.RewriteRefactorings;
67+
import org.springframework.ide.vscode.boot.java.jdt.refactoring.JdtRefactorings;
6868
import org.springframework.ide.vscode.boot.java.spel.SpelSemanticTokens;
6969
import org.springframework.ide.vscode.boot.java.utils.CompilationUnitCache;
7070
import org.springframework.ide.vscode.boot.java.value.ValueHoverProvider;
@@ -185,7 +185,7 @@ public BootJavaLanguageServerComponents(ApplicationContext appContext) {
185185
spelSemanticTokens = appContext.getBean(SpelSemanticTokens.class);
186186
dataRepositoryAotMetadataService = appContext.getBean(DataRepositoryAotMetadataService.class);
187187
codeLensHandler = createCodeLensEngine(springIndex, projectFinder, server, spelSemanticTokens, dataRepositoryAotMetadataService,
188-
appContext.getBean(RewriteRefactorings.class), config);
188+
appContext.getBean(JdtRefactorings.class), config);
189189

190190
highlightsEngine = createDocumentHighlightEngine(appContext);
191191
documents.onDocumentHighlight(highlightsEngine);
@@ -320,14 +320,14 @@ protected ReferencesHandler createReferenceHandler(SimpleLanguageServer server,
320320
}
321321

322322
protected BootJavaCodeLensEngine createCodeLensEngine(SpringMetamodelIndex springIndex, JavaProjectFinder projectFinder, SimpleLanguageServer server,
323-
SpelSemanticTokens spelSemanticTokens, DataRepositoryAotMetadataService repositoryAotMetadataService, RewriteRefactorings refactorings,
323+
SpelSemanticTokens spelSemanticTokens, DataRepositoryAotMetadataService repositoryAotMetadataService, JdtRefactorings jdtRefactorings,
324324
BootJavaConfig config) {
325325

326326
Collection<CodeLensProvider> codeLensProvider = new ArrayList<>();
327327
codeLensProvider.add(new WebfluxHandlerCodeLensProvider(springIndex));
328328
codeLensProvider.add(new CopilotCodeLensProvider(projectFinder, server, spelSemanticTokens));
329329
codeLensProvider.add(new RouterFunctionCodeLensProvider());
330-
codeLensProvider.add(new DataRepositoryAotMetadataCodeLensProvider(server, projectFinder, repositoryAotMetadataService, refactorings, config));
330+
codeLensProvider.add(new DataRepositoryAotMetadataCodeLensProvider(server, projectFinder, repositoryAotMetadataService, jdtRefactorings, config));
331331
codeLensProvider.add(new WebConfigCodeLensProvider(projectFinder, springIndex, config));
332332

333333
return new BootJavaCodeLensEngine(this, codeLensProvider);

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataCodeLensProvider.java

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@
3737
import org.springframework.ide.vscode.boot.java.handlers.CodeLensProvider;
3838
import org.springframework.ide.vscode.parser.hql.HqlQueryFormatter;
3939
import org.springframework.ide.vscode.parser.postgresql.PostgreSqlQueryFormatter;
40-
import org.springframework.ide.vscode.boot.java.rewrite.RewriteRefactorings;
40+
import org.springframework.ide.vscode.boot.java.jdt.refactoring.AddAnnotationRefactoring;
41+
import org.springframework.ide.vscode.boot.java.jdt.refactoring.JdtFixDescriptor;
42+
import org.springframework.ide.vscode.boot.java.jdt.refactoring.JdtRefactorUtils;
43+
import org.springframework.ide.vscode.boot.java.jdt.refactoring.JdtRefactorings;
4144
import org.springframework.ide.vscode.boot.java.utils.ASTUtils;
4245
import org.springframework.ide.vscode.commons.java.IJavaProject;
4346
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
4447
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
45-
import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope;
46-
import org.springframework.ide.vscode.commons.rewrite.java.AddAnnotationOverMethod;
47-
import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor;
4848
import org.springframework.ide.vscode.commons.util.BadLocationException;
4949
import org.springframework.ide.vscode.commons.util.text.TextDocument;
5050

@@ -65,11 +65,11 @@ public class DataRepositoryAotMetadataCodeLensProvider implements CodeLensProvid
6565

6666
private final DataRepositoryAotMetadataService repositoryMetadataService;
6767
private final JavaProjectFinder projectFinder;
68-
private final RewriteRefactorings refactorings;
68+
private final JdtRefactorings refactorings;
6969
private final BootJavaConfig config;
7070

7171
public DataRepositoryAotMetadataCodeLensProvider(SimpleLanguageServer server, JavaProjectFinder projectFinder, DataRepositoryAotMetadataService repositoryMetadataService,
72-
RewriteRefactorings refactorings, BootJavaConfig config) {
72+
JdtRefactorings refactorings, BootJavaConfig config) {
7373
this.projectFinder = projectFinder;
7474
this.repositoryMetadataService = repositoryMetadataService;
7575
this.refactorings = refactorings;
@@ -159,7 +159,7 @@ private List<CodeLens> createCodeLenses(IJavaProject project, MethodDeclaration
159159
|| hierarchyAnnot.isAnnotatedWith(mb, Annotations.DATA_JDBC_QUERY);
160160

161161
if (!isQueryAnnotated) {
162-
codeLenses.add(new CodeLens(range, refactorings.createFixCommand(COVERT_TO_QUERY_LABEL, createFixDescriptor(mb, document.getUri(), metadata.module(), methodMetadata, config)), null));
162+
codeLenses.add(new CodeLens(range, refactorings.createFixCommand(COVERT_TO_QUERY_LABEL, createJdtFixDescriptor(mb, document.getUri(), metadata.module(), methodMetadata, config)), null));
163163
}
164164

165165
Command impl = new Command("Go To Implementation", GenAotQueryMethodImplProvider.CMD_NAVIGATE_TO_IMPL, List.of(new GenAotQueryMethodImplProvider.GoToImplParams(
@@ -200,20 +200,23 @@ private Optional<CodeLens> createRefreshCodeLens(IJavaProject project, String ti
200200
});
201201
}
202202

203-
static FixDescriptor createFixDescriptor(IMethodBinding mb, String docUri, DataRepositoryModule module, IDataRepositoryAotMethodMetadata methodMetadata, BootJavaConfig config) {
204-
return new FixDescriptor(AddAnnotationOverMethod.class.getName(), List.of(docUri), "Turn into `@Query`")
205-
.withRecipeScope(RecipeScope.FILE)
206-
.withParameters(Map.of(
207-
"annotationType", moduleToQueryMapping.get(module),
208-
"method", "%s %s(%s)".formatted(mb.getDeclaringClass().getQualifiedName(), mb.getName(),
209-
Arrays.stream(mb.getParameterTypes())
210-
.map(pt -> pt.getName())
211-
.collect(Collectors.joining(","))),
212-
"attributes", createAttributeList(methodMetadata.getAttributesMap(), module, config)));
203+
static JdtFixDescriptor createJdtFixDescriptor(IMethodBinding mb, String docUri, DataRepositoryModule module, IDataRepositoryAotMethodMetadata methodMetadata, BootJavaConfig config) {
204+
List<String> paramTypeNames = Arrays.stream(mb.getParameterTypes())
205+
.map(pt -> pt.getName())
206+
.collect(Collectors.toList());
207+
208+
AddAnnotationRefactoring refactoring = new AddAnnotationRefactoring(
209+
moduleToQueryMapping.get(module),
210+
mb.getDeclaringClass().getQualifiedName(),
211+
mb.getName(),
212+
paramTypeNames,
213+
createAttributeList(methodMetadata.getAttributesMap(), module, config));
214+
215+
return new JdtFixDescriptor(refactoring, List.of(docUri), "Turn into `@Query`");
213216
}
214217

215-
private static List<AddAnnotationOverMethod.Attribute> createAttributeList(Map<String, String> attributes, DataRepositoryModule module, BootJavaConfig config) {
216-
List<AddAnnotationOverMethod.Attribute> result = new ArrayList<>();
218+
private static List<AddAnnotationRefactoring.Attribute> createAttributeList(Map<String, String> attributes, DataRepositoryModule module, BootJavaConfig config) {
219+
List<AddAnnotationRefactoring.Attribute> result = new ArrayList<>();
217220
boolean isMultiline = config.isDataQueryMultiline();
218221

219222
for (Map.Entry<String, String> entry : attributes.entrySet()) {
@@ -232,14 +235,15 @@ private static List<AddAnnotationOverMethod.Attribute> createAttributeList(Map<S
232235
}
233236
}
234237
};
235-
value = "\"\"\"\n" + formattedValue + "\n\"\"\"";
238+
value = "\"\"\"\n" + JdtRefactorUtils.escapeForTextBlock(formattedValue) + "\n\"\"\"";
236239
} else {
237240
value = "\"" + StringEscapeUtils.escapeJava(value).trim() + "\"";
238241
}
239242

240-
result.add(new AddAnnotationOverMethod.Attribute(key, value));
243+
result.add(new AddAnnotationRefactoring.Attribute(key, value));
241244
}
242245
return result;
243246
}
247+
244248
}
245249

0 commit comments

Comments
 (0)