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 cb2536e9700..c88505bddab 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 @@ -22,12 +22,15 @@ import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo +import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.load.kotlin.TypeMappingMode import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtTypeParameterListOwner +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind +import org.jetbrains.kotlin.types.RawType internal const val METHOD_INDEX_FOR_GETTER = 1 internal const val METHOD_INDEX_FOR_SETTER = 2 @@ -69,10 +72,23 @@ internal abstract class KtUltraLightMethod( } protected fun computeCheckNeedToErasureParametersTypes(methodDescriptor: FunctionDescriptor?): Boolean { - return methodDescriptor - ?.getSpecialSignatureInfo() - ?.let { it.valueParametersSignature !== null } - ?: false + + if (methodDescriptor == null) return false + + val hasSpecialSignatureInfo = methodDescriptor.getSpecialSignatureInfo() + ?.let { it.valueParametersSignature != null } ?: false + if (hasSpecialSignatureInfo) return true + + // Workaround for KT-32245 that checks if this signature could be affected by KT-38406 + if (!DescriptorUtils.isOverride(methodDescriptor)) return false + + val hasStarProjectionParameterType = methodDescriptor.valueParameters + .any { parameter -> parameter.type.arguments.any { it.isStarProjection } } + if (!hasStarProjectionParameterType) return false + + return methodDescriptor.overriddenDescriptors + .filterIsInstance() + .any { it.valueParameters.any { parameter -> parameter.type is RawType } } } abstract override fun buildTypeParameterList(): PsiTypeParameterList diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase2.0.java b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase2.0.java new file mode 100644 index 00000000000..a00aadba6f9 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase2.0.java @@ -0,0 +1,6 @@ +// PSI_ELEMENT: com.intellij.psi.PsiMethod +// OPTIONS: overrides +public interface Foo2 { + interface X {} + void baz(X clazz); +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase2.1.kt b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase2.1.kt new file mode 100644 index 00000000000..180139e8602 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase2.1.kt @@ -0,0 +1,3 @@ +class FooImpl2 : Foo2 { + override fun baz(clazz: Foo2.X<*>?) = Unit +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase2.results.txt b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase2.results.txt new file mode 100644 index 00000000000..96bba588277 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase2.results.txt @@ -0,0 +1 @@ +Unclassified usage 2 override fun baz(clazz: Foo2.X<*>?) = 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 67b3cb8917b..c376ac8f4ce 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java @@ -1764,6 +1764,11 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest { runTest("idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase.0.java"); } + @TestMetadata("OverridenRawGenericSignatureBase2.0.java") + public void testOverridenRawGenericSignatureBase2() throws Exception { + runTest("idea/testData/findUsages/java/findJavaMethodUsages/OverridenRawGenericSignatureBase2.0.java"); + } + @TestMetadata("SyntheticProperties.0.java") public void testSyntheticProperties() throws Exception { runTest("idea/testData/findUsages/java/findJavaMethodUsages/SyntheticProperties.0.java");