6873845: refine access to symbol file
authorjjg
Fri, 21 Aug 2009 14:58:21 -0700
changeset 3661 104c425e96aa
parent 3660 ee583c342a41
child 3662 686143fe191f
6873845: refine access to symbol file Reviewed-by: darcy
langtools/src/share/classes/com/sun/tools/javac/code/Lint.java
langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java
langtools/src/share/classes/com/sun/tools/javac/comp/Check.java
langtools/src/share/classes/com/sun/tools/javac/main/JavacOption.java
langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java
langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties
langtools/test/tools/javac/T6873845.java
--- 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");
+}
+