-
Notifications
You must be signed in to change notification settings - Fork 20
🐛 Do special search for on-demand imports #143
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
4649fee
34e06fe
4d2ae79
67a2fef
0c70a81
892d9e9
fb2f68d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -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,20 +15,31 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.eclipse.jdt.core.search.SearchParticipant; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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<SymbolInformation> search(String projectName, ArrayList<Stri | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| return new ArrayList<>(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| List<ICompilationUnit> units = new ArrayList<>(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (includedPaths != null && includedPaths.size() > 0) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ArrayList<IJavaElement> includedFragments = new ArrayList<IJavaElement>(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for (IJavaProject proj : targetProjects) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -295,6 +311,11 @@ private static List<SymbolInformation> search(String projectName, ArrayList<Stri | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (includedIPath.segmentCount() <= fragmentPath.segmentCount() && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| includedIPath.matchingFirstSegments(fragmentPath) == includedIPath.segmentCount()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| includedFragments.add(fragment); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Get all compilation units for included fragments | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (fragment.getKind() == IPackageFragmentRoot.K_SOURCE) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| units.addAll(List.of(fragment.getCompilationUnits())); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -313,6 +334,8 @@ private static List<SymbolInformation> search(String projectName, ArrayList<Stri | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| logInfo("scope: " + scope); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| List<SymbolInformation> symbols = new ArrayList<SymbolInformation>(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SearchPattern pattern; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pattern = mapLocationToSearchPatternLocation(location, query); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -325,8 +348,6 @@ private static List<SymbolInformation> search(String projectName, ArrayList<Stri | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SearchEngine searchEngine = new SearchEngine(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| List<SymbolInformation> symbols = new ArrayList<SymbolInformation>(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SymbolInformationTypeRequestor requestor = new SymbolInformationTypeRequestor(symbols, 0, monitor, location, query, annotationQuery); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| //Use the default search participents | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -340,12 +361,68 @@ private static List<SymbolInformation> search(String projectName, ArrayList<Stri | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| logInfo("KONVEYOR_LOG: unable to get search " + e.toString().replace("\n", " ")); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| symbols.addAll(requestor.getSymbols()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (location == 8) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Matcher matcher = Pattern.compile("[^A-Z*]+\\*").matcher(query); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (matcher.matches()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // IMPORT location and package wildcard | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
jmle marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Get all compilation units in scope | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for (IJavaProject p : targetProjects) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for (IPackageFragment pkg : p.getPackageFragments()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (pkg.getKind() == IPackageFragmentRoot.K_SOURCE) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for (ICompilationUnit unit : pkg.getCompilationUnits()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (scope.encloses(unit)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| units.add(unit); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+364
to
+375
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid redundant compilation unit collection. When Apply this fix to collect units only when not already gathered: - // Get all compilation units in scope
- for (IJavaProject p : targetProjects) {
- for (IPackageFragment pkg : p.getPackageFragments()) {
- if (pkg.getKind() == IPackageFragmentRoot.K_SOURCE) {
- for (ICompilationUnit unit : pkg.getCompilationUnits()) {
- if (scope.encloses(unit)) {
- units.add(unit);
- }
- }
- }
- }
- }
+ // Get all compilation units in scope (if not already collected via included paths)
+ if (units.isEmpty()) {
+ for (IJavaProject p : targetProjects) {
+ for (IPackageFragment pkg : p.getPackageFragments()) {
+ if (pkg.getKind() == IPackageFragmentRoot.K_SOURCE) {
+ for (ICompilationUnit unit : pkg.getCompilationUnits()) {
+ if (scope.encloses(unit)) {
+ units.add(unit);
+ }
+ }
+ }
+ }
+ }
+ }📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Now run ImportScanner only on units in scope | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ASTParser parser = ASTParser.newParser(AST.getJLSLatest()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Pattern regex = Pattern.compile(query); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for (ICompilationUnit unit : units) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| parser.setSource(unit); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CompilationUnit cu = (CompilationUnit) parser.createAST(null); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for (Object o : cu.imports()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ImportDeclaration imp = (ImportDeclaration) o; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (imp.isOnDemand()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (regex.matcher(imp.getName().getFullyQualifiedName()).matches()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SymbolInformation symbol = new SymbolInformation(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| symbol.setName(imp.getName().getFullyQualifiedName()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| symbol.setKind(SymbolKind.Namespace); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| symbol.setContainerName(unit.getElementName()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| symbol.setLocation(getLocationForImport(unit, imp, cu)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| System.out.println("Found in " + unit.getElementName()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove debug print statement. The - System.out.println("Found in " + unit.getElementName());
+ logInfo("Found on-demand import in " + unit.getElementName());📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| symbols.add(symbol); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| logInfo("KONVEYOR_LOG: got: " + requestor.getAllSearchMatches() + | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| " search matches for " + query + | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| " location " + location | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| + " matches" + requestor.getSymbols().size()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return requestor.getSymbols(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return symbols; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public static Location getLocationForImport(ICompilationUnit icu, ImportDeclaration imp, CompilationUnit cuAst) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| int start = imp.getStartPosition(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| int length = imp.getLength(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| int end = start + length; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| int startLine = cuAst.getLineNumber(start) - 1; // LSP is 0-based | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| int startCol = cuAst.getColumnNumber(start) - 1; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| int endLine = cuAst.getLineNumber(end) - 1; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| int endCol = cuAst.getColumnNumber(end) - 1; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
coderabbitai[bot] marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Uh oh!
There was an error while loading. Please reload this page.