diff options
| author | Stephan Herrmann | 2017-07-06 21:22:46 +0000 |
|---|---|---|
| committer | Stephan Herrmann | 2017-07-06 21:56:27 +0000 |
| commit | c2d14a1f165c1fc082bde2bfc0ca85051a03a917 (patch) | |
| tree | a622cedace815f4f71ef028ce2a46da3494060e5 | |
| parent | c00bc3fdd83212c5995041d716296940002538ab (diff) | |
| download | eclipse.jdt.core-c2d14a1f165c1fc082bde2bfc0ca85051a03a917.tar.gz eclipse.jdt.core-c2d14a1f165c1fc082bde2bfc0ca85051a03a917.tar.xz eclipse.jdt.core-c2d14a1f165c1fc082bde2bfc0ca85051a03a917.zip | |
Bug 518668: [9][test] ASTConverter tests failure
- reinstate "requires java.base" in all ModuleBinding (compiler & DOM)
3 files changed, 36 insertions, 19 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter9Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter9Test.java index 09651971a5..1897fe86cc 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter9Test.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter9Test.java @@ -442,7 +442,7 @@ public class ASTConverter9Test extends ConverterTestSetup { ASTNode unit3 = runConversion(AST_INTERNAL_JLS9, sourceUnit3, true); assertEquals("Not a compilation unit", ASTNode.COMPILATION_UNIT, unit3.getNodeType()); ModuleDeclaration moduleDecl3 = ((CompilationUnit) unit3).getModule(); - IModuleBinding firstModAsBinary = moduleDecl3.resolveBinding().getRequiredModules()[0]; + IModuleBinding firstModAsBinary = moduleDecl3.resolveBinding().getRequiredModules()[1]; // skip java.base assertModuleFirstDetails(firstModAsBinary); @@ -466,10 +466,11 @@ public class ASTConverter9Test extends ConverterTestSetup { IModuleBinding[] reqs = moduleBinding.getRequiredModules(); assertTrue("Null requires", reqs != null); - assertTrue("incorrect number of requires modules", reqs.length == 1); - assertTrue("incorrect name for requires modules", reqs[0].getName().equals("second")); + assertTrue("incorrect number of requires modules", reqs.length == 2); + assertTrue("incorrect name for requires modules", reqs[0].getName().equals("java.base")); + assertTrue("incorrect name for requires modules", reqs[1].getName().equals("second")); - IPackageBinding[] secPacks = reqs[0].getExportedPackages(); + IPackageBinding[] secPacks = reqs[1].getExportedPackages(); assertTrue("Packages Exported in second module null", secPacks != null); assertTrue("Incorrect number of exported packages in second module", secPacks.length == 1); IPackageBinding pack22 = secPacks[0]; diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceModuleBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceModuleBinding.java index c6a1f27401..95461bc201 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceModuleBinding.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceModuleBinding.java @@ -37,16 +37,19 @@ public class SourceModuleBinding extends ModuleBinding { public void setRequires(ModuleBinding[] requires, ModuleBinding[] requiresTransitive) { // TODO(SHMOD): it's a bit awkward that we may get called after applyModuleUpdates() has already worked. - this.requires = merge(this.requires, requires, ModuleBinding[]::new); - this.requiresTransitive = merge(this.requiresTransitive, requiresTransitive, ModuleBinding[]::new); + ModuleBinding javaBase = this.environment.javaBaseModule(); + if (javaBase.isUnnamed()) // happens when no java.base can be found in the name environment. + javaBase = null; + this.requires = merge(this.requires, requires, javaBase, ModuleBinding[]::new); + this.requiresTransitive = merge(this.requiresTransitive, requiresTransitive, null, ModuleBinding[]::new); } public void setUses(TypeBinding[] uses) { - this.uses = merge(this.uses, uses, TypeBinding[]::new); + this.uses = merge(this.uses, uses, null, TypeBinding[]::new); } public void setServices(TypeBinding[] services) { - this.services = merge(this.services, services, TypeBinding[]::new); + this.services = merge(this.services, services, null, TypeBinding[]::new); } public void setImplementations(TypeBinding infBinding, Collection<TypeBinding> resolvedImplementations) { @@ -55,17 +58,20 @@ public class SourceModuleBinding extends ModuleBinding { this.implementations.put(infBinding, resolvedImplementations.toArray(new TypeBinding[resolvedImplementations.size()])); } - private <T> T[] merge(T[] one, T[] two, IntFunction<T[]> supplier) { - if (one.length == 0) { + private <T> T[] merge(T[] one, T[] two, T extra, IntFunction<T[]> supplier) { + if (one.length == 0 && extra == null) { if (two.length > 0) return two; return one; } + int len0 = extra == null ? 0 : 1; int len1 = one.length; int len2 = two.length; - T[] result = supplier.apply(len1+len2); - System.arraycopy(one, 0, result, 0, len1); - System.arraycopy(two, 0, result, len1, len2); + T[] result = supplier.apply(len0+len1+len2); + if (extra != null) + result[0] = extra; + System.arraycopy(one, 0, result, len0, len1); + System.arraycopy(two, 0, result, len0+len1, len2); return result; } diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ModuleDescriptionInfo.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ModuleDescriptionInfo.java index d0e058a4b0..97d5da0639 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ModuleDescriptionInfo.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ModuleDescriptionInfo.java @@ -26,6 +26,7 @@ import org.eclipse.jdt.internal.compiler.ast.RequiresStatement; import org.eclipse.jdt.internal.compiler.ast.TypeReference; import org.eclipse.jdt.internal.compiler.ast.UsesStatement; import org.eclipse.jdt.internal.compiler.env.IModule; +import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; public class ModuleDescriptionInfo extends AnnotatableInfo implements IModule { @@ -205,14 +206,17 @@ public class ModuleDescriptionInfo extends AnnotatableInfo implements IModule { mod.isOpen = module.isOpen(); if (module.requiresCount > 0) { RequiresStatement[] refs = module.requires; - mod.requires = new ModuleReferenceInfo[refs.length]; + mod.requires = new ModuleReferenceInfo[refs.length+1]; + mod.requires[0] = getJavaBaseReference(); for (int i = 0; i < refs.length; i++) { - mod.requires[i] = new ModuleReferenceInfo(); - mod.requires[i].name = CharOperation.concatWith(refs[i].module.tokens, '.'); // Check why ModuleReference#tokens must be a char[][] and not a char[] or String; - mod.requires[i].modifiers = refs[i].modifiers; + mod.requires[i+1] = new ModuleReferenceInfo(); + mod.requires[i+1].name = CharOperation.concatWith(refs[i].module.tokens, '.'); // Check why ModuleReference#tokens must be a char[][] and not a char[] or String; + mod.requires[i+1].modifiers = refs[i].modifiers; } } else { - mod.requires = NO_REQUIRES; + mod.requires = CharOperation.equals(module.moduleName, TypeConstants.JAVA_BASE) + ? NO_REQUIRES + : new ModuleReferenceInfo[] { getJavaBaseReference() }; } if (module.exportsCount > 0) { ExportsStatement[] refs = module.exports; @@ -255,6 +259,12 @@ public class ModuleDescriptionInfo extends AnnotatableInfo implements IModule { return mod; } + private static ModuleReferenceInfo getJavaBaseReference() { + ModuleReferenceInfo ref = new ModuleReferenceInfo(); + ref.name = TypeConstants.JAVA_BASE; + return ref; + } + private static PackageExportInfo createPackageExport(ExportsStatement ref) { PackageExportInfo exp = new PackageExportInfo(); exp.pack = ref.pkgName; @@ -370,7 +380,7 @@ public class ModuleDescriptionInfo extends AnnotatableInfo implements IModule { buffer.append('\n'); for(int i = 0; i < this.usedServices.length; i++) { buffer.append("\tuses "); //$NON-NLS-1$ - buffer.append(this.usedServices[i].toString()).append('\n'); + buffer.append(this.usedServices[i]).append('\n'); } } if (this.services != null && this.services.length > 0) { |
