< prev index next >

src/jdk.compiler/share/classes/com/sun/tools/javac/main/Arguments.java

Print this page
rev 2977 : JDK-8058150

*** 23,55 **** * questions. */ package com.sun.tools.javac.main; import java.io.File; import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import com.sun.tools.doclint.DocLint; import com.sun.tools.javac.code.Lint.LintCategory; import com.sun.tools.javac.code.Source; import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.jvm.Profile; import com.sun.tools.javac.jvm.Target; import com.sun.tools.javac.main.OptionHelper.GrumpyHelper; ! import com.sun.tools.javac.file.BaseFileManager; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.Log.PrefixKind; import com.sun.tools.javac.util.Options; import com.sun.tools.javac.util.PropagatedException; /** * Shared option and argument handling for command line and API usage of javac. --- 23,66 ---- * questions. */ package com.sun.tools.javac.main; import java.io.File; + import java.io.IOException; + import java.nio.file.Path; + import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; + import java.util.ServiceLoader; import java.util.Set; + import java.util.stream.Stream; + import java.util.stream.StreamSupport; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; + import javax.tools.StandardJavaFileManager; + import javax.tools.StandardLocation; import com.sun.tools.doclint.DocLint; import com.sun.tools.javac.code.Lint.LintCategory; import com.sun.tools.javac.code.Source; + import com.sun.tools.javac.file.BaseFileManager; import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.jvm.Profile; import com.sun.tools.javac.jvm.Target; import com.sun.tools.javac.main.OptionHelper.GrumpyHelper; ! import com.sun.tools.javac.platform.PlatformProvider; ! import com.sun.tools.javac.platform.PlatformProviderFactory; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.Log.PrefixKind; + import com.sun.tools.javac.util.Log.WriterKind; import com.sun.tools.javac.util.Options; import com.sun.tools.javac.util.PropagatedException; /** * Shared option and argument handling for command line and API usage of javac.
*** 270,279 **** --- 281,347 ---- * ILLEGAL_ARGUMENT */ private boolean processArgs(Iterable<String> args, Set<Option> allowableOpts, OptionHelper helper, boolean allowOperands, boolean checkFileManager) { + if (!doProcessArgs(args, allowableOpts, helper, allowOperands, checkFileManager)) + return false; + + String platformString = options.get(Option.PLATFORM); + + checkOptionAllowed(platformString == null, + option -> error("err.platform.bootclasspath.conflict", option.getText()), + Option.BOOTCLASSPATH, Option.XBOOTCLASSPATH, Option.XBOOTCLASSPATH_APPEND, + Option.XBOOTCLASSPATH_PREPEND, Option.ENDORSEDDIRS, Option.EXTDIRS, Option.SOURCE, + Option.TARGET); + + if (platformString != null) { + PlatformProvider platformProvider = lookupPlatformProvider(platformString); + + if (platformProvider == null) { + error("err.unsupported.platform.version", platformString); + return false; + } + + options.put(Option.SOURCE, platformProvider.getSourceVersion()); + options.put(Option.TARGET, platformProvider.getTargetVersion()); + + context.put(PlatformProvider.class, platformProvider); + + if (!doProcessArgs(platformProvider.getAdditionalOptions(), allowableOpts, helper, allowOperands, checkFileManager)) + return false; + + Collection<Path> platformCP = platformProvider.getPlatformPath(); + + if (platformCP != null) { + JavaFileManager fm = getFileManager(); + + if (!(fm instanceof StandardJavaFileManager)) { + error("err.platform.not.standard.file.manager"); + return false; + } + + try { + StandardJavaFileManager sfm = (StandardJavaFileManager) fm; + + sfm.setLocationFromPaths(StandardLocation.PLATFORM_CLASS_PATH, platformCP); + } catch (IOException ex) { + log.printLines(PrefixKind.JAVAC, "msg.io"); + ex.printStackTrace(log.getWriter(WriterKind.NOTICE)); + return false; + } + } + } + + options.notifyListeners(); + + return true; + } + + private boolean doProcessArgs(Iterable<String> args, + Set<Option> allowableOpts, OptionHelper helper, + boolean allowOperands, boolean checkFileManager) { JavaFileManager fm = checkFileManager ? getFileManager() : null; Iterator<String> argIter = args.iterator(); while (argIter.hasNext()) { String arg = argIter.next(); if (arg.isEmpty()) {
*** 313,327 **** } else { if (option.process(helper, arg)) { return false; } } - } - options.notifyListeners(); - return true; } /** * Validates the overall consistency of the options and operands --- 381,392 ----
*** 403,413 **** } } boolean lintOptions = options.isUnset(Option.XLINT_CUSTOM, "-" + LintCategory.OPTIONS.option); ! if (lintOptions && source.compareTo(Source.DEFAULT) < 0) { JavaFileManager fm = getFileManager(); if (fm instanceof BaseFileManager) { if (((BaseFileManager) fm).isDefaultBootClassPath()) log.warning(LintCategory.OPTIONS, "source.no.bootclasspath", source.name); } --- 468,478 ---- } } boolean lintOptions = options.isUnset(Option.XLINT_CUSTOM, "-" + LintCategory.OPTIONS.option); ! if (lintOptions && source.compareTo(Source.DEFAULT) < 0 && !options.isSet(Option.PLATFORM)) { JavaFileManager fm = getFileManager(); if (fm instanceof BaseFileManager) { if (((BaseFileManager) fm).isDefaultBootClassPath()) log.warning(LintCategory.OPTIONS, "source.no.bootclasspath", source.name); }
*** 433,442 **** --- 498,519 ---- log.warning(LintCategory.OPTIONS, "option.obsolete.suppression"); return !errors; } + private PlatformProvider lookupPlatformProvider(String platform) { + Iterable<PlatformProviderFactory> factories = + ServiceLoader.load(PlatformProviderFactory.class, Arguments.class.getClassLoader()); + return StreamSupport.stream(factories.spliterator(), false) + .flatMap(factory -> StreamSupport.stream(factory.createPlatformProviders() + .spliterator(), + false)) + .filter(provider -> platform.equals(provider.getName())) + .findFirst() + .orElse(null); + } + /** * Returns true if there are no files or classes specified for use. * @return true if there are no files or classes specified for use */ public boolean isEmpty() {
*** 526,535 **** --- 603,624 ---- return false; } return true; } + private interface ErrorReporter { + void report(Option o); + } + + void checkOptionAllowed(boolean allowed, ErrorReporter r, Option... opts) { + if (!allowed) { + Stream.of(opts) + .filter(options :: isSet) + .forEach(r :: report); + } + } + void error(String key, Object... args) { errors = true; switch (errorMode) { case ILLEGAL_ARGUMENT: { String msg = log.localize(PrefixKind.JAVAC, key, args);
< prev index next >