diff --git a/check_api/src/main/java/com/google/errorprone/util/ASTHelpers.java b/check_api/src/main/java/com/google/errorprone/util/ASTHelpers.java index 930bfb7d99e..4c8c6080a05 100644 --- a/check_api/src/main/java/com/google/errorprone/util/ASTHelpers.java +++ b/check_api/src/main/java/com/google/errorprone/util/ASTHelpers.java @@ -1337,29 +1337,31 @@ public Type visitConditionalExpression(ConditionalExpressionTree tree, Void unus @Override public Type visitNewClass(NewClassTree tree, Void unused) { - return visitMethodInvocationOrNewClass(tree.getArguments(), ASTHelpers.getSymbol(tree)); + return visitMethodInvocationOrNewClass( + tree.getArguments(), ASTHelpers.getSymbol(tree), ((JCNewClass) tree).constructorType); } @Override public Type visitMethodInvocation(MethodInvocationTree tree, Void unused) { - return visitMethodInvocationOrNewClass(tree.getArguments(), ASTHelpers.getSymbol(tree)); + return visitMethodInvocationOrNewClass( + tree.getArguments(), ASTHelpers.getSymbol(tree), ((JCMethodInvocation) tree).meth.type); } private Type visitMethodInvocationOrNewClass( - List arguments, MethodSymbol sym) { + List arguments, MethodSymbol sym, Type type) { int idx = arguments.indexOf(current); if (idx == -1) { return null; } - if (sym.getParameters().size() <= idx) { + if (type.getParameterTypes().size() <= idx) { checkState(sym.isVarArgs()); - idx = sym.getParameters().size() - 1; + idx = type.getParameterTypes().size() - 1; } - Type type = sym.getParameters().get(idx).asType(); - if (sym.isVarArgs() && idx == sym.getParameters().size() - 1) { - type = state.getTypes().elemtype(type); + Type argType = type.getParameterTypes().get(idx); + if (sym.isVarArgs() && idx == type.getParameterTypes().size() - 1) { + argType = state.getTypes().elemtype(argType); } - return type; + return argType; } @Override diff --git a/core/src/test/java/com/google/errorprone/util/testdata/TargetTypeTest.java b/core/src/test/java/com/google/errorprone/util/testdata/TargetTypeTest.java index 6158e9c03ea..e8e5468aadb 100644 --- a/core/src/test/java/com/google/errorprone/util/testdata/TargetTypeTest.java +++ b/core/src/test/java/com/google/errorprone/util/testdata/TargetTypeTest.java @@ -17,8 +17,9 @@ package com.google.errorprone.util.testdata; import java.io.Serializable; +import java.util.List; -class TargetTypeTest { +abstract class TargetTypeTest { void unary() { System.out.println( // BUG: Diagnostic contains: boolean @@ -361,6 +362,21 @@ void concatenation(String s, Object a) { a = s + detectStringArray(); } + abstract T id(T t); + + abstract List list(List t); + + void generic() { + // BUG: Diagnostic contains: java.lang.String + String s = id(detectString()); + // BUG: Diagnostic contains: java.lang.Integer + int i = id(detectPrimitiveInt()); + // BUG: Diagnostic contains: java.util.List + List y = id(detectStringList()); + // BUG: Diagnostic contains: java.lang.Integer + Integer z = id(detectPrimitiveInt()); + } + // Helper methods that we can search for. static byte detectPrimitiveByte() { return 0; @@ -398,5 +414,9 @@ static Void detectVoid() { return null; } + static List detectStringList() { + return null; + } + enum ThisEnum {} }