langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java
changeset 45156 001f73134346
parent 44822 2f24758e7ae0
child 45217 6f188021f8f8
child 45682 fc3b228b9e2a
equal deleted inserted replaced
45155:141f584faf59 45156:001f73134346
   140     private final Types types;
   140     private final Types types;
   141     private final JavaFileManager fileManager;
   141     private final JavaFileManager fileManager;
   142     private final ModuleFinder moduleFinder;
   142     private final ModuleFinder moduleFinder;
   143     private final Source source;
   143     private final Source source;
   144     private final boolean allowModules;
   144     private final boolean allowModules;
       
   145     private final boolean allowAccessIntoSystem;
   145 
   146 
   146     public final boolean multiModuleMode;
   147     public final boolean multiModuleMode;
   147 
   148 
   148     private final String legacyModuleOverride;
   149     private final String legacyModuleOverride;
   149 
   150 
   190         fileManager = context.get(JavaFileManager.class);
   191         fileManager = context.get(JavaFileManager.class);
   191         source = Source.instance(context);
   192         source = Source.instance(context);
   192         allowModules = source.allowModules();
   193         allowModules = source.allowModules();
   193         Options options = Options.instance(context);
   194         Options options = Options.instance(context);
   194 
   195 
       
   196         allowAccessIntoSystem = options.isUnset(Option.RELEASE);
   195         lintOptions = options.isUnset(Option.XLINT_CUSTOM, "-" + LintCategory.OPTIONS.option);
   197         lintOptions = options.isUnset(Option.XLINT_CUSTOM, "-" + LintCategory.OPTIONS.option);
   196 
   198 
   197         Collection<String> xmodules = options.keySet()
   199         Collection<String> xmodules = options.keySet()
   198                                              .stream()
   200                                              .stream()
   199                                              .filter(opt -> opt.startsWith(XMODULES_PREFIX))
   201                                              .filter(opt -> opt.startsWith(XMODULES_PREFIX))
  1228                 }
  1230                 }
  1229             }
  1231             }
  1230             for (String limit : extraLimitMods) {
  1232             for (String limit : extraLimitMods) {
  1231                 limitMods.add(syms.enterModule(names.fromString(limit)));
  1233                 limitMods.add(syms.enterModule(names.fromString(limit)));
  1232             }
  1234             }
  1233             observable = computeTransitiveClosure(limitMods, null);
  1235             observable = computeTransitiveClosure(limitMods, rootModules, null);
  1234             observable.addAll(rootModules);
  1236             observable.addAll(rootModules);
  1235             if (lintOptions) {
  1237             if (lintOptions) {
  1236                 for (ModuleSymbol msym : limitMods) {
  1238                 for (ModuleSymbol msym : limitMods) {
  1237                     if (!observable.contains(msym)) {
  1239                     if (!observable.contains(msym)) {
  1238                         log.warning(LintCategory.OPTIONS,
  1240                         log.warning(LintCategory.OPTIONS,
  1308                         observable.add(sym);
  1310                         observable.add(sym);
  1309                 });
  1311                 });
  1310             }
  1312             }
  1311         }
  1313         }
  1312 
  1314 
  1313         Set<ModuleSymbol> result = computeTransitiveClosure(enabledRoot, observable);
  1315         Set<ModuleSymbol> result = computeTransitiveClosure(enabledRoot, rootModules, observable);
  1314 
  1316 
  1315         result.add(syms.unnamedModule);
  1317         result.add(syms.unnamedModule);
  1316 
  1318 
  1317         boolean hasAutomatic = result.stream().anyMatch(IS_AUTOMATIC);
  1319         boolean hasAutomatic = result.stream().anyMatch(IS_AUTOMATIC);
  1318 
  1320 
  1346 
  1348 
  1347     public boolean isInModuleGraph(ModuleSymbol msym) {
  1349     public boolean isInModuleGraph(ModuleSymbol msym) {
  1348         return allModules == null || allModules.contains(msym);
  1350         return allModules == null || allModules.contains(msym);
  1349     }
  1351     }
  1350 
  1352 
  1351     private Set<ModuleSymbol> computeTransitiveClosure(Set<? extends ModuleSymbol> base, Set<ModuleSymbol> observable) {
  1353     private Set<ModuleSymbol> computeTransitiveClosure(Set<? extends ModuleSymbol> base,
       
  1354                                                        Set<? extends ModuleSymbol> rootModules,
       
  1355                                                        Set<ModuleSymbol> observable) {
  1352         List<ModuleSymbol> primaryTodo = List.nil();
  1356         List<ModuleSymbol> primaryTodo = List.nil();
  1353         List<ModuleSymbol> secondaryTodo = List.nil();
  1357         List<ModuleSymbol> secondaryTodo = List.nil();
  1354 
  1358 
  1355         for (ModuleSymbol ms : base) {
  1359         for (ModuleSymbol ms : base) {
  1356             primaryTodo = primaryTodo.prepend(ms);
  1360             if (rootModules.contains(ms)) {
       
  1361                 primaryTodo = primaryTodo.prepend(ms);
       
  1362             } else {
       
  1363                 secondaryTodo = secondaryTodo.prepend(ms);
       
  1364             }
  1357         }
  1365         }
  1358 
  1366 
  1359         Set<ModuleSymbol> result = new LinkedHashSet<>();
  1367         Set<ModuleSymbol> result = new LinkedHashSet<>();
  1360         result.add(syms.java_base);
  1368         result.add(syms.java_base);
  1361 
  1369 
  1374             if (observable != null && !observable.contains(current))
  1382             if (observable != null && !observable.contains(current))
  1375                 continue;
  1383                 continue;
  1376             if (!result.add(current) || current == syms.unnamedModule || ((current.flags_field & Flags.AUTOMATIC_MODULE) != 0))
  1384             if (!result.add(current) || current == syms.unnamedModule || ((current.flags_field & Flags.AUTOMATIC_MODULE) != 0))
  1377                 continue;
  1385                 continue;
  1378             current.complete();
  1386             current.complete();
  1379             if (current.kind == ERR && isPrimaryTodo && warnedMissing.add(current)) {
  1387             if (current.kind == ERR && (isPrimaryTodo || base.contains(current)) && warnedMissing.add(current)) {
  1380                 log.error(Errors.ModuleNotFound(current));
  1388                 log.error(Errors.ModuleNotFound(current));
  1381             }
  1389             }
  1382             for (RequiresDirective rd : current.requires) {
  1390             for (RequiresDirective rd : current.requires) {
  1383                 if (rd.module == syms.java_base) continue;
  1391                 if (rd.module == syms.java_base) continue;
  1384                 if ((rd.isTransitive() && isPrimaryTodo) || base.contains(current)) {
  1392                 if ((rd.isTransitive() && isPrimaryTodo) || rootModules.contains(current)) {
  1385                     primaryTodo = primaryTodo.prepend(rd.module);
  1393                     primaryTodo = primaryTodo.prepend(rd.module);
  1386                 } else {
  1394                 } else {
  1387                     secondaryTodo = secondaryTodo.prepend(rd.module);
  1395                     secondaryTodo = secondaryTodo.prepend(rd.module);
  1388                 }
  1396                 }
  1389             }
  1397             }
  1486             if (d.packge != null) {
  1494             if (d.packge != null) {
  1487                 d.packge.modle = msym;
  1495                 d.packge.modle = msym;
  1488             }
  1496             }
  1489         }
  1497         }
  1490 
  1498 
       
  1499         if (!allowAccessIntoSystem && (msym.flags() & Flags.SYSTEM_MODULE) != 0 &&
       
  1500             msym.patchLocation != null) {
       
  1501             log.error(Errors.PatchModuleWithRelease(msym));
       
  1502         }
  1491     }
  1503     }
  1492 
  1504 
  1493     private Set<ModuleSymbol> retrieveRequiresTransitive(ModuleSymbol msym) {
  1505     private Set<ModuleSymbol> retrieveRequiresTransitive(ModuleSymbol msym) {
  1494         Set<ModuleSymbol> requiresTransitive = requiresTransitiveCache.get(msym);
  1506         Set<ModuleSymbol> requiresTransitive = requiresTransitiveCache.get(msym);
  1495 
  1507 
  1611             if (!isKnownModule(msym, unknownModules))
  1623             if (!isKnownModule(msym, unknownModules))
  1612                 continue;
  1624                 continue;
  1613 
  1625 
  1614             if (!isValidName(packageName))
  1626             if (!isValidName(packageName))
  1615                 continue;
  1627                 continue;
       
  1628 
       
  1629             if (!allowAccessIntoSystem && (msym.flags() & Flags.SYSTEM_MODULE) != 0) {
       
  1630                 log.error(Errors.AddExportsWithRelease(msym));
       
  1631                 continue;
       
  1632             }
       
  1633 
  1616             PackageSymbol p = syms.enterPackage(msym, names.fromString(packageName));
  1634             PackageSymbol p = syms.enterPackage(msym, names.fromString(packageName));
  1617             p.modle = msym;  // TODO: do we need this?
  1635             p.modle = msym;  // TODO: do we need this?
  1618 
  1636 
  1619             List<ModuleSymbol> targetModules = List.nil();
  1637             List<ModuleSymbol> targetModules = List.nil();
  1620             for (String toModule : targetNames.split("[ ,]+")) {
  1638             for (String toModule : targetNames.split("[ ,]+")) {
  1683             ModuleSymbol msym = syms.enterModule(names.fromString(sourceName));
  1701             ModuleSymbol msym = syms.enterModule(names.fromString(sourceName));
  1684             if (!allModules.contains(msym)) {
  1702             if (!allModules.contains(msym)) {
  1685                 if (lintOptions) {
  1703                 if (lintOptions) {
  1686                     log.warning(Warnings.ModuleForOptionNotFound(Option.ADD_READS, msym));
  1704                     log.warning(Warnings.ModuleForOptionNotFound(Option.ADD_READS, msym));
  1687                 }
  1705                 }
       
  1706                 continue;
       
  1707             }
       
  1708 
       
  1709             if (!allowAccessIntoSystem && (msym.flags() & Flags.SYSTEM_MODULE) != 0) {
       
  1710                 log.error(Errors.AddReadsWithRelease(msym));
  1688                 continue;
  1711                 continue;
  1689             }
  1712             }
  1690 
  1713 
  1691             for (String targetName : targetNames.split("[ ,]+", -1)) {
  1714             for (String targetName : targetNames.split("[ ,]+", -1)) {
  1692                 ModuleSymbol targetModule;
  1715                 ModuleSymbol targetModule;