提交 be646e7d 编写于 作者: J jjg

6958836: javadoc should support -Xmaxerrs and -Xmaxwarns

Reviewed-by: darcy
上级 b9e9c3c6
...@@ -125,8 +125,8 @@ public class Log extends AbstractLog { ...@@ -125,8 +125,8 @@ public class Log extends AbstractLog {
this.promptOnError = options.get("-prompt") != null; this.promptOnError = options.get("-prompt") != null;
this.emitWarnings = options.get("-Xlint:none") == null; this.emitWarnings = options.get("-Xlint:none") == null;
this.suppressNotes = options.get("suppressNotes") != null; this.suppressNotes = options.get("suppressNotes") != null;
this.MaxErrors = getIntOption(options, "-Xmaxerrs", 100); this.MaxErrors = getIntOption(options, "-Xmaxerrs", getDefaultMaxErrors());
this.MaxWarnings = getIntOption(options, "-Xmaxwarns", 100); this.MaxWarnings = getIntOption(options, "-Xmaxwarns", getDefaultMaxWarnings());
boolean rawDiagnostics = options.get("rawDiagnostics") != null; boolean rawDiagnostics = options.get("rawDiagnostics") != null;
messages = JavacMessages.instance(context); messages = JavacMessages.instance(context);
...@@ -155,6 +155,18 @@ public class Log extends AbstractLog { ...@@ -155,6 +155,18 @@ public class Log extends AbstractLog {
return defaultValue; return defaultValue;
} }
/** Default value for -Xmaxerrs.
*/
protected int getDefaultMaxErrors() {
return 100;
}
/** Default value for -Xmaxwarns.
*/
protected int getDefaultMaxWarnings() {
return 100;
}
/** The default writer for diagnostics /** The default writer for diagnostics
*/ */
static final PrintWriter defaultWriter(Context context) { static final PrintWriter defaultWriter(Context context) {
......
...@@ -155,10 +155,8 @@ public class DocletInvoker { ...@@ -155,10 +155,8 @@ public class DocletInvoker {
public boolean start(RootDoc root) { public boolean start(RootDoc root) {
Object retVal; Object retVal;
String methodName = "start"; String methodName = "start";
Class<?>[] paramTypes = new Class<?>[1]; Class<?>[] paramTypes = { RootDoc.class };
Object[] params = new Object[1]; Object[] params = { root };
paramTypes[0] = RootDoc.class;
params[0] = root;
try { try {
retVal = invoke(methodName, null, paramTypes, params); retVal = invoke(methodName, null, paramTypes, params);
} catch (DocletInvokeException exc) { } catch (DocletInvokeException exc) {
...@@ -181,10 +179,8 @@ public class DocletInvoker { ...@@ -181,10 +179,8 @@ public class DocletInvoker {
public int optionLength(String option) { public int optionLength(String option) {
Object retVal; Object retVal;
String methodName = "optionLength"; String methodName = "optionLength";
Class<?>[] paramTypes = new Class<?>[1]; Class<?>[] paramTypes = { String.class };
Object[] params = new Object[1]; Object[] params = { option };
paramTypes[0] = option.getClass();
params[0] = option;
try { try {
retVal = invoke(methodName, new Integer(0), paramTypes, params); retVal = invoke(methodName, new Integer(0), paramTypes, params);
} catch (DocletInvokeException exc) { } catch (DocletInvokeException exc) {
...@@ -208,12 +204,8 @@ public class DocletInvoker { ...@@ -208,12 +204,8 @@ public class DocletInvoker {
String options[][] = optlist.toArray(new String[optlist.length()][]); String options[][] = optlist.toArray(new String[optlist.length()][]);
String methodName = "validOptions"; String methodName = "validOptions";
DocErrorReporter reporter = messager; DocErrorReporter reporter = messager;
Class<?>[] paramTypes = new Class<?>[2]; Class<?>[] paramTypes = { String[][].class, DocErrorReporter.class };
Object[] params = new Object[2]; Object[] params = { options, reporter };
paramTypes[0] = options.getClass();
paramTypes[1] = DocErrorReporter.class;
params[0] = options;
params[1] = reporter;
try { try {
retVal = invoke(methodName, Boolean.TRUE, paramTypes, params); retVal = invoke(methodName, Boolean.TRUE, paramTypes, params);
} catch (DocletInvokeException exc) { } catch (DocletInvokeException exc) {
......
...@@ -86,7 +86,7 @@ public class Messager extends Log implements DocErrorReporter { ...@@ -86,7 +86,7 @@ public class Messager extends Log implements DocErrorReporter {
private static final long serialVersionUID = 0; private static final long serialVersionUID = 0;
} }
private final String programName; final String programName;
private ResourceBundle messageRB = null; private ResourceBundle messageRB = null;
...@@ -121,6 +121,16 @@ public class Messager extends Log implements DocErrorReporter { ...@@ -121,6 +121,16 @@ public class Messager extends Log implements DocErrorReporter {
this.programName = programName; this.programName = programName;
} }
@Override
protected int getDefaultMaxErrors() {
return Integer.MAX_VALUE;
}
@Override
protected int getDefaultMaxWarnings() {
return Integer.MAX_VALUE;
}
/** /**
* Reset resource bundle, eg. locale has changed. * Reset resource bundle, eg. locale has changed.
*/ */
...@@ -231,11 +241,13 @@ public class Messager extends Log implements DocErrorReporter { ...@@ -231,11 +241,13 @@ public class Messager extends Log implements DocErrorReporter {
* @param msg message to print * @param msg message to print
*/ */
public void printError(SourcePosition pos, String msg) { public void printError(SourcePosition pos, String msg) {
String prefix = (pos == null) ? programName : pos.toString(); if (nerrors < MaxErrors) {
errWriter.println(prefix + ": " + getText("javadoc.error") + " - " + msg); String prefix = (pos == null) ? programName : pos.toString();
errWriter.flush(); errWriter.println(prefix + ": " + getText("javadoc.error") + " - " + msg);
prompt(); errWriter.flush();
nerrors++; prompt();
nerrors++;
}
} }
/** /**
...@@ -256,10 +268,12 @@ public class Messager extends Log implements DocErrorReporter { ...@@ -256,10 +268,12 @@ public class Messager extends Log implements DocErrorReporter {
* @param msg message to print * @param msg message to print
*/ */
public void printWarning(SourcePosition pos, String msg) { public void printWarning(SourcePosition pos, String msg) {
String prefix = (pos == null) ? programName : pos.toString(); if (nwarnings < MaxWarnings) {
warnWriter.println(prefix + ": " + getText("javadoc.warning") +" - " + msg); String prefix = (pos == null) ? programName : pos.toString();
warnWriter.flush(); warnWriter.println(prefix + ": " + getText("javadoc.warning") +" - " + msg);
nwarnings++; warnWriter.flush();
nwarnings++;
}
} }
/** /**
......
...@@ -51,8 +51,6 @@ import static com.sun.tools.javac.code.Flags.*; ...@@ -51,8 +51,6 @@ import static com.sun.tools.javac.code.Flags.*;
* @author Neal Gafter (rewrite) * @author Neal Gafter (rewrite)
*/ */
class Start { class Start {
/** Context for this invocation. */
private final Context context;
private final String defaultDocletClassName; private final String defaultDocletClassName;
private final ClassLoader docletParentClassLoader; private final ClassLoader docletParentClassLoader;
...@@ -98,8 +96,8 @@ class Start { ...@@ -98,8 +96,8 @@ class Start {
PrintWriter noticeWriter, PrintWriter noticeWriter,
String defaultDocletClassName, String defaultDocletClassName,
ClassLoader docletParentClassLoader) { ClassLoader docletParentClassLoader) {
context = new Context(); Context tempContext = new Context(); // interim context until option decoding completed
messager = new Messager(context, programName, errWriter, warnWriter, noticeWriter); messager = new Messager(tempContext, programName, errWriter, warnWriter, noticeWriter);
this.defaultDocletClassName = defaultDocletClassName; this.defaultDocletClassName = defaultDocletClassName;
this.docletParentClassLoader = docletParentClassLoader; this.docletParentClassLoader = docletParentClassLoader;
} }
...@@ -110,8 +108,8 @@ class Start { ...@@ -110,8 +108,8 @@ class Start {
Start(String programName, String defaultDocletClassName, Start(String programName, String defaultDocletClassName,
ClassLoader docletParentClassLoader) { ClassLoader docletParentClassLoader) {
context = new Context(); Context tempContext = new Context(); // interim context until option decoding completed
messager = new Messager(context, programName); messager = new Messager(tempContext, programName);
this.defaultDocletClassName = defaultDocletClassName; this.defaultDocletClassName = defaultDocletClassName;
this.docletParentClassLoader = docletParentClassLoader; this.docletParentClassLoader = docletParentClassLoader;
} }
...@@ -144,6 +142,13 @@ class Start { ...@@ -144,6 +142,13 @@ class Start {
} }
} }
/**
* Usage
*/
private void Xusage() {
messager.notice("main.Xusage");
}
/** /**
* Exit * Exit
*/ */
...@@ -213,6 +218,15 @@ class Start { ...@@ -213,6 +218,15 @@ class Start {
setDocletInvoker(argv); setDocletInvoker(argv);
ListBuffer<String> subPackages = new ListBuffer<String>(); ListBuffer<String> subPackages = new ListBuffer<String>();
ListBuffer<String> excludedPackages = new ListBuffer<String>(); ListBuffer<String> excludedPackages = new ListBuffer<String>();
Context context = new Context();
// Setup a new Messager, using the same initial parameters as the
// existing Messager, except that this one will be able to use any
// options that may be set up below.
Messager.preRegister(context,
messager.programName,
messager.errWriter, messager.warnWriter, messager.noticeWriter);
Options compOpts = Options.instance(context); Options compOpts = Options.instance(context);
boolean docClasses = false; boolean docClasses = false;
...@@ -310,6 +324,15 @@ class Start { ...@@ -310,6 +324,15 @@ class Start {
usageError("main.locale_first"); usageError("main.locale_first");
oneArg(argv, i++); oneArg(argv, i++);
docLocale = argv[i]; docLocale = argv[i];
} else if (arg.equals("-Xmaxerrs") || arg.equals("-Xmaxwarns")) {
oneArg(argv, i++);
if (compOpts.get(arg) != null) {
usageError("main.option.already.seen", arg);
}
compOpts.put(arg, argv[i]);
} else if (arg.equals("-X")) {
Xusage();
exit();
} else if (arg.startsWith("-XD")) { } else if (arg.startsWith("-XD")) {
String s = arg.substring("-XD".length()); String s = arg.substring("-XD".length());
int eq = s.indexOf('='); int eq = s.indexOf('=');
......
...@@ -49,7 +49,13 @@ main.usage=usage: javadoc [options] [packagenames] [sourcefiles] [@files]\n\ ...@@ -49,7 +49,13 @@ main.usage=usage: javadoc [options] [packagenames] [sourcefiles] [@files]\n\
-locale <name> Locale to be used, e.g. en_US or en_US_WIN\n\ -locale <name> Locale to be used, e.g. en_US or en_US_WIN\n\
-encoding <name> Source file encoding name\n\ -encoding <name> Source file encoding name\n\
-quiet Do not display status messages\n\ -quiet Do not display status messages\n\
-J<flag> Pass <flag> directly to the runtime system\n -J<flag> Pass <flag> directly to the runtime system\n\
-X Print a synopsis of nonstandard options\n
main.Xusage=\
-Xmaxerrs <number> Set the maximum number of errors to print\n\
-Xmaxwarns <number> Set the maximum number of warnings to print\n\
\n\
These options are non-standard and subject to change without notice.
main.option.already.seen=The {0} option may be specified no more than once. main.option.already.seen=The {0} option may be specified no more than once.
main.requires_argument=option {0} requires an argument. main.requires_argument=option {0} requires an argument.
main.locale_first=option -locale must be first on the command line. main.locale_first=option -locale must be first on the command line.
......
/*
* Copyright (c) 2010, 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 6958836
* @summary javadoc should support -Xmaxerrs and -Xmaxwarns
*/
import java.io.*;
import java.util.*;
public class Test {
public static void main(String... args) throws Exception {
new Test().run();
}
void run() throws Exception {
javadoc("errs", list(), 10, 0);
javadoc("errs", list("-Xmaxerrs", "0"), 10, 0);
javadoc("errs", list("-Xmaxerrs", "2"), 2, 0);
javadoc("errs", list("-Xmaxerrs", "4"), 4, 0);
javadoc("errs", list("-Xmaxerrs", "20"), 10, 0);
javadoc("warns", list(), 0, 10);
javadoc("warns", list("-Xmaxwarns", "0"), 0, 10);
javadoc("warns", list("-Xmaxwarns", "2"), 0, 2);
javadoc("warns", list("-Xmaxwarns", "4"), 0, 4);
javadoc("warns", list("-Xmaxwarns", "20"), 0, 10);
if (errors > 0)
throw new Exception(errors + " errors occurred.");
}
void javadoc(String pkg, List<String> testOpts,
int expectErrs, int expectWarns) {
System.err.println("Test " + (++count) + ": " + pkg + " " + testOpts);
File testOutDir = new File("test" + count);
List<String> opts = new ArrayList<String>();
// Force en_US locale in lieu of something like -XDrawDiagnostics.
// For some reason, this must be the first option when used.
opts.addAll(list("-locale", "en_US"));
opts.addAll(list("-classpath", System.getProperty("test.src")));
opts.addAll(list("-d", testOutDir.getPath()));
opts.addAll(testOpts);
opts.add(pkg);
StringWriter errSW = new StringWriter();
PrintWriter errPW = new PrintWriter(errSW);
StringWriter warnSW = new StringWriter();
PrintWriter warnPW = new PrintWriter(warnSW);
StringWriter noteSW = new StringWriter();
PrintWriter notePW = new PrintWriter(noteSW);
int rc = com.sun.tools.javadoc.Main.execute("javadoc",
errPW, warnPW, notePW,
"com.sun.tools.doclets.standard.Standard",
getClass().getClassLoader(),
opts.toArray(new String[opts.size()]));
System.err.println("rc: " + rc);
errPW.close();
String errOut = errSW.toString();
System.err.println("Errors:\n" + errOut);
warnPW.close();
String warnOut = warnSW.toString();
System.err.println("Warnings:\n" + warnOut);
notePW.close();
String noteOut = noteSW.toString();
System.err.println("Notes:\n" + noteOut);
check(errOut, "Errors.java", expectErrs);
check(warnOut, " warning ", expectWarns); // requires -locale en_US
}
void check(String text, String expectText, int expectCount) {
int foundCount = 0;
for (String line: text.split("[\r\n]+")) {
if (line.contains(expectText))
foundCount++;
}
if (foundCount != expectCount) {
error("incorrect number of matches found: " + foundCount
+ ", expected: " + expectCount);
}
}
private List<String> list(String... args) {
return Arrays.asList(args);
}
void error(String msg) {
System.err.println(msg);
errors++;
}
int count;
int errors;
}
/*
* Copyright (c) 2010, 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.
*/
package errs;
// class with 10 errors
class Errors {
X m0() { }
X m1() { }
X m2() { }
X m3() { }
X m4() { }
X m5() { }
X m6() { }
X m7() { }
X m8() { }
X m9() { }
}
/*
* Copyright (c) 2010, 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.
*/
package warns;
// class with 10 warnings
public class Warnings {
/** @param x */
public void m0() { }
/** @param x */
public void m1() { }
/** @param x */
public void m2() { }
/** @param x */
public void m3() { }
/** @param x */
public void m4() { }
/** @param x */
public void m5() { }
/** @param x */
public void m6() { }
/** @param x */
public void m7() { }
/** @param x */
public void m8() { }
/** @param x */
public void m9() { }
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册