< prev index next >

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java

Print this page
rev 50632 : [mq]: defaultroots


  64 import com.sun.tools.javac.code.Directive.UsesDirective;
  65 import com.sun.tools.javac.code.Flags;
  66 import com.sun.tools.javac.code.Flags.Flag;
  67 import com.sun.tools.javac.code.Lint.LintCategory;
  68 import com.sun.tools.javac.code.ModuleFinder;
  69 import com.sun.tools.javac.code.Source;
  70 import com.sun.tools.javac.code.Source.Feature;
  71 import com.sun.tools.javac.code.Symbol;
  72 import com.sun.tools.javac.code.Symbol.ClassSymbol;
  73 import com.sun.tools.javac.code.Symbol.Completer;
  74 import com.sun.tools.javac.code.Symbol.CompletionFailure;
  75 import com.sun.tools.javac.code.Symbol.MethodSymbol;
  76 import com.sun.tools.javac.code.Symbol.ModuleFlags;
  77 import com.sun.tools.javac.code.Symbol.ModuleSymbol;
  78 import com.sun.tools.javac.code.Symbol.PackageSymbol;
  79 import com.sun.tools.javac.code.Symtab;
  80 import com.sun.tools.javac.code.Type;
  81 import com.sun.tools.javac.code.Types;
  82 import com.sun.tools.javac.jvm.ClassWriter;
  83 import com.sun.tools.javac.jvm.JNIWriter;

  84 import com.sun.tools.javac.main.Option;
  85 import com.sun.tools.javac.resources.CompilerProperties.Errors;
  86 import com.sun.tools.javac.resources.CompilerProperties.Warnings;
  87 import com.sun.tools.javac.tree.JCTree;
  88 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
  89 import com.sun.tools.javac.tree.JCTree.JCDirective;
  90 import com.sun.tools.javac.tree.JCTree.JCExports;
  91 import com.sun.tools.javac.tree.JCTree.JCExpression;
  92 import com.sun.tools.javac.tree.JCTree.JCModuleDecl;
  93 import com.sun.tools.javac.tree.JCTree.JCOpens;
  94 import com.sun.tools.javac.tree.JCTree.JCProvides;
  95 import com.sun.tools.javac.tree.JCTree.JCRequires;
  96 import com.sun.tools.javac.tree.JCTree.JCUses;
  97 import com.sun.tools.javac.tree.JCTree.Tag;
  98 import com.sun.tools.javac.tree.TreeInfo;
  99 import com.sun.tools.javac.util.Assert;
 100 import com.sun.tools.javac.util.Context;
 101 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
 102 import com.sun.tools.javac.util.List;
 103 import com.sun.tools.javac.util.ListBuffer;


 127  *  <p><b>This is NOT part of any supported API.
 128  *  If you write code that depends on this, you do so at your own risk.
 129  *  This code and its internal interfaces are subject to change or
 130  *  deletion without notice.</b>
 131  */
 132 public class Modules extends JCTree.Visitor {
 133     private static final String ALL_SYSTEM = "ALL-SYSTEM";
 134     private static final String ALL_MODULE_PATH = "ALL-MODULE-PATH";
 135 
 136     private final Log log;
 137     private final Names names;
 138     private final Symtab syms;
 139     private final Attr attr;
 140     private final Check chk;
 141     private final DeferredLintHandler deferredLintHandler;
 142     private final TypeEnvs typeEnvs;
 143     private final Types types;
 144     private final JavaFileManager fileManager;
 145     private final ModuleFinder moduleFinder;
 146     private final Source source;

 147     private final boolean allowModules;
 148     private final boolean allowAccessIntoSystem;
 149 
 150     public final boolean multiModuleMode;
 151 
 152     private final Name java_se;
 153     private final Name java_;
 154 
 155     ModuleSymbol defaultModule;
 156 
 157     private final String addExportsOpt;
 158     private Map<ModuleSymbol, Set<ExportsDirective>> addExports;
 159     private final String addReadsOpt;
 160     private Map<ModuleSymbol, Set<RequiresDirective>> addReads;
 161     private final String addModsOpt;
 162     private final Set<String> extraAddMods = new HashSet<>();
 163     private final String limitModsOpt;
 164     private final Set<String> extraLimitMods = new HashSet<>();
 165     private final String moduleVersionOpt;
 166 


 174     public static Modules instance(Context context) {
 175         Modules instance = context.get(Modules.class);
 176         if (instance == null)
 177             instance = new Modules(context);
 178         return instance;
 179     }
 180 
 181     protected Modules(Context context) {
 182         context.put(Modules.class, this);
 183         log = Log.instance(context);
 184         names = Names.instance(context);
 185         syms = Symtab.instance(context);
 186         attr = Attr.instance(context);
 187         chk = Check.instance(context);
 188         deferredLintHandler = DeferredLintHandler.instance(context);
 189         typeEnvs = TypeEnvs.instance(context);
 190         moduleFinder = ModuleFinder.instance(context);
 191         types = Types.instance(context);
 192         fileManager = context.get(JavaFileManager.class);
 193         source = Source.instance(context);

 194         allowModules = Feature.MODULES.allowedInSource(source);
 195         Options options = Options.instance(context);
 196 
 197         allowAccessIntoSystem = options.isUnset(Option.RELEASE);
 198         lintOptions = options.isUnset(Option.XLINT_CUSTOM, "-" + LintCategory.OPTIONS.option);
 199 
 200         multiModuleMode = fileManager.hasLocation(StandardLocation.MODULE_SOURCE_PATH);
 201         ClassWriter classWriter = ClassWriter.instance(context);
 202         classWriter.multiModuleMode = multiModuleMode;
 203         JNIWriter jniWriter = JNIWriter.instance(context);
 204         jniWriter.multiModuleMode = multiModuleMode;
 205 
 206         java_se = names.fromString("java.se");
 207         java_ = names.fromString("java.");
 208 
 209         addExportsOpt = options.get(Option.ADD_EXPORTS);
 210         addReadsOpt = options.get(Option.ADD_READS);
 211         addModsOpt = options.get(Option.ADD_MODULES);
 212         limitModsOpt = options.get(Option.LIMIT_MODULES);
 213         moduleVersionOpt = options.get(Option.MODULE_VERSION);


1217                 limitMods.add(syms.enterModule(names.fromString(limit)));
1218             }
1219             observable = computeTransitiveClosure(limitMods, rootModules, null);
1220             observable.addAll(rootModules);
1221             if (lintOptions) {
1222                 for (ModuleSymbol msym : limitMods) {
1223                     if (!observable.contains(msym)) {
1224                         log.warning(LintCategory.OPTIONS,
1225                                 Warnings.ModuleForOptionNotFound(Option.LIMIT_MODULES, msym));
1226                     }
1227                 }
1228             }
1229         }
1230 
1231         Predicate<ModuleSymbol> observablePred = sym ->
1232              (observable == null) ? (moduleFinder.findModule(sym).kind != ERR) : observable.contains(sym);
1233         Predicate<ModuleSymbol> systemModulePred = sym -> (sym.flags() & Flags.SYSTEM_MODULE) != 0;
1234         Set<ModuleSymbol> enabledRoot = new LinkedHashSet<>();
1235 
1236         if (rootModules.contains(syms.unnamedModule)) {
1237             ModuleSymbol javaSE = syms.getModule(java_se);
1238             Predicate<ModuleSymbol> jdkModulePred;
1239 






1240             if (javaSE != null && (observable == null || observable.contains(javaSE))) {
1241                 jdkModulePred = sym -> {
1242                     sym.complete();
1243                     return   !sym.name.startsWith(java_)
1244                            && sym.exports.stream().anyMatch(e -> e.modules == null);
1245                 };
1246                 enabledRoot.add(javaSE);
1247             } else {
1248                 jdkModulePred = sym -> true;
1249             }

1250 
1251             Predicate<ModuleSymbol> noIncubatorPred = sym -> {
1252                 sym.complete();
1253                 return !sym.resolutionFlags.contains(ModuleResolutionFlags.DO_NOT_RESOLVE_BY_DEFAULT);
1254             };
1255 
1256             for (ModuleSymbol sym : new HashSet<>(syms.getAllModules())) {
1257                 try {
1258                     if (systemModulePred.test(sym) && observablePred.test(sym) && jdkModulePred.test(sym) && noIncubatorPred.test(sym)) {
1259                         enabledRoot.add(sym);
1260                     }
1261                 } catch (CompletionFailure ex) {
1262                     chk.completionError(null, ex);
1263                 }
1264             }
1265         }
1266 
1267         enabledRoot.addAll(rootModules);
1268 
1269         if (addModsOpt != null || !extraAddMods.isEmpty()) {




  64 import com.sun.tools.javac.code.Directive.UsesDirective;
  65 import com.sun.tools.javac.code.Flags;
  66 import com.sun.tools.javac.code.Flags.Flag;
  67 import com.sun.tools.javac.code.Lint.LintCategory;
  68 import com.sun.tools.javac.code.ModuleFinder;
  69 import com.sun.tools.javac.code.Source;
  70 import com.sun.tools.javac.code.Source.Feature;
  71 import com.sun.tools.javac.code.Symbol;
  72 import com.sun.tools.javac.code.Symbol.ClassSymbol;
  73 import com.sun.tools.javac.code.Symbol.Completer;
  74 import com.sun.tools.javac.code.Symbol.CompletionFailure;
  75 import com.sun.tools.javac.code.Symbol.MethodSymbol;
  76 import com.sun.tools.javac.code.Symbol.ModuleFlags;
  77 import com.sun.tools.javac.code.Symbol.ModuleSymbol;
  78 import com.sun.tools.javac.code.Symbol.PackageSymbol;
  79 import com.sun.tools.javac.code.Symtab;
  80 import com.sun.tools.javac.code.Type;
  81 import com.sun.tools.javac.code.Types;
  82 import com.sun.tools.javac.jvm.ClassWriter;
  83 import com.sun.tools.javac.jvm.JNIWriter;
  84 import com.sun.tools.javac.jvm.Target;
  85 import com.sun.tools.javac.main.Option;
  86 import com.sun.tools.javac.resources.CompilerProperties.Errors;
  87 import com.sun.tools.javac.resources.CompilerProperties.Warnings;
  88 import com.sun.tools.javac.tree.JCTree;
  89 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
  90 import com.sun.tools.javac.tree.JCTree.JCDirective;
  91 import com.sun.tools.javac.tree.JCTree.JCExports;
  92 import com.sun.tools.javac.tree.JCTree.JCExpression;
  93 import com.sun.tools.javac.tree.JCTree.JCModuleDecl;
  94 import com.sun.tools.javac.tree.JCTree.JCOpens;
  95 import com.sun.tools.javac.tree.JCTree.JCProvides;
  96 import com.sun.tools.javac.tree.JCTree.JCRequires;
  97 import com.sun.tools.javac.tree.JCTree.JCUses;
  98 import com.sun.tools.javac.tree.JCTree.Tag;
  99 import com.sun.tools.javac.tree.TreeInfo;
 100 import com.sun.tools.javac.util.Assert;
 101 import com.sun.tools.javac.util.Context;
 102 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
 103 import com.sun.tools.javac.util.List;
 104 import com.sun.tools.javac.util.ListBuffer;


 128  *  <p><b>This is NOT part of any supported API.
 129  *  If you write code that depends on this, you do so at your own risk.
 130  *  This code and its internal interfaces are subject to change or
 131  *  deletion without notice.</b>
 132  */
 133 public class Modules extends JCTree.Visitor {
 134     private static final String ALL_SYSTEM = "ALL-SYSTEM";
 135     private static final String ALL_MODULE_PATH = "ALL-MODULE-PATH";
 136 
 137     private final Log log;
 138     private final Names names;
 139     private final Symtab syms;
 140     private final Attr attr;
 141     private final Check chk;
 142     private final DeferredLintHandler deferredLintHandler;
 143     private final TypeEnvs typeEnvs;
 144     private final Types types;
 145     private final JavaFileManager fileManager;
 146     private final ModuleFinder moduleFinder;
 147     private final Source source;
 148     private final Target target;
 149     private final boolean allowModules;
 150     private final boolean allowAccessIntoSystem;
 151 
 152     public final boolean multiModuleMode;
 153 
 154     private final Name java_se;
 155     private final Name java_;
 156 
 157     ModuleSymbol defaultModule;
 158 
 159     private final String addExportsOpt;
 160     private Map<ModuleSymbol, Set<ExportsDirective>> addExports;
 161     private final String addReadsOpt;
 162     private Map<ModuleSymbol, Set<RequiresDirective>> addReads;
 163     private final String addModsOpt;
 164     private final Set<String> extraAddMods = new HashSet<>();
 165     private final String limitModsOpt;
 166     private final Set<String> extraLimitMods = new HashSet<>();
 167     private final String moduleVersionOpt;
 168 


 176     public static Modules instance(Context context) {
 177         Modules instance = context.get(Modules.class);
 178         if (instance == null)
 179             instance = new Modules(context);
 180         return instance;
 181     }
 182 
 183     protected Modules(Context context) {
 184         context.put(Modules.class, this);
 185         log = Log.instance(context);
 186         names = Names.instance(context);
 187         syms = Symtab.instance(context);
 188         attr = Attr.instance(context);
 189         chk = Check.instance(context);
 190         deferredLintHandler = DeferredLintHandler.instance(context);
 191         typeEnvs = TypeEnvs.instance(context);
 192         moduleFinder = ModuleFinder.instance(context);
 193         types = Types.instance(context);
 194         fileManager = context.get(JavaFileManager.class);
 195         source = Source.instance(context);
 196         target = Target.instance(context);
 197         allowModules = Feature.MODULES.allowedInSource(source);
 198         Options options = Options.instance(context);
 199 
 200         allowAccessIntoSystem = options.isUnset(Option.RELEASE);
 201         lintOptions = options.isUnset(Option.XLINT_CUSTOM, "-" + LintCategory.OPTIONS.option);
 202 
 203         multiModuleMode = fileManager.hasLocation(StandardLocation.MODULE_SOURCE_PATH);
 204         ClassWriter classWriter = ClassWriter.instance(context);
 205         classWriter.multiModuleMode = multiModuleMode;
 206         JNIWriter jniWriter = JNIWriter.instance(context);
 207         jniWriter.multiModuleMode = multiModuleMode;
 208 
 209         java_se = names.fromString("java.se");
 210         java_ = names.fromString("java.");
 211 
 212         addExportsOpt = options.get(Option.ADD_EXPORTS);
 213         addReadsOpt = options.get(Option.ADD_READS);
 214         addModsOpt = options.get(Option.ADD_MODULES);
 215         limitModsOpt = options.get(Option.LIMIT_MODULES);
 216         moduleVersionOpt = options.get(Option.MODULE_VERSION);


1220                 limitMods.add(syms.enterModule(names.fromString(limit)));
1221             }
1222             observable = computeTransitiveClosure(limitMods, rootModules, null);
1223             observable.addAll(rootModules);
1224             if (lintOptions) {
1225                 for (ModuleSymbol msym : limitMods) {
1226                     if (!observable.contains(msym)) {
1227                         log.warning(LintCategory.OPTIONS,
1228                                 Warnings.ModuleForOptionNotFound(Option.LIMIT_MODULES, msym));
1229                     }
1230                 }
1231             }
1232         }
1233 
1234         Predicate<ModuleSymbol> observablePred = sym ->
1235              (observable == null) ? (moduleFinder.findModule(sym).kind != ERR) : observable.contains(sym);
1236         Predicate<ModuleSymbol> systemModulePred = sym -> (sym.flags() & Flags.SYSTEM_MODULE) != 0;
1237         Set<ModuleSymbol> enabledRoot = new LinkedHashSet<>();
1238 
1239         if (rootModules.contains(syms.unnamedModule)) {

1240             Predicate<ModuleSymbol> jdkModulePred;
1241             if (target.allApiModulesAreRoots()) {
1242                 jdkModulePred = sym -> {
1243                     sym.complete();
1244                     return sym.exports.stream().anyMatch(e -> e.modules == null);
1245                 };
1246             } else {
1247                 ModuleSymbol javaSE = syms.getModule(java_se);
1248                 if (javaSE != null && (observable == null || observable.contains(javaSE))) {
1249                     jdkModulePred = sym -> {
1250                         sym.complete();
1251                         return !sym.name.startsWith(java_)
1252                             && sym.exports.stream().anyMatch(e -> e.modules == null);
1253                     };
1254                     enabledRoot.add(javaSE);
1255                 } else {
1256                     jdkModulePred = sym -> true;
1257                 }
1258             }
1259 
1260             Predicate<ModuleSymbol> noIncubatorPred = sym -> {
1261                 sym.complete();
1262                 return !sym.resolutionFlags.contains(ModuleResolutionFlags.DO_NOT_RESOLVE_BY_DEFAULT);
1263             };
1264 
1265             for (ModuleSymbol sym : new HashSet<>(syms.getAllModules())) {
1266                 try {
1267                     if (systemModulePred.test(sym) && observablePred.test(sym) && jdkModulePred.test(sym) && noIncubatorPred.test(sym)) {
1268                         enabledRoot.add(sym);
1269                     }
1270                 } catch (CompletionFailure ex) {
1271                     chk.completionError(null, ex);
1272                 }
1273             }
1274         }
1275 
1276         enabledRoot.addAll(rootModules);
1277 
1278         if (addModsOpt != null || !extraAddMods.isEmpty()) {


< prev index next >