FIR: temporary implementation of kotlin.FunctionX resolve
This commit is contained in:
+15
-1
@@ -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<Int, ConeSymbol>()
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import kotlin.jvm.functions.Function0
|
||||
|
||||
val x: Function0<Int> = { 42 }
|
||||
|
||||
val y: Function1<String, String> = { it }
|
||||
@@ -0,0 +1,5 @@
|
||||
FILE: functionX.kt
|
||||
public? final? property x(val): R|kotlin/jvm/functions/Function0<kotlin/Int>| = STUB
|
||||
public? get(): R|kotlin/jvm/functions/Function0<kotlin/Int>|
|
||||
public? final? property y(val): R|kotlin/Function1<kotlin/String, kotlin/String>| = STUB
|
||||
public? get(): R|kotlin/Function1<kotlin/String, kotlin/String>|
|
||||
@@ -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")
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user