diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt index 0d74f9e0b69..23cf8e1f6b2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt @@ -6,12 +6,14 @@ package org.jetbrains.kotlin.fir.resolve.impl import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.deserialization.FirTypeDeserializer import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.symbols.ConeSymbol import org.jetbrains.kotlin.fir.symbols.LibraryClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl @@ -92,8 +94,20 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider private val allPackageFragments = loadBuiltIns().groupBy { it.fqName } + private val fictitiousFunctionSymbols = mutableMapOf() + override fun getSymbolByFqName(classId: ClassId): ConeSymbol? { - return allPackageFragments[classId.packageFqName]?.firstNotNullResult { it.getSymbolByFqName(classId, this) } + return allPackageFragments[classId.packageFqName]?.firstNotNullResult { + it.getSymbolByFqName(classId, this) + } ?: with(classId) { + val className = relativeClassName.asString() + val kind = FunctionClassDescriptor.Kind.byClassNamePrefix(packageFqName, className) ?: return@with null + val prefix = kind.classNamePrefix + val arity = className.substring(prefix.length).toIntOrNull() ?: return null + fictitiousFunctionSymbols.getOrPut(arity) { + FirClassSymbol(classId) + } + } } } \ No newline at end of file diff --git a/compiler/testData/fir/resolve/stdlib/functionX.kt b/compiler/testData/fir/resolve/stdlib/functionX.kt new file mode 100644 index 00000000000..eebfa57a08b --- /dev/null +++ b/compiler/testData/fir/resolve/stdlib/functionX.kt @@ -0,0 +1,5 @@ +import kotlin.jvm.functions.Function0 + +val x: Function0 = { 42 } + +val y: Function1 = { it } \ No newline at end of file diff --git a/compiler/testData/fir/resolve/stdlib/functionX.txt b/compiler/testData/fir/resolve/stdlib/functionX.txt new file mode 100644 index 00000000000..e6f33c79823 --- /dev/null +++ b/compiler/testData/fir/resolve/stdlib/functionX.txt @@ -0,0 +1,5 @@ +FILE: functionX.kt + public? final? property x(val): R|kotlin/jvm/functions/Function0| = STUB + public? get(): R|kotlin/jvm/functions/Function0| + public? final? property y(val): R|kotlin/Function1| = STUB + public? get(): R|kotlin/Function1| diff --git a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index 067fec1d602..75194bbcf02 100644 --- a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -31,8 +31,7 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { @TestMetadata("companion.kt") public void testCompanion() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/companion.kt"); - doTest(fileName); + runTest("compiler/testData/fir/resolve/companion.kt"); } @TestMetadata("derivedClass.kt") diff --git a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseWithStdlibGenerated.java b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseWithStdlibGenerated.java index 6b37f939e9c..fc9b582d667 100644 --- a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseWithStdlibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseWithStdlibGenerated.java @@ -34,6 +34,11 @@ public class FirResolveTestCaseWithStdlibGenerated extends AbstractFirResolveTes runTest("compiler/testData/fir/resolve/stdlib/concurrent.kt"); } + @TestMetadata("functionX.kt") + public void testFunctionX() throws Exception { + runTest("compiler/testData/fir/resolve/stdlib/functionX.kt"); + } + @TestMetadata("reflectionClass.kt") public void testReflectionClass() throws Exception { runTest("compiler/testData/fir/resolve/stdlib/reflectionClass.kt");