8196433: use the new error diagnostic approach at javac.Main

Reviewed-by: jjg
This commit is contained in:
Vicente Romero 2018-04-18 16:02:53 -04:00
parent c215aa5889
commit 03a10ec7b2
31 changed files with 638 additions and 441 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -86,13 +86,17 @@ public interface MessageType {
NAME("name", "Name", "com.sun.tools.javac.util"),
NUMBER("number", "int", null),
OPTION_NAME("option name", "Option", "com.sun.tools.javac.main"),
PROFILE("profile", "Profile", "com.sun.tools.javac.jvm"),
SOURCE("source", "Source", "com.sun.tools.javac.code"),
SOURCE_VERSION("source version", "SourceVersion", "javax.lang.model"),
STRING("string", "String", null),
SYMBOL("symbol", "Symbol", "com.sun.tools.javac.code"),
SYMBOL_KIND("symbol kind", "Kind", "com.sun.tools.javac.code.Kinds"),
KIND_NAME("kind name", "KindName", "com.sun.tools.javac.code.Kinds"),
TARGET("target", "Target", "com.sun.tools.javac.jvm"),
TOKEN("token", "TokenKind", "com.sun.tools.javac.parser.Tokens"),
TYPE("type", "Type", "com.sun.tools.javac.code"),
URL("url", "URL", "java.net"),
SET("set", "Set", "java.util"),
LIST("list", "List", "java.util"),
OBJECT("object", "Object", null),

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -172,7 +172,7 @@ public class JavacTaskImpl extends BasicJavacTask {
if (compiler == null || compiler.errorCount() == 0
|| Options.instance(context).isSet("dev")) {
Log log = Log.instance(context);
log.printLines(PrefixKind.JAVAC, "msg.bug", JavaCompiler.version());
log.printLines("msg.bug", JavaCompiler.version());
ex.printStackTrace(log.getWriter(WriterKind.NOTICE));
}
return abnormalErrorResult;

View File

@ -54,7 +54,6 @@ 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.code.Source.Feature;
import com.sun.tools.javac.file.BaseFileManager;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.jvm.Profile;
@ -66,6 +65,7 @@ import com.sun.tools.javac.resources.CompilerProperties.Errors;
import com.sun.tools.javac.resources.CompilerProperties.Warnings;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.JCDiagnostic;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticInfo;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.util.ListBuffer;
import com.sun.tools.javac.util.Log;
@ -295,7 +295,7 @@ public class Arguments {
String platformString = options.get(Option.RELEASE);
checkOptionAllowed(platformString == null,
option -> error("err.release.bootclasspath.conflict", option.getPrimaryName()),
option -> reportDiag(Errors.ReleaseBootclasspathConflict(option)),
Option.BOOT_CLASS_PATH, Option.XBOOTCLASSPATH, Option.XBOOTCLASSPATH_APPEND,
Option.XBOOTCLASSPATH_PREPEND,
Option.ENDORSEDDIRS, Option.DJAVA_ENDORSED_DIRS,
@ -308,7 +308,7 @@ public class Arguments {
PlatformUtils.lookupPlatformDescription(platformString);
if (platformDescription == null) {
error("err.unsupported.release.version", platformString);
reportDiag(Errors.UnsupportedReleaseVersion(platformString));
return false;
}
@ -363,7 +363,7 @@ public class Arguments {
while (argIter.hasNext()) {
String arg = argIter.next();
if (arg.isEmpty()) {
error("err.invalid.flag", arg);
reportDiag(Errors.InvalidFlag(arg));
return false;
}
@ -392,7 +392,7 @@ public class Arguments {
}
// none of the above
error("err.invalid.flag", arg);
reportDiag(Errors.InvalidFlag(arg));
return false;
}
@ -457,9 +457,9 @@ public class Arguments {
if (!emptyAllowed) {
if (!errors) {
if (JavaCompiler.explicitAnnotationProcessingRequested(options)) {
error("err.no.source.files.classes");
reportDiag(Errors.NoSourceFilesClasses);
} else {
error("err.no.source.files");
reportDiag(Errors.NoSourceFiles);
}
}
return false;
@ -520,13 +520,9 @@ public class Arguments {
if (target.compareTo(source.requiredTarget()) < 0) {
if (targetString != null) {
if (sourceString == null) {
error("warn.target.default.source.conflict",
targetString,
source.requiredTarget().name);
reportDiag(Warnings.TargetDefaultSourceConflict(targetString, source.requiredTarget()));
} else {
error("warn.source.target.conflict",
sourceString,
source.requiredTarget().name);
reportDiag(Warnings.SourceTargetConflict(sourceString, source.requiredTarget()));
}
return false;
} else {
@ -539,13 +535,11 @@ public class Arguments {
if (options.isSet(Option.PREVIEW)) {
if (sourceString == null) {
//enable-preview must be used with explicit -source or --release
error("err.preview.without.source.or.release");
report(Errors.PreviewWithoutSourceOrRelease);
return false;
} else if (source != Source.DEFAULT) {
//enable-preview must be used with latest source version
error("err.preview.not.latest",
sourceString,
Source.DEFAULT.name);
report(Errors.PreviewNotLatest(sourceString, Source.DEFAULT));
return false;
}
}
@ -554,18 +548,18 @@ public class Arguments {
if (profileString != null) {
Profile profile = Profile.lookup(profileString);
if (!profile.isValid(target)) {
error("warn.profile.target.conflict", profileString, target.name);
reportDiag(Warnings.ProfileTargetConflict(profile, target));
}
// This check is only effective in command line mode,
// where the file manager options are added to options
if (options.get(Option.BOOT_CLASS_PATH) != null) {
error("err.profile.bootclasspath.conflict");
reportDiag(Errors.ProfileBootclasspathConflict);
}
}
if (options.isSet(Option.SOURCE_PATH) && options.isSet(Option.MODULE_SOURCE_PATH)) {
error("err.sourcepath.modulesourcepath.conflict");
reportDiag(Errors.SourcepathModulesourcepathConflict);
}
boolean lintOptions = options.isUnset(Option.XLINT_CUSTOM, "-" + LintCategory.OPTIONS.option);
@ -586,15 +580,15 @@ public class Arguments {
}
if (target.compareTo(Target.MIN) < 0) {
log.error(Errors.OptionRemovedTarget(target.name, Target.MIN.name));
log.error(Errors.OptionRemovedTarget(target, Target.MIN));
} else if (target == Target.MIN && lintOptions) {
log.warning(LintCategory.OPTIONS, Warnings.OptionObsoleteTarget(target.name));
log.warning(LintCategory.OPTIONS, Warnings.OptionObsoleteTarget(target));
obsoleteOptionFound = true;
}
final Target t = target;
checkOptionAllowed(t.compareTo(Target.JDK1_8) <= 0,
option -> error("err.option.not.allowed.with.target", option.getPrimaryName(), t.name),
option -> reportDiag(Errors.OptionNotAllowedWithTarget(option, t)),
Option.BOOT_CLASS_PATH,
Option.XBOOTCLASSPATH_PREPEND, Option.XBOOTCLASSPATH, Option.XBOOTCLASSPATH_APPEND,
Option.ENDORSEDDIRS, Option.DJAVA_ENDORSED_DIRS,
@ -602,7 +596,7 @@ public class Arguments {
Option.PROFILE);
checkOptionAllowed(t.compareTo(Target.JDK1_9) >= 0,
option -> error("err.option.not.allowed.with.target", option.getPrimaryName(), t.name),
option -> reportDiag(Errors.OptionNotAllowedWithTarget(option, t)),
Option.MODULE_SOURCE_PATH, Option.UPGRADE_MODULE_PATH,
Option.SYSTEM, Option.MODULE_PATH, Option.ADD_MODULES,
Option.ADD_EXPORTS, Option.ADD_OPENS, Option.ADD_READS,
@ -610,7 +604,7 @@ public class Arguments {
Option.PATCH_MODULE);
if (lintOptions && options.isSet(Option.PARAMETERS) && !target.hasMethodParameters()) {
log.warning(Warnings.OptionParametersUnsupported(target.name, Target.JDK1_8.name));
log.warning(Warnings.OptionParametersUnsupported(target, Target.JDK1_8));
}
if (fm.hasLocation(StandardLocation.MODULE_SOURCE_PATH)) {
@ -871,7 +865,7 @@ public class Arguments {
}
Path file = Paths.get(value);
if (Files.exists(file) && !Files.isDirectory(file)) {
error("err.file.not.directory", value);
reportDiag(Errors.FileNotDirectory(value));
return false;
}
return true;
@ -889,35 +883,19 @@ public class Arguments {
}
}
void error(JCDiagnostic.Error error) {
void reportDiag(DiagnosticInfo diag) {
errors = true;
switch (errorMode) {
case ILLEGAL_ARGUMENT: {
String msg = log.localize(error);
String msg = log.localize(diag);
throw new PropagatedException(new IllegalArgumentException(msg));
}
case ILLEGAL_STATE: {
String msg = log.localize(error);
String msg = log.localize(diag);
throw new PropagatedException(new IllegalStateException(msg));
}
case LOG:
report(error);
}
}
void error(String key, Object... args) {
errors = true;
switch (errorMode) {
case ILLEGAL_ARGUMENT: {
String msg = log.localize(PrefixKind.JAVAC, key, args);
throw new PropagatedException(new IllegalArgumentException(msg));
}
case ILLEGAL_STATE: {
String msg = log.localize(PrefixKind.JAVAC, key, args);
throw new PropagatedException(new IllegalStateException(msg));
}
case LOG:
report(key, args);
report(diag);
}
}
@ -932,22 +910,17 @@ public class Arguments {
throw new PropagatedException(new IllegalStateException(msg, f.getCause()));
}
case LOG:
log.printRawLines(ownName + ": " + msg);
log.printRawLines(msg);
}
}
void warning(String key, Object... args) {
report(key, args);
}
private void report(String key, Object... args) {
private void report(DiagnosticInfo diag) {
// Would be good to have support for -XDrawDiagnostics here
log.printRawLines(ownName + ": " + log.localize(PrefixKind.JAVAC, key, args));
}
private void report(JCDiagnostic.Error error) {
// Would be good to have support for -XDrawDiagnostics here
log.printRawLines(ownName + ": " + log.localize(error));
if (diag instanceof JCDiagnostic.Error) {
log.error((JCDiagnostic.Error)diag);
} else if (diag instanceof JCDiagnostic.Warning){
log.warning((JCDiagnostic.Warning)diag);
}
}
private JavaFileManager getFileManager() {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -49,7 +49,9 @@ import com.sun.tools.javac.jvm.Target;
import com.sun.tools.javac.main.CommandLine.UnmatchedQuote;
import com.sun.tools.javac.platform.PlatformDescription;
import com.sun.tools.javac.processing.AnnotationProcessingError;
import com.sun.tools.javac.resources.CompilerProperties.Errors;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticInfo;
import com.sun.tools.javac.util.Log.PrefixKind;
import com.sun.tools.javac.util.Log.WriterKind;
@ -138,19 +140,22 @@ public class Main {
/** Report a usage error.
*/
void error(String key, Object... args) {
void reportDiag(DiagnosticInfo diag) {
if (apiMode) {
String msg = log.localize(PrefixKind.JAVAC, key, args);
String msg = log.localize(diag);
throw new PropagatedException(new IllegalStateException(msg));
}
warning(key, args);
reportHelper(diag);
log.printLines(PrefixKind.JAVAC, "msg.usage", ownName);
}
/** Report a warning.
/** Report helper.
*/
void warning(String key, Object... args) {
log.printRawLines(ownName + ": " + log.localize(PrefixKind.JAVAC, key, args));
void reportHelper(DiagnosticInfo diag) {
String msg = log.localize(diag);
String errorPrefix = log.localize(Errors.Error);
msg = msg.startsWith(errorPrefix) ? msg : errorPrefix + msg;
log.printRawLines(msg);
}
@ -209,10 +214,10 @@ public class Main {
try {
argv = CommandLine.parse(ENV_OPT_NAME, argv);
} catch (UnmatchedQuote ex) {
error("err.unmatched.quote", ex.variableName);
reportDiag(Errors.UnmatchedQuote(ex.variableName));
return Result.CMDERR;
} catch (FileNotFoundException | NoSuchFileException e) {
warning("err.file.not.found", e.getMessage());
reportHelper(Errors.FileNotFound(e.getMessage()));
return Result.SYSERR;
} catch (IOException ex) {
log.printLines(PrefixKind.JAVAC, "msg.io");
@ -366,11 +371,10 @@ public class Main {
CodeSource otherClassCodeSource = otherClass.getProtectionDomain().getCodeSource();
CodeSource javacCodeSource = this.getClass().getProtectionDomain().getCodeSource();
if (otherClassCodeSource != null && javacCodeSource != null) {
log.printLines(PrefixKind.JAVAC, "err.two.class.loaders.2",
otherClassCodeSource.getLocation(),
javacCodeSource.getLocation());
log.printLines(Errors.TwoClassLoaders2(otherClassCodeSource.getLocation(),
javacCodeSource.getLocation()));
} else {
log.printLines(PrefixKind.JAVAC, "err.two.class.loaders.1");
log.printLines(Errors.TwoClassLoaders1);
}
return true;
}

View File

@ -59,6 +59,7 @@ import com.sun.tools.javac.jvm.Profile;
import com.sun.tools.javac.jvm.Target;
import com.sun.tools.javac.platform.PlatformProvider;
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
import com.sun.tools.javac.resources.CompilerProperties.Errors;
import com.sun.tools.javac.util.Assert;
import com.sun.tools.javac.util.Log;
import com.sun.tools.javac.util.Log.PrefixKind;
@ -197,7 +198,7 @@ public enum Option {
@Override
public void process(OptionHelper helper, String option, String arg) throws InvalidValueException {
if (arg.isEmpty()) {
throw helper.newInvalidValueException("err.no.value.for.option", option);
throw helper.newInvalidValueException(Errors.NoValueForOption(option));
} else if (getPattern().matcher(arg).matches()) {
String prev = helper.get(PATCH_MODULE);
if (prev == null) {
@ -209,13 +210,13 @@ public enum Option {
.collect(Collectors.toSet())
.contains(argModulePackage);
if (isRepeated) {
throw helper.newInvalidValueException("err.repeated.value.for.patch.module", argModulePackage);
throw helper.newInvalidValueException(Errors.RepeatedValueForPatchModule(argModulePackage));
} else {
super.process(helper, option, prev + '\0' + arg);
}
}
} else {
throw helper.newInvalidValueException("err.bad.value.for.option", option, arg);
throw helper.newInvalidValueException(Errors.BadValueForOption(option, arg));
}
}
@ -290,7 +291,7 @@ public enum Option {
public void process(OptionHelper helper, String option, String operand) throws InvalidValueException {
Source source = Source.lookup(operand);
if (source == null) {
throw helper.newInvalidValueException("err.invalid.source", operand);
throw helper.newInvalidValueException(Errors.InvalidSource(operand));
}
super.process(helper, option, operand);
}
@ -301,7 +302,7 @@ public enum Option {
public void process(OptionHelper helper, String option, String operand) throws InvalidValueException {
Target target = Target.lookup(operand);
if (target == null) {
throw helper.newInvalidValueException("err.invalid.target", operand);
throw helper.newInvalidValueException(Errors.InvalidTarget(operand));
}
super.process(helper, option, operand);
}
@ -337,7 +338,7 @@ public enum Option {
public void process(OptionHelper helper, String option, String operand) throws InvalidValueException {
Profile profile = Profile.lookup(operand);
if (profile == null) {
throw helper.newInvalidValueException("err.invalid.profile", operand);
throw helper.newInvalidValueException(Errors.InvalidProfile(operand));
}
super.process(helper, option, operand);
}
@ -392,12 +393,12 @@ public enum Option {
public void process(OptionHelper helper, String option) throws InvalidValueException {
int argLength = option.length();
if (argLength == 2) {
throw helper.newInvalidValueException("err.empty.A.argument");
throw helper.newInvalidValueException(Errors.EmptyAArgument);
}
int sepIndex = option.indexOf('=');
String key = option.substring(2, (sepIndex != -1 ? sepIndex : argLength) );
if (!JavacProcessingEnvironment.isValidOptionName(key)) {
throw helper.newInvalidValueException("err.invalid.A.key", option);
throw helper.newInvalidValueException(Errors.InvalidAKey(option));
}
helper.put(option, option);
}
@ -410,14 +411,13 @@ public enum Option {
public void process(OptionHelper helper, String option, String arg) throws InvalidValueException {
String prev = helper.get(DEFAULT_MODULE_FOR_CREATED_FILES);
if (prev != null) {
throw helper.newInvalidValueException("err.option.too.many",
DEFAULT_MODULE_FOR_CREATED_FILES.primaryName);
throw helper.newInvalidValueException(Errors.OptionTooMany(DEFAULT_MODULE_FOR_CREATED_FILES.primaryName));
} else if (arg.isEmpty()) {
throw helper.newInvalidValueException("err.no.value.for.option", option);
throw helper.newInvalidValueException(Errors.NoValueForOption(option));
} else if (getPattern().matcher(arg).matches()) {
helper.put(DEFAULT_MODULE_FOR_CREATED_FILES.primaryName, arg);
} else {
throw helper.newInvalidValueException("err.bad.value.for.option", option, arg);
throw helper.newInvalidValueException(Errors.BadValueForOption(option, arg));
}
}
@ -487,7 +487,7 @@ public enum Option {
Log log = helper.getLog();
log.setWriters(new PrintWriter(new FileWriter(arg), true));
} catch (java.io.IOException e) {
throw helper.newInvalidValueException("err.error.writing.file", arg, e);
throw helper.newInvalidValueException(Errors.ErrorWritingFile(arg, e.getMessage()));
}
super.process(helper, option, arg);
}
@ -570,12 +570,12 @@ public enum Option {
@Override
public void process(OptionHelper helper, String option, String arg) throws InvalidValueException {
if (arg.isEmpty()) {
throw helper.newInvalidValueException("err.no.value.for.option", option);
throw helper.newInvalidValueException(Errors.NoValueForOption(option));
} else if (getPattern().matcher(arg).matches()) {
String prev = helper.get(ADD_EXPORTS);
helper.put(ADD_EXPORTS.primaryName, (prev == null) ? arg : prev + '\0' + arg);
} else {
throw helper.newInvalidValueException("err.bad.value.for.option", option, arg);
throw helper.newInvalidValueException(Errors.BadValueForOption(option, arg));
}
}
@ -591,12 +591,12 @@ public enum Option {
@Override
public void process(OptionHelper helper, String option, String arg) throws InvalidValueException {
if (arg.isEmpty()) {
throw helper.newInvalidValueException("err.no.value.for.option", option);
throw helper.newInvalidValueException(Errors.NoValueForOption(option));
} else if (getPattern().matcher(arg).matches()) {
String prev = helper.get(ADD_READS);
helper.put(ADD_READS.primaryName, (prev == null) ? arg : prev + '\0' + arg);
} else {
throw helper.newInvalidValueException("err.bad.value.for.option", option, arg);
throw helper.newInvalidValueException(Errors.BadValueForOption(option, arg));
}
}
@ -612,14 +612,14 @@ public enum Option {
@Override
public void process(OptionHelper helper, String option, String arg) throws InvalidValueException {
if (arg.isEmpty()) {
throw helper.newInvalidValueException("err.no.value.for.option", option);
throw helper.newInvalidValueException(Errors.NoValueForOption(option));
} else if (getPattern().matcher(arg).matches()) {
String prev = helper.get(ADD_MODULES);
// since the individual values are simple names, we can simply join the
// values of multiple --add-modules options with ','
helper.put(ADD_MODULES.primaryName, (prev == null) ? arg : prev + ',' + arg);
} else {
throw helper.newInvalidValueException("err.bad.value.for.option", option, arg);
throw helper.newInvalidValueException(Errors.BadValueForOption(option, arg));
}
}
@ -633,11 +633,11 @@ public enum Option {
@Override
public void process(OptionHelper helper, String option, String arg) throws InvalidValueException {
if (arg.isEmpty()) {
throw helper.newInvalidValueException("err.no.value.for.option", option);
throw helper.newInvalidValueException(Errors.NoValueForOption(option));
} else if (getPattern().matcher(arg).matches()) {
helper.put(LIMIT_MODULES.primaryName, arg); // last one wins
} else {
throw helper.newInvalidValueException("err.bad.value.for.option", option, arg);
throw helper.newInvalidValueException(Errors.BadValueForOption(option, arg));
}
}
@ -651,13 +651,13 @@ public enum Option {
@Override
public void process(OptionHelper helper, String option, String arg) throws InvalidValueException {
if (arg.isEmpty()) {
throw helper.newInvalidValueException("err.no.value.for.option", option);
throw helper.newInvalidValueException(Errors.NoValueForOption(option));
} else {
// use official parser if available
try {
ModuleDescriptor.Version.parse(arg);
} catch (IllegalArgumentException e) {
throw helper.newInvalidValueException("err.bad.value.for.option", option, arg);
throw helper.newInvalidValueException(Errors.BadValueForOption(option, arg));
}
}
super.process(helper, option, arg);
@ -692,10 +692,10 @@ public enum Option {
if (option.endsWith(".java") ) {
Path p = Paths.get(option);
if (!Files.exists(p)) {
throw helper.newInvalidValueException("err.file.not.found", p);
throw helper.newInvalidValueException(Errors.FileNotFound(p.toString()));
}
if (!Files.isRegularFile(p)) {
throw helper.newInvalidValueException("err.file.not.file", p);
throw helper.newInvalidValueException(Errors.FileNotFile(p));
}
helper.addFile(p);
} else {
@ -1078,7 +1078,7 @@ public enum Option {
operand = arg.substring(sep + 1);
} else {
if (!rest.hasNext()) {
throw helper.newInvalidValueException("err.req.arg", arg);
throw helper.newInvalidValueException(Errors.ReqArg(this.primaryName));
}
option = arg;
operand = rest.next();

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -27,7 +27,9 @@ package com.sun.tools.javac.main;
import java.nio.file.Path;
import com.sun.tools.javac.resources.CompilerProperties.Errors;
import com.sun.tools.javac.util.JCDiagnostic;
import com.sun.tools.javac.util.JCDiagnostic.Error;
import com.sun.tools.javac.util.Log;
import com.sun.tools.javac.util.Log.PrefixKind;
@ -89,8 +91,8 @@ public abstract class OptionHelper {
* @param args the arguments, if any, for the resource string
* @return the InvalidValueException
*/
Option.InvalidValueException newInvalidValueException(String key, Object... args) {
return new Option.InvalidValueException(getLog().localize(PrefixKind.JAVAC, key, args));
Option.InvalidValueException newInvalidValueException(Error error) {
return new Option.InvalidValueException(getLog().localize(error));
}
/** Record a file to be compiled. */

View File

@ -39,13 +39,18 @@
# name a name, typically a Java identifier
# number an integer
# option name the name of a command line option
# source version a source version number, such as 1.5, 1.6, 1.7
# path a path
# profile a profile name
# source a source version number, such as 1.5, 1.6, 1.7, taken from a com.sun.tools.javac.code.Source
# source version a source version number, such as 1.5, 1.6, 1.7, taken from a javax.lang.model.SourceVersion
# string a general string
# symbol the name of a declared type
# symbol kind the kind of a symbol (i.e. method, variable)
# kind name an informative description of the kind of a declaration; see compiler.misc.kindname.*
# target a target version number, such as 1.5, 1.6, 1.7, taken from a com.sun.tools.javac.jvm.Target
# token the name of a non-terminal in source code; see compiler.misc.token.*
# type a Java type; e.g. int, X, X<T>
# url a URL
# object a Java object (unspecified)
# unused the value is not used in this message
#
@ -1779,7 +1784,7 @@ compiler.warn.source.no.bootclasspath=\
compiler.warn.option.obsolete.source=\
source value {0} is obsolete and will be removed in a future release
# 0: string
# 0: target
compiler.warn.option.obsolete.target=\
target value {0} is obsolete and will be removed in a future release
@ -1787,12 +1792,12 @@ compiler.warn.option.obsolete.target=\
compiler.err.option.removed.source=\
Source option {0} is no longer supported. Use {1} or later.
# 0: string, 1: string
# 0: target, 1: target
compiler.err.option.removed.target=\
Target option {0} is no longer supported. Use {1} or later.
# 0: string, 1: string
# 0: target, 1: target
compiler.warn.option.parameters.unsupported=\
-parameters is not supported for target value {0}. Use {1} or later.
@ -3257,3 +3262,123 @@ compiler.warn.leaks.not.accessible.unexported.qualified=\
# 0: string, 1: string
compiler.err.illegal.argument.for.option=\
illegal argument for {0}: {1}
############################################
# messages previouly at javac.properties
compiler.err.empty.A.argument=\
-A requires an argument; use ''-Akey'' or ''-Akey=value''
# 0: string
compiler.err.invalid.A.key=\
key in annotation processor option ''{0}'' is not a dot-separated sequence of identifiers
# 0: string
compiler.err.invalid.flag=\
invalid flag: {0}
compiler.err.profile.bootclasspath.conflict=\
profile and bootclasspath options cannot be used together
# 0: string
compiler.err.invalid.profile=\
invalid profile: {0}
# 0: string
compiler.err.invalid.target=\
invalid target release: {0}
# 0: option name, 1: target
compiler.err.option.not.allowed.with.target=\
option {0} not allowed with target {1}
# 0: string
compiler.err.option.too.many=\
option {0} can only be specified once
compiler.err.no.source.files=\
no source files
compiler.err.no.source.files.classes=\
no source files or class names
# 0: string
compiler.err.req.arg=\
{0} requires an argument
# 0: string
compiler.err.invalid.source=\
invalid source release: {0}
# 0: string, 1: string
compiler.err.error.writing.file=\
error writing {0}; {1}
compiler.err.sourcepath.modulesourcepath.conflict=\
cannot specify both --source-path and --module-source-path
# 0: string, 1: target
compiler.warn.source.target.conflict=\
source release {0} requires target release {1}
# 0: string, 1: target
compiler.warn.target.default.source.conflict=\
target release {0} conflicts with default source release {1}
# 0: profile, 1: target
compiler.warn.profile.target.conflict=\
profile {0} is not valid for target release {1}
# 0: string
compiler.err.file.not.directory=\
not a directory: {0}
# 0: object
compiler.err.file.not.file=\
not a file: {0}
compiler.err.two.class.loaders.1=\
javac is split between multiple class loaders: check your configuration
# 0: url, 1: url
compiler.err.two.class.loaders.2=\
javac is split between multiple class loaders:\n\
one class comes from file: {0}\n\
while javac comes from {1}
# 0: string, 1: string
compiler.err.bad.value.for.option=\
bad value for {0} option: ''{1}''
# 0: string
compiler.err.no.value.for.option=\
no value for {0} option
# 0: string
compiler.err.repeated.value.for.patch.module=\
--patch-module specified more than once for {0}
# 0: string
compiler.err.unmatched.quote=\
unmatched quote in environment variable {0}
# 0: option name
compiler.err.release.bootclasspath.conflict=\
option {0} cannot be used together with --release
# 0: string
compiler.err.unsupported.release.version=\
release version {0} not supported
# 0: string
compiler.err.file.not.found=\
file not found: {0}
# 0: string, 1: source
compiler.err.preview.not.latest=\
invalid source release {0} with --enable-preview\n\
(preview language features are only supported for release {1})
compiler.err.preview.without.source.or.release=\
--enable-preview must be used with either -source or --release

View File

@ -335,71 +335,6 @@ javac.opt.inherit_runtime_environment=\
javac.opt.default.module.for.created.files=\
Fallback target module for files created by annotation processors, if none specified or inferred.
## errors
javac.err.empty.A.argument=\
-A requires an argument; use ''-Akey'' or ''-Akey=value''
javac.err.invalid.arg=\
invalid argument: {0}
javac.err.invalid.A.key=\
key in annotation processor option ''{0}'' is not a dot-separated sequence of identifiers
javac.err.invalid.flag=\
invalid flag: {0}
javac.err.profile.bootclasspath.conflict=\
profile and bootclasspath options cannot be used together
javac.err.invalid.profile=\
invalid profile: {0}
javac.err.invalid.target=\
invalid target release: {0}
javac.err.option.not.allowed.with.target=\
option {0} not allowed with target {1}
javac.err.option.too.many=\
option {0} can only be specified once
javac.err.no.source.files=\
no source files
javac.err.no.source.files.classes=\
no source files or class names
javac.err.req.arg=\
{0} requires an argument
javac.err.invalid.source=\
invalid source release: {0}
javac.err.error.writing.file=\
error writing {0}; {1}
javac.err.sourcepath.modulesourcepath.conflict=\
cannot specify both --source-path and --module-source-path
javac.warn.source.target.conflict=\
source release {0} requires target release {1}
javac.warn.target.default.source.conflict=\
target release {0} conflicts with default source release {1}
javac.warn.profile.target.conflict=\
profile {0} is not valid for target release {1}
javac.err.preview.not.latest=\
invalid source release {0} with --enable-preview\n\
(preview language features are only supported for release {1})
javac.err.preview.without.source.or.release=\
--enable-preview must be used with either -source or --release
javac.err.file.not.found=\
file not found: {0}
javac.err.file.not.directory=\
not a directory: {0}
javac.err.file.not.file=\
not a file: {0}
javac.err.two.class.loaders.1=\
javac is split between multiple class loaders: check your configuration
javac.err.two.class.loaders.2=\
javac is split between multiple class loaders:\n\
one class comes from file: {0}\n\
while javac comes from {1}
javac.err.bad.value.for.option=\
bad value for {0} option: ''{1}''
javac.err.no.value.for.option=\
no value for {0} option
javac.err.repeated.value.for.patch.module=\
--patch-module specified more than once for {0}
javac.err.unmatched.quote=\
unmatched quote in environment variable %s
## messages
javac.msg.usage.header=\
@ -437,9 +372,3 @@ Consult the following stack trace for details.\n
javac.version={0} {1}
javac.fullVersion={0} full version "{1}"
javac.err.release.bootclasspath.conflict=\
option {0} cannot be used together with --release
javac.err.unsupported.release.version=\
release version {0} not supported

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -43,11 +43,13 @@ import com.sun.tools.javac.api.DiagnosticFormatter.PositionKind;
import com.sun.tools.javac.api.Formattable;
import com.sun.tools.javac.code.Lint.LintCategory;
import com.sun.tools.javac.code.Printer;
import com.sun.tools.javac.code.Source;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.code.Type.CapturedType;
import com.sun.tools.javac.file.PathFileObject;
import com.sun.tools.javac.jvm.Profile;
import com.sun.tools.javac.jvm.Target;
import com.sun.tools.javac.main.Option;
import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.tree.Pretty;
@ -211,6 +213,12 @@ public abstract class AbstractDiagnosticFormatter implements DiagnosticFormatter
else if (arg instanceof Formattable) {
return ((Formattable)arg).toString(l, messages);
}
else if (arg instanceof Target) {
return ((Target)arg).name;
}
else if (arg instanceof Source) {
return ((Source)arg).name;
}
else {
return String.valueOf(arg);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -26,6 +26,7 @@
package com.sun.tools.javac.util;
import com.sun.tools.javac.api.Messages;
import java.lang.ref.SoftReference;
import java.util.ResourceBundle;
import java.util.MissingResourceException;
@ -34,6 +35,10 @@ import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import com.sun.tools.javac.api.DiagnosticFormatter;
import com.sun.tools.javac.util.JCDiagnostic.Factory;
import com.sun.tools.javac.resources.CompilerProperties.Errors;
/**
* Support for formatted localized messages.
*
@ -61,6 +66,9 @@ public class JavacMessages implements Messages {
private Locale currentLocale;
private List<ResourceBundle> currentBundles;
private DiagnosticFormatter<JCDiagnostic> diagFormatter;
private JCDiagnostic.Factory diagFactory;
public Locale getCurrentLocale() {
return currentLocale;
}
@ -73,11 +81,18 @@ public class JavacMessages implements Messages {
this.currentLocale = locale;
}
Context context;
/** Creates a JavacMessages object.
*/
public JavacMessages(Context context) {
this(defaultBundleName, context.get(Locale.class));
this.context = context;
context.put(messagesKey, this);
Options options = Options.instance(context);
boolean rawDiagnostics = options.isSet("rawDiagnostics");
this.diagFormatter = rawDiagnostics ? new RawDiagnosticFormatter(options) :
new BasicDiagnosticFormatter(options, this);
}
/** Creates a JavacMessages object.
@ -140,6 +155,10 @@ public class JavacMessages implements Messages {
return getLocalizedString(currentLocale, key, args);
}
public String getLocalizedString(JCDiagnostic.DiagnosticInfo diagInfo) {
return getLocalizedString(currentLocale, diagInfo);
}
@Override
public String getLocalizedString(Locale l, String key, Object... args) {
if (l == null)
@ -147,6 +166,12 @@ public class JavacMessages implements Messages {
return getLocalizedString(getBundles(l), key, args);
}
public String getLocalizedString(Locale l, JCDiagnostic.DiagnosticInfo diagInfo) {
if (l == null)
l = getCurrentLocale();
return getLocalizedString(getBundles(l), diagInfo);
}
/* Static access:
* javac has a firmly entrenched notion of a default message bundle
* which it can access from any static context. This is used to get
@ -185,7 +210,7 @@ public class JavacMessages implements Messages {
}
}
private static String getLocalizedString(List<ResourceBundle> bundles,
static private String getLocalizedString(List<ResourceBundle> bundles,
String key,
Object... args) {
String msg = null;
@ -205,6 +230,36 @@ public class JavacMessages implements Messages {
return MessageFormat.format(msg, args);
}
private String getLocalizedString(List<ResourceBundle> bundles, JCDiagnostic.DiagnosticInfo diagInfo) {
String msg = null;
for (List<ResourceBundle> l = bundles; l.nonEmpty() && msg == null; l = l.tail) {
ResourceBundle rb = l.head;
try {
msg = rb.getString(diagInfo.key());
}
catch (MissingResourceException e) {
// ignore, try other bundles in list
}
}
if (msg == null) {
msg = "compiler message file broken: key=" + diagInfo.key() +
" arguments={0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}";
}
if (diagInfo == Errors.Error) {
return MessageFormat.format(msg, new Object[0]);
} else {
return diagFormatter.format(getDiagFactory().create(DiagnosticSource.NO_SOURCE, null, diagInfo),
getCurrentLocale());
}
}
JCDiagnostic.Factory getDiagFactory() {
if (diagFactory == null) {
this.diagFactory = JCDiagnostic.Factory.instance(context);
}
return diagFactory;
}
/**
* This provides a way for the JavacMessager to retrieve a
* ResourceBundle from another module such as jdk.javadoc.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -42,6 +42,7 @@ import com.sun.tools.javac.main.Main;
import com.sun.tools.javac.main.Option;
import com.sun.tools.javac.tree.EndPosTable;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticInfo;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType;
@ -597,6 +598,11 @@ public class Log extends AbstractLog {
printRawLines(noticeWriter, localize(key, args));
}
public void printLines(DiagnosticInfo diag) {
PrintWriter noticeWriter = writers.get(WriterKind.NOTICE);
printRawLines(noticeWriter, localize(diag));
}
public void printLines(PrefixKind pk, String key, Object... args) {
PrintWriter noticeWriter = writers.get(WriterKind.NOTICE);
printRawLines(noticeWriter, localize(pk, key, args));
@ -789,7 +795,7 @@ public class Log extends AbstractLog {
if (useRawMessages) {
return diagInfo.key();
} else {
return messages.getLocalizedString(diagInfo.key(), diagInfo.args);
return messages.getLocalizedString(diagInfo);
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -79,7 +79,7 @@ public class BadOptionsTest extends TestRunner {
.run(Task.Expect.FAIL)
.writeAll();
checkFound(result.getOutput(Task.OutputKind.DIRECT),
"javadoc: error - no value for --add-modules option");
"javadoc: error - error: no value for --add-modules option");
checkNotFound(result, "Exception", "at jdk.javadoc/");
}
@ -104,7 +104,7 @@ public class BadOptionsTest extends TestRunner {
.run(Task.Expect.FAIL)
.writeAll();
checkFound(result.getOutput(Task.OutputKind.DIRECT),
"javadoc: error - no value for --add-exports option");
"javadoc: error - error: no value for --add-exports option");
checkNotFound(result, "Exception", "at jdk.javadoc/");
}
@ -116,7 +116,7 @@ public class BadOptionsTest extends TestRunner {
.run(Task.Expect.FAIL)
.writeAll();
checkFound(result.getOutput(Task.OutputKind.DIRECT),
"javadoc: error - bad value for --add-exports option");
"javadoc: error - error: bad value for --add-exports option: 'm/p'");
checkNotFound(result, "Exception", "at jdk.javadoc/");
}
@ -146,7 +146,7 @@ public class BadOptionsTest extends TestRunner {
.run(Task.Expect.FAIL)
.writeAll();
checkFound(result.getOutput(Task.OutputKind.DIRECT),
"javadoc: cannot specify both --source-path and --module-source-path");
"error: cannot specify both --source-path and --module-source-path");
checkFound(result.getOutput(Task.OutputKind.DIRECT),
"1 error");
}

View File

@ -1,59 +0,0 @@
/*
* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 6410653 6401277
* @summary REGRESSION: javac crashes if -d or -s argument is a file
* @author Peter von der Ah\u00e9
* @modules java.compiler
* jdk.compiler/com.sun.tools.javac.util:open
*/
import java.lang.reflect.Field;
import java.io.File;
import java.io.ByteArrayOutputStream;
import javax.tools.*;
public class T6410653 {
public static void main(String... args) throws Exception {
File testSrc = new File(System.getProperty("test.src"));
String source = new File(testSrc, "T6410653.java").getPath();
Tool compiler = ToolProvider.getSystemJavaCompiler();
Module compilerModule = compiler.getClass().getModule();
Class<?> log = Class.forName(compilerModule, "com.sun.tools.javac.util.Log");
Field useRawMessages = log.getDeclaredField("useRawMessages");
useRawMessages.setAccessible(true);
useRawMessages.setBoolean(null, true);
ByteArrayOutputStream out = new ByteArrayOutputStream();
compiler.run(null, null, out, "-d", source, source);
System.err.println(">>>" + out + "<<<");
useRawMessages.setBoolean(null, false);
if (!out.toString().equals(String.format("%s%n",
"javac: javac.err.file.not.directory"))) {
throw new AssertionError(out);
}
System.out.println("Test PASSED. Running javac again to see localized output:");
compiler.run(null, null, System.out, "-d", source, source);
}
}

View File

@ -1,69 +0,0 @@
/*
* Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8009640
* @summary -profile <compact> does not work when -bootclasspath specified
* @library /tools/lib
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.main
* jdk.compiler/com.sun.tools.javac.util
* jdk.jdeps/com.sun.tools.javap
* @build toolbox.ToolBox toolbox.JavacTask
* @run main CheckRejectProfileBCPOptionsIfUsedTogetherTest
*/
import java.nio.file.Paths;
import com.sun.tools.javac.util.Assert;
import toolbox.JavacTask;
import toolbox.Task;
import toolbox.ToolBox;
public class CheckRejectProfileBCPOptionsIfUsedTogetherTest {
private static final String TestSrc =
"public class Test {\n" +
" javax.swing.JButton b;\n" +
"}";
public static void main(String args[]) throws Exception {
ToolBox tb = new ToolBox();
tb.writeFile("Test.java", TestSrc);
Task.Result result = new JavacTask(tb, Task.Mode.CMDLINE)
.options("-profile", "compact1",
"-bootclasspath", Paths.get(ToolBox.testJDK, "jre/lib/rt.jar").toString())
.files("Test.java")
.run(Task.Expect.FAIL)
.writeAll();
String out = result.getOutput(Task.OutputKind.DIRECT);
Assert.check(out.startsWith(
"javac: profile and bootclasspath options cannot be used together"),
"Incorrect javac error output");
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -233,7 +233,6 @@ public class CheckResourceKeys {
"compiler.misc.non.denotable.type", // UNUSED
"compiler.misc.unnamed.package", // should be required, CR 6964147
"compiler.warn.proc.type.already.exists", // TODO in JavacFiler
"javac.err.invalid.arg", // UNUSED ??
"javac.opt.arg.class", // UNUSED ??
"javac.opt.arg.pathname", // UNUSED ??
"javac.opt.moreinfo", // option commented out

View File

@ -157,3 +157,35 @@ compiler.err.duplicate.module.on.path
compiler.err.locn.module-info.not.allowed.on.patch.path
compiler.misc.cant.resolve.modules
compiler.misc.file.does.not.contain.module
# these keys were in javac.properties and examples are hard to be produced for them
# basically because in most cases the compilation ends with an exception
compiler.err.bad.value.for.option
compiler.err.empty.A.argument
compiler.err.error.writing.file
compiler.err.file.not.directory
compiler.err.file.not.file
compiler.err.file.not.found
compiler.err.invalid.A.key
compiler.err.invalid.flag
compiler.err.invalid.profile
compiler.err.invalid.source
compiler.err.invalid.target
compiler.err.no.source.files.classes
compiler.err.no.value.for.option
compiler.err.option.not.allowed.with.target
compiler.err.option.too.many
compiler.err.profile.bootclasspath.conflict
compiler.err.release.bootclasspath.conflict
compiler.err.repeated.value.for.patch.module
compiler.err.req.arg
compiler.err.sourcepath.modulesourcepath.conflict
compiler.err.two.class.loaders.1
compiler.err.two.class.loaders.2
compiler.err.unmatched.quote
compiler.err.unsupported.release.version
compiler.warn.profile.target.conflict
compiler.warn.source.target.conflict
compiler.warn.target.default.source.conflict
compiler.err.preview.not.latest
compiler.err.preview.without.source.or.release

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -22,5 +22,6 @@
*/
// key: compiler.warn.dir.path.element.not.directory
// key: compiler.err.no.source.files
// options: -Xlint:path
// run: simple

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -84,7 +84,7 @@ public class DocLintTest {
DL_ERR9(ERROR, "Test.java:9:14: compiler.err.proc.messager: reference not found"),
DL_WRN12(WARNING, "Test.java:12:9: compiler.warn.proc.messager: no description for @return"),
OPT_BADARG(ERROR, "invalid flag: -Xdoclint:badarg");
OPT_BADARG(ERROR, "error: invalid flag: -Xdoclint:badarg");
final Diagnostic.Kind kind;
final String text;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -96,7 +96,7 @@ public class IncludePackagesTest {
p1sp1sp2T(ERROR, "p1sp1sp2T.java:2:12: compiler.err.proc.messager: malformed HTML"),
p2T(ERROR, "p2T.java:2:12: compiler.err.proc.messager: malformed HTML"),
Default(ERROR, "Default.java:1:12: compiler.err.proc.messager: malformed HTML"),
INVALID_PACKAGE_ERROR(ERROR, "invalid flag: -Xdoclint/package:wrong+package");
INVALID_PACKAGE_ERROR(ERROR, "error: invalid flag: -Xdoclint/package:wrong+package");
final Diagnostic.Kind kind;
final String text;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -62,7 +62,7 @@ public class AddExportsTest extends ModuleTestBase {
.getOutput(Task.OutputKind.DIRECT);
checkOutputContains(log,
"javac: no value for --add-exports option");
"error: no value for --add-exports option");
}
@Test
@ -123,7 +123,7 @@ public class AddExportsTest extends ModuleTestBase {
.getOutput(Task.OutputKind.DIRECT);
checkOutputContains(log,
"javac: bad value for --add-exports option: '" + option + "'");
"error: bad value for --add-exports option: '" + option + "'");
}
@Test
@ -158,7 +158,7 @@ public class AddExportsTest extends ModuleTestBase {
.getOutput(Task.OutputKind.DIRECT);
checkOutputContains(log,
"javac: bad value for --add-exports option: '" + option + "'");
"error: bad value for --add-exports option: '" + option + "'");
}
@Test

View File

@ -264,7 +264,7 @@ public class AddLimitMods extends ModuleTestBase {
.writeAll()
.getOutputLines(Task.OutputKind.DIRECT);
if (!actual.contains("javac: option --add-modules not allowed with target 1.8")) {
if (!actual.contains("- compiler.err.option.not.allowed.with.target: --add-modules, 1.8")) {
throw new IllegalStateException("incorrect errors; actual=" + actual);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -73,7 +73,7 @@ public class AddModulesTest extends ModuleTestBase {
.getOutput(Task.OutputKind.DIRECT);
checkOutputContains(log,
"javac: no value for --add-modules option");
"error: no value for --add-modules option");
}
@Test
@ -120,7 +120,7 @@ public class AddModulesTest extends ModuleTestBase {
.getOutput(Task.OutputKind.DIRECT);
checkOutputContains(log,
"javac: bad value for --add-modules option");
"error: bad value for --add-modules option");
}
@Test

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -352,7 +352,7 @@ public class AddReadsTest extends ModuleTestBase {
.getOutput(Task.OutputKind.DIRECT);
checkOutputContains(log,
"javac: no value for --add-reads option");
"error: no value for --add-reads option");
}
@Test
@ -421,7 +421,7 @@ public class AddReadsTest extends ModuleTestBase {
.getOutput(Task.OutputKind.DIRECT);
checkOutputContains(log,
"javac: bad value for --add-reads option: '" + option + "'");
"error: bad value for --add-reads option: '" + option + "'");
}
@Test
@ -572,7 +572,7 @@ public class AddReadsTest extends ModuleTestBase {
.getOutput(Task.OutputKind.DIRECT);
checkOutputContains(log,
"javac: bad value for --add-reads option: 'm1x:m2x'");
"error: bad value for --add-reads option: 'm1x:m2x'");
}
@Test

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -58,7 +58,7 @@ public class LimitModulesTest extends ModuleTestBase {
.writeAll()
.getOutput(Task.OutputKind.DIRECT);
if (!log.contains("javac: no value for --limit-modules option"))
if (!log.contains("error: no value for --limit-modules option"))
throw new Exception("expected output not found");
log = new JavacTask(tb, Task.Mode.CMDLINE)
@ -70,7 +70,7 @@ public class LimitModulesTest extends ModuleTestBase {
.writeAll()
.getOutput(Task.OutputKind.DIRECT);
if (!log.contains("javac: no value for --limit-modules option"))
if (!log.contains("error: no value for --limit-modules option"))
throw new Exception("expected output not found");
}
@ -127,7 +127,7 @@ public class LimitModulesTest extends ModuleTestBase {
.writeAll()
.getOutput(Task.OutputKind.DIRECT);
if (!log.contains("javac: bad value for --limit-modules option"))
if (!log.contains("error: bad value for --limit-modules option"))
throw new Exception("expected output not found");
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -76,7 +76,7 @@ public class ModuleSourcePathTest extends ModuleTestBase {
.writeAll()
.getOutput(Task.OutputKind.DIRECT);
if (!log.contains("cannot specify both --source-path and --module-source-path"))
if (!log.contains("compiler.err.sourcepath.modulesourcepath.conflict"))
throw new Exception("expected diagnostic not found");
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -98,19 +98,19 @@ public class PatchModulesTest extends ModuleTestBase {
@Test
public void testDuplicates(Path base) throws Exception {
test(asList("java.base=a", "java.compiler=b", "java.base=c"),
false, "--patch-module specified more than once for java.base");
false, "error: --patch-module specified more than once for java.base");
}
@Test
public void testEmpty(Path base) throws Exception {
test(asList(""),
false, "no value for --patch-module option");
false, "error: no value for --patch-module option");
}
@Test
public void testInvalid(Path base) throws Exception {
test(asList("java.base/java.lang=."),
false, "bad value for --patch-module option: 'java.base/java.lang=.'");
false, "error: bad value for --patch-module option: 'java.base/java.lang=.'");
}
void test(List<String> patches, String expect) throws Exception {

View File

@ -1,89 +0,0 @@
/*
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8072480
* @summary Verify option clash between --release and -source is reported correctly.
* @modules jdk.compiler/com.sun.tools.javac.util:open
*/
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.tools.Tool;
import javax.tools.ToolProvider;
public class ReleaseOptionClashes {
public static void main(String... args) throws Exception {
new ReleaseOptionClashes().run();
}
void run() throws Exception {
doRunTest("7", "-bootclasspath", "any");
doRunTest("7", "-Xbootclasspath:any");
doRunTest("7", "-Xbootclasspath/a:any");
doRunTest("7", "-Xbootclasspath/p:any");
doRunTest("7", "-endorseddirs", "any");
doRunTest("7", "-extdirs", "any");
doRunTest("7", "-source", "8");
doRunTest("7", "-target", "8");
doRunTest("9", "--system", "none");
doRunTest("9", "--upgrade-module-path", "any");
}
void doRunTest(String release, String... args) throws Exception {
System.out.println("Testing clashes for arguments: " + Arrays.asList(args));
Class<?> log = Class.forName("com.sun.tools.javac.util.Log", true, cl);
Field useRawMessages = log.getDeclaredField("useRawMessages");
useRawMessages.setAccessible(true);
useRawMessages.setBoolean(null, true);
ByteArrayOutputStream out = new ByteArrayOutputStream();
List<String> options = new ArrayList<>();
options.addAll(Arrays.asList("--release", release));
options.addAll(Arrays.asList(args));
options.add(System.getProperty("test.src") + File.separator + "ReleaseOptionClashes.java");
compiler.run(null, null, out, options.toArray(new String[0]));
useRawMessages.setBoolean(null, false);
if (!out.toString().equals(String.format("%s%n%s%n",
"javac: javac.err.release.bootclasspath.conflict",
"javac.msg.usage")) &&
//-Xbootclasspath:any produces two warnings: one for -bootclasspath and one for -Xbootclasspath:
!out.toString().equals(String.format("%s%n%s%n%s%n%s%n",
"javac: javac.err.release.bootclasspath.conflict",
"javac.msg.usage",
"javac: javac.err.release.bootclasspath.conflict",
"javac.msg.usage"))) {
throw new AssertionError(out);
}
System.out.println("Test PASSED. Running javac again to see localized output:");
compiler.run(null, null, System.out, options.toArray(new String[0]));
}
Tool compiler = ToolProvider.getSystemJavaCompiler();
ClassLoader cl = compiler.getClass().getClassLoader();
}

View File

@ -0,0 +1,266 @@
/*
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8196433
* @summary use the new error diagnostic approach at javac.Main
* @library /tools/lib
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.main
* jdk.compiler/com.sun.tools.javac.util
* jdk.jdeps/com.sun.tools.javap
* @build toolbox.ToolBox toolbox.JavacTask toolbox.TestRunner
* @run main OptionSmokeTest
*/
import java.nio.file.Path;
import java.nio.file.Paths;
import com.sun.tools.javac.util.Assert;
import toolbox.TestRunner;
import toolbox.ToolBox;
import toolbox.JavacTask;
import toolbox.Task;
public class OptionSmokeTest extends TestRunner {
ToolBox tb = new ToolBox();
public OptionSmokeTest() {
super(System.err);
}
protected void runTests() throws Exception {
runTests(m -> new Object[] { Paths.get(m.getName()) });
}
Path[] findJavaFiles(Path... paths) throws Exception {
return tb.findJavaFiles(paths);
}
public static void main(String... args) throws Exception {
new OptionSmokeTest().runTests();
}
@Test
public void optionA1(Path base) throws Exception {
doTest(base,
"error: -A requires an argument; use '-Akey' or '-Akey=value'",
"-A");
}
@Test
public void optionA2(Path base) throws Exception {
doTest(base,
"error: key in annotation processor option '-A1e=2' is not a dot-separated sequence of identifiers",
"-A1e=2");
}
@Test
public void noFlag(Path base) throws Exception {
doTest(base, "error: invalid flag: -noFlag", "-noFlag");
}
@Test
public void profileAndBSP(Path base) throws Exception {
doTest(base, "error: profile and bootclasspath options cannot be used together",
"-profile compact1 -bootclasspath . -target 8 -source 8");
}
@Test
public void invalidProfile(Path base) throws Exception {
doTest(base, "error: invalid profile: noProfile",
"-profile noProfile");
}
@Test
public void invalidTarget(Path base) throws Exception {
doTest(base, "error: invalid target release: 999999",
"-target 999999");
}
@Test
public void optionNotAvailableWithTarget(Path base) throws Exception {
doTest(base, "error: option -profile not allowed with target 11",
"-profile compact1 -target 11");
}
@Test
public void optionTooMany(Path base) throws Exception {
doTest(base, "error: option --default-module-for-created-files can only be specified once",
"--default-module-for-created-files=m1x --default-module-for-created-files=m1x");
}
@Test
public void noSrcFiles(Path base) throws Exception {
doTestNoSource(base, "error: no source files", "-target 11");
}
@Test
public void requiresArg(Path base) throws Exception {
doTestNoSource(base, "error: -target requires an argument", "-target");
}
@Test
public void invalidSource(Path base) throws Exception {
doTestNoSource(base, "error: invalid source release: 999999", "-source 999999");
}
@Test
public void sourceAndModuleSourceCantBeTogether(Path base) throws Exception {
doTest(base, "error: cannot specify both --source-path and --module-source-path",
"--source-path . --module-source-path .");
}
@Test
public void sourceAndTargetMismatch(Path base) throws Exception {
doTest(base, "warning: source release 11 requires target release 11",
"-source 11 -target 10");
}
@Test
public void targetConflictsWithDefaultSource(Path base) throws Exception {
doTest(base, "warning: target release 10 conflicts with default source release 11",
"-target 10");
}
@Test
public void profileNotValidForTarget(Path base) throws Exception {
doTest(base, "warning: profile compact2 is not valid for target release 1.7",
"-profile compact2 -target 7 -source 7");
}
@Test
public void fileNotFound(Path base) throws Exception {
String log = new JavacTask(tb, Task.Mode.CMDLINE)
.files("notExistent/T.java")
.run(Task.Expect.FAIL)
.writeAll()
.getOutput(Task.OutputKind.DIRECT);
Assert.check(log.startsWith("error: file not found: notExistent" + fileSeparator + "T.java"),
"real value of log:" + log);
}
static final String fileSeparator = System.getProperty("file.separator");
@Test
public void notADirectory(Path base) throws Exception {
doTest(base, "error: not a directory: notADirectory" + fileSeparator + "src" + fileSeparator + "Dummy.java",
"-d notADirectory" + fileSeparator + "src" + fileSeparator + "Dummy.java");
}
@Test
public void notAFile(Path base) throws Exception {
// looks like a java file, it is a directory
Path dir = base.resolve("dir.java");
tb.createDirectories(dir);
String log = new JavacTask(tb, Task.Mode.CMDLINE)
.spaceSeparatedOptions("-XDsourcefile " + dir)
.run(Task.Expect.FAIL)
.writeAll()
.getOutput(Task.OutputKind.DIRECT);
Assert.check(log.startsWith("error: not a file: notAFile" + fileSeparator + "dir.java"));
}
@Test
public void badValueForOption(Path base) throws Exception {
doTestNoSource(base, "error: bad value for --patch-module option: \'notExistent\'",
"--patch-module notExistent");
}
@Test
public void patchModuleMoreThanOnce(Path base) throws Exception {
doTestNoSource(base, "error: --patch-module specified more than once for m",
"--patch-module m=. --patch-module m=.");
}
@Test
public void unmatchedQuoteInEnvVar(Path base) throws Exception {
Path src = base.resolve("src");
tb.writeJavaFiles(src, "class Dummy {}");
String log = new JavacTask(tb, Task.Mode.EXEC)
.envVar("JDK_JAVAC_OPTIONS", "--add-exports jdk.compiler" + fileSeparator + "com.sun.tools.javac.jvm=\"ALL-UNNAMED")
.files(findJavaFiles(src))
.run(Task.Expect.FAIL)
.writeAll()
.getOutput(Task.OutputKind.STDERR);
Assert.check(log.startsWith("error: unmatched quote in environment variable JDK_JAVAC_OPTIONS"));
}
@Test
public void optionCantBeUsedWithRelease(Path base) throws Exception {
doTestNoSource(base, "error: option -source cannot be used together with --release",
"--release 7 -source 7");
}
@Test
public void releaseVersionNotSupported(Path base) throws Exception {
doTestNoSource(base, "error: release version 99999999 not supported",
"--release 99999999");
}
// taken from former test: tools/javac/options/release/ReleaseOptionClashes
@Test
public void releaseAndBootclasspath(Path base) throws Exception {
doTestNoSource(base, "error: option --boot-class-path cannot be used together with --release",
"--release 7 -bootclasspath any");
doTestNoSource(base, "error: option -Xbootclasspath: cannot be used together with --release",
"--release 7 -Xbootclasspath:any");
doTestNoSource(base, "error: option -Xbootclasspath/p: cannot be used together with --release",
"--release 7 -Xbootclasspath/p:any");
doTestNoSource(base, "error: option -endorseddirs cannot be used together with --release",
"--release 7 -endorseddirs any");
doTestNoSource(base, "error: option -extdirs cannot be used together with --release",
"--release 7 -extdirs any");
doTestNoSource(base, "error: option -source cannot be used together with --release",
"--release 7 -source 8");
doTestNoSource(base, "error: option -target cannot be used together with --release",
"--release 7 -target 8");
doTestNoSource(base, "error: option --system cannot be used together with --release",
"--release 9 --system none");
doTestNoSource(base, "error: option --upgrade-module-path cannot be used together with --release",
"--release 9 --upgrade-module-path any");
}
void doTest(Path base, String output, String options) throws Exception {
Path src = base.resolve("src");
tb.writeJavaFiles(src, "class Dummy { }");
String log = new JavacTask(tb, Task.Mode.CMDLINE)
.spaceSeparatedOptions(options)
.files(findJavaFiles(src))
.run(Task.Expect.FAIL)
.writeAll()
.getOutput(Task.OutputKind.DIRECT);
Assert.check(log.startsWith(output), "expected:\n" + output + '\n' + "found:\n" + log);
}
void doTestNoSource(Path base, String output, String options) throws Exception {
String log = new JavacTask(tb, Task.Mode.CMDLINE)
.spaceSeparatedOptions(options)
.run(Task.Expect.FAIL)
.writeAll()
.getOutput(Task.OutputKind.DIRECT);
Assert.check(log.startsWith(output), "expected:\n" + output + '\n' + "found:\n" + log);
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -141,7 +141,7 @@ public class PlatformProviderTest implements PlatformProvider {
List<String> expectedOutput =
Arrays.asList("getSupportedPlatformNames",
"getPlatform(fail, )",
"javac: javac.err.unsupported.release.version",
"error: release version fail not supported",
"javac.msg.usage");
List<String> actualOutput = result.getOutputLines(Task.OutputKind.STDERR);
result.writeAll();

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -96,7 +96,7 @@ public class BadOptionsTest extends TestRunner {
.run(Task.Expect.FAIL)
.writeAll();
checkFound(result.getOutput(Task.OutputKind.DIRECT),
"javadoc: error - no value for --add-modules option");
"javadoc: error - error: no value for --add-modules option");
checkNotFound(result, "Exception", "at jdk.javadoc/");
}
@ -122,7 +122,7 @@ public class BadOptionsTest extends TestRunner {
.run(Task.Expect.FAIL)
.writeAll();
checkFound(result.getOutput(Task.OutputKind.DIRECT),
"javadoc: error - no value for --add-exports option");
"javadoc: error - error: no value for --add-exports option");
checkNotFound(result, "Exception", "at jdk.javadoc/");
}
@ -135,7 +135,7 @@ public class BadOptionsTest extends TestRunner {
.run(Task.Expect.FAIL)
.writeAll();
checkFound(result.getOutput(Task.OutputKind.DIRECT),
"javadoc: error - bad value for --add-exports option");
"javadoc: error - error: bad value for --add-exports option: 'm/p'");
checkNotFound(result, "Exception", "at jdk.javadoc/");
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -177,6 +177,16 @@ public class JavacTask extends AbstractTask<JavacTask> {
return this;
}
/**
* Sets the options.
* @param spaceSeparatedOption the space separated options
* @return this task object
*/
public JavacTask spaceSeparatedOptions(String spaceSeparatedOption) {
this.options = Arrays.asList(spaceSeparatedOption.split("\\s+"));
return this;
}
/**
* Sets the options.
* @param options the options