diff options
| author | Manoj Palat | 2016-06-10 12:28:24 +0000 |
|---|---|---|
| committer | Manoj Palat | 2016-06-10 12:28:24 +0000 |
| commit | 86858dbb92e3c3c7f045572da23f0779074749a2 (patch) | |
| tree | 2aed9eb1b8d827aeafc363e40d3037ea41a93094 | |
| parent | 667e56a9d9129b25d42167e15e3a2a5164190faa (diff) | |
| download | eclipse.jdt.core-86858dbb92e3c3c7f045572da23f0779074749a2.tar.gz eclipse.jdt.core-86858dbb92e3c3c7f045572da23f0779074749a2.tar.xz eclipse.jdt.core-86858dbb92e3c3c7f045572da23f0779074749a2.zip | |
Fix for bug 495863 [1.9] [code completion] targetted module reference
completion
5 files changed, 123 insertions, 9 deletions
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java index 8603713b4f..76c26cf9a7 100644 --- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java +++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java @@ -1916,10 +1916,11 @@ public final class CompletionEngine ModuleReference target = targets[j]; if (target == null) break; if (target instanceof CompletionOnModuleReference) { + buildContext(target, null, parsedUnit, null, null); this.requestor.setIgnored(CompletionProposal.MODULE_REF, false); //TODO: Hack until ui fixes this issue. if(!this.requestor.isIgnored(CompletionProposal.MODULE_REF)) { contextAccepted = true; - findModules((CompletionOnModuleReference) target); + findModules((CompletionOnModuleReference) target, true /* targetted */); } debugPrintf(); return; @@ -1939,7 +1940,7 @@ public final class CompletionEngine buildContext(reference, null, parsedUnit, null, null); this.requestor.setIgnored(CompletionProposal.MODULE_REF, false); //TODO: Hack until ui fixes this issue. if(!this.requestor.isIgnored(CompletionProposal.MODULE_REF)) { - findModules((CompletionOnModuleReference) reference); + findModules((CompletionOnModuleReference) reference, false /* targetted */); } debugPrintf(); return; @@ -10419,7 +10420,7 @@ public final class CompletionEngine this.printDebug(proposal); } } - private void findModules(CompletionOnModuleReference moduleReference) { + private void findModules(CompletionOnModuleReference moduleReference, boolean targetted) { this.completionToken = CharOperation.concatWith(moduleReference.tokens, '.'); if (this.completionToken.length == 0) @@ -10428,7 +10429,7 @@ public final class CompletionEngine setSourceRange(moduleReference.sourceStart, moduleReference.sourceEnd); long completionPosition = moduleReference.sourcePositions[moduleReference.sourcePositions.length - 1]; setTokenRange((int) (completionPosition >>> 32), (int) completionPosition); - this.nameEnvironment.findModules(CharOperation.toLowerCase(this.completionToken), this); + this.nameEnvironment.findModules(CharOperation.toLowerCase(this.completionToken), this, targetted ? this.javaProject : null); } private void findPackages(CompletionOnExportReference exportStatement) { diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java index b44708dd15..fc9c9502e8 100644 --- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java +++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java @@ -1036,6 +1036,51 @@ protected void consumeSingleExportsPkgName() { this.restartRecovery = true; // used to avoid branching back into the regular automaton } } +protected void consumeSingleExportsTargetName() { + int index; + /* no need to take action if not inside assist identifiers */ + if ((index = indexOfAssistIdentifier()) < 0) { + super.consumeSingleExportsTargetName(); + return; + } + /* retrieve identifiers subset and whole positions, the assist node positions + should include the entire replaced source. */ + int length = this.identifierLengthStack[this.identifierLengthPtr]; + char[][] subset = identifierSubSet(index+1); // include the assistIdentifier + this.identifierLengthPtr--; + this.identifierPtr -= length; + long[] positions = new long[length]; + System.arraycopy( + this.identifierPositionStack, + this.identifierPtr + 1, + positions, + 0, + length); + + /* build specific assist node on targetted exports statement */ + ModuleReference reference = createAssistModuleReference(subset, positions, 0 /* no modifiers */); + this.assistNode = reference; + this.lastCheckPoint = reference.sourceEnd + 1; + pushOnAstStack(reference); + + reference.declarationSourceEnd = reference.sourceEnd; + reference.declarationEnd = reference.declarationSourceEnd; + reference.declarationSourceStart = reference.sourceStart; +// if (this.currentToken == TokenNameSEMICOLON){ +// impt.declarationSourceEnd = this.scanner.currentPosition - 1; +// } else { +// } +// //this.endPosition is just before the ; +// impt.declarationSourceStart = this.intStack[this.intPtr--]; + // recovery - TBD + if (this.currentElement != null){ + this.lastCheckPoint = reference.declarationSourceEnd+1; + this.currentElement = this.currentElement.add(reference, 0); + this.lastIgnoredToken = -1; + this.restartRecovery = true; // used to avoid branching back into the regular automaton + } + +} protected void consumeSingleRequiresModuleName() { int index = indexOfAssistIdentifier(); diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java index 738658fb27..e7069199a0 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java @@ -5714,6 +5714,14 @@ protected void consumeSingleExportsTargetName() { impt.declarationEnd = impt.declarationSourceEnd; // //this.endPosition is just before the ; // impt.declarationSourceStart = this.intStack[this.intPtr--]; + // recovery - TBD + if (this.currentElement != null){ + this.lastCheckPoint = impt.declarationSourceEnd+1; + this.currentElement = this.currentElement.add(impt, 0); + this.lastIgnoredToken = -1; + this.restartRecovery = true; // used to avoid branching back into the regular automaton + } + } protected void consumeExportTarget() { int length = this.astLengthStack[this.astLengthPtr--]; diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/NameLookup.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/NameLookup.java index 2b3fb80f06..7046b47b9e 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/NameLookup.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/NameLookup.java @@ -34,6 +34,7 @@ import org.eclipse.jdt.internal.compiler.env.AccessRestriction; import org.eclipse.jdt.internal.compiler.env.AccessRuleSet; import org.eclipse.jdt.internal.compiler.env.IBinaryType; import org.eclipse.jdt.internal.compiler.env.IModule; +import org.eclipse.jdt.internal.compiler.lookup.ModuleEnvironment; import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; import org.eclipse.jdt.internal.compiler.parser.ScannerHelper; import org.eclipse.jdt.internal.compiler.util.HashtableOfObjectToInt; @@ -985,8 +986,67 @@ public class NameLookup implements SuffixConstants { : CharOperation.equals(needle, haystack); } - public void seekModuleReferences(String name, IJavaElementRequestor requestor) { - seekModule(name, true /* prefix */, requestor); + /** + * Assumption is that project dependencies are setup already so that the required projects of a + * given project will include this project - module search will be done only in those projects. + * Note that this does not check for cycles in module dependency graph. + * @param name + * @param requestor + * @param javaProject + */ + public void seekTargettedModuleReferences(String name, IJavaElementRequestor requestor, IJavaProject javaProject) { + //seekModule(name, true /* prefix */, requestor); + List<IJavaProject> dependentJavaProjects = new ArrayList<>(); + String myName = javaProject.getElementName(); + IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); + for (IProject project : projects) { + if (!JavaProject.hasJavaNature(project)) continue; + IJavaProject jProject = JavaCore.create (project); + if (jProject.equals(javaProject)) continue; + try { + String[] requiredPojects = jProject.getRequiredProjectNames(); + for (String s : requiredPojects) { + if (s == null) continue; + if (s.equals(myName)) { + dependentJavaProjects.add(jProject); + break; + } + } + } catch (JavaModelException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + if (dependentJavaProjects.isEmpty()) return; + // At this point we have all the projects dependent on this project. + + for (IJavaProject jP : dependentJavaProjects) { + try { + if (!jP.isOpen()) continue; + IPackageFragmentRoot[] roots = jP.getPackageFragmentRoots(); + for (IPackageFragmentRoot root : roots) { + if (root instanceof JarPackageFragmentRoot) continue; // TODO: Add support for JPFRs? + root.open(null); + PackageFragmentRootInfo pFRI = ((PackageFragmentRootInfo) ((PackageFragmentRoot) root).getElementInfo()); + IModule module = pFRI.getModule(); + if (module == null) continue; + char[] moduleName = module.name(); + if (moduleName == null || moduleName.equals(CharOperation.NO_CHAR) || moduleName.equals(ModuleEnvironment.UNNAMED)) continue; + requestor.acceptModule(module); + } + } catch (JavaModelException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + public void seekModuleReferences(String name, IJavaElementRequestor requestor, IJavaProject javaProject) { + if (javaProject != null) { + seekTargettedModuleReferences(name, requestor, javaProject); + } else { + seekModule(name, true /* prefix */, requestor); + } } public void seekModule(String name, boolean prefix, IJavaElementRequestor requestor) { int count= this.packageFragmentRoots.length; diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java index a5c92c462e..55e42a1363 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java @@ -172,10 +172,10 @@ public class SearchableEnvironment extends ModuleEnvironment * The packages found are passed to: * ISearchRequestor.acceptModule(char[][] moduleName) */ - public void findModules(char[] prefix, ISearchRequestor requestor) { + public void findModules(char[] prefix, ISearchRequestor requestor, IJavaProject javaProject) { this.nameLookup.seekModuleReferences( - new String(prefix), - new SearchableEnvironmentRequestor(requestor)); + new String(prefix), + new SearchableEnvironmentRequestor(requestor), javaProject); } /** |
