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);
     }