Hi,
I found another case for the issue SONARJAVA-1150 : Incorrect resolution of methods in generic classes
I have 2 classes :
public class ClassA {
public <C extends Collection<T>, T> void genericMethod(C argument1, T argument2) {
}
}
public class ClassB {
private void method1() {
List<String> param1 = new ArrayList<String>();
String param2 = new String();
new ClassA().genericMethod(param1, param2);
}
}
When the JavaAstScanner scans the ClassB, an IllegalStateException is thrown.
In the ClassA, the declaration <C extends Collection<T>, T> generates the problem.
When I replace the declaration <C extends Collection<T>, T> with <T, C extends Collection<T>> it works fine
The stacktrace of the exception :
java.lang.IllegalStateException: Could not resolve type parameter: T in class ClassA
at com.google.common.base.Preconditions.checkState(Preconditions.java:145) ~[guava-10.0.1.jar:na]
at org.sonar.java.resolve.BytecodeVisitor$ReadType.visitTypeVariable(BytecodeVisitor.java:534) ~[java-squid-3.3.jar:na]
at org.objectweb.asm.signature.SignatureReader.parseType(SignatureReader.java:169) ~[asm-debug-all-5.0.3.jar:5.0.3]
at org.objectweb.asm.signature.SignatureReader.parseType(SignatureReader.java:219) ~[asm-debug-all-5.0.3.jar:5.0.3]
at org.objectweb.asm.signature.SignatureReader.accept(SignatureReader.java:91) ~[asm-debug-all-5.0.3.jar:5.0.3]
at org.sonar.java.resolve.BytecodeVisitor.visitMethod(BytecodeVisitor.java:215) ~[java-squid-3.3.jar:na]
at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:911) ~[asm-debug-all-5.0.3.jar:5.0.3]
at org.objectweb.asm.ClassReader.accept(ClassReader.java:693) ~[asm-debug-all-5.0.3.jar:5.0.3]
at org.objectweb.asm.ClassReader.accept(ClassReader.java:506) ~[asm-debug-all-5.0.3.jar:5.0.3]
at org.sonar.java.resolve.BytecodeCompleter.complete(BytecodeCompleter.java:103) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.JavaSymbol.complete(JavaSymbol.java:104) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.JavaType.getSymbol(JavaType.java:77) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.Resolve.findMethod(Resolve.java:385) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.Resolve.findMethod(Resolve.java:377) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.TypeAndReferenceSolver.resolveConstructorSymbol(TypeAndReferenceSolver.java:466) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.TypeAndReferenceSolver.visitNewClass(TypeAndReferenceSolver.java:446) ~[java-squid-3.3.jar:na]
at org.sonar.java.model.expression.NewClassTreeImpl.accept(NewClassTreeImpl.java:106) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.TypeAndReferenceSolver.resolveAs(TypeAndReferenceSolver.java:280) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.TypeAndReferenceSolver.resolveAs(TypeAndReferenceSolver.java:248) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.TypeAndReferenceSolver.resolveAs(TypeAndReferenceSolver.java:241) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.TypeAndReferenceSolver.resolveMethodSymbol(TypeAndReferenceSolver.java:222) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.TypeAndReferenceSolver.visitMethodInvocation(TypeAndReferenceSolver.java:199) ~[java-squid-3.3.jar:na]
at org.sonar.java.model.expression.MethodInvocationTreeImpl.accept(MethodInvocationTreeImpl.java:102) ~[java-squid-3.3.jar:na]
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:42) ~[java-squid-3.3.jar:na]
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitExpressionStatement(BaseTreeVisitor.java:101) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.TypeAndReferenceSolver.visitExpressionStatement(TypeAndReferenceSolver.java:183) ~[java-squid-3.3.jar:na]
at org.sonar.java.model.statement.ExpressionStatementTreeImpl.accept(ExpressionStatementTreeImpl.java:70) ~[java-squid-3.3.jar:na]
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:42) ~[java-squid-3.3.jar:na]
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:36) ~[java-squid-3.3.jar:na]
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBlock(BaseTreeVisitor.java:85) ~[java-squid-3.3.jar:na]
at org.sonar.java.model.statement.BlockTreeImpl.accept(BlockTreeImpl.java:91) ~[java-squid-3.3.jar:na]
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:42) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.TypeAndReferenceSolver.visitMethod(TypeAndReferenceSolver.java:116) ~[java-squid-3.3.jar:na]
at org.sonar.java.model.declaration.MethodTreeImpl.accept(MethodTreeImpl.java:193) ~[java-squid-3.3.jar:na]
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:42) ~[java-squid-3.3.jar:na]
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:36) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.TypeAndReferenceSolver.visitClass(TypeAndReferenceSolver.java:125) ~[java-squid-3.3.jar:na]
at org.sonar.java.model.declaration.ClassTreeImpl.accept(ClassTreeImpl.java:189) ~[java-squid-3.3.jar:na]
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:42) ~[java-squid-3.3.jar:na]
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:36) ~[java-squid-3.3.jar:na]
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitCompilationUnit(BaseTreeVisitor.java:55) ~[java-squid-3.3.jar:na]
at org.sonar.java.resolve.SemanticModel.createFor(SemanticModel.java:66) ~[java-squid-3.3.jar:na]
at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:110) ~[java-squid-3.3.jar:na]
at com.sonar.sslr.impl.ast.AstWalker.walkAndVisit(AstWalker.java:67) [sslr-core-1.20.jar:na]
at org.sonar.java.ast.AstScanner.simpleScan(AstScanner.java:107) [java-squid-3.3.jar:na]
at org.sonar.java.ast.AstScanner.scan(AstScanner.java:75) [java-squid-3.3.jar:na]
at org.sonar.java.JavaAstScanner.scanSingleFile(JavaAstScanner.java:63) [java-squid-3.3.jar:na]
at org.sonar.java.JavaAstScanner.scanSingleFile(JavaAstScanner.java:50) [java-squid-3.3.jar:na]
Regards,
Denis