mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 02:54:35 +02:00
6885255: Improve usability of raw warnings
Raw warnings should be disabled in (i) instanceof expressions and (ii) when java.lang.Class is not parameterized Reviewed-by: jjg
This commit is contained in:
parent
71962ebfb0
commit
d56e09153a
6 changed files with 100 additions and 35 deletions
|
@ -2008,7 +2008,7 @@ public class Attr extends JCTree.Visitor {
|
||||||
|
|
||||||
public void visitTypeCast(JCTypeCast tree) {
|
public void visitTypeCast(JCTypeCast tree) {
|
||||||
Type clazztype = attribType(tree.clazz, env);
|
Type clazztype = attribType(tree.clazz, env);
|
||||||
chk.validate(tree.clazz, env);
|
chk.validate(tree.clazz, env, false);
|
||||||
Type exprtype = attribExpr(tree.expr, env, Infer.anyPoly);
|
Type exprtype = attribExpr(tree.expr, env, Infer.anyPoly);
|
||||||
Type owntype = chk.checkCastable(tree.expr.pos(), exprtype, clazztype);
|
Type owntype = chk.checkCastable(tree.expr.pos(), exprtype, clazztype);
|
||||||
if (exprtype.constValue() != null)
|
if (exprtype.constValue() != null)
|
||||||
|
@ -2021,7 +2021,7 @@ public class Attr extends JCTree.Visitor {
|
||||||
tree.expr.pos(), attribExpr(tree.expr, env));
|
tree.expr.pos(), attribExpr(tree.expr, env));
|
||||||
Type clazztype = chk.checkReifiableReferenceType(
|
Type clazztype = chk.checkReifiableReferenceType(
|
||||||
tree.clazz.pos(), attribType(tree.clazz, env));
|
tree.clazz.pos(), attribType(tree.clazz, env));
|
||||||
chk.validate(tree.clazz, env);
|
chk.validate(tree.clazz, env, false);
|
||||||
chk.checkCastable(tree.expr.pos(), exprtype, clazztype);
|
chk.checkCastable(tree.expr.pos(), exprtype, clazztype);
|
||||||
result = check(tree, syms.booleanType, VAL, pkind, pt);
|
result = check(tree, syms.booleanType, VAL, pkind, pt);
|
||||||
}
|
}
|
||||||
|
|
|
@ -906,33 +906,15 @@ public class Check {
|
||||||
*
|
*
|
||||||
* and we can't make sure that the bound is already attributed because
|
* and we can't make sure that the bound is already attributed because
|
||||||
* of possible cycles.
|
* of possible cycles.
|
||||||
*/
|
*
|
||||||
private Validator validator = new Validator();
|
* Visitor method: Validate a type expression, if it is not null, catching
|
||||||
|
|
||||||
/** Visitor method: Validate a type expression, if it is not null, catching
|
|
||||||
* and reporting any completion failures.
|
* and reporting any completion failures.
|
||||||
*/
|
*/
|
||||||
void validate(JCTree tree, Env<AttrContext> env) {
|
void validate(JCTree tree, Env<AttrContext> env) {
|
||||||
try {
|
validate(tree, env, true);
|
||||||
if (tree != null) {
|
|
||||||
validator.env = env;
|
|
||||||
tree.accept(validator);
|
|
||||||
checkRaw(tree, env);
|
|
||||||
}
|
|
||||||
} catch (CompletionFailure ex) {
|
|
||||||
completionError(tree.pos(), ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//where
|
|
||||||
void checkRaw(JCTree tree, Env<AttrContext> env) {
|
|
||||||
if (lint.isEnabled(Lint.LintCategory.RAW) &&
|
|
||||||
tree.type.tag == CLASS &&
|
|
||||||
!TreeInfo.isDiamond(tree) &&
|
|
||||||
!env.enclClass.name.isEmpty() && //anonymous or intersection
|
|
||||||
tree.type.isRaw()) {
|
|
||||||
log.warning(Lint.LintCategory.RAW,
|
|
||||||
tree.pos(), "raw.class.use", tree.type, tree.type.tsym.type);
|
|
||||||
}
|
}
|
||||||
|
void validate(JCTree tree, Env<AttrContext> env, boolean checkRaw) {
|
||||||
|
new Validator(env).validateTree(tree, checkRaw, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Visitor method: Validate a list of type expressions.
|
/** Visitor method: Validate a list of type expressions.
|
||||||
|
@ -946,9 +928,16 @@ public class Check {
|
||||||
*/
|
*/
|
||||||
class Validator extends JCTree.Visitor {
|
class Validator extends JCTree.Visitor {
|
||||||
|
|
||||||
|
boolean isOuter;
|
||||||
|
Env<AttrContext> env;
|
||||||
|
|
||||||
|
Validator(Env<AttrContext> env) {
|
||||||
|
this.env = env;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitTypeArray(JCArrayTypeTree tree) {
|
public void visitTypeArray(JCArrayTypeTree tree) {
|
||||||
validate(tree.elemtype, env);
|
tree.elemtype.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -960,10 +949,14 @@ public class Check {
|
||||||
List<Type> forms = tree.type.tsym.type.getTypeArguments();
|
List<Type> forms = tree.type.tsym.type.getTypeArguments();
|
||||||
ListBuffer<Type> tvars_buf = new ListBuffer<Type>();
|
ListBuffer<Type> tvars_buf = new ListBuffer<Type>();
|
||||||
|
|
||||||
|
boolean is_java_lang_Class = tree.type.tsym.flatName() == names.java_lang_Class;
|
||||||
|
|
||||||
// For matching pairs of actual argument types `a' and
|
// For matching pairs of actual argument types `a' and
|
||||||
// formal type parameters with declared bound `b' ...
|
// formal type parameters with declared bound `b' ...
|
||||||
while (args.nonEmpty() && forms.nonEmpty()) {
|
while (args.nonEmpty() && forms.nonEmpty()) {
|
||||||
validate(args.head, env);
|
validateTree(args.head,
|
||||||
|
!(isOuter && is_java_lang_Class),
|
||||||
|
false);
|
||||||
|
|
||||||
// exact type arguments needs to know their
|
// exact type arguments needs to know their
|
||||||
// bounds (for upper and lower bound
|
// bounds (for upper and lower bound
|
||||||
|
@ -1015,14 +1008,14 @@ public class Check {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitTypeParameter(JCTypeParameter tree) {
|
public void visitTypeParameter(JCTypeParameter tree) {
|
||||||
validate(tree.bounds, env);
|
validateTrees(tree.bounds, true, isOuter);
|
||||||
checkClassBounds(tree.pos(), tree.type);
|
checkClassBounds(tree.pos(), tree.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitWildcard(JCWildcard tree) {
|
public void visitWildcard(JCWildcard tree) {
|
||||||
if (tree.inner != null)
|
if (tree.inner != null)
|
||||||
validate(tree.inner, env);
|
validateTree(tree.inner, true, isOuter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1060,7 +1053,34 @@ public class Check {
|
||||||
public void visitTree(JCTree tree) {
|
public void visitTree(JCTree tree) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Env<AttrContext> env;
|
public void validateTree(JCTree tree, boolean checkRaw, boolean isOuter) {
|
||||||
|
try {
|
||||||
|
if (tree != null) {
|
||||||
|
this.isOuter = isOuter;
|
||||||
|
tree.accept(this);
|
||||||
|
if (checkRaw)
|
||||||
|
checkRaw(tree, env);
|
||||||
|
}
|
||||||
|
} catch (CompletionFailure ex) {
|
||||||
|
completionError(tree.pos(), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validateTrees(List<? extends JCTree> trees, boolean checkRaw, boolean isOuter) {
|
||||||
|
for (List<? extends JCTree> l = trees; l.nonEmpty(); l = l.tail)
|
||||||
|
validateTree(l.head, checkRaw, isOuter);
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkRaw(JCTree tree, Env<AttrContext> env) {
|
||||||
|
if (lint.isEnabled(Lint.LintCategory.RAW) &&
|
||||||
|
tree.type.tag == CLASS &&
|
||||||
|
!TreeInfo.isDiamond(tree) &&
|
||||||
|
!env.enclClass.name.isEmpty() && //anonymous or intersection
|
||||||
|
tree.type.isRaw()) {
|
||||||
|
log.warning(Lint.LintCategory.RAW,
|
||||||
|
tree.pos(), "raw.class.use", tree.type, tree.type.tsym.type);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* *************************************************************************
|
/* *************************************************************************
|
||||||
|
|
|
@ -27,8 +27,8 @@ class T6747671<E> {
|
||||||
A<B>.Z<A<B>> z3;//raw warning (2)
|
A<B>.Z<A<B>> z3;//raw warning (2)
|
||||||
|
|
||||||
void test(Object arg1, B arg2) {//raw warning
|
void test(Object arg1, B arg2) {//raw warning
|
||||||
boolean b = arg1 instanceof A;//raw warning
|
boolean b = arg1 instanceof A;//ok
|
||||||
Object a = (A)arg1;//raw warning
|
Object a = (A)arg1;//ok
|
||||||
A a2 = new A() {};//raw warning (2)
|
A a2 = new A() {};//raw warning (2)
|
||||||
a2.new Z() {};//raw warning
|
a2.new Z() {};//raw warning
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,7 @@ T6747671.java:23:13: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
|
||||||
T6747671.java:27:14: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
|
T6747671.java:27:14: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
|
||||||
T6747671.java:27:7: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
|
T6747671.java:27:7: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
|
||||||
T6747671.java:29:28: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
|
T6747671.java:29:28: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
|
||||||
T6747671.java:30:37: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
|
|
||||||
T6747671.java:31:21: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
|
|
||||||
T6747671.java:32:9: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
|
T6747671.java:32:9: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
|
||||||
T6747671.java:32:20: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
|
T6747671.java:32:20: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
|
||||||
T6747671.java:33:16: compiler.warn.raw.class.use: T6747671.A.Z, T6747671<E>.A<X>.Z<Y>
|
T6747671.java:33:16: compiler.warn.raw.class.use: T6747671.A.Z, T6747671<E>.A<X>.Z<Y>
|
||||||
11 warnings
|
9 warnings
|
||||||
|
|
31
langtools/test/tools/javac/warnings/6885255/T6885255.java
Normal file
31
langtools/test/tools/javac/warnings/6885255/T6885255.java
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/**
|
||||||
|
* @test /nodynamiccopyright/
|
||||||
|
* @bug 6885255
|
||||||
|
* @summary -Xlint:rawtypes
|
||||||
|
* @compile/ref=T6885255.out -XDrawDiagnostics -Xlint:rawtypes T6885255.java
|
||||||
|
*/
|
||||||
|
|
||||||
|
class T6885255 {
|
||||||
|
|
||||||
|
static class Test<X, Y> {}
|
||||||
|
|
||||||
|
Class<Test> ct; //no warn - outer Class w/ raw param
|
||||||
|
Class<Test<Test, Test>> ctt; //warn - outer Class w/o raw param (2)
|
||||||
|
|
||||||
|
Class<Class<Test>> cct; //warn - outer Class w/o raw param
|
||||||
|
Class<Class<Test<Test, Test>>> cctt; //warn - outer Class w/o raw param (2)
|
||||||
|
|
||||||
|
Object o1 = (Test)null; //no warn - outer raw and cast
|
||||||
|
Object o2 = (Test<Test, Test>)null; //warn - inner raw (2)
|
||||||
|
|
||||||
|
Object o3 = (Class)null; //no warn - outer raw and cast
|
||||||
|
Object o4 = (Class<Test>)null; //no warn - outer Class w/ raw param
|
||||||
|
|
||||||
|
Object o5 = (Class<Test<Test, Test>>)null; //warn - outer Class w/ non raw param (2)
|
||||||
|
Object o6 = (Class<Class<Test<Test, Test>>>)null; //warn - outer Class w/ non raw param (2)
|
||||||
|
|
||||||
|
Object o7 = (Test<Class, Class>)null; //warn - inner raw (2)
|
||||||
|
Object o8 = (Test<Class<Test>, Class<Test>>)null; //warn - inner Class (2)
|
||||||
|
|
||||||
|
boolean b = null instanceof Test; //no warn - raw and instanceof
|
||||||
|
}
|
16
langtools/test/tools/javac/warnings/6885255/T6885255.out
Normal file
16
langtools/test/tools/javac/warnings/6885255/T6885255.out
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
T6885255.java:13:16: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:13:22: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:15:17: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:16:22: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:16:28: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:19:23: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:19:29: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:24:29: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:24:35: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:25:35: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:25:41: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:27:23: compiler.warn.raw.class.use: java.lang.Class, java.lang.Class<T>
|
||||||
|
T6885255.java:27:30: compiler.warn.raw.class.use: java.lang.Class, java.lang.Class<T>
|
||||||
|
T6885255.java:28:29: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
T6885255.java:28:42: compiler.warn.raw.class.use: T6885255.Test, T6885255.Test<X,Y>
|
||||||
|
15 warnings
|
Loading…
Add table
Add a link
Reference in a new issue