Mercurial > hg > openjdk > jigsaw > langtools
changeset 273:9359f5d70528 j1-2009-demo
javac: Modules -- provide default platform requires if none specified
javac: Modules -- use "synthetic" flag on default requires
javac: ZeroMod -- ignore platform requires for now
author | jjg |
---|---|
date | Wed, 20 May 2009 16:14:25 -0700 |
parents | d9cf7132c862 |
children | 8407fceeb6d9 652f05d99b9e |
files | src/share/classes/com/sun/tools/javac/comp/Modules.java src/share/classes/com/sun/tools/javac/util/Names.java src/share/classes/javax/lang/model/util/ModuleResolver.java test/tools/javac/modules/ModuleRequiresAttributeTest01.java |
diffstat | 4 files changed, 108 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javac/comp/Modules.java Fri May 15 15:52:06 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/Modules.java Wed May 20 16:14:25 2009 -0700 @@ -103,10 +103,19 @@ /** The symbol currently being analyzed. */ ModuleSymbol currSym; - Env<JCModuleDecl> env; - Map<ModuleSymbol, Env<JCModuleDecl>> moduleEnvs = new HashMap<ModuleSymbol, Env<JCModuleDecl>>(); + static class ModuleContext { + ModuleContext(JCModuleDecl decl) { + this.decl = decl; + } + final JCModuleDecl decl; + boolean seenPlatformRequires; + } - /** True if seen module declaration in input trees. */ + Env<ModuleContext> env; + Map<ModuleSymbol, Env<ModuleContext>> moduleEnvs = new HashMap<ModuleSymbol, Env<ModuleContext>>(); + + /** True if file manager is not a ModuleFileManager and we have + * seen module declaration in input trees. */ boolean moduleFileManagerUnavailable; public static Modules instance(Context context) { @@ -186,12 +195,17 @@ } currSym = sym; - Env<JCModuleDecl> menv = env.dup(tree, tree); + Env<ModuleContext> menv = env.dup(tree, new ModuleContext(tree)); moduleEnvs.put(sym, menv); - Env<JCModuleDecl> prev = env; + Env<ModuleContext> prev = env; env = menv; try { acceptAll(tree.metadata); + + if (!env.info.seenPlatformRequires) { + ModuleId mid = getDefaultPlatformModule(); + sym.requires.put(mid, new ModuleRequires(mid, List.of(names.synthetic))); + } } finally { currSym = null; env = prev; @@ -201,7 +215,7 @@ @Override public void visitTopLevel(JCCompilationUnit tree) { DEBUG("Modules.visitTopLevel " + tree.sourcefile); - env = new Env<JCModuleDecl>(tree, null); + env = new Env<ModuleContext>(tree, null); env.toplevel = tree; currTopLevel = tree; JavaFileObject prev = log.useSource(tree.sourcefile); @@ -226,7 +240,7 @@ } finally { currTopLevel = null; log.useSource(prev); - DEBUG("Modules.visitTopLevel EXIT rootLocns=" + rootLocns); + DEBUG("Modules.visitTopLevel EXIT rootLocns=" + rootLocns); } } @@ -258,6 +272,9 @@ ModuleId mid = new ModuleId(TreeInfo.fullName(moduleId.qualId), moduleId.version); // JIGSAW TODO check duplicates sym.requires.put(mid, new ModuleRequires(mid, tree.flags)); + ModuleResolver mr = getModuleResolver(); + if (mr.isPlatformName(mid.name)) + env.info.seenPlatformRequires = true; } } @@ -314,6 +331,24 @@ } } + ModuleId getDefaultPlatformModule() { + if (defaultPlatformModule == null) { + ModuleResolver mr = getModuleResolver(); + String def = mr.getDefaultPlatformModule(); + int at = def.indexOf("@"); + if (at == -1) + defaultPlatformModule = new ModuleId(names.fromString(def), null); + else { + Name name = names.fromString(def.substring(0, at).trim()); + Name version = names.fromString(def.substring(at + 1).trim()); + defaultPlatformModule = new ModuleId(name, version); + } + } + return defaultPlatformModule; + } + // where + private ModuleId defaultPlatformModule; + private boolean resolve(List<JCCompilationUnit> trees) { if (moduleFileManagerUnavailable) return false; @@ -359,8 +394,8 @@ } DEBUG("Modules.resolve: resolve modules"); - ModuleResolver moduleResolver = getModuleResolver(); - DEBUG("Modules.resolve: module resolver: " + moduleResolver); + ModuleResolver mr = getModuleResolver(); + DEBUG("Modules.resolve: module resolver: " + mr); try { ListBuffer<ModuleSymbol> namedModules = new ListBuffer<ModuleSymbol>(); for (ModuleSymbol msym: allModules.values()) { @@ -368,7 +403,7 @@ namedModules.add(msym); } Iterable<? extends ModuleElement> modules = - moduleResolver.resolve(roots, namedModules); + mr.resolve(roots, namedModules); ListBuffer<Location> locns = new ListBuffer<Location>(); for (ModuleElement me: modules) { @@ -390,27 +425,34 @@ } protected ModuleResolver getModuleResolver() { + if (moduleResolver != null) + return moduleResolver; ServiceLoader<ModuleResolver> loader = ServiceLoader.load(ModuleResolver.class); // for now, use the first available, if any - for (Iterator<ModuleResolver> iter = loader.iterator(); iter.hasNext(); ) - return iter.next(); + for (Iterator<ModuleResolver> iter = loader.iterator(); iter.hasNext(); ) { + moduleResolver = iter.next(); + return moduleResolver; + } // use Class.forName on jigsaw module resolve // use ZeroMod - return new ZeroMod(new ErrorHandler() { + moduleResolver = new ZeroMod(new ErrorHandler() { public void report(ModuleSymbol msym, ModuleId mid, String key, Object... args) { error(msym, mid, key, args); } }); + return moduleResolver; } + // where + private ModuleResolver moduleResolver; private void error(ModuleSymbol msym, ModuleId id, String key, Object... args) { // TODO, determine error location from msym, mid ClassSymbol minfo = msym.module_info; - Env<JCModuleDecl> menv = moduleEnvs.get(msym); + Env<ModuleContext> menv = moduleEnvs.get(msym); DEBUG("Modules.error " + msym + " -- " + moduleEnvs.get(msym)); JavaFileObject fo; JCDiagnostic.DiagnosticPosition pos; @@ -421,7 +463,7 @@ pos = null; } else { fo = menv.toplevel.sourcefile; - pos = treeFinder.find(menv.info, id); + pos = treeFinder.find(menv.info.decl, id); } JavaFileObject prev = log.useSource(fo); @@ -691,6 +733,15 @@ // where private Map<Name, Map<Name, ModuleSymbol>> moduleTable; + public boolean isPlatformName(CharSequence name) { + String n = name.toString(); + return n.equals("jdk") || n.startsWith("jdk."); // for now + } + + public String getDefaultPlatformModule() { + return "jdk@7-ea"; // for now + } + private class ModuleException extends Exception { private static final long serialVersionUID = 0; ModuleException(String key, ModuleId moduleId) { @@ -734,6 +785,10 @@ DEBUG("ZeroMod.Node.getDependencies: " + sym + " " + sym.requires); ListBuffer<Node> nodes = new ListBuffer<Node>(); for (ModuleRequires mr: sym.requires.values()) { + if (isPlatformName(mr.moduleId.name)) { + DEBUG("ZeroMod.Node.getDependencies: ignore platform module " + mr.moduleId.name); + continue; + } try { nodes.add(getNode(getModule(mr.moduleId))); } catch (ModuleException e) {
--- a/src/share/classes/com/sun/tools/javac/util/Names.java Fri May 15 15:52:06 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/util/Names.java Wed May 20 16:14:25 2009 -0700 @@ -147,6 +147,7 @@ public final Name requires; public final Name provides; public final Name permits; + public final Name synthetic; public final Name ModuleClass; public final Name ModulePermits; public final Name ModuleProvides; @@ -265,6 +266,7 @@ requires = fromString("requires"); provides = fromString("provides"); permits = fromString("permits"); + synthetic = fromString("synthetic"); ModuleClass = fromString("ModuleClass"); ModulePermits = fromString("ModulePermits"); ModuleProvides = fromString("ModuleProvides");
--- a/src/share/classes/javax/lang/model/util/ModuleResolver.java Fri May 15 15:52:06 2009 -0700 +++ b/src/share/classes/javax/lang/model/util/ModuleResolver.java Wed May 20 16:14:25 2009 -0700 @@ -24,6 +24,7 @@ */ package javax.lang.model.util; +// TODO: reconsider this package -- perhaps it belongs in com.sun.tools.javac.api import javax.lang.model.element.ModuleElement; @@ -36,7 +37,7 @@ public interface ModuleResolver { class ResolutionException extends Exception { - static final long serialVersionUID = 0; // FIXME + private static final long serialVersionUID = -5294493995009985322L; } /** @@ -46,10 +47,10 @@ * @param modules A set of modules in which to find any dependencies. * @throws ResolutionException if the resolution cannot be successfully completed. */ - Iterable<? extends ModuleElement> resolve( - Iterable<? extends ModuleElement> roots, - Iterable<? extends ModuleElement> modules) - throws ResolutionException; + Iterable<? extends ModuleElement> resolve( + Iterable<? extends ModuleElement> roots, + Iterable<? extends ModuleElement> modules) + throws ResolutionException; /** * Get the set of visible modules for a module. This method may be called @@ -57,6 +58,10 @@ * @param module * @return the visible modules */ - Iterable<? extends ModuleElement> getVisibleModules(ModuleElement module) - throws IllegalStateException; + Iterable<? extends ModuleElement> getVisibleModules(ModuleElement module) + throws IllegalStateException; + + boolean isPlatformName(CharSequence name); + + String getDefaultPlatformModule(); // should use a "platform" enum }
--- a/test/tools/javac/modules/ModuleRequiresAttributeTest01.java Fri May 15 15:52:06 2009 -0700 +++ b/test/tools/javac/modules/ModuleRequiresAttributeTest01.java Wed May 20 16:14:25 2009 -0700 @@ -141,24 +141,22 @@ if (requiresList.size() > 0) error("ModuleRequires attribute not found; expected " + flags + " " + requiresList); } else { - if (requiresList.size() == 0) { - error("Unexpected module attribute found: " + attr); - } else { - ConstantPool cp = cf.constant_pool; - List<String> attrList = new ArrayList<String>(); - for (int i = 0; i < attr.requires_length; i++) { - ModuleRequires_attribute.Entry e = attr.requires_table[i]; - ConstantPool.CONSTANT_ModuleId_info mid = cp.getModuleIdInfo(e.requires_index); - String mn = cp.getUTF8Value(mid.name_index); - String mvq = (mid.version_index == 0 ? null : cp.getUTF8Value(mid.version_index)); - attrList.add(getModuleId(mn, mvq)); - Set<Flag> attrFlags = new HashSet<Flag>(); - for (int f = 0; f < e.attributes_length; f++) - attrFlags.add(Flag.of(cp.getUTF8Value(e.attributes[f]))); - checkEqual("flags", flags, attrFlags); - } - checkEqual("requires", requiresList, attrList); + ConstantPool cp = cf.constant_pool; + List<String> attrList = new ArrayList<String>(); + for (int i = 0; i < attr.requires_length; i++) { + ModuleRequires_attribute.Entry e = attr.requires_table[i]; + if (isSynthetic(e, cp)) + continue; + ConstantPool.CONSTANT_ModuleId_info mid = cp.getModuleIdInfo(e.requires_index); + String mn = cp.getUTF8Value(mid.name_index); + String mvq = (mid.version_index == 0 ? null : cp.getUTF8Value(mid.version_index)); + attrList.add(getModuleId(mn, mvq)); + Set<Flag> attrFlags = new HashSet<Flag>(); + for (int f = 0; f < e.attributes_length; f++) + attrFlags.add(Flag.of(cp.getUTF8Value(e.attributes[f]))); + checkEqual("flags", flags, attrFlags); } + checkEqual("requires", requiresList, attrList); } } catch (ConstantPoolException e) { error("Error accessing constant pool " + file + ": " + e); @@ -167,6 +165,15 @@ } } + static boolean isSynthetic(ModuleRequires_attribute.Entry e, ConstantPool cp) + throws ConstantPoolException { + for (int f = 0; f < e.attributes_length; f++) { + if (cp.getUTF8Value(e.attributes[f]).equals("synthetic")) + return true; + } + return false; + } + static String getModuleId(String name, String version) { return (version == null ? name : name + "@" + version); }