diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethods.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethods.kt index 69b5ad5ee97..cb2536e9700 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethods.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethods.kt @@ -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 = 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 diff --git a/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.java b/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.java index 11f5a760939..b326da8653b 100644 --- a/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.java +++ b/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.java @@ -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) } \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightClasses/delegatesWithAnnotations.java b/compiler/testData/asJava/ultraLightClasses/delegatesWithAnnotations.java index de2399934c7..06ccaab02b4 100644 --- a/compiler/testData/asJava/ultraLightClasses/delegatesWithAnnotations.java +++ b/compiler/testData/asJava/ultraLightClasses/delegatesWithAnnotations.java @@ -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) } \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightClasses/dollarsInNameLocal.java b/compiler/testData/asJava/ultraLightClasses/dollarsInNameLocal.java index fcae6bbea96..59ed1799f75 100644 --- a/compiler/testData/asJava/ultraLightClasses/dollarsInNameLocal.java +++ b/compiler/testData/asJava/ultraLightClasses/dollarsInNameLocal.java @@ -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() } \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightClasses/inferringAnonymousObjectTypes.java b/compiler/testData/asJava/ultraLightClasses/inferringAnonymousObjectTypes.java index dee366e8f07..0fb2d7c7ecc 100644 --- a/compiler/testData/asJava/ultraLightClasses/inferringAnonymousObjectTypes.java +++ b/compiler/testData/asJava/ultraLightClasses/inferringAnonymousObjectTypes.java @@ -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 initChild; @null() - public C(int); + public C(int);// .ctor(int) @org.jetbrains.annotations.NotNull() - public final kotlin.jvm.functions.Function0 getInitChild(); + public final kotlin.jvm.functions.Function0 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() } \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightClasses/inlineClasses.java b/compiler/testData/asJava/ultraLightClasses/inlineClasses.java index e2078d4b66c..c01353737d3 100644 --- a/compiler/testData/asJava/ultraLightClasses/inlineClasses.java +++ b/compiler/testData/asJava/ultraLightClasses/inlineClasses.java @@ -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*/ { @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() } \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightClasses/jvmSyntheticForAccessors.java b/compiler/testData/asJava/ultraLightClasses/jvmSyntheticForAccessors.java index 9e8df1fdd97..1e066c7028b 100644 --- a/compiler/testData/asJava/ultraLightClasses/jvmSyntheticForAccessors.java +++ b/compiler/testData/asJava/ultraLightClasses/jvmSyntheticForAccessors.java @@ -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) } \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightClasses/localClassDerived.java b/compiler/testData/asJava/ultraLightClasses/localClassDerived.java index 2eb721d9c28..4ae5e470c31 100644 --- a/compiler/testData/asJava/ultraLightClasses/localClassDerived.java +++ b/compiler/testData/asJava/ultraLightClasses/localClassDerived.java @@ -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() } \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase.0.java b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase.0.java new file mode 100644 index 00000000000..152365da72e --- /dev/null +++ b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase.0.java @@ -0,0 +1,5 @@ +// PSI_ELEMENT: com.intellij.psi.PsiMethod +// OPTIONS: overrides +public interface Foo { + void baz(T foo); +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase.1.kt b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase.1.kt new file mode 100644 index 00000000000..235775bc2f0 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase.1.kt @@ -0,0 +1,3 @@ +class FooImpl : Foo { + override fun baz(foo: T) = Unit +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase.results.txt b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase.results.txt new file mode 100644 index 00000000000..e0c6bd64480 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase.results.txt @@ -0,0 +1 @@ +Unclassified usage 2 override fun baz(foo: T) = Unit \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java index 9a9b31dfb88..67b3cb8917b 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java @@ -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"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt b/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt index 727d7562c9d..92f7399d700 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt @@ -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.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(" {")