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()) {
|