From 4649feed0445e164348b01168ec28ec2c912afd1 Mon Sep 17 00:00:00 2001 From: Juan Manuel Leflet Estrada Date: Wed, 10 Sep 2025 16:10:10 +0200 Subject: [PATCH 1/6] Do special search for on-demand imports Signed-off-by: Juan Manuel Leflet Estrada --- .../SampleDelegateCommandHandler.java | 90 ++++++++++++++++++- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java index 36fa210..c58ed78 100644 --- a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java +++ b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.core.runtime.IPath; @@ -14,6 +15,10 @@ import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.dom.AST; +import org.eclipse.jdt.core.dom.ASTParser; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.ImportDeclaration; import org.eclipse.jdt.core.search.IJavaSearchConstants; import org.eclipse.jdt.core.search.IJavaSearchScope; import org.eclipse.jdt.core.search.SearchEngine; @@ -21,13 +26,20 @@ import org.eclipse.jdt.core.search.SearchPattern; import org.eclipse.jdt.internal.core.search.JavaSearchParticipant; import org.eclipse.jdt.ls.core.internal.IDelegateCommandHandler; +import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.JobHelpers; import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.ResourceUtils; +import org.eclipse.lsp4j.Location; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.SymbolInformation; +import org.eclipse.lsp4j.SymbolKind; import io.konveyor.tackle.core.internal.query.AnnotationQuery; +import io.konveyor.tackle.core.internal.symbol.DefaultSymbolProvider; +import io.konveyor.tackle.core.internal.symbol.ImportSymbolProvider; import io.konveyor.tackle.core.internal.util.OpenSourceFilteredSearchScope; import io.konveyor.tackle.core.internal.util.OpenSourceLibraryExclusionManager; @@ -150,6 +162,8 @@ private static SearchPattern mapLocationToSearchPatternLocation(int location, St * @param query * @return * @throws Exception + * + * TODO: move these to enums */ private static SearchPattern getPatternSingleQuery(int location, String query) throws Exception { var pattern = SearchPattern.R_PATTERN_MATCH; @@ -228,6 +242,8 @@ private static List search(String projectName, ArrayList(); } + List units = new ArrayList<>(); + if (includedPaths != null && includedPaths.size() > 0) { ArrayList includedFragments = new ArrayList(); for (IJavaProject proj : targetProjects) { @@ -295,6 +311,11 @@ private static List search(String projectName, ArrayList search(String projectName, ArrayList search(String projectName, ArrayList symbols = new ArrayList(); + SearchPattern pattern; try { pattern = mapLocationToSearchPatternLocation(location, query); @@ -325,8 +359,6 @@ private static List search(String projectName, ArrayList symbols = new ArrayList(); - SymbolInformationTypeRequestor requestor = new SymbolInformationTypeRequestor(symbols, 0, monitor, location, query, annotationQuery); //Use the default search participents @@ -340,12 +372,64 @@ private static List search(String projectName, ArrayList Date: Wed, 10 Sep 2025 18:47:41 +0200 Subject: [PATCH 2/6] Calculate compilation units only if there is a * import search Signed-off-by: Juan Manuel Leflet Estrada --- .../SampleDelegateCommandHandler.java | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java index c58ed78..fd31dc4 100644 --- a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java +++ b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java @@ -162,7 +162,7 @@ private static SearchPattern mapLocationToSearchPatternLocation(int location, St * @param query * @return * @throws Exception - * + * * TODO: move these to enums */ private static SearchPattern getPatternSingleQuery(int location, String query) throws Exception { @@ -325,17 +325,6 @@ private static List search(String projectName, ArrayList search(String projectName, ArrayList search(String projectName, ArrayList search(String projectName, ArrayList Date: Wed, 10 Sep 2025 20:51:21 +0200 Subject: [PATCH 3/6] Improvements Signed-off-by: Juan Manuel Leflet Estrada --- .../tackle/core/internal/SampleDelegateCommandHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java index fd31dc4..94ee3f9 100644 --- a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java +++ b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java @@ -383,13 +383,14 @@ private static List search(String projectName, ArrayList Date: Tue, 23 Sep 2025 10:38:28 +0200 Subject: [PATCH 4/6] Fix and simplify getLocationForImport Signed-off-by: Juan Manuel Leflet Estrada --- .../internal/SampleDelegateCommandHandler.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java index 94ee3f9..b344b2e 100644 --- a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java +++ b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java @@ -415,14 +415,10 @@ private static List search(String projectName, ArrayList Date: Tue, 23 Sep 2025 10:42:10 +0200 Subject: [PATCH 5/6] Add missing import Signed-off-by: Juan Manuel Leflet Estrada --- .../SampleDelegateCommandHandler.java | 138 +++++++++--------- 1 file changed, 67 insertions(+), 71 deletions(-) diff --git a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java index b344b2e..81c2f23 100644 --- a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java +++ b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java @@ -28,18 +28,15 @@ import org.eclipse.jdt.ls.core.internal.IDelegateCommandHandler; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; +import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.JobHelpers; import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.ResourceUtils; import org.eclipse.lsp4j.Location; -import org.eclipse.lsp4j.Position; -import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.SymbolKind; import io.konveyor.tackle.core.internal.query.AnnotationQuery; -import io.konveyor.tackle.core.internal.symbol.DefaultSymbolProvider; -import io.konveyor.tackle.core.internal.symbol.ImportSymbolProvider; import io.konveyor.tackle.core.internal.util.OpenSourceFilteredSearchScope; import io.konveyor.tackle.core.internal.util.OpenSourceLibraryExclusionManager; @@ -89,11 +86,11 @@ private static SearchPattern mapLocationToSearchPatternLocation(int location, St var startListIndex = query.indexOf("("); var endListIndex = query.indexOf(")"); var startQuery = query.substring(0, startListIndex); - var endQuery = query.substring(endListIndex+1, query.length()); + var endQuery = query.substring(endListIndex + 1, query.length()); var optionalList = endQuery.startsWith("?"); // This should strip the ( ) chars - var listString = query.substring(startListIndex+1, endListIndex); + var listString = query.substring(startListIndex + 1, endListIndex); var list = listString.split("\\|"); ArrayList l = new ArrayList(); @@ -103,11 +100,11 @@ private static SearchPattern mapLocationToSearchPatternLocation(int location, St l.add(mapLocationToSearchPatternLocation(location, startQuery + endQuery)); } - for (String s: list) { + for (String s : list) { var p = mapLocationToSearchPatternLocation(location, startQuery + s + endQuery); l.add(p); } - + // Get the end pattern SearchPattern p = l.subList(1, l.size()).stream().reduce(l.get(0), (SearchPattern::createOrPattern)); return p; @@ -142,28 +139,26 @@ private static SearchPattern mapLocationToSearchPatternLocation(int location, St /** * Location correspondence from java provider (TYPE is the default): - * "": 0, - * "inheritance": 1, - * "method_call": 2, - * "constructor_call": 3, - * "annotation": 4, - * "implements_type": 5, - * "enum_constant": 6, - * "return_type": 7, - * "import": 8, - * "variable_declaration": 9, - * "type": 10, - * "package": 11, - * "field": 12, - * "method_declaration": 13, - * "class_declaration": 14, + * "": 0, + * "inheritance": 1, + * "method_call": 2, + * "constructor_call": 3, + * "annotation": 4, + * "implements_type": 5, + * "enum_constant": 6, + * "return_type": 7, + * "import": 8, + * "variable_declaration": 9, + * "type": 10, + * "package": 11, + * "field": 12, + * "method_declaration": 13, + * "class_declaration": 14, * * @param location * @param query * @return - * @throws Exception - * - * TODO: move these to enums + * @throws Exception TODO: move these to enums */ private static SearchPattern getPatternSingleQuery(int location, String query) throws Exception { var pattern = SearchPattern.R_PATTERN_MATCH; @@ -172,52 +167,52 @@ private static SearchPattern getPatternSingleQuery(int location, String query) t pattern = SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE; } switch (location) { - // Using type for both type and annotation. - // Type and annotation - case 10: - case 4: - case 8: - return SearchPattern.createPattern(query, IJavaSearchConstants.TYPE, IJavaSearchConstants.ALL_OCCURRENCES, pattern); - case 5: - case 1: - return SearchPattern.createPattern(query, IJavaSearchConstants.TYPE, IJavaSearchConstants.IMPLEMENTORS, pattern); - case 7: - case 9: - return SearchPattern.createPattern(query, IJavaSearchConstants.TYPE, IJavaSearchConstants.REFERENCES, pattern); - case 2: - if (query.contains(".")) { - return SearchPattern.createPattern(query, IJavaSearchConstants.METHOD, IJavaSearchConstants.QUALIFIED_REFERENCE, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_ERASURE_MATCH); - } - // Switched back to referenced - return SearchPattern.createPattern(query, IJavaSearchConstants.METHOD, IJavaSearchConstants.REFERENCES, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_ERASURE_MATCH); - case 3: - return SearchPattern.createPattern(query, IJavaSearchConstants.CONSTRUCTOR, IJavaSearchConstants.ALL_OCCURRENCES, pattern); - case 11: - return SearchPattern.createPattern(query, IJavaSearchConstants.PACKAGE, IJavaSearchConstants.ALL_OCCURRENCES, pattern); - case 12: - return SearchPattern.createPattern(query, IJavaSearchConstants.TYPE, IJavaSearchConstants.FIELD_DECLARATION_TYPE_REFERENCE, pattern); - case 13: - return SearchPattern.createPattern(query, IJavaSearchConstants.METHOD, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH | SearchPattern.R_PATTERN_MATCH); - case 14: - return SearchPattern.createPattern(query, IJavaSearchConstants.CLASS, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH | SearchPattern.R_PATTERN_MATCH); + // Using type for both type and annotation. + // Type and annotation + case 10: + case 4: + case 8: + return SearchPattern.createPattern(query, IJavaSearchConstants.TYPE, IJavaSearchConstants.ALL_OCCURRENCES, pattern); + case 5: + case 1: + return SearchPattern.createPattern(query, IJavaSearchConstants.TYPE, IJavaSearchConstants.IMPLEMENTORS, pattern); + case 7: + case 9: + return SearchPattern.createPattern(query, IJavaSearchConstants.TYPE, IJavaSearchConstants.REFERENCES, pattern); + case 2: + if (query.contains(".")) { + return SearchPattern.createPattern(query, IJavaSearchConstants.METHOD, IJavaSearchConstants.QUALIFIED_REFERENCE, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_ERASURE_MATCH); + } + // Switched back to referenced + return SearchPattern.createPattern(query, IJavaSearchConstants.METHOD, IJavaSearchConstants.REFERENCES, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_ERASURE_MATCH); + case 3: + return SearchPattern.createPattern(query, IJavaSearchConstants.CONSTRUCTOR, IJavaSearchConstants.ALL_OCCURRENCES, pattern); + case 11: + return SearchPattern.createPattern(query, IJavaSearchConstants.PACKAGE, IJavaSearchConstants.ALL_OCCURRENCES, pattern); + case 12: + return SearchPattern.createPattern(query, IJavaSearchConstants.TYPE, IJavaSearchConstants.FIELD_DECLARATION_TYPE_REFERENCE, pattern); + case 13: + return SearchPattern.createPattern(query, IJavaSearchConstants.METHOD, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH | SearchPattern.R_PATTERN_MATCH); + case 14: + return SearchPattern.createPattern(query, IJavaSearchConstants.CLASS, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH | SearchPattern.R_PATTERN_MATCH); } - throw new Exception("unable to create search pattern"); + throw new Exception("unable to create search pattern"); } private static List search(String projectName, ArrayList includedPaths, String query, AnnotationQuery annotationQuery, int location, String analysisMode, - boolean includeOpenSourceLibraries, String mavenLocalRepoPath, String mavenIndexPath, IProgressMonitor monitor) throws Exception { + boolean includeOpenSourceLibraries, String mavenLocalRepoPath, String mavenIndexPath, IProgressMonitor monitor) throws Exception { IJavaProject[] targetProjects; IJavaProject project = ProjectUtils.getJavaProject(projectName); if (project != null) { - targetProjects = new IJavaProject[] { project }; - } else { - targetProjects= ProjectUtils.getJavaProjects(); - } - + targetProjects = new IJavaProject[]{project}; + } else { + targetProjects = ProjectUtils.getJavaProjects(); + } + logInfo("Searching in target project: " + targetProjects); // For Partial results, we are going to filter out based on a list in the engine - int s = IJavaSearchScope.SOURCES | IJavaSearchScope.REFERENCED_PROJECTS | IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SYSTEM_LIBRARIES; + int s = IJavaSearchScope.SOURCES | IJavaSearchScope.REFERENCED_PROJECTS | IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SYSTEM_LIBRARIES; if (analysisMode.equals(sourceOnlyAnalysisMode)) { logInfo("KONVEYOR_LOG: source-only analysis mode only scoping to Sources"); s = IJavaSearchScope.SOURCES; @@ -231,11 +226,11 @@ private static List search(String projectName, ArrayList search(String projectName, ArrayList search(String projectName, ArrayList Date: Thu, 9 Oct 2025 17:24:16 +0200 Subject: [PATCH 6/6] Do not addAll and add explanatory comment Signed-off-by: Juan Manuel Leflet Estrada --- .../tackle/core/internal/SampleDelegateCommandHandler.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java index a806895..fb92d49 100644 --- a/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java +++ b/java-analyzer-bundle.core/src/main/java/io/konveyor/tackle/core/internal/SampleDelegateCommandHandler.java @@ -356,13 +356,11 @@ private static List search(String projectName, ArrayListimport javax.ejb.*;) we need to + // do a special search, since on-demand imports are only resolved at compilation time if (location == 8) { Matcher matcher = Pattern.compile("[^A-Z*]+\\*").matcher(query); if (matcher.matches()) { - // IMPORT location and package wildcard - // Get all compilation units in scope for (IJavaProject p : targetProjects) { for (IPackageFragment pkg : p.getPackageFragments()) {