Fix invalid signature for generic UL method
Fixed #KT-38348
This commit is contained in:
@@ -10,6 +10,7 @@ import com.intellij.psi.impl.PsiImplUtil
|
||||
import com.intellij.psi.impl.PsiSuperMethodImplUtil
|
||||
import com.intellij.psi.impl.light.LightMethodBuilder
|
||||
import com.intellij.psi.impl.light.LightTypeParameterListBuilder
|
||||
import com.intellij.psi.util.MethodSignature
|
||||
import com.intellij.psi.util.MethodSignatureBackedByPsiMethod
|
||||
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
|
||||
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
|
||||
@@ -113,6 +114,9 @@ internal abstract class KtUltraLightMethod(
|
||||
override fun findSuperMethods(parentClass: PsiClass?): Array<out PsiMethod> =
|
||||
PsiSuperMethodImplUtil.findSuperMethods(this, parentClass)
|
||||
|
||||
override fun getSignature(substitutor: PsiSubstitutor): MethodSignature =
|
||||
MethodSignatureBackedByPsiMethod.create(this, substitutor)
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
if (other !is KtUltraLightMethod) return false
|
||||
|
||||
+3
-3
@@ -6,10 +6,10 @@ public final class TestClass /* TestClass*/ {
|
||||
private int hello;
|
||||
|
||||
@null()
|
||||
public TestClass(int);
|
||||
public TestClass(int);// .ctor(int)
|
||||
|
||||
public final int getHello();
|
||||
public final int getHello();// getHello()
|
||||
|
||||
public final void setHello(@Anno() int);
|
||||
public final void setHello(@Anno() int);// setHello(int)
|
||||
|
||||
}
|
||||
@@ -1,42 +1,42 @@
|
||||
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||
public abstract @interface SimpleAnn /* SimpleAnn*/ {
|
||||
@null()
|
||||
public abstract java.lang.String value();
|
||||
public abstract java.lang.String value();// value()
|
||||
|
||||
}
|
||||
|
||||
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||
public abstract @interface Ann /* Ann*/ {
|
||||
@null()
|
||||
public abstract SimpleAnn[] t();
|
||||
public abstract SimpleAnn[] t();// t()
|
||||
|
||||
@null()
|
||||
public abstract java.lang.Class<?> z();
|
||||
public abstract java.lang.Class<?> z();// z()
|
||||
|
||||
@null()
|
||||
public abstract java.lang.Class<?>[] e();
|
||||
public abstract java.lang.Class<?>[] e();// e()
|
||||
|
||||
@null()
|
||||
public abstract java.lang.String y();
|
||||
public abstract java.lang.String y();// y()
|
||||
|
||||
@null()
|
||||
public abstract kotlin.DeprecationLevel depr();
|
||||
public abstract kotlin.DeprecationLevel depr();// depr()
|
||||
|
||||
public abstract int x();
|
||||
public abstract int x();// x()
|
||||
|
||||
}
|
||||
|
||||
public abstract interface Base /* Base*/ {
|
||||
@Ann(x = 1, y = "134", z = String::class, e = {Int::class, Double::class}, depr = DeprecationLevel.WARNING, t = {@SimpleAnn(value = "243"), @SimpleAnn(value = "4324")})
|
||||
public abstract void foo(@Ann(x = 2, y = "324", z = Ann::class, e = {Byte::class, Base::class}, depr = DeprecationLevel.WARNING, t = {@SimpleAnn(value = "687"), @SimpleAnn(value = "78")}) @org.jetbrains.annotations.NotNull() java.lang.String);
|
||||
public abstract void foo(@Ann(x = 2, y = "324", z = Ann::class, e = {Byte::class, Base::class}, depr = DeprecationLevel.WARNING, t = {@SimpleAnn(value = "687"), @SimpleAnn(value = "78")}) @org.jetbrains.annotations.NotNull() java.lang.String);// foo(java.lang.String)
|
||||
|
||||
}
|
||||
|
||||
public final class Derived /* Derived*/ implements Base {
|
||||
@Ann(x = 1, y = "134", z = java.lang.String.class, e = {int.class, double.class}, depr = kotlin.DeprecationLevel.WARNING, t = {@SimpleAnn(value="243"), @SimpleAnn(value="4324")})
|
||||
public void foo(@Ann(x = 2, y = "324", z = Ann.class, e = {byte.class, Base.class}, depr = kotlin.DeprecationLevel.WARNING, t = {@SimpleAnn(value="687"), @SimpleAnn(value="78")}) @org.jetbrains.annotations.NotNull() java.lang.String);
|
||||
public void foo(@Ann(x = 2, y = "324", z = Ann.class, e = {byte.class, Base.class}, depr = kotlin.DeprecationLevel.WARNING, t = {@SimpleAnn(value="687"), @SimpleAnn(value="78")}) @org.jetbrains.annotations.NotNull() java.lang.String);// foo(java.lang.String)
|
||||
|
||||
@null()
|
||||
public Derived(@org.jetbrains.annotations.NotNull() Base);
|
||||
public Derived(@org.jetbrains.annotations.NotNull() Base);// .ctor(Base)
|
||||
|
||||
}
|
||||
@@ -1,14 +1,14 @@
|
||||
public final class Foo /* c.b.a.Foo*/ {
|
||||
@null()
|
||||
public Foo();
|
||||
public Foo();// .ctor()
|
||||
|
||||
public final void bar();
|
||||
public final void bar();// bar()
|
||||
|
||||
}
|
||||
|
||||
public static final class A$B /* null*/ {
|
||||
@null()
|
||||
public A$B();
|
||||
public A$B();// .ctor()
|
||||
|
||||
class $$$$$$$ ...
|
||||
|
||||
@@ -18,13 +18,13 @@ public static final class A$B /* null*/ {
|
||||
|
||||
public final class C$D /* null*/ {
|
||||
@null()
|
||||
public C$D();
|
||||
public C$D();// .ctor()
|
||||
|
||||
}
|
||||
|
||||
public final class $$$$$$$ /* null*/ {
|
||||
@null()
|
||||
public $$$$$$$();
|
||||
public $$$$$$$();// .ctor()
|
||||
|
||||
class G$G$ ...
|
||||
|
||||
@@ -32,6 +32,6 @@ public final class $$$$$$$ /* null*/ {
|
||||
|
||||
public final class G$G$ /* null*/ {
|
||||
@null()
|
||||
public G$G$();
|
||||
public G$G$();// .ctor()
|
||||
|
||||
}
|
||||
+21
-21
@@ -2,12 +2,12 @@ public final class Prop /* Prop*/ {
|
||||
private final java.lang.Object someProp;
|
||||
|
||||
@null()
|
||||
public Prop();
|
||||
public Prop();// .ctor()
|
||||
|
||||
}
|
||||
|
||||
final class null /* null*/ {
|
||||
private ();
|
||||
private ();// .ctor()
|
||||
|
||||
}
|
||||
|
||||
@@ -17,20 +17,20 @@ final class C /* C*/ {
|
||||
private final kotlin.jvm.functions.Function0<java.lang.Object> initChild;
|
||||
|
||||
@null()
|
||||
public C(int);
|
||||
public C(int);// .ctor(int)
|
||||
|
||||
@org.jetbrains.annotations.NotNull()
|
||||
public final kotlin.jvm.functions.Function0<java.lang.Object> getInitChild();
|
||||
public final kotlin.jvm.functions.Function0<java.lang.Object> getInitChild();// getInitChild()
|
||||
|
||||
public final int getY();
|
||||
public final int getY();// getY()
|
||||
|
||||
}
|
||||
|
||||
final class null /* null*/ {
|
||||
@org.jetbrains.annotations.NotNull()
|
||||
public java.lang.String toString();
|
||||
public java.lang.String toString();// toString()
|
||||
|
||||
private ();
|
||||
private ();// .ctor()
|
||||
|
||||
}
|
||||
|
||||
@@ -38,27 +38,27 @@ public final class ValidPublicSupertype /* ValidPublicSupertype*/ {
|
||||
private final java.lang.Runnable x;
|
||||
|
||||
@null()
|
||||
public ValidPublicSupertype();
|
||||
public ValidPublicSupertype();// .ctor()
|
||||
|
||||
@org.jetbrains.annotations.NotNull()
|
||||
public final java.lang.Runnable bar();
|
||||
public final java.lang.Runnable bar();// bar()
|
||||
|
||||
@org.jetbrains.annotations.NotNull()
|
||||
public final java.lang.Runnable getX();
|
||||
public final java.lang.Runnable getX();// getX()
|
||||
|
||||
}
|
||||
|
||||
final class null /* null*/ implements java.lang.Runnable {
|
||||
private ();
|
||||
private ();// .ctor()
|
||||
|
||||
public void run();
|
||||
public void run();// run()
|
||||
|
||||
}
|
||||
|
||||
final class null /* null*/ implements java.lang.Runnable {
|
||||
private ();
|
||||
private ();// .ctor()
|
||||
|
||||
public void run();
|
||||
public void run();// run()
|
||||
|
||||
}
|
||||
|
||||
@@ -69,26 +69,26 @@ public final class InvalidPublicSupertype /* InvalidPublicSupertype*/ {
|
||||
private final java.lang.Runnable x;
|
||||
|
||||
@null()
|
||||
public InvalidPublicSupertype();
|
||||
public InvalidPublicSupertype();// .ctor()
|
||||
|
||||
@org.jetbrains.annotations.NotNull()
|
||||
public final java.lang.Runnable bar();
|
||||
public final java.lang.Runnable bar();// bar()
|
||||
|
||||
@org.jetbrains.annotations.NotNull()
|
||||
public final java.lang.Runnable getX();
|
||||
public final java.lang.Runnable getX();// getX()
|
||||
|
||||
}
|
||||
|
||||
final class null /* null*/ implements I, java.lang.Runnable {
|
||||
private ();
|
||||
private ();// .ctor()
|
||||
|
||||
public void run();
|
||||
public void run();// run()
|
||||
|
||||
}
|
||||
|
||||
final class null /* null*/ implements I, java.lang.Runnable {
|
||||
private ();
|
||||
private ();// .ctor()
|
||||
|
||||
public void run();
|
||||
public void run();// run()
|
||||
|
||||
}
|
||||
@@ -4,21 +4,21 @@ public final class UInt /* UInt*/ {
|
||||
public enum Foo /* Foo*/ {
|
||||
;
|
||||
|
||||
public final int getX();
|
||||
public final int getX();// getX()
|
||||
|
||||
}
|
||||
|
||||
public final class InlinedDelegate /* InlinedDelegate*/<T> {
|
||||
@null()
|
||||
public final T getNode();
|
||||
public final T getNode();// getNode()
|
||||
|
||||
}
|
||||
|
||||
public final class InlineInheritance /* InlineInheritance*/ {
|
||||
public final int getV();
|
||||
public final int getV();// getV()
|
||||
|
||||
public int getX();
|
||||
public int getX();// getX()
|
||||
|
||||
public int y();
|
||||
public int y();// y()
|
||||
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
public final class X /* X*/ {
|
||||
@null()
|
||||
public X();
|
||||
public X();// .ctor()
|
||||
|
||||
public final int getW();
|
||||
public final int getW();// getW()
|
||||
|
||||
public final void setV(int);
|
||||
public final void setV(int);// setV(int)
|
||||
|
||||
}
|
||||
@@ -1,19 +1,19 @@
|
||||
public final class Boo /* Boo*/ {
|
||||
@null()
|
||||
public Boo();
|
||||
public Boo();// .ctor()
|
||||
|
||||
public final void fooBar();
|
||||
public final void fooBar();// fooBar()
|
||||
|
||||
}
|
||||
|
||||
public static final class LocalClassBase /* null*/ {
|
||||
@null()
|
||||
public LocalClassBase();
|
||||
public LocalClassBase();// .ctor()
|
||||
|
||||
}
|
||||
|
||||
public static final class LocalClassDerived /* null*/ extends LocalClassBase {
|
||||
@null()
|
||||
public LocalClassDerived();
|
||||
public LocalClassDerived();// .ctor()
|
||||
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
// PSI_ELEMENT: com.intellij.psi.PsiMethod
|
||||
// OPTIONS: overrides
|
||||
public interface Foo {
|
||||
<T> void <caret>baz(T foo);
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
class FooImpl : Foo {
|
||||
override fun <T : Any?> baz(foo: T) = Unit
|
||||
}
|
||||
Vendored
+1
@@ -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(" {")
|
||||
|
||||
Reference in New Issue
Block a user