6873845: refine access to symbol file
Reviewed-by: darcy
This commit is contained in:
parent
bde1a2faf8
commit
0ec5040633
@ -193,10 +193,20 @@ public class Lint
|
|||||||
/**
|
/**
|
||||||
* Warn about unchecked operations on raw types.
|
* 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) {
|
LintCategory(String option) {
|
||||||
|
this(option, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
LintCategory(String option, boolean hidden) {
|
||||||
this.option = option;
|
this.option = option;
|
||||||
|
this.hidden = hidden;
|
||||||
map.put(option, this);
|
map.put(option, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,6 +215,7 @@ public class Lint
|
|||||||
}
|
}
|
||||||
|
|
||||||
public final String option;
|
public final String option;
|
||||||
|
public final boolean hidden;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -119,6 +119,7 @@ public class Attr extends JCTree.Visitor {
|
|||||||
options.get("-relax") != null);
|
options.get("-relax") != null);
|
||||||
useBeforeDeclarationWarning = options.get("useBeforeDeclarationWarning") != null;
|
useBeforeDeclarationWarning = options.get("useBeforeDeclarationWarning") != null;
|
||||||
allowInvokedynamic = options.get("invokedynamic") != null;
|
allowInvokedynamic = options.get("invokedynamic") != null;
|
||||||
|
enableSunApiLintControl = options.get("enableSunApiLintControl") != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Switch: relax some constraints for retrofit mode.
|
/** Switch: relax some constraints for retrofit mode.
|
||||||
@ -160,6 +161,12 @@ public class Attr extends JCTree.Visitor {
|
|||||||
*/
|
*/
|
||||||
boolean useBeforeDeclarationWarning;
|
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.
|
/** Check kind and type of given tree against protokind and prototype.
|
||||||
* If check succeeds, store type in tree and return it.
|
* If check succeeds, store type in tree and return it.
|
||||||
* If check fails, store errType in tree and return it.
|
* If check fails, store errType in tree and return it.
|
||||||
@ -2215,8 +2222,12 @@ public class Attr extends JCTree.Visitor {
|
|||||||
sym.outermostClass() != env.info.scope.owner.outermostClass())
|
sym.outermostClass() != env.info.scope.owner.outermostClass())
|
||||||
chk.warnDeprecated(tree.pos(), sym);
|
chk.warnDeprecated(tree.pos(), sym);
|
||||||
|
|
||||||
if ((sym.flags() & PROPRIETARY) != 0)
|
if ((sym.flags() & PROPRIETARY) != 0) {
|
||||||
|
if (enableSunApiLintControl)
|
||||||
|
chk.warnSunApi(tree.pos(), "sun.proprietary", sym);
|
||||||
|
else
|
||||||
log.strictWarning(tree.pos(), "sun.proprietary", sym);
|
log.strictWarning(tree.pos(), "sun.proprietary", sym);
|
||||||
|
}
|
||||||
|
|
||||||
// Test (3): if symbol is a variable, check that its type and
|
// Test (3): if symbol is a variable, check that its type and
|
||||||
// kind are compatible with the prototype and protokind.
|
// kind are compatible with the prototype and protokind.
|
||||||
|
@ -104,12 +104,15 @@ public class Check {
|
|||||||
|
|
||||||
boolean verboseDeprecated = lint.isEnabled(LintCategory.DEPRECATION);
|
boolean verboseDeprecated = lint.isEnabled(LintCategory.DEPRECATION);
|
||||||
boolean verboseUnchecked = lint.isEnabled(LintCategory.UNCHECKED);
|
boolean verboseUnchecked = lint.isEnabled(LintCategory.UNCHECKED);
|
||||||
|
boolean verboseSunApi = lint.isEnabled(LintCategory.SUNAPI);
|
||||||
boolean enforceMandatoryWarnings = source.enforceMandatoryWarnings();
|
boolean enforceMandatoryWarnings = source.enforceMandatoryWarnings();
|
||||||
|
|
||||||
deprecationHandler = new MandatoryWarningHandler(log, verboseDeprecated,
|
deprecationHandler = new MandatoryWarningHandler(log, verboseDeprecated,
|
||||||
enforceMandatoryWarnings, "deprecated");
|
enforceMandatoryWarnings, "deprecated");
|
||||||
uncheckedHandler = new MandatoryWarningHandler(log, verboseUnchecked,
|
uncheckedHandler = new MandatoryWarningHandler(log, verboseUnchecked,
|
||||||
enforceMandatoryWarnings, "unchecked");
|
enforceMandatoryWarnings, "unchecked");
|
||||||
|
sunApiHandler = new MandatoryWarningHandler(log, verboseSunApi,
|
||||||
|
enforceMandatoryWarnings, "sunapi");
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Switch: generics enabled?
|
/** Switch: generics enabled?
|
||||||
@ -137,6 +140,9 @@ public class Check {
|
|||||||
*/
|
*/
|
||||||
private MandatoryWarningHandler uncheckedHandler;
|
private MandatoryWarningHandler uncheckedHandler;
|
||||||
|
|
||||||
|
/** A handler for messages about using Sun proprietary API.
|
||||||
|
*/
|
||||||
|
private MandatoryWarningHandler sunApiHandler;
|
||||||
|
|
||||||
/* *************************************************************************
|
/* *************************************************************************
|
||||||
* Errors and Warnings
|
* Errors and Warnings
|
||||||
@ -166,12 +172,22 @@ public class Check {
|
|||||||
uncheckedHandler.report(pos, msg, args);
|
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.
|
* Report any deferred diagnostics.
|
||||||
*/
|
*/
|
||||||
public void reportDeferredDiagnostics() {
|
public void reportDeferredDiagnostics() {
|
||||||
deprecationHandler.reportDeferredDiagnostic();
|
deprecationHandler.reportDeferredDiagnostic();
|
||||||
uncheckedHandler.reportDeferredDiagnostic();
|
uncheckedHandler.reportDeferredDiagnostic();
|
||||||
|
sunApiHandler.reportDeferredDiagnostic();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,11 +25,11 @@
|
|||||||
|
|
||||||
package com.sun.tools.javac.main;
|
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.Log;
|
||||||
import com.sun.tools.javac.util.Options;
|
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
|
* TODO: describe com.sun.tools.javac.main.JavacOption
|
||||||
@ -106,9 +106,10 @@ public interface JavacOption {
|
|||||||
*/
|
*/
|
||||||
ChoiceKind choiceKind;
|
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) {
|
Option(OptionName name, String argsNameKey, String descrKey) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@ -123,10 +124,18 @@ public interface JavacOption {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Option(OptionName name, String descrKey, ChoiceKind choiceKind, String... choices) {
|
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);
|
this(name, null, descrKey);
|
||||||
if (choiceKind == null || choices == null)
|
if (choiceKind == null || choices == null)
|
||||||
throw new NullPointerException();
|
throw new NullPointerException();
|
||||||
@ -153,10 +162,10 @@ public interface JavacOption {
|
|||||||
if (choices != null) {
|
if (choices != null) {
|
||||||
String arg = option.substring(name.optionName.length());
|
String arg = option.substring(name.optionName.length());
|
||||||
if (choiceKind == ChoiceKind.ONEOF)
|
if (choiceKind == ChoiceKind.ONEOF)
|
||||||
return choices.contains(arg);
|
return choices.keySet().contains(arg);
|
||||||
else {
|
else {
|
||||||
for (String a: arg.split(",+")) {
|
for (String a: arg.split(",+")) {
|
||||||
if (!choices.contains(a))
|
if (!choices.keySet().contains(a))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,11 +190,13 @@ public interface JavacOption {
|
|||||||
if (argsNameKey == null) {
|
if (argsNameKey == null) {
|
||||||
if (choices != null) {
|
if (choices != null) {
|
||||||
String sep = "{";
|
String sep = "{";
|
||||||
for (String c: choices) {
|
for (Map.Entry<String,Boolean> e: choices.entrySet()) {
|
||||||
|
if (!e.getValue()) {
|
||||||
sb.append(sep);
|
sb.append(sep);
|
||||||
sb.append(c);
|
sb.append(e.getKey());
|
||||||
sep = ",";
|
sep = ",";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
sb.append("}");
|
sb.append("}");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -209,8 +220,8 @@ public interface JavacOption {
|
|||||||
if (choices != null) {
|
if (choices != null) {
|
||||||
if (choiceKind == ChoiceKind.ONEOF) {
|
if (choiceKind == ChoiceKind.ONEOF) {
|
||||||
// some clients like to see just one of option+choice set
|
// some clients like to see just one of option+choice set
|
||||||
for (String c: choices)
|
for (String s: choices.keySet())
|
||||||
options.remove(option + c);
|
options.remove(option + s);
|
||||||
String opt = option + arg;
|
String opt = option + arg;
|
||||||
options.put(opt, opt);
|
options.put(opt, opt);
|
||||||
// some clients like to see option (without trailing ":")
|
// some clients like to see option (without trailing ":")
|
||||||
@ -256,7 +267,7 @@ public interface JavacOption {
|
|||||||
XOption(OptionName name, String descrKey, ChoiceKind kind, String... choices) {
|
XOption(OptionName name, String descrKey, ChoiceKind kind, String... choices) {
|
||||||
super(name, descrKey, kind, 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);
|
super(name, descrKey, kind, choices);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
|
@ -38,9 +38,9 @@ import com.sun.tools.javac.processing.JavacProcessingEnvironment;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.SourceVersion;
|
||||||
|
|
||||||
@ -598,14 +598,14 @@ public class RecognizedOptions {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Collection<String> getXLintChoices() {
|
private static Map<String,Boolean> getXLintChoices() {
|
||||||
Collection<String> choices = new LinkedHashSet<String>();
|
Map<String,Boolean> choices = new LinkedHashMap<String,Boolean>();
|
||||||
choices.add("all");
|
choices.put("all", false);
|
||||||
for (Lint.LintCategory c : Lint.LintCategory.values())
|
for (Lint.LintCategory c : Lint.LintCategory.values())
|
||||||
choices.add(c.option);
|
choices.put(c.option, c.hidden);
|
||||||
for (Lint.LintCategory c : Lint.LintCategory.values())
|
for (Lint.LintCategory c : Lint.LintCategory.values())
|
||||||
choices.add("-" + c.option);
|
choices.put("-" + c.option, c.hidden);
|
||||||
choices.add("none");
|
choices.put("none", false);
|
||||||
return choices;
|
return choices;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -564,12 +564,6 @@ compiler.note.deprecated.filename.additional=\
|
|||||||
compiler.note.deprecated.plural.additional=\
|
compiler.note.deprecated.plural.additional=\
|
||||||
Some input files additionally use or override a deprecated API.
|
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=\
|
compiler.note.unchecked.filename=\
|
||||||
{0} uses unchecked or unsafe operations.
|
{0} uses unchecked or unsafe operations.
|
||||||
compiler.note.unchecked.plural=\
|
compiler.note.unchecked.plural=\
|
||||||
@ -584,6 +578,25 @@ compiler.note.unchecked.filename.additional=\
|
|||||||
compiler.note.unchecked.plural.additional=\
|
compiler.note.unchecked.plural.additional=\
|
||||||
Some input files additionally use unchecked or unsafe operations.
|
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=\
|
compiler.misc.count.error=\
|
||||||
|
84
langtools/test/tools/javac/T6873845.java
Normal file
84
langtools/test/tools/javac/T6873845.java
Normal file
@ -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");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user