equal
deleted
inserted
replaced
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; |