Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Herrmann2018-12-04 22:06:22 +0000
committerStephan Herrmann2018-12-16 18:11:34 +0000
commit391dfa15865398c9e23bedf36d40d0b48eaac38c (patch)
tree714202e8dce02e7a264b7ea6c4359fb835fd2023
parentda7450b0a69f7f564c4e3f809ea549e893a6df56 (diff)
downloadeclipse.jdt.core-I20181216-1800.tar.gz
eclipse.jdt.core-I20181216-1800.tar.xz
eclipse.jdt.core-I20181216-1800.zip
Bug 541217 - Presence of module-info.java in project breaks typeI20181216-1800
hierarchy results Change-Id: I6a4d478a709b008ec4b581789b2ff260315df95c Signed-off-by: Stephan Herrmann <stephan.herrmann@berlin.de> Also-by: Roland Grunberg <rgrunber@redhat.com>
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java31
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java15
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.java6
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java21
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java4
5 files changed, 71 insertions, 6 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java
index e0d0955516..573ad9a857 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java
@@ -3076,4 +3076,35 @@ public void testBug533949() throws CoreException {
if (javaProject2 != null) deleteProject(javaProject2);
}
}
+
+public void testBug541217() throws CoreException {
+ if (!isJRE9) return;
+ IJavaProject javaProject1 = null;
+ try {
+ javaProject1 = createJava9Project("mod1");
+ String packA = "/mod1/src/a/";
+ createFolder(packA);
+ createFile(packA + "A.java",
+ "package a;\n" +
+ "public interface A extends java.sql.Driver{\n"+
+ "}\n");
+ createFile("/mod1/src/module-info.java",
+ "module mod1 {\n" +
+ " requires java.sql;\n"+
+ " exports a;\n"+
+ "}\n");
+
+ waitUntilIndexesReady();
+
+ IType focus = javaProject1.findType("java.sql.Driver");
+ ITypeHierarchy hierarchy = focus.newTypeHierarchy(null);
+ IType[] allSubTypes = hierarchy.getAllSubtypes(focus);
+ assertTypesEqual("Incorrect sub hierarchy",
+ "a.A\n",
+ allSubTypes,
+ true);
+ } finally{
+ if (javaProject1 != null) deleteProject(javaProject1);
+ }
+}
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
index 7c37358a0b..e06463c6b8 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
@@ -1441,6 +1441,21 @@ public AccessRestriction getAccessRestriction(TypeBinding type) {
* assuming C is a type in both cases. In the a.b.C.D.E case, null is the answer.
*/
public ReferenceBinding getCachedType(char[][] compoundName) {
+ ReferenceBinding result = getCachedType0(compoundName);
+ if (result == null && this.useModuleSystem) {
+ ModuleBinding[] modulesToSearch = this.module.isUnnamed() || this.module.isAuto
+ ? this.root.knownModules.valueTable
+ : this.module.getAllRequiredModules();
+ for (ModuleBinding someModule : modulesToSearch) {
+ if (someModule == null) continue;
+ result = someModule.environment.getCachedType0(compoundName);
+ if (result != null && result.isValidBinding())
+ break;
+ }
+ }
+ return result;
+}
+public ReferenceBinding getCachedType0(char[][] compoundName) {
if (compoundName.length == 1) {
return this.defaultPackage.getType0(compoundName[0]);
}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.java
index 0c7c04c412..b492fa1dc2 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
+ * Copyright (c) 2000, 2018 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -276,9 +276,9 @@ public abstract class HierarchyBuilder {
/**
* Create an ICompilationUnit info from the given compilation unit on disk.
*/
- protected ICompilationUnit createCompilationUnitFromPath(Openable handle, IFile file) {
+ protected ICompilationUnit createCompilationUnitFromPath(Openable handle, IFile file, char[] moduleName) {
final char[] elementName = handle.getElementName().toCharArray();
- return new ResourceCompilationUnit(file, null) {
+ return new ResourceCompilationUnit(file, moduleName) {
@Override
public char[] getFileName() {
return elementName;
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java
index a0d72dcf13..9bce2a4b97 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java
@@ -37,6 +37,8 @@ import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.jdt.core.IModuleDescription;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
@@ -753,7 +755,7 @@ public void resolve(Openable[] openables, HashSet localTypes, IProgressMonitor m
} else {
// create parsed unit from file
IFile file = (IFile) cu.getResource();
- ICompilationUnit sourceUnit = this.builder.createCompilationUnitFromPath(openable, file);
+ ICompilationUnit sourceUnit = this.builder.createCompilationUnitFromPath(openable, file, findAssociatedModuleName(openable));
CompilationResult unitResult = new CompilationResult(sourceUnit, i, openablesLength, this.options.maxProblemsPerUnit);
parsedUnit = parser.dietParse(sourceUnit, unitResult);
}
@@ -891,6 +893,23 @@ public void resolve(Openable[] openables, HashSet localTypes, IProgressMonitor m
reset();
}
}
+
+private char[] findAssociatedModuleName(Openable openable) {
+ IModuleDescription module = null;
+ IPackageFragmentRoot root = openable.getPackageFragmentRoot();
+ try {
+ if (root.getKind() == IPackageFragmentRoot.K_SOURCE)
+ module = root.getJavaProject().getModuleDescription(); // from any root in this project
+ else
+ module = root.getModuleDescription();
+ } catch (JavaModelException jme) {
+ // ignore, cannot associate to any module
+ }
+ if (module != null)
+ return module.getElementName().toCharArray();
+ return null;
+}
+
private void setEnvironment(LookupEnvironment lookupEnvironment, HierarchyBuilder builder) {
this.lookupEnvironment = lookupEnvironment;
this.builder = builder;
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java
index 216d1e12a4..3ff7bca478 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java
@@ -404,8 +404,8 @@ private void buildFromPotentialSubtypes(String[] allPotentialSubTypes, HashSet l
}
}
@Override
-protected ICompilationUnit createCompilationUnitFromPath(Openable handle, IFile file) {
- ICompilationUnit unit = super.createCompilationUnitFromPath(handle, file);
+protected ICompilationUnit createCompilationUnitFromPath(Openable handle, IFile file, char[] moduleName) {
+ ICompilationUnit unit = super.createCompilationUnitFromPath(handle, file, moduleName);
this.cuToHandle.put(unit, handle);
return unit;
}

Back to the top