Fix invalid signature for generic UL method

Fixed #KT-38348
This commit is contained in:
Igor Yakovlev
2020-04-17 15:48:46 +03:00
parent 6f40ad7de2
commit ed3ae785fb
13 changed files with 85 additions and 58 deletions
@@ -0,0 +1,5 @@
// PSI_ELEMENT: com.intellij.psi.PsiMethod
// OPTIONS: overrides
public interface Foo {
<T> void <caret>baz(T foo);
}
@@ -0,0 +1,3 @@
class FooImpl : Foo {
override fun <T : Any?> baz(foo: T) = Unit
}
@@ -0,0 +1 @@
Unclassified usage 2 override fun <T : Any?> baz(foo: T) = Unit
@@ -1759,6 +1759,11 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest {
runTest("idea/testData/findUsages/java/findJavaMethodUsages/OverriddenMethodSyntheticAccessor.0.java");
}
@TestMetadata("OverridenRawGenericSignatureBase.0.java")
public void testOverridenRawGenericSignatureBase() throws Exception {
runTest("idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase.0.java");
}
@TestMetadata("SyntheticProperties.0.java")
public void testSyntheticProperties() throws Exception {
runTest("idea/testData/findUsages/java/findJavaMethodUsages/SyntheticProperties.0.java");
@@ -12,6 +12,7 @@ import com.intellij.openapi.util.Conditions
import com.intellij.openapi.util.Disposer
import com.intellij.psi.*
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.MethodSignature
import com.intellij.testFramework.UsefulTestCase
import com.intellij.util.PairProcessor
import com.intellij.util.ref.DebugReflectionUtil
@@ -185,9 +186,9 @@ object UltraLightChecker {
return result
}
private fun PsiTypeParameterListOwner.renderTypeParams() =
if (typeParameters.isEmpty()) ""
else "<" + typeParameters.joinToString {
private fun Array<PsiTypeParameter>.renderTypeParams() =
if (isEmpty()) ""
else "<" + joinToString {
val bounds =
if (it.extendsListTypes.isNotEmpty())
" extends " + it.extendsListTypes.joinToString(" & ", transform = { it.renderType() })
@@ -204,7 +205,7 @@ object UltraLightChecker {
private fun PsiMethod.renderMethod() =
renderModifiers(returnType) +
(if (isVarArgs) "/* vararg */ " else "") +
renderTypeParams() +
typeParameters.renderTypeParams() +
(returnType?.renderType() ?: "") + " " +
name +
"(" + parameterList.parameters.joinToString { it.renderModifiers(it.type) + it.type.renderType() } + ")" +
@@ -213,7 +214,15 @@ object UltraLightChecker {
if (thrownTypes.isEmpty()) ""
else " throws " + thrownTypes.joinToString { it.renderType() }
} +
";"
";" +
"// ${getSignature(PsiSubstitutor.EMPTY).renderSignature()}"
private fun MethodSignature.renderSignature(): String {
val typeParams = typeParameters.renderTypeParams()
val paramTypes = parameterTypes.joinToString(prefix = "(", postfix = ")") { it.renderType() }
val name = if (isConstructor) ".ctor" else name
return "$typeParams $name$paramTypes"
}
private fun PsiEnumConstant.renderEnumConstant(): String {
val initializingClass = initializingClass ?: return name
@@ -237,7 +246,7 @@ object UltraLightChecker {
append(renderModifiers())
append("$classWord ")
append("$name /* $qualifiedName*/")
append(renderTypeParams())
append(typeParameters.renderTypeParams())
append(extendsList.renderRefList("extends"))
append(implementsList.renderRefList("implements"))
appendln(" {")