--- a/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java Fri Aug 21 11:25:45 2009 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java Fri Aug 21 14:58:21 2009 -0700
@@ -193,10 +193,20 @@
/**
* Warn about unchecked operations on raw types.
*/
- RAW("rawtypes");
+ RAW("rawtypes"),
+
+ /**
+ * Warn about Sun proprietary API that may be removed in a future release.
+ */
+ SUNAPI("sunapi", true);
LintCategory(String option) {
+ this(option, false);
+ }
+
+ LintCategory(String option, boolean hidden) {
this.option = option;
+ this.hidden = hidden;
map.put(option, this);
}
@@ -205,6 +215,7 @@
}
public final String option;
+ public final boolean hidden;
};
/**
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Fri Aug 21 11:25:45 2009 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Fri Aug 21 14:58:21 2009 -0700
@@ -119,6 +119,7 @@
options.get("-relax") != null);
useBeforeDeclarationWarning = options.get("useBeforeDeclarationWarning") != null;
allowInvokedynamic = options.get("invokedynamic") != null;
+ enableSunApiLintControl = options.get("enableSunApiLintControl") != null;
}
/** Switch: relax some constraints for retrofit mode.
@@ -160,6 +161,12 @@
*/
boolean useBeforeDeclarationWarning;
+ /**
+ * Switch: allow lint infrastructure to control Sun proprietary
+ * API warnings.
+ */
+ boolean enableSunApiLintControl;
+
/** Check kind and type of given tree against protokind and prototype.
* If check succeeds, store type in tree and return it.
* If check fails, store errType in tree and return it.
@@ -2215,8 +2222,12 @@
sym.outermostClass() != env.info.scope.owner.outermostClass())
chk.warnDeprecated(tree.pos(), sym);
- if ((sym.flags() & PROPRIETARY) != 0)
- log.strictWarning(tree.pos(), "sun.proprietary", sym);
+ if ((sym.flags() & PROPRIETARY) != 0) {
+ if (enableSunApiLintControl)
+ chk.warnSunApi(tree.pos(), "sun.proprietary", sym);
+ else
+ log.strictWarning(tree.pos(), "sun.proprietary", sym);
+ }
// Test (3): if symbol is a variable, check that its type and
// kind are compatible with the prototype and protokind.
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Fri Aug 21 11:25:45 2009 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Fri Aug 21 14:58:21 2009 -0700
@@ -104,12 +104,15 @@
boolean verboseDeprecated = lint.isEnabled(LintCategory.DEPRECATION);
boolean verboseUnchecked = lint.isEnabled(LintCategory.UNCHECKED);
+ boolean verboseSunApi = lint.isEnabled(LintCategory.SUNAPI);
boolean enforceMandatoryWarnings = source.enforceMandatoryWarnings();
deprecationHandler = new MandatoryWarningHandler(log, verboseDeprecated,
enforceMandatoryWarnings, "deprecated");
uncheckedHandler = new MandatoryWarningHandler(log, verboseUnchecked,
enforceMandatoryWarnings, "unchecked");
+ sunApiHandler = new MandatoryWarningHandler(log, verboseSunApi,
+ enforceMandatoryWarnings, "sunapi");
}
/** Switch: generics enabled?
@@ -137,6 +140,9 @@
*/
private MandatoryWarningHandler uncheckedHandler;
+ /** A handler for messages about using Sun proprietary API.
+ */
+ private MandatoryWarningHandler sunApiHandler;
/* *************************************************************************
* Errors and Warnings
@@ -166,12 +172,22 @@
uncheckedHandler.report(pos, msg, args);
}
+ /** Warn about using Sun proprietary API.
+ * @param pos Position to be used for error reporting.
+ * @param msg A string describing the problem.
+ */
+ public void warnSunApi(DiagnosticPosition pos, String msg, Object... args) {
+ if (!lint.isSuppressed(LintCategory.SUNAPI))
+ sunApiHandler.report(pos, msg, args);
+ }
+
/**
* Report any deferred diagnostics.
*/
public void reportDeferredDiagnostics() {
deprecationHandler.reportDeferredDiagnostic();
uncheckedHandler.reportDeferredDiagnostic();
+ sunApiHandler.reportDeferredDiagnostic();
}
--- a/langtools/src/share/classes/com/sun/tools/javac/main/JavacOption.java Fri Aug 21 11:25:45 2009 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavacOption.java Fri Aug 21 14:58:21 2009 -0700
@@ -25,11 +25,11 @@
package com.sun.tools.javac.main;
+import java.io.PrintWriter;
+import java.util.LinkedHashMap;
+import java.util.Map;
import com.sun.tools.javac.util.Log;
import com.sun.tools.javac.util.Options;
-import java.io.PrintWriter;
-import java.util.Arrays;
-import java.util.Collection;
/**
* TODO: describe com.sun.tools.javac.main.JavacOption
@@ -106,9 +106,10 @@
*/
ChoiceKind choiceKind;
- /** The choices for this option, if any.
+ /** The choices for this option, if any, and whether or not the choices
+ * are hidden
*/
- Collection<String> choices;
+ Map<String,Boolean> choices;
Option(OptionName name, String argsNameKey, String descrKey) {
this.name = name;
@@ -123,10 +124,18 @@
}
Option(OptionName name, String descrKey, ChoiceKind choiceKind, String... choices) {
- this(name, descrKey, choiceKind, Arrays.asList(choices));
+ this(name, descrKey, choiceKind, createChoices(choices));
}
- Option(OptionName name, String descrKey, ChoiceKind choiceKind, Collection<String> choices) {
+ private static Map<String,Boolean> createChoices(String... choices) {
+ Map<String,Boolean> map = new LinkedHashMap<String,Boolean>();
+ for (String c: choices)
+ map.put(c, true);
+ return map;
+ }
+
+ Option(OptionName name, String descrKey, ChoiceKind choiceKind,
+ Map<String,Boolean> choices) {
this(name, null, descrKey);
if (choiceKind == null || choices == null)
throw new NullPointerException();
@@ -153,10 +162,10 @@
if (choices != null) {
String arg = option.substring(name.optionName.length());
if (choiceKind == ChoiceKind.ONEOF)
- return choices.contains(arg);
+ return choices.keySet().contains(arg);
else {
for (String a: arg.split(",+")) {
- if (!choices.contains(a))
+ if (!choices.keySet().contains(a))
return false;
}
}
@@ -181,10 +190,12 @@
if (argsNameKey == null) {
if (choices != null) {
String sep = "{";
- for (String c: choices) {
- sb.append(sep);
- sb.append(c);
- sep = ",";
+ for (Map.Entry<String,Boolean> e: choices.entrySet()) {
+ if (!e.getValue()) {
+ sb.append(sep);
+ sb.append(e.getKey());
+ sep = ",";
+ }
}
sb.append("}");
}
@@ -209,8 +220,8 @@
if (choices != null) {
if (choiceKind == ChoiceKind.ONEOF) {
// some clients like to see just one of option+choice set
- for (String c: choices)
- options.remove(option + c);
+ for (String s: choices.keySet())
+ options.remove(option + s);
String opt = option + arg;
options.put(opt, opt);
// some clients like to see option (without trailing ":")
@@ -256,7 +267,7 @@
XOption(OptionName name, String descrKey, ChoiceKind kind, String... choices) {
super(name, descrKey, kind, choices);
}
- XOption(OptionName name, String descrKey, ChoiceKind kind, Collection<String> choices) {
+ XOption(OptionName name, String descrKey, ChoiceKind kind, Map<String,Boolean> choices) {
super(name, descrKey, kind, choices);
}
@Override
--- a/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java Fri Aug 21 11:25:45 2009 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java Fri Aug 21 14:58:21 2009 -0700
@@ -38,9 +38,9 @@
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
-import java.util.Collection;
import java.util.EnumSet;
-import java.util.LinkedHashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
import java.util.Set;
import javax.lang.model.SourceVersion;
@@ -598,14 +598,14 @@
};
}
- private static Collection<String> getXLintChoices() {
- Collection<String> choices = new LinkedHashSet<String>();
- choices.add("all");
+ private static Map<String,Boolean> getXLintChoices() {
+ Map<String,Boolean> choices = new LinkedHashMap<String,Boolean>();
+ choices.put("all", false);
for (Lint.LintCategory c : Lint.LintCategory.values())
- choices.add(c.option);
+ choices.put(c.option, c.hidden);
for (Lint.LintCategory c : Lint.LintCategory.values())
- choices.add("-" + c.option);
- choices.add("none");
+ choices.put("-" + c.option, c.hidden);
+ choices.put("none", false);
return choices;
}
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Aug 21 11:25:45 2009 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Aug 21 14:58:21 2009 -0700
@@ -564,12 +564,6 @@
compiler.note.deprecated.plural.additional=\
Some input files additionally use or override a deprecated API.
-# Notes related to annotation processing
-
-# Print a client-generated note; assumed to be localized, no translation required
-compiler.note.proc.messager=\
- {0}
-
compiler.note.unchecked.filename=\
{0} uses unchecked or unsafe operations.
compiler.note.unchecked.plural=\
@@ -584,6 +578,25 @@
compiler.note.unchecked.plural.additional=\
Some input files additionally use unchecked or unsafe operations.
+compiler.note.sunapi.filename=\
+ {0} uses Sun proprietary API that may be removed in a future release.
+compiler.note.sunapi.plural=\
+ Some input files use Sun proprietary API that may be removed in a future release.
+# The following string may appear after one of the above sunapi messages.
+compiler.note.sunapi.recompile=\
+ Recompile with -Xlint:sunapi for details.
+
+compiler.note.sunapi.filename.additional=\
+ {0} uses additional Sun proprietary API that may be removed in a future release.
+compiler.note.sunapi.plural.additional=\
+ Some input files additionally use Sun proprietary API that may be removed in a future release.
+
+# Notes related to annotation processing
+
+# Print a client-generated note; assumed to be localized, no translation required
+compiler.note.proc.messager=\
+ {0}
+
#####
compiler.misc.count.error=\
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T6873845.java Fri Aug 21 14:58:21 2009 -0700
@@ -0,0 +1,84 @@
+import java.io.*;
+import java.util.*;
+
+import sun.misc.*;
+
+/*
+ * @test /nodynamiccopyright/
+ * @bug 6873845
+ * @summary refine access to symbol file
+ */
+
+public class T6873845 {
+ public static void main(String... args) throws Exception {
+ new T6873845().run();
+ }
+
+ public void run() throws Exception {
+ String out = compile(Arrays.asList("-XDrawDiagnostics", "-X"));
+ if (out.contains("sunapi"))
+ throw new Exception("unexpected output for -X");
+
+ String warn1 = "T6873845.java:72:9: compiler.warn.sun.proprietary: sun.misc.Unsafe" + newline;
+ String warn2 = "T6873845.java:77:9: compiler.warn.sun.proprietary: sun.misc.Unsafe" + newline;
+ String note1 = "- compiler.note.sunapi.filename: T6873845.java" + newline;
+ String note2 = "- compiler.note.sunapi.recompile" + newline;
+
+ test(opts(),
+ warn1 + warn2 + "2 warnings" + newline);
+ test(opts("-XDenableSunApiLintControl"),
+ note1 + note2);
+ test(opts("-XDenableSunApiLintControl", "-XDsuppressNotes"),
+ "");
+ test(opts("-XDenableSunApiLintControl", "-Xlint:sunapi"),
+ warn1 + "1 warning" + newline);
+ test(opts("-XDenableSunApiLintControl", "-Xlint:all"),
+ warn1 + "1 warning" + newline);
+ test(opts("-XDenableSunApiLintControl", "-Xlint:all,-sunapi"),
+ note1 + note2);
+ }
+
+ List<String> opts(String... opts) {
+ return Arrays.asList(opts);
+ }
+
+ void test(List<String> opts, String expect) throws Exception {
+ List<String> args = new ArrayList<String>();
+ args.addAll(opts);
+ args.add("-d");
+ args.add(testClasses.getPath());
+ args.add(new File(testSrc, "T6873845.java").getPath());
+ compile(args); // to verify resource strings exist
+ args.add(0, "-XDrawDiagnostics");
+ String out = compile(args);
+ if (!out.equals(expect))
+ throw new Exception("unexpected output from compiler");
+ }
+
+ String compile(List<String> args) throws Exception{
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ System.out.println("compile: " + args);
+ int rc = com.sun.tools.javac.Main.compile(args.toArray(new String[args.size()]), pw);
+ pw.close();
+ String out = sw.toString();
+ System.out.println(out);
+ if (rc != 0)
+ throw new Exception("compilation failed unexpectedly");
+ return out;
+ }
+
+ void m1() {
+ Unsafe.getUnsafe();
+ }
+
+ @SuppressWarnings("sunapi")
+ void m2() {
+ Unsafe.getUnsafe();
+ }
+
+ private File testSrc = new File(System.getProperty("test.src", "."));
+ private File testClasses = new File(System.getProperty("test.classes", "."));
+ private String newline = System.getProperty("line.separator");
+}
+