--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java Fri Aug 31 16:29:49 2018 -0400
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java Fri Aug 31 14:54:42 2018 -0700
@@ -97,11 +97,8 @@
import static javax.tools.StandardLocation.PLATFORM_CLASS_PATH;
import static com.sun.tools.javac.main.Option.BOOT_CLASS_PATH;
-import static com.sun.tools.javac.main.Option.DJAVA_ENDORSED_DIRS;
-import static com.sun.tools.javac.main.Option.DJAVA_EXT_DIRS;
import static com.sun.tools.javac.main.Option.ENDORSEDDIRS;
import static com.sun.tools.javac.main.Option.EXTDIRS;
-import static com.sun.tools.javac.main.Option.XBOOTCLASSPATH;
import static com.sun.tools.javac.main.Option.XBOOTCLASSPATH_APPEND;
import static com.sun.tools.javac.main.Option.XBOOTCLASSPATH_PREPEND;
@@ -1533,7 +1530,62 @@
return true;
}
+ /**
+ * Initializes the module table, based on a string containing the composition
+ * of a series of command-line options.
+ * At most one pattern to initialize a series of modules can be given.
+ * At most one module-specific search path per module can be given.
+ *
+ * @param value a series of values, separated by NUL.
+ */
void init(String value) {
+ Pattern moduleSpecificForm = Pattern.compile("([\\p{Alnum}$_.]+)=(.*)");
+ List<String> pathsForModules = new ArrayList<>();
+ String modulePattern = null;
+ for (String v : value.split("\0")) {
+ if (moduleSpecificForm.matcher(v).matches()) {
+ pathsForModules.add(v);
+ } else {
+ modulePattern = v;
+ }
+ }
+ // set the general module pattern first, if given
+ if (modulePattern != null) {
+ initFromPattern(modulePattern);
+ }
+ pathsForModules.forEach(this::initForModule);
+ }
+
+ /**
+ * Initializes a module-specific override, using {@code setPathsForModule}.
+ *
+ * @param value a string of the form: module-name=search-path
+ */
+ void initForModule(String value) {
+ int eq = value.indexOf('=');
+ String name = value.substring(0, eq);
+ List<Path> paths = new ArrayList<>();
+ for (String v : value.substring(eq + 1).split(File.pathSeparator)) {
+ try {
+ paths.add(Paths.get(v));
+ } catch (InvalidPathException e) {
+ throw new IllegalArgumentException("invalid path: " + v, e);
+ }
+ }
+ try {
+ setPathsForModule(name, paths);
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new IllegalArgumentException("cannot set path for module " + name, e);
+ }
+ }
+
+ /**
+ * Initializes the module table based on a custom option syntax.
+ *
+ * @param value the value such as may be given to a --module-source-path option
+ */
+ void initFromPattern(String value) {
Collection<String> segments = new ArrayList<>();
for (String s: value.split(File.pathSeparator)) {
expandBraces(s, segments);