diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt index e8eebe9a3a2..3d68b968906 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.java.declarations.FirJavaMethod import org.jetbrains.kotlin.fir.java.declarations.FirJavaValueParameter import org.jetbrains.kotlin.fir.java.enhancement.* import org.jetbrains.kotlin.fir.java.enhancement.EnhancementSignatureParts +import org.jetbrains.kotlin.fir.java.toNotNullConeKotlinType import org.jetbrains.kotlin.fir.java.types.FirJavaTypeRef import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.ProcessorAction @@ -26,8 +27,7 @@ import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol -import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef -import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver import org.jetbrains.kotlin.load.java.descriptors.NullDefaultValue @@ -173,17 +173,38 @@ class JavaClassEnhancementScope( append("(") for (parameter in valueParameters) { - // TODO: appendErasedType(parameter.returnTypeRef) + appendErasedType(parameter.returnTypeRef) } append(")") if (this@computeJvmDescriptor !is FirJavaMethod || (returnTypeRef as FirJavaTypeRef).isVoid()) { append("V") } else { - // TODO: appendErasedType(returnTypeRef) + appendErasedType(returnTypeRef) } } + private fun StringBuilder.appendErasedType(typeRef: FirTypeRef) { + when (typeRef) { + is FirResolvedTypeRef -> appendConeType(typeRef.type) + is FirJavaTypeRef -> appendConeType(typeRef.toNotNullConeKotlinType(session)) + } + } + + private fun StringBuilder.appendConeType(coneType: ConeKotlinType) { + append("L") + when (coneType) { + is ConeClassLikeType -> { + val classId = coneType.lookupTag.classId + append(classId.packageFqName.asString().replace(".", "/")) + append("/") + append(classId.relativeClassName) + } + is ConeTypeParameterType -> append(coneType.lookupTag.name) + } + append(";") + } + private fun FirJavaTypeRef.isVoid(): Boolean { return type is JavaPrimitiveType && type.type == null } diff --git a/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/extraDump.java.txt b/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/extraDump.java.txt new file mode 100644 index 00000000000..3c6143c218c --- /dev/null +++ b/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/extraDump.java.txt @@ -0,0 +1,2 @@ + public abstract interface MyIterable : R|java/lang/Iterable| { +} diff --git a/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/jvm/MyIterable.java b/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/jvm/MyIterable.java new file mode 100644 index 00000000000..c12f94db797 --- /dev/null +++ b/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/jvm/MyIterable.java @@ -0,0 +1 @@ +public interface MyIterable extends Iterable \ No newline at end of file diff --git a/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/jvm/test.kt b/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/jvm/test.kt new file mode 100644 index 00000000000..2cd61a2b3c0 --- /dev/null +++ b/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/jvm/test.kt @@ -0,0 +1,6 @@ +interface UseIterable : MyIterable { + fun test() { + val it = iterator() + val split = spliterator() + } +} diff --git a/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/jvm/test.txt b/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/jvm/test.txt new file mode 100644 index 00000000000..4734c72aa71 --- /dev/null +++ b/idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/jvm/test.txt @@ -0,0 +1,8 @@ +FILE: test.kt + public abstract interface UseIterable : R|MyIterable| { + public open function test(): R|kotlin/Unit| { + val it: R|error: Not supported: FirImplicitTypeRefImpl| = R|FakeOverride>, kotlin/collections/Iterator>?>|!>|() + val split: R|error: Not supported: FirImplicitTypeRefImpl| = R|FakeOverride>, java/util/Spliterator>>|>|() + } + + } diff --git a/idea/tests/org/jetbrains/kotlin/idea/fir/AbstractFirMultiModuleResolveTest.kt b/idea/tests/org/jetbrains/kotlin/idea/fir/AbstractFirMultiModuleResolveTest.kt index 04c64c8347f..8221ee8e2f6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/fir/AbstractFirMultiModuleResolveTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/fir/AbstractFirMultiModuleResolveTest.kt @@ -53,10 +53,12 @@ abstract class AbstractFirMultiModuleResolveTest : AbstractMultiModuleTest() { fun doTest(dirPath: String) { setupMppProjectFromDirStructure(File(dirPath)) + val useFullJdk = "full" in dirPath + val jdkKind = if (useFullJdk) TestJdkKind.FULL_JDK else TestJdkKind.MOCK_JDK for (module in project.allModules().drop(1)) { ConfigLibraryUtil.configureSdk( module, - PluginTestCaseBase.addJdk(testRootDisposable) { PluginTestCaseBase.jdk(TestJdkKind.MOCK_JDK) } + PluginTestCaseBase.addJdk(testRootDisposable) { PluginTestCaseBase.jdk(jdkKind) } ) } doFirResolveTest(dirPath) diff --git a/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java index 62282f1d440..81f1971df29 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java @@ -59,6 +59,11 @@ public class FirMultiModuleResolveTestGenerated extends AbstractFirMultiModuleRe runTest("idea/testData/fir/multiModule/basicWithPrimitiveJava/"); } + @TestMetadata("fullWithJavaPredefinedSignature") + public void testFullWithJavaPredefinedSignature() throws Exception { + runTest("idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/"); + } + @TestMetadata("javaInheritsRawKotlin") public void testJavaInheritsRawKotlin() throws Exception { runTest("idea/testData/fir/multiModule/javaInheritsRawKotlin/");