diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureParameterImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureParameterImpl.java index 96e036870b30..6e83c8c34607 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureParameterImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/signatures/GrClosureParameterImpl.java @@ -15,15 +15,14 @@ */ package org.jetbrains.plugins.groovy.lang.psi.impl.signatures; -import com.intellij.psi.PsiParameter; -import com.intellij.psi.PsiSubstitutor; -import com.intellij.psi.PsiType; +import com.intellij.psi.*; import com.intellij.psi.util.TypeConversionUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureParameter; +import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; /** * Created by Max Medvedev on 14/03/14 @@ -47,7 +46,19 @@ class GrClosureParameterImpl implements GrClosureParameter { @Nullable @Override public PsiType getType() { - PsiType type = mySubstitutor.substitute(myParameter.getType()); + PsiType typeParameter = myParameter.getType(); + PsiType type = mySubstitutor.substitute(typeParameter); + if (typeParameter instanceof PsiClassType) { + final PsiClass parameterClass = ((PsiClassType)typeParameter).resolve(); + if (parameterClass instanceof PsiTypeParameter && type != null) { + + PsiClassType[] types = parameterClass.getExtendsListTypes(); + if (types.length > 0 && !TypesUtil.isAssignableByMethodCallConversion(types[0], type, myParameter)) { + type = types[0]; + } + } + } + return myEraseType ? TypeConversionUtil.erasure(type) : type; } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/SubstitutorComputer.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/SubstitutorComputer.java index 6158a66d83d3..b9b975c3bfcf 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/SubstitutorComputer.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/SubstitutorComputer.java @@ -225,9 +225,11 @@ public class SubstitutorComputer { return argType; } - if (!TypesUtil.isAssignable(TypeConversionUtil.erasure(paramType), argType, myPlace) && - TypesUtil.isAssignableByMethodCallConversion(paramType, argType, myPlace)) { - return paramType; + if (!TypesUtil.isAssignable( TypeConversionUtil.erasure(paramType), argType, myPlace)) { + if (TypesUtil.isAssignableByMethodCallConversion(paramType, argType, myPlace)) { + return paramType; + } + return null; } return argType; } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GrGenericsInferringTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GrGenericsInferringTest.groovy index fe2e7aad39c1..beb420613359 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GrGenericsInferringTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GrGenericsInferringTest.groovy @@ -278,4 +278,33 @@ class GrGenericsInferringTest extends GrHighlightingTestBase { } ''' } + + void testBoundedGenericsCompileStatic() { + testHighlighting ''' +import groovy.transform.CompileStatic + +@CompileStatic +class Foo { + static > void bar(T a) { + } + + static void method() { + bar(['']) + } +} +''' + } + + void testBoundedGenerics() { + testHighlighting ''' +class Foo { + static > void bar(T a) { + } + + static void method() { + bar(['']) + } +} +''' + } }