Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java16
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConcealedPackageBinding.java2
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java269
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnNamedModuleBinding.java125
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java16
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JrtPackageFragmentRoot.java49
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/NameLookup.java424
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ProjectEntry.java42
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java38
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJrt.java26
10 files changed, 231 insertions, 776 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 e5df6312dc..69a7e840f7 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
@@ -181,6 +181,7 @@ import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.env.AccessRestriction;
import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
import org.eclipse.jdt.internal.compiler.env.IModuleContext;
+import org.eclipse.jdt.internal.compiler.env.IModuleEnvironment;
import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
import org.eclipse.jdt.internal.compiler.env.ISourceType;
import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;
@@ -234,7 +235,6 @@ import org.eclipse.jdt.internal.core.INamingRequestor;
import org.eclipse.jdt.internal.core.InternalNamingConventions;
import org.eclipse.jdt.internal.core.JavaElementRequestor;
import org.eclipse.jdt.internal.core.JavaModelManager;
-import org.eclipse.jdt.internal.core.JavaProject;
import org.eclipse.jdt.internal.core.ModuleSourcePathManager;
import org.eclipse.jdt.internal.core.SourceMethod;
import org.eclipse.jdt.internal.core.SourceMethodElementInfo;
@@ -717,10 +717,6 @@ public final class CompletionEngine
char[] source;
ModuleDeclaration moduleDeclaration;
char[] completionToken;
- IModuleContext moduleContext = () -> {
- return Stream.of((JavaProject)this.javaProject);
- };
-
char[] qualifiedCompletionToken;
boolean resolvingImports = false;
boolean resolvingStaticImports = false;
@@ -10691,7 +10687,15 @@ public final class CompletionEngine
}
private void findPackagesInCurrentModule() {
- this.nameEnvironment.findPackages(CharOperation.toLowerCase(this.completionToken), this, this.moduleContext);
+ IModuleDescription mod = null;
+ try {
+ mod = this.javaProject.getModuleDescription();
+ } catch (JavaModelException e) {
+ // do nothing
+ }
+ IModuleEnvironment env = this.nameEnvironment.getModuleEnvironmentFor(mod == null ? null : mod.getElementName().toCharArray());
+ IModuleContext context = env == null ? IModuleContext.UNNAMED_MODULE_CONTEXT : () -> Stream.of(env);
+ this.nameEnvironment.findPackages(CharOperation.toLowerCase(this.completionToken), this, context);
}
private void findPackages(CompletionOnPackageReference packageStatement) {
this.completionToken = CharOperation.concatWithAll(packageStatement.tokens, '.');
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConcealedPackageBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConcealedPackageBinding.java
index 0692b9da4d..42ec1e4243 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConcealedPackageBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConcealedPackageBinding.java
@@ -37,7 +37,7 @@ public class ConcealedPackageBinding extends PackageBinding {
}
ReferenceBinding getType(char[] name, char[] mod) {
- PackageBinding wrapped = this.declaringModule.declaredPackages.get(readableName());
+ PackageBinding wrapped = this.declaringModule.getDeclaredPackage(this.compoundName);
return wrapped.getType(name, mod);
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
index e50c62fc3a..f378c15e86 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
@@ -32,6 +32,7 @@ import org.eclipse.jdt.internal.compiler.env.IModule;
import org.eclipse.jdt.internal.compiler.env.IModule.IModuleReference;
import org.eclipse.jdt.internal.compiler.env.IModule.IPackageExport;
import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
+import org.eclipse.jdt.internal.compiler.env.INameEnvironmentExtension;
import org.eclipse.jdt.internal.compiler.env.ITypeAnnotationWalker;
import org.eclipse.jdt.internal.compiler.util.HashtableOfPackage;
import org.eclipse.jdt.internal.compiler.util.JRTUtil;
@@ -173,83 +174,68 @@ public class ModuleBinding extends Binding {
}
return false;
}
-// public PackageBinding getTopLevelPackage(char[] name) {
-// // return package binding if there exists a package named name in this module's context and it can be seen by this module
-// // A package can be seen by this module if it declares the package or someone exports that package to it
-// PackageBinding existing = this.environment.getPackage0(name);
-// if (existing != null) {
-// if (existing == LookupEnvironment.TheNotFoundPackage)
-// return null;
-// }
-// if (declaresPackage(null, name)) {
-// return new PackageBinding(name, this.environment);
-// } else {
-// return Stream.of(getAllRequiredModules()).sorted((m1, m2) -> m1.requires.length - m2.requires.length)
-// .map(m -> {
-// PackageBinding binding = m.getExportedPackage(name);
-// if (binding != null && m.isPackageExportedTo(binding, this)) {
-// return m.declaredPackages.get(name);
-// }
-// return null;
-// })
-// .filter(p -> p != null).findFirst().orElse(null);
-// }
-// }
- // Given parent is declared in this module, see if there is sub package named name declared in this module
-// private PackageBinding getDeclaredPackage(PackageBinding parent, char[] name) {
-// PackageBinding pkg = parent.getPackage0(name);
-// if (pkg != null && pkg != LookupEnvironment.TheNotFoundPackage)
-// return pkg;
-// if (declaresPackage(parent.compoundName, name)) {
-// char[][] subPkgCompoundName = CharOperation.arrayConcat(parent.compoundName, name);
-// PackageBinding binding = new PackageBinding(subPkgCompoundName, parent, this.environment);
-// parent.addPackage(binding);
-// this.declaredPackages.put(binding.readableName(), binding);
-// return binding;
-// }
-// // TODO: Situation can probably improved by adding NOtFoundPackage to this.declaredPackages
-// //parent.addNotFoundPackage(name); Not a package in this module does not mean not a package at all
-// return null;
-// }
-// public PackageBinding getDeclaredPackage(char[] qualifiedName) {
-// // return package binding if there exists a package named name in this module
-// if (qualifiedName == null || qualifiedName.length == 0) {
-// return this.environment.getDefaultPackage(this.moduleName);
-// }
-//
-//// PackageBinding pkg = parent.getPackage0(name);
-//// if (pkg != null && pkg != LookupEnvironment.TheNotFoundPackage)
-//// return pkg;
-// if (declaresPackage(qualifiedName)) {
-// char[][] subPkgCompoundName = CharOperation.splitOn('.', qualifiedName);
-// PackageBinding binding = new PackageBinding(subPkgCompoundName, null, this.environment);
-// //parent.addPackage(binding);
-// this.declaredPackages.put(binding.readableName(), binding);
-// return binding;
-// }
-// // TODO: Situation can probably improved by adding NOtFoundPackage to this.declaredPackages
-// //parent.addNotFoundPackage(name); Not a package in this module does not mean not a package at all
-// return null;
-// }
+ PackageBinding getTopLevelPackage(char[] name) {
+ PackageBinding packageBinding = this.declaredPackages.get(name);
+ if (packageBinding != null) {
+ if (packageBinding == LookupEnvironment.TheNotFoundPackage)
+ return null;
+ return packageBinding;
+ }
+ if (declaresPackage(new char[][] {name})) {
+ packageBinding = new PackageBinding(name, this.environment);
+ }
+ if (packageBinding != null) {
+ this.declaredPackages.put(name, packageBinding);
+ return packageBinding;
+ }
+
+ this.declaredPackages.put(name, LookupEnvironment.TheNotFoundPackage); // saves asking the oracle next time
+ return null;
+ }
+
public PackageBinding getDeclaredPackage(char[][] name) {
// return package binding if there exists a package named name in this module
if (name == null || name.length == 0) {
return this.environment.getDefaultPackage(this.moduleName);
}
- char[] qualifiedName = CharOperation.concatWith(name, '.');
- PackageBinding binding = this.declaredPackages.get(qualifiedName);
- if (binding != null) {
- if (binding == LookupEnvironment.TheNotFoundPackage)
- return null;
- return binding;
- }
- if (declaresPackage(name)) {
- binding = new PackageBinding(name, null, this.environment);
- } else {
- binding = LookupEnvironment.TheNotFoundPackage;
+// char[] qualifiedName = CharOperation.concatWith(name, '.');
+ PackageBinding packageBinding = getTopLevelPackage(name[0]);
+ if (packageBinding == null || packageBinding == LookupEnvironment.TheNotFoundPackage)
+ return null;
+ int length = name.length, index = 1;
+ while (index < length) {
+ char[] simpleName = name[index++];
+ PackageBinding binding = packageBinding.getPackage0(simpleName);
+ if (binding != null) {
+ if (binding == LookupEnvironment.TheNotFoundPackage) {
+ return null;
+ }
+ } else {
+ if (declaresPackage(packageBinding.compoundName, simpleName)) {
+ char[][] subPkgCompoundName = CharOperation.arrayConcat(packageBinding.compoundName, simpleName);
+ binding = new PackageBinding(subPkgCompoundName, packageBinding, this.environment);
+ packageBinding.addPackage(binding);
+ } else {
+ packageBinding.addNotFoundPackage(simpleName);
+ return null;
+ }
+ }
+ packageBinding = binding;
}
- this.declaredPackages.put(qualifiedName, binding);
- return binding;
+ return packageBinding;
+// PackageBinding binding = this.declaredPackages.get(qualifiedName);
+// if (binding != null) {
+// if (binding == LookupEnvironment.TheNotFoundPackage)
+// return null;
+// return binding;
+// }
+// if (declaresPackage(name)) {
+// binding = new PackageBinding(name, null, this.environment);
+// } else {
+// binding = LookupEnvironment.TheNotFoundPackage;
+// }
+// this.declaredPackages.put(qualifiedName, binding);
+// return binding;
// PackageBinding parent = null;
// PackageBinding existing = this.environment.getPackage0(name[0]);
// if (existing != null) { // known top level package
@@ -287,7 +273,7 @@ public class ModuleBinding extends Binding {
}
//Resolve exports to see if the package or a sub package is exported
return Stream.of(this.exports).sorted((e1, e2) -> e1.name().length - e2.name().length)
- .filter(e -> CharOperation.equals(qualifiedPackageName, e.name())) // TODO: improve this
+ .filter(e -> CharOperation.equals(qualifiedPackageName, e.name()))
.map(e -> {
PackageBinding binding = getDeclaredPackage(CharOperation.splitOn('.', e.name()));
if (binding != null) {
@@ -302,7 +288,6 @@ public class ModuleBinding extends Binding {
if (pkg == null) {
pkg = getDeclaredPackage(p.compoundName);
if (pkg == p) {
- //this.declaredPackages.put(p.readableName(), p);
return true;
}
}
@@ -499,17 +484,7 @@ public class ModuleBinding extends Binding {
}
});
}
-// public ReferenceBinding getType(char[][] compoundName) {
-// ReferenceBinding binding = null;
-// char[][] parentPackageName = CharOperation.subarray(compoundName, 0, compoundName.length - 1);
-// PackageBinding pkg = getPackage(parentPackageName);
-// if (pkg != null) {
-// binding = pkg.getType0(compoundName[compoundName.length - 1]);
-// }
-// return binding;
-// }
public ReferenceBinding findType(char[][] compoundName) {
- // TODO
ReferenceBinding binding = null;
char[][] parentPackageName = CharOperation.subarray(compoundName, 0, compoundName.length - 1);
PackageBinding pkg = getPackage(parentPackageName);
@@ -525,69 +500,55 @@ public class ModuleBinding extends Binding {
if (type != null && type.isValidBinding())
return type;
PackageBinding packageBinding = getPackage(compoundName);
-// if (packageBinding != null) {
-// if (packageBinding.isValidBinding() || packageBinding.problemId() == ProblemReasons.Ambiguous)
-// return packageBinding;
-// }
-// int currentIndex = 0, length = compoundName.length;
-// //ModuleBinding clientModule = this.environment().getModule(module());
-// Binding binding = null;
-// PackageBinding packageBinding = null;//(PackageBinding) binding;
-// while (currentIndex < length) {
-//// binding = packageBinding.getTypeOrPackage(compoundName[currentIndex++], module());
-//// if (binding == null) {
-//// return new ProblemReferenceBinding(CharOperation.subarray(compoundName, 0, currentIndex), null /* no closest match since search for pkg*/, ProblemReasons.NotFound);
-//// }
-// char[][] name = CharOperation.subarray(compoundName, 0, ++currentIndex);
-// binding = findType(name);
-// if (binding != null && binding.isValidBinding())
-// return binding;
-//// if (!(binding instanceof PackageBinding))// && !binding.isValidBinding())
-//// return new ProblemReferenceBinding(
-//// CharOperation.subarray(compoundName, 0, currentIndex),
-//// binding instanceof ReferenceBinding ? (ReferenceBinding)((ReferenceBinding)binding).closestMatch() : null,
-//// binding.problemId());
-//// if (binding instanceof ReferenceBinding)
-//// return binding;
-// binding = getPackage(name);
-// if (binding != null)
-// packageBinding = (PackageBinding)binding;
-// }
-// // Could not resolve, probably partially resolved
-// if (packageBinding != null) {
-// if (packageBinding.compoundName.length < length) { // partially resolved
-// return new ProblemReferenceBinding(CharOperation.subarray(compoundName, 0, packageBinding.compoundName.length + 1), null, ProblemReasons.NotFound);
-// } else {
-// return new ProblemReferenceBinding(compoundName, null, ProblemReasons.NotFound);
-// }
-// } else if (problemBinding == null) { // reuse problem binding if exists
-// char[][] qName = new char[][] { compoundName[0] };
-// problemBinding = new ProblemReferenceBinding(qName, environment().createMissingType(null, compoundName), ProblemReasons.NotFound);
-// }
return packageBinding;
}
-
+
public PackageBinding createPackage(char[][] compoundName) {
- for(int i = 1; i < compoundName.length; i++) {
-// char[][] typeName = CharOperation.subarray(compoundName, 0, i);
- ReferenceBinding type;// = findType(typeName);
-// if (type != null && type != LookupEnvironment.TheNotFoundType && !(type instanceof UnresolvedReferenceBinding))
-// return null;
- char[][] packageName = CharOperation.subarray(compoundName, 0, i);
- PackageBinding pkg = this.declaredPackages.get(CharOperation.concatWith(packageName, '.'));
- if (pkg != null) {
- type = pkg.getType0(compoundName[i]);
- if (type != null && type != LookupEnvironment.TheNotFoundType && !(type instanceof UnresolvedReferenceBinding))
- return null;
- }
- }
- char[] qualifiedName = CharOperation.concatWith(compoundName, '.');
- PackageBinding packageBinding = this.declaredPackages.get(qualifiedName);
+ PackageBinding packageBinding = this.declaredPackages.get(compoundName[0]);
if (packageBinding == null || packageBinding == LookupEnvironment.TheNotFoundPackage) {
- packageBinding = new PackageBinding(compoundName, null, this.environment);
- this.declaredPackages.put(qualifiedName, packageBinding);
+ packageBinding = new PackageBinding(compoundName[0], this.environment);
+ this.declaredPackages.put(compoundName[0], packageBinding);
+ }
+ for (int i = 1, length = compoundName.length; i < length; i++) {
+ // check to see if it collides with a known type...
+ // this case can only happen if the package does not exist as a directory in the file system
+ // otherwise when the source type was defined, the correct error would have been reported
+ // unless its an unresolved type which is referenced from an inconsistent class file
+ // NOTE: empty packages are not packages according to changes in JLS v2, 7.4.3
+ // so not all types cause collision errors when they're created even though the package did exist
+ ReferenceBinding type = packageBinding.getType0(compoundName[i]);
+ if (type != null && type != LookupEnvironment.TheNotFoundType
+ && !(type instanceof UnresolvedReferenceBinding))
+ return null;
+
+ PackageBinding parent = packageBinding;
+ if ((packageBinding = parent.getPackage0(compoundName[i])) == null
+ || packageBinding == LookupEnvironment.TheNotFoundPackage) {
+ // if the package is unknown, check to see if a type exists which would collide with the new package
+ // catches the case of a package statement of: package java.lang.Object;
+ // since the package can be added after a set of source files have already been compiled,
+ // we need to check whenever a package is created
+ INameEnvironment nameEnvironment = this.environment.nameEnvironment;
+ if (nameEnvironment instanceof INameEnvironmentExtension) {
+ // When the nameEnvironment is an instance of INameEnvironmentWithProgress, it can get avoided to
+ // search for secondaryTypes (see flag).
+ // This is a performance optimization, because it is very expensive to search for secondary types
+ // and it isn't necessary to check when creating a package,
+ // because package name can not collide with a secondary type name.
+ if (((INameEnvironmentExtension) nameEnvironment).findType(compoundName[i], parent.compoundName,
+ false, getDependencyClosureContext()) != null) {
+ return null;
+ }
+ } else {
+ if (nameEnvironment.findType(compoundName[i], parent.compoundName) != null) {
+ return null;
+ }
+ }
+ packageBinding = new PackageBinding(CharOperation.subarray(compoundName, 0, i + 1), parent,
+ this.environment);
+ parent.addPackage(packageBinding);
+ }
}
- //PackageBinding packageBinding = getPackage(compoundName);
return packageBinding;
}
public ReferenceBinding getCachedType(char[][] compoundName) {
@@ -597,13 +558,7 @@ public class ModuleBinding extends Binding {
return unnamed.getType0(compoundName[0]);
}
char[][] pkgName = CharOperation.subarray(compoundName, 0, compoundName.length - 1);
-// char[] qName = CharOperation.concatWith(pkgName, '.');
-// PackageBinding pkg = this.declaredPackages.get(qName);
PackageBinding pkg = getPackage(pkgName);
-// if (pkg == null || !pkg.isValidBinding()) {
-// pkg = Stream.of(getAllRequiredModules()).map(m -> m.declaredPackages.get(qName))
-// .filter(p -> p != null && p.isValidBinding()).findFirst().orElse(null); // shouldn't encounter duplicates
-// }
return (pkg != null && pkg.isValidBinding()) ? pkg.getType0(compoundName[compoundName.length - 1]) : null;
}
@@ -611,14 +566,20 @@ public class ModuleBinding extends Binding {
if (constantPoolName.length == 1)
return this.environment.getDefaultPackage(this.moduleName);
- char[][] pkgName = CharOperation.subarray(constantPoolName, 0, constantPoolName.length - 1);
- char[] qualifiedName = CharOperation.concatWith(pkgName, '.');
- PackageBinding packageBinding = getPackage(pkgName);//this.declaredPackages.get(qualifiedName);
+ PackageBinding packageBinding = getPackage(CharOperation.subarray(constantPoolName, 0, constantPoolName.length - 1));//this.declaredPackages.get(constantPoolName[0]);
if (packageBinding == null || packageBinding == LookupEnvironment.TheNotFoundPackage) {
- packageBinding = new PackageBinding(pkgName, null, this.environment);
- this.declaredPackages.put(qualifiedName, packageBinding);
- if (isMissing) {
- packageBinding.tagBits |= TagBits.HasMissingType;
+ packageBinding = new PackageBinding(constantPoolName[0], this.environment);
+ if (isMissing) packageBinding.tagBits |= TagBits.HasMissingType;
+ this.declaredPackages.put(constantPoolName[0], packageBinding);
+ for (int i = 1, length = constantPoolName.length - 1; i < length; i++) {
+ PackageBinding parent = packageBinding;
+ if ((packageBinding = parent.getPackage0(constantPoolName[i])) == null || packageBinding == LookupEnvironment.TheNotFoundPackage) {
+ packageBinding = new PackageBinding(CharOperation.subarray(constantPoolName, 0, i + 1), parent, this.environment);
+ if (isMissing) {
+ packageBinding.tagBits |= TagBits.HasMissingType;
+ }
+ parent.addPackage(packageBinding);
+ }
}
}
return packageBinding;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnNamedModuleBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnNamedModuleBinding.java
index 57a81ec32b..4413e998d8 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnNamedModuleBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnNamedModuleBinding.java
@@ -20,8 +20,6 @@ import java.util.stream.Stream;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.internal.compiler.env.IModuleContext;
-import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
-import org.eclipse.jdt.internal.compiler.env.INameEnvironmentExtension;
import org.eclipse.jdt.internal.compiler.util.JRTUtil;
/**
@@ -52,127 +50,4 @@ public class UnNamedModuleBinding extends ModuleBinding {
public IModuleContext getModuleGraphContext() {
return IModuleContext.UNNAMED_MODULE_CONTEXT;
}
- PackageBinding getTopLevelPackage(char[] name) {
- PackageBinding packageBinding = this.declaredPackages.get(name);
- if (packageBinding != null) {
- if (packageBinding == LookupEnvironment.TheNotFoundPackage)
- return null;
- return packageBinding;
- }
- if (declaresPackage(new char[][] {name})) {
- packageBinding = new PackageBinding(name, this.environment);
- }
- if (packageBinding != null) {
- //if (this.nameEnvironment.isPackage(null, name, mod)) {
- this.declaredPackages.put(name, packageBinding);
- return packageBinding;
- }
-
- this.declaredPackages.put(name, LookupEnvironment.TheNotFoundPackage); // saves asking the oracle next time
- return null;
- }
-
- public PackageBinding getDeclaredPackage(char[][] name) {
- // return package binding if there exists a package named name in this module
- if (name == null || name.length == 0) {
- return this.environment.getDefaultPackage(this.moduleName);
- }
-// char[] qualifiedName = CharOperation.concatWith(name, '.');
- PackageBinding packageBinding = getTopLevelPackage(name[0]);
- if (packageBinding == null || packageBinding == LookupEnvironment.TheNotFoundPackage)
- return null;
- int length = name.length, index = 1;
- while (index < length) {
- char[] simpleName = name[index++];
- PackageBinding binding = packageBinding.getPackage0(simpleName);
- if (binding != null) {
- if (binding == LookupEnvironment.TheNotFoundPackage) {
- return null;
- }
- } else {
- if (declaresPackage(packageBinding.compoundName, simpleName)) {
- char[][] subPkgCompoundName = CharOperation.arrayConcat(packageBinding.compoundName, simpleName);
- binding = new PackageBinding(subPkgCompoundName, packageBinding, this.environment);
- packageBinding.addPackage(binding);
- } else {
- packageBinding.addNotFoundPackage(simpleName);
- return null;
- }
- }
- packageBinding = binding;
- }
- return packageBinding;
- }
- public PackageBinding createPackage(char[][] compoundName) {
- PackageBinding packageBinding = this.declaredPackages.get(compoundName[0]);
- if (packageBinding == null || packageBinding == LookupEnvironment.TheNotFoundPackage) {
- packageBinding = new PackageBinding(compoundName[0], this.environment);
- this.declaredPackages.put(compoundName[0], packageBinding);
- }
- for (int i = 1, length = compoundName.length; i < length; i++) {
- // check to see if it collides with a known type...
- // this case can only happen if the package does not exist as a directory in the file system
- // otherwise when the source type was defined, the correct error would have been reported
- // unless its an unresolved type which is referenced from an inconsistent class file
- // NOTE: empty packages are not packages according to changes in JLS v2, 7.4.3
- // so not all types cause collision errors when they're created even though the package did exist
- ReferenceBinding type = packageBinding.getType0(compoundName[i]);
- if (type != null && type != LookupEnvironment.TheNotFoundType
- && !(type instanceof UnresolvedReferenceBinding))
- return null;
-
- PackageBinding parent = packageBinding;
- if ((packageBinding = parent.getPackage0(compoundName[i])) == null
- || packageBinding == LookupEnvironment.TheNotFoundPackage) {
- // if the package is unknown, check to see if a type exists which would collide with the new package
- // catches the case of a package statement of: package java.lang.Object;
- // since the package can be added after a set of source files have already been compiled,
- // we need to check whenever a package is created
- INameEnvironment nameEnvironment = this.environment.nameEnvironment;
- if (nameEnvironment instanceof INameEnvironmentExtension) {
- // When the nameEnvironment is an instance of INameEnvironmentWithProgress, it can get avoided to
- // search for secondaryTypes (see flag).
- // This is a performance optimization, because it is very expensive to search for secondary types
- // and it isn't necessary to check when creating a package,
- // because package name can not collide with a secondary type name.
- if (((INameEnvironmentExtension) nameEnvironment).findType(compoundName[i], parent.compoundName,
- false, getDependencyClosureContext()) != null) {
- return null;
- }
- } else {
- if (nameEnvironment.findType(compoundName[i], parent.compoundName) != null) {
- return null;
- }
- }
- packageBinding = new PackageBinding(CharOperation.subarray(compoundName, 0, i + 1), parent,
- this.environment);
- parent.addPackage(packageBinding);
- }
- }
- return packageBinding;
- }
- public PackageBinding computePackageFrom(char[][] constantPoolName, boolean isMissing) {
- if (constantPoolName.length == 1)
- return this.environment.getDefaultPackage(this.moduleName);
-
- PackageBinding packageBinding = getPackage(CharOperation.subarray(constantPoolName, 0, constantPoolName.length - 1));//this.declaredPackages.get(constantPoolName[0]);
-// if (packageBinding != null && packageBinding.isValidBinding())
-// return packageBinding;
- if (packageBinding == null || packageBinding == LookupEnvironment.TheNotFoundPackage) {
- packageBinding = new PackageBinding(constantPoolName[0], this.environment);
- if (isMissing) packageBinding.tagBits |= TagBits.HasMissingType;
- this.declaredPackages.put(constantPoolName[0], packageBinding);
- for (int i = 1, length = constantPoolName.length - 1; i < length; i++) {
- PackageBinding parent = packageBinding;
- if ((packageBinding = parent.getPackage0(constantPoolName[i])) == null || packageBinding == LookupEnvironment.TheNotFoundPackage) {
- packageBinding = new PackageBinding(CharOperation.subarray(constantPoolName, 0, i + 1), parent, this.environment);
- if (isMissing) {
- packageBinding.tagBits |= TagBits.HasMissingType;
- }
- parent.addPackage(packageBinding);
- }
- }
- }
- return packageBinding;
- }
} \ No newline at end of file
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java
index 3fe2dbac67..b6b178062a 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java
@@ -78,9 +78,6 @@ import org.eclipse.jdt.core.WorkingCopyOwner;
import org.eclipse.jdt.core.compiler.CategorizedProblem;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.core.eval.IEvaluationContext;
-import org.eclipse.jdt.internal.compiler.env.IModuleEnvironment;
-import org.eclipse.jdt.internal.compiler.env.IPackageLookup;
-import org.eclipse.jdt.internal.compiler.env.ITypeLookup;
import org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
import org.eclipse.jdt.internal.compiler.util.JRTUtil;
import org.eclipse.jdt.internal.compiler.util.ObjectVector;
@@ -122,7 +119,7 @@ import org.xml.sax.SAXException;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class JavaProject
extends Openable
- implements IJavaProject, IProjectNature, IModuleEnvironment, SuffixConstants {
+ implements IJavaProject, IProjectNature, SuffixConstants {
/**
* Name of file containing project classpath
@@ -3374,15 +3371,4 @@ public class JavaProject
}
info.setModule(module);
}
- @Override
- public ITypeLookup typeLookup() {
- // No direct way to lookup, use the java model APIs instead
- return ITypeLookup.Dummy;
- }
-
- @Override
- public IPackageLookup packageLookup() {
- // No direct way to lookup, use the java model APIs instead
- return IPackageLookup.Dummy;
- }
}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JrtPackageFragmentRoot.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JrtPackageFragmentRoot.java
index ca732a7d26..306691ab67 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JrtPackageFragmentRoot.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JrtPackageFragmentRoot.java
@@ -26,11 +26,6 @@ import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IModuleDescription;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.compiler.CharOperation;
-import org.eclipse.jdt.internal.compiler.env.IModule;
-import org.eclipse.jdt.internal.compiler.env.IModuleEnvironment;
-import org.eclipse.jdt.internal.compiler.env.IModulePathEntry;
-import org.eclipse.jdt.internal.compiler.env.IPackageLookup;
-import org.eclipse.jdt.internal.compiler.env.ITypeLookup;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.util.JRTUtil;
import org.eclipse.jdt.internal.core.util.HashtableOfArrayToObject;
@@ -42,7 +37,7 @@ import org.eclipse.jdt.internal.core.util.Util;
* @see org.eclipse.jdt.core.IPackageFragmentRoot
* @see org.eclipse.jdt.internal.core.JarPackageFragmentRootInfo
*/
-public class JrtPackageFragmentRoot extends JarPackageFragmentRoot implements IModulePathEntry, IModuleEnvironment {
+public class JrtPackageFragmentRoot extends JarPackageFragmentRoot {
String moduleName;
@@ -96,8 +91,8 @@ public class JrtPackageFragmentRoot extends JarPackageFragmentRoot implements IM
SourceMapper createSourceMapper(IPath sourcePath, IPath rootPath) throws JavaModelException {
IClasspathEntry entry = ((JavaProject) getParent()).getClasspathEntryFor(getPath());
String encoding = (entry== null) ? null : ((ClasspathEntry) entry).getSourceAttachmentEncoding();
- IModule mod = getModule();
- String modName = mod == null ? null : new String(mod.name());
+ IModuleDescription mod = getModuleDescription();
+ String modName = mod == null ? null : mod.getElementName();
SourceMapper mapper = new SourceMapper(
sourcePath,
rootPath == null ? modName : rootPath.toOSString(),
@@ -132,42 +127,4 @@ public class JrtPackageFragmentRoot extends JarPackageFragmentRoot implements IM
buffer.append(" (not open)"); //$NON-NLS-1$
}
}
-
- @Override
- public IModuleEnvironment getLookupEnvironment() {
- //
- return this;
- }
-
- @Override
- public IModuleEnvironment getLookupEnvironmentFor(IModule module) {
- //
- return getModule() == module ? this : null;
- }
-
- @Override
- public ITypeLookup typeLookup() {
- // No direct way to lookup, use the java model APIs instead
- return ITypeLookup.Dummy;
- }
-
- @Override
- public IPackageLookup packageLookup() {
- // No direct way to lookup, use the java model APIs instead
- return IPackageLookup.Dummy;
- }
-
- @Override
- public IModule getModule() {
- IModuleDescription desc = getModuleDescription();
- if (desc != null) {
- try {
- return (ModuleDescriptionInfo)((JavaElement) desc).getElementInfo();
- } catch (JavaModelException e) {
- e.printStackTrace();
- }
- }
- return null;
- }
-
}
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 c4f07b9b60..8be1cc54f5 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
@@ -18,7 +18,6 @@ package org.eclipse.jdt.internal.core;
import java.io.File;
import java.util.*;
import java.util.function.BiPredicate;
-import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.eclipse.core.resources.*;
@@ -28,12 +27,9 @@ import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IInitializer;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IModuleDescription;
import org.eclipse.jdt.core.IOpenable;
import org.eclipse.jdt.core.IPackageFragment;
@@ -51,10 +47,6 @@ 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.env.IModuleContext;
-import org.eclipse.jdt.internal.compiler.env.IModuleEnvironment;
-import org.eclipse.jdt.internal.compiler.env.IModulePathEntry;
-import org.eclipse.jdt.internal.compiler.env.IPackageLookup;
-import org.eclipse.jdt.internal.compiler.env.ITypeLookup;
import org.eclipse.jdt.internal.compiler.lookup.ModuleEnvironment;
import org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
import org.eclipse.jdt.internal.compiler.parser.ScannerHelper;
@@ -346,40 +338,6 @@ public class NameLookup implements SuffixConstants {
return null;
}
}
- public static class Roots implements IModuleEnvironment {
- private IPackageFragmentRoot[] roots;
- Roots(IPackageFragmentRoot[] roots) {
- this.roots = roots;
- }
-
- @Override
- public ITypeLookup typeLookup() {
- return ITypeLookup.Dummy;
- }
-
- @Override
- public IPackageLookup packageLookup() {
- return IPackageLookup.Dummy;
- }
-
- public boolean isIncludedIn(IModuleEnvironment other) {
- if (this == other)
- return true;
- if (!(other instanceof Roots))
- return false;
- Roots env = (Roots) other;
- if (this.roots == null) {
- return env.roots == null;
- } else if (env.roots == null){
- return false;
- }
- int len = this.roots.length;
- int otherLen = env.roots.length;
- if (len > otherLen)
- return false;
- return Stream.of(this.roots).flatMap(r -> Stream.of(env.roots).filter(root -> r.equals(root))).count() == this.roots.length;
- }
- }
public static class Answer {
public IType type;
public IModuleDescription module;
@@ -420,55 +378,6 @@ public class NameLookup implements SuffixConstants {
}
}
- private class Selector implements IJavaElementRequestor {
- public List<IPackageFragment> pkgFragments;
-
- public Selector(String moduleName) {
- this.pkgFragments = new ArrayList<>();
- }
-
- @Override
- public void acceptField(IField field) {
- // do nothing
- }
-
- @Override
- public void acceptInitializer(IInitializer initializer) {
- // do nothing
- }
-
- @Override
- public void acceptMemberType(IType type) {
- // do nothing
- }
-
- @Override
- public void acceptMethod(IMethod method) {
- // do nothing
- }
-
- @Override
- public void acceptPackageFragment(IPackageFragment packageFragment) {
- this.pkgFragments.add(packageFragment);
- }
-
- @Override
- public void acceptType(IType type) {
- // do nothing
- }
-
- @Override
- public void acceptModule(IModuleDescription module) {
- // do nothing
- }
-
- @Override
- public boolean isCanceled() {
- // TODO Auto-generated method stub
- return false;
- }
- }
-
// TODO (jerome) suppress the accept flags (qualified name is sufficient to find a type)
/**
* Accept flag for specifying classes.
@@ -1037,35 +946,35 @@ public class NameLookup implements SuffixConstants {
* It means that secondary types may be not found under certain circumstances...
* @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=118789"
*/
- public Answer findType(String typeName, String packageName, boolean partialMatch, int acceptFlags, boolean checkRestrictions, IModuleContext context) {
- Answer suggestedAnswer = null;
- if (context != IModuleContext.UNNAMED_MODULE_CONTEXT) {
-// for (IModuleDeclaration module : modules) {
- suggestedAnswer = findType(typeName, packageName, partialMatch, acceptFlags,
- true/* consider secondary types */, false/* do NOT wait for indexes */, checkRestrictions,
- null, context);
-// if (answer != null) {
-// if (!answer.ignoreIfBetter()) {
-// if (answer.isBetter(suggestedAnswer))
-// return answer;
-// } else if (answer.isBetter(suggestedAnswer))
-// // remember suggestion and keep looking
-// suggestedAnswer = answer;
-// }
-// }
-
- } else {
- suggestedAnswer = findType(typeName,
- packageName,
- partialMatch,
- acceptFlags,
- true/* consider secondary types */,
- false/* do NOT wait for indexes */,
- checkRestrictions,
- null);
- }
- return suggestedAnswer;
- }
+// public Answer findType(String typeName, String packageName, boolean partialMatch, int acceptFlags, boolean checkRestrictions, IModuleContext context) {
+// Answer suggestedAnswer = null;
+// if (context != IModuleContext.UNNAMED_MODULE_CONTEXT) {
+//// for (IModuleDeclaration module : modules) {
+// suggestedAnswer = findType(typeName, packageName, partialMatch, acceptFlags,
+// true/* consider secondary types */, false/* do NOT wait for indexes */, checkRestrictions,
+// null, context);
+//// if (answer != null) {
+//// if (!answer.ignoreIfBetter()) {
+//// if (answer.isBetter(suggestedAnswer))
+//// return answer;
+//// } else if (answer.isBetter(suggestedAnswer))
+//// // remember suggestion and keep looking
+//// suggestedAnswer = answer;
+//// }
+//// }
+//
+// } else {
+// suggestedAnswer = findType(typeName,
+// packageName,
+// partialMatch,
+// acceptFlags,
+// true/* consider secondary types */,
+// false/* do NOT wait for indexes */,
+// checkRestrictions,
+// null);
+// }
+// return suggestedAnswer;
+// }
/**
* Find type considering secondary types but without waiting for indexes.
@@ -1084,27 +993,7 @@ public class NameLookup implements SuffixConstants {
}
/**
* Find type. Considering secondary types and waiting for indexes depends on given corresponding parameters.
- */
- public Answer findType(
- String typeName,
- String packageName,
- boolean partialMatch,
- int acceptFlags,
- boolean considerSecondaryTypes,
- boolean waitForIndexes,
- boolean checkRestrictions,
- IProgressMonitor monitor) {
-
- return findType(typeName,
- packageName,
- partialMatch,
- acceptFlags,
- considerSecondaryTypes,
- waitForIndexes,
- checkRestrictions,
- monitor,
- IModuleContext.UNNAMED_MODULE_CONTEXT);
- }
+ */
public Answer findType(
String typeName,
String packageName,
@@ -1120,7 +1009,7 @@ public class NameLookup implements SuffixConstants {
packageName= IPackageFragment.DEFAULT_PACKAGE_NAME;
} else if (typeName.length() > 0 && ScannerHelper.isLowerCase(typeName.charAt(0))) {
// see if this is a known package and not a type
- // TODO: Should check only in the provided roots
+ // TODO: Should we check only in the provided roots?
if (findPackageFragments(packageName + "." + typeName, false) != null) return null; //$NON-NLS-1$
}
// Try to find type in package fragments list
@@ -1209,8 +1098,7 @@ public class NameLookup implements SuffixConstants {
boolean considerSecondaryTypes,
boolean waitForIndexes,
boolean checkRestrictions,
- IProgressMonitor monitor,
- IModuleContext context) {
+ IProgressMonitor monitor) {
if (packageName == null || packageName.length() == 0) {
packageName= IPackageFragment.DEFAULT_PACKAGE_NAME;
} else if (typeName.length() > 0 && ScannerHelper.isLowerCase(typeName.charAt(0))) {
@@ -1220,84 +1108,10 @@ public class NameLookup implements SuffixConstants {
// Look for concerned package fragments
JavaElementRequestor elementRequestor = new JavaElementRequestor();
- seekPackageFragments(packageName, false, elementRequestor, context);
+ seekPackageFragments(packageName, false, elementRequestor);
IPackageFragment[] packages= elementRequestor.getPackageFragments();
return findType(typeName, packageName, packages, partialMatch, acceptFlags, considerSecondaryTypes, waitForIndexes, checkRestrictions, monitor);
-// // Try to find type in package fragments list
-// IType type = null;
-// int length= packages.length;
-// HashSet projects = null;
-// IJavaProject javaProject = null;
-// Answer suggestedAnswer = null;
-// for (int i= 0; i < length; i++) {
-// type = findType(typeName, packages[i], partialMatch, acceptFlags, waitForIndexes, considerSecondaryTypes);
-// if (type != null) {
-// AccessRestriction accessRestriction = null;
-// PackageFragmentRoot root = (PackageFragmentRoot) type.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
-// ClasspathEntry entry = (ClasspathEntry) this.rootToResolvedEntries.get(root);
-// if (entry != null) { // reverse map always contains resolved CP entry
-// if (checkRestrictions) {
-// accessRestriction = getViolatedRestriction(typeName, packageName, entry, accessRestriction);
-// }
-// }
-// Answer answer = new Answer (type, accessRestriction, entry, getModule(root));
-// if (!answer.ignoreIfBetter()) {
-// if (answer.isBetter(suggestedAnswer))
-// return answer;
-// } else if (answer.isBetter(suggestedAnswer))
-// // remember suggestion and keep looking
-// suggestedAnswer = answer;
-// }
-// else if (suggestedAnswer == null && considerSecondaryTypes) {
-// if (javaProject == null) {
-// javaProject = packages[i].getJavaProject();
-// } else if (projects == null) {
-// if (!javaProject.equals(packages[i].getJavaProject())) {
-// projects = new HashSet(3);
-// projects.add(javaProject);
-// projects.add(packages[i].getJavaProject());
-// }
-// } else {
-// projects.add(packages[i].getJavaProject());
-// }
-// }
-// }
-// if (suggestedAnswer != null)
-// // no better answer was found
-// return suggestedAnswer;
-//
-// // If type was not found, try to find it as secondary in source folders
-// if (considerSecondaryTypes && javaProject != null) {
-// if (projects == null) {
-// type = findSecondaryType(packageName, typeName, javaProject, waitForIndexes, monitor);
-// } else {
-// Iterator allProjects = projects.iterator();
-// while (type == null && allProjects.hasNext()) {
-// type = findSecondaryType(packageName, typeName, (IJavaProject) allProjects.next(), waitForIndexes, monitor);
-// }
-// }
-// }
-// if (type != null) {
-// ICompilationUnit unit = type.getCompilationUnit();
-// if (unit != null && unit.isWorkingCopy()) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=421902
-// IType[] types = null;
-// try {
-// types = unit.getTypes();
-// } catch (JavaModelException e) {
-// return null;
-// }
-// boolean typeFound = false;
-// for (int i = 0, typesLength = types == null ? 0 : types.length; i < typesLength; i++) {
-// if (types[i].getElementName().equals(typeName)) {
-// typeFound = true;
-// break;
-// }
-// }
-// if (!typeFound) type = null;
-// }
-// }
-// return type == null ? null : new Answer(type, null, null);
}
public IModule getModuleDescriptionInfo(IModuleDescription moduleDesc) {
@@ -1486,41 +1300,6 @@ public class NameLookup implements SuffixConstants {
}
return false;
}
- public boolean isPackage(String[] pkgName, IModuleContext context) {
- if (context == IModuleContext.UNNAMED_MODULE_CONTEXT)
- return isPackage(pkgName);
-
- Object value = this.packageFragments.get(pkgName);
- // TODO: need better representation of IModuleEnvironment and IModulePathEntry
- // in the model to avoid this kind of comparison
- return context.getEnvironment().anyMatch(e -> {
- if (value instanceof PackageFragmentRoot) {
- PackageFragmentRoot root = (PackageFragmentRoot)value;
- IModuleDescription mod = root.getModuleDescription();
- try {
- Roots env = (Roots) getModuleEnvironmentFor(mod == null ? null : mod.getElementName().toCharArray());
- return env.isIncludedIn(e);
- } catch (JavaModelException e1) {
- // not expected
- }
- } else {
- IPackageFragmentRoot[] roots = (IPackageFragmentRoot[]) value;
- if (roots != null) {
- for (int i = 0, length = roots.length; i < length; i++) {
- PackageFragmentRoot root = (PackageFragmentRoot) roots[i];
- IModuleDescription mod = root.getModuleDescription();
- try {
- Roots env = (Roots) getModuleEnvironmentFor(mod == null ? null : mod.getElementName().toCharArray());
- if (env.isIncludedIn(e)) return true;
- } catch (JavaModelException e1) {
- // not expected
- }
- }
- }
- }
- return false;
- });
- }
/**
* Returns true if the given element's name matches the
* specified <code>searchName</code>, otherwise false.
@@ -1572,100 +1351,27 @@ public class NameLookup implements SuffixConstants {
seekPackageFragments(name, partialMatch, requestor);
return;
}
- if (partialMatch) {
- seekModuleAwarePartialPackageFragments(name, requestor, context);
- return;
- }
-
+ boolean allPrefixMatch = name.equals("*"); //$NON-NLS-1$
String[] splittedName = Util.splitOn('.', name, 0, name.length());
- int pkgIndex = this.packageFragments.getIndex(splittedName);
- if (pkgIndex == -1)
- return;
- checkModulePackages(requestor, context, pkgIndex);
-
- }
- /**
- * Notifies the given requestor of all package fragments with the
- * given name. Checks the requestor at regular intervals to see if the
- * requestor has canceled. The domain of
- * the search is bounded by the <code>IJavaProject</code>
- * this <code>NameLookup</code> was obtained from.
- *
- * @param partialMatch partial name matches qualify when <code>true</code>;
- * only exact name matches qualify when <code>false</code>
- */
- public void seekTypes(String pkgName, String name, boolean partialMatch, IJavaElementRequestor requestor,
- int acceptFlags, IModuleContext context, String moduleName) {
- Selector selector = new Selector(moduleName);
- seekPackageFragments(pkgName, true /*partialMatch*/, selector, context);
- if (selector.pkgFragments.size() == 0) return;
- for (IPackageFragment pkg : selector.pkgFragments) {
- seekTypes(name, pkg, partialMatch, acceptFlags, requestor);
- }
- }
-
- private void seekModuleAwarePartialPackageFragments(String name, IJavaElementRequestor requestor, IModuleContext context) {
- boolean allPrefixMatch = CharOperation.equals(name.toCharArray(), CharOperation.ALL_PREFIX);
- Arrays.stream(this.packageFragments.keyTable)
- .filter(k -> k != null)
- .filter(k -> allPrefixMatch || Util.concatWith((String[])k, '.').startsWith(name))
- .forEach(k -> {
- checkModulePackages(requestor, context, this.packageFragments.getIndex(k));
- });
- }
-
- private void checkModulePackages(IJavaElementRequestor requestor, IModuleContext context, int pkgIndex) {
- Object value = this.packageFragments.valueTable[pkgIndex];
- // reuse existing String[]
- String[] pkgName = (String[]) this.packageFragments.keyTable[pkgIndex];
- context.getEnvironment().forEach(r -> {
- if (value instanceof PackageFragmentRoot) {
-// Object toCompare = value;
-// // TODO: need better representation of IModuleEnvironment and IModulePathEntry
-// // in the model to avoid comparison based on instance
-// if (r instanceof JavaProject) {
-// toCompare = ((PackageFragmentRoot)value).getJavaProject();
-// }
-// if (r.equals(toCompare)) {
-// PackageFragmentRoot root = (PackageFragmentRoot) value;
-// requestor.acceptPackageFragment(root.getPackageFragment(pkgName));
-// }
- IModuleDescription mod = ((PackageFragmentRoot)value).getModuleDescription();
- try {
- Roots env = (Roots) getModuleEnvironmentFor(mod == null ? null : mod.getElementName().toCharArray());
- if (env.isIncludedIn(r)) {
- PackageFragmentRoot root = (PackageFragmentRoot) value;
- requestor.acceptPackageFragment(root.getPackageFragment(pkgName));
- }
- } catch (JavaModelException e1) {
- // not expected
- }
- } else {
- IPackageFragmentRoot[] roots = (IPackageFragmentRoot[]) value;
- if (roots != null) {
- for (int i = 0, length = roots.length; i < length; i++) {
- if (requestor.isCanceled())
- return;
+ Stream.of(this.packageFragments.keyTable)
+ .filter(k -> k != null && (allPrefixMatch || Util.startsWithIgnoreCase((String[]) k, splittedName, partialMatch)))
+ .filter(k -> { // include only packages in the given context
+ String pkgName = Util.concatWith((String[]) k, '.');
+ return context.getEnvironment().anyMatch(e -> e.isPackage(pkgName));
+ }).forEach(k -> {
+ int pkgIndex = this.packageFragments.getIndex(k);
+ Object value = this.packageFragments.valueTable[pkgIndex];
+ if (value instanceof PackageFragmentRoot) {
+ PackageFragmentRoot root = (PackageFragmentRoot) value;
+ requestor.acceptPackageFragment(root.getPackageFragment((String[]) k));
+ } else {
+ IPackageFragmentRoot[] roots = (IPackageFragmentRoot[]) value;
+ for (int i = 0; i < roots.length; i++) {
PackageFragmentRoot root = (PackageFragmentRoot) roots[i];
- IModuleDescription mod = root.getModuleDescription();
- try {
- Roots env = (Roots) getModuleEnvironmentFor(mod == null ? null : mod.getElementName().toCharArray());
- if (env.isIncludedIn(r)) {
- requestor.acceptPackageFragment(root.getPackageFragment(pkgName));
- }
- } catch (JavaModelException e1) {
- // not expected
- }
-// Object toCompare = root;
-// if (r instanceof JavaProject) {
-// toCompare = root.getJavaProject();
-// }
-// if (r.equals(toCompare))
-// requestor.acceptPackageFragment(root.getPackageFragment(pkgName));
+ requestor.acceptPackageFragment(root.getPackageFragment((String[]) k));
}
}
- }
- });
+ });
}
@FunctionalInterface
@@ -1777,36 +1483,6 @@ public class NameLookup implements SuffixConstants {
}
}
- public IModuleEnvironment getModuleEnvironmentFor(char[] moduleName) throws JavaModelException {
- if (moduleName == null || moduleName.length == 0) {
- List<IPackageFragmentRoot> roots = Stream.of(this.packageFragmentRoots).filter(root -> !(root instanceof IModulePathEntry) && root.getModuleDescription() == null).collect(Collectors.toList());
- return roots.isEmpty() ? null : new Roots(roots.toArray(new IPackageFragmentRoot[roots.size()]));
- }
- String name = CharOperation.charToString(moduleName);
- IModulePathEntry entry = JavaModelManager.getModulePathManager().getModuleRoot(name);
- if (entry != null) {
- IModule module = JavaModelManager.getModulePathManager().getModule(moduleName);
- return entry.getLookupEnvironmentFor(module);
- }
- // revisit PackageFragmentRoot being a IModuleEnvironment
- // It is not ideal to expect a java model element to cater to type lookup.
- // Besides, the JrtPFR seemed to have only bogus implementation anyway.
-// int count= this.packageFragmentRoots.length;
-// for (int i= 0; i < count; i++) {
-// IPackageFragmentRoot root= this.packageFragmentRoots[i];
-// if (root instanceof JrtPackageFragmentRoot) {
-// if (CharOperation.equals(moduleName, root.getElementName().toCharArray())) {
-// return new Roots(new IPackageFragmentRoot[]{root});
-// }
-// }
-// }
- IPackageFragmentRoot root = Stream.of(this.packageFragmentRoots).filter(r -> {
- IModuleDescription desc = r.getModuleDescription();
- return desc != null && CharOperation.equals(desc.getElementName().toCharArray(), moduleName);
- }).findFirst().orElse(null);
-
- return root == null ? null : new Roots(new IPackageFragmentRoot[] {root});
- }
public void seekModules(char[] name, JavaElementRequestor requestor) {
seekModule(name, false, requestor);
}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ProjectEntry.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ProjectEntry.java
index 78b3d3ed5c..df0c5a1be9 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ProjectEntry.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ProjectEntry.java
@@ -14,13 +14,7 @@
*******************************************************************************/
package org.eclipse.jdt.internal.core;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IModuleDescription;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.compiler.env.IModule;
import org.eclipse.jdt.internal.compiler.env.IModuleEnvironment;
@@ -54,29 +48,29 @@ public class ProjectEntry implements IModulePathEntry {
@Override
public IModuleEnvironment getLookupEnvironment() {
//
- return this.project;
+ return null;//this.project;
}
@Override
public IModuleEnvironment getLookupEnvironmentFor(IModule module) {
//
- if (getModule() == module) {
- try {
- ArrayList<IPackageFragmentRoot> children = this.project.getChildrenOfType(IJavaElement.PACKAGE_FRAGMENT_ROOT);
- List<IPackageFragmentRoot> srcRoots = children.stream().filter(r -> {
- try {
- return r instanceof PackageFragmentRoot && r.getKind() == IPackageFragmentRoot.K_SOURCE;
- } catch (JavaModelException e) {
- //
- }
- return false;
- }).collect(Collectors.toList());
- return new NameLookup.Roots(srcRoots.toArray(new PackageFragmentRoot[srcRoots.size()]));
- } catch (JavaModelException e) {
- //
- }
-// return this.project;
- }
+// if (getModule() == module) {
+// try {
+// ArrayList<IPackageFragmentRoot> children = this.project.getChildrenOfType(IJavaElement.PACKAGE_FRAGMENT_ROOT);
+// List<IPackageFragmentRoot> srcRoots = children.stream().filter(r -> {
+// try {
+// return r instanceof PackageFragmentRoot && r.getKind() == IPackageFragmentRoot.K_SOURCE;
+// } catch (JavaModelException e) {
+// //
+// }
+// return false;
+// }).collect(Collectors.toList());
+// return new NameLookup.Roots(srcRoots.toArray(new PackageFragmentRoot[srcRoots.size()]));
+// } catch (JavaModelException e) {
+// //
+// }
+//// return this.project;
+// }
return null;
}
@Override
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 96af390d6f..d3c3eebf9a 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
@@ -121,9 +121,7 @@ public class SearchableEnvironment
String[] pkgName = new String[length];
for (int i = 0; i < length; i++)
pkgName[i] = new String(splitName[i]);
- return
- (this.owner != null && this.owner.isPackage(pkgName))
- || this.nameLookup.isPackage(pkgName, moduleName);
+ return this.nameLookup.isPackage(pkgName, moduleName);
};
}
protected NameEnvironmentAnswer findType(String typeName, String packageName, IPackageFragment[] packages) {
@@ -197,8 +195,7 @@ public class SearchableEnvironment
packageName,
false/*exact match*/,
NameLookup.ACCEPT_ALL,
- this.checkAccessRestrictions,
- context);
+ this.checkAccessRestrictions);
if (answer != null) {
// construct name env answer
if (answer.type instanceof BinaryType) { // BinaryType
@@ -815,21 +812,22 @@ public class SearchableEnvironment
* @see ModuleEnvironment#isPackage(char[][], char[])
*/
public boolean isPackage(char[][] parentPackageName, char[] subPackageName, IModuleContext moduleContext) {
-// String[] pkgName;
-// if (parentPackageName == null)
-// pkgName = new String[] {new String(subPackageName)};
-// else {
-// int length = parentPackageName.length;
-// pkgName = new String[length+1];
-// for (int i = 0; i < length; i++)
-// pkgName[i] = new String(parentPackageName[i]);
-// pkgName[length] = new String(subPackageName);
-// }
-// return
-// (this.owner != null && this.owner.isPackage(pkgName))
-// || this.nameLookup.isPackage(pkgName, moduleContext);
- return moduleContext.getEnvironment().map(e -> e.packageLookup())
- .filter(l -> l.isPackage(new String(CharOperation.concatWith(parentPackageName, subPackageName, '.')))).findAny().isPresent();
+ String[] pkgName;
+ if (parentPackageName == null)
+ pkgName = new String[] {new String(subPackageName)};
+ else {
+ int length = parentPackageName.length;
+ pkgName = new String[length+1];
+ for (int i = 0; i < length; i++)
+ pkgName[i] = new String(parentPackageName[i]);
+ pkgName[length] = new String(subPackageName);
+ }
+ if (this.owner != null && this.owner.isPackage(pkgName))
+ return true;
+ return moduleContext == IModuleContext.UNNAMED_MODULE_CONTEXT ? this.nameLookup.isPackage(pkgName)
+ : moduleContext.getEnvironment().map(e -> e.packageLookup()).filter(
+ l -> l.isPackage(new String(CharOperation.concatWith(parentPackageName, subPackageName, '.'))))
+ .findAny().isPresent();
}
/**
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJrt.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJrt.java
index 276b14f6f7..82c35d7518 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJrt.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJrt.java
@@ -24,7 +24,6 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
-import java.util.function.Function;
import java.util.zip.ZipFile;
import org.eclipse.core.runtime.IPath;
@@ -56,15 +55,18 @@ private String externalAnnotationPath;
private ZipFile annotationZipFile;
String zipFilename; // keep for equals
-protected Function<char[], ITypeLookup> typeLookupForModule = modName ->
-(typeName, qualifiedPackageName, qualifiedBinaryFileName, asBinaryOnly) -> {
-return typeLookup().findClass(typeName, qualifiedPackageName, qualifiedBinaryFileName, asBinaryOnly, modName);
-};
+protected ITypeLookup typeLookupForModule(char[] modName) {
+ return (typeName, qualifiedPackageName, qualifiedBinaryFileName, asBinaryOnly) -> {
+ return typeLookup().findClass(typeName, qualifiedPackageName, qualifiedBinaryFileName, asBinaryOnly,
+ modName);
+ };
+}
-protected Function<char[], IPackageLookup> pkgLookupForModule = modName ->
-qualifiedPackageName -> {
-return packageLookup().isPackage(qualifiedPackageName, modName);
-};
+protected IPackageLookup pkgLookupForModule(char[] modName) {
+ return qualifiedPackageName -> {
+ return packageLookup().isPackage(qualifiedPackageName, modName);
+ };
+}
public ClasspathJrt(String zipFilename, IPath externalAnnotationPath, INameEnvironment env) {
this.zipFilename = zipFilename;
@@ -303,18 +305,20 @@ public IModuleEnvironment getLookupEnvironment() {
@Override
public IModuleEnvironment getLookupEnvironmentFor(IModule mod) {
//
+ if (mod == null || !servesModule(mod.name()))
+ return null;
return new IModuleEnvironment() {
@Override
public ITypeLookup typeLookup() {
//
- return servesModule(mod.name()) ? ClasspathJrt.this.typeLookupForModule.apply(mod.name()) : ITypeLookup.Dummy;
+ return ClasspathJrt.this.typeLookupForModule(mod.name());
}
@Override
public IPackageLookup packageLookup() {
//
- return servesModule(mod.name()) ? ClasspathJrt.this.pkgLookupForModule.apply(mod.name()) : IPackageLookup.Dummy;
+ return ClasspathJrt.this.pkgLookupForModule(mod.name());
}
};
}

Back to the top