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
|
package org.jetbrains.kotlin.fir.resolve.impl
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
|
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
import org.jetbrains.kotlin.descriptors.SourceElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.deserialization.FirTypeDeserializer
|
import org.jetbrains.kotlin.fir.deserialization.FirTypeDeserializer
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.LibraryClassSymbol
|
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.ProtoBuf
|
||||||
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
|
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl
|
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 allPackageFragments = loadBuiltIns().groupBy { it.fqName }
|
||||||
|
|
||||||
|
private val fictitiousFunctionSymbols = mutableMapOf<Int, ConeSymbol>()
|
||||||
|
|
||||||
override fun getSymbolByFqName(classId: ClassId): 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")
|
@TestMetadata("companion.kt")
|
||||||
public void testCompanion() throws Exception {
|
public void testCompanion() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/companion.kt");
|
runTest("compiler/testData/fir/resolve/companion.kt");
|
||||||
doTest(fileName);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("derivedClass.kt")
|
@TestMetadata("derivedClass.kt")
|
||||||
|
|||||||
+5
@@ -34,6 +34,11 @@ public class FirResolveTestCaseWithStdlibGenerated extends AbstractFirResolveTes
|
|||||||
runTest("compiler/testData/fir/resolve/stdlib/concurrent.kt");
|
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")
|
@TestMetadata("reflectionClass.kt")
|
||||||
public void testReflectionClass() throws Exception {
|
public void testReflectionClass() throws Exception {
|
||||||
runTest("compiler/testData/fir/resolve/stdlib/reflectionClass.kt");
|
runTest("compiler/testData/fir/resolve/stdlib/reflectionClass.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user