diff options
author | Stephan Herrmann | 2018-12-04 22:06:22 +0000 |
---|---|---|
committer | Stephan Herrmann | 2018-12-16 18:11:34 +0000 |
commit | 391dfa15865398c9e23bedf36d40d0b48eaac38c (patch) | |
tree | 714202e8dce02e7a264b7ea6c4359fb835fd2023 | |
parent | da7450b0a69f7f564c4e3f809ea549e893a6df56 (diff) | |
download | eclipse.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>
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; } |