[FIR] Properly implement FirFunctionalTypeKindService
This implementation takes additional functional type kinds from compiler plugins into account
This commit is contained in:
committed by
Space Team
parent
c86495dcae
commit
e0c8f2354a
+2
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver
|
|||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirDummyCompilerLazyDeclarationResolver
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirDummyCompilerLazyDeclarationResolver
|
||||||
|
import org.jetbrains.kotlin.fir.session.registerCommonComponentsAfterExtensionsAreConfigured
|
||||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||||
import org.jetbrains.kotlin.platform.isCommon
|
import org.jetbrains.kotlin.platform.isCommon
|
||||||
import org.jetbrains.kotlin.platform.isJs
|
import org.jetbrains.kotlin.platform.isJs
|
||||||
@@ -54,6 +55,7 @@ class LLFirBuiltinsSessionFactory(
|
|||||||
registerIdeComponents(project)
|
registerIdeComponents(project)
|
||||||
register(FirLazyDeclarationResolver::class, FirDummyCompilerLazyDeclarationResolver)
|
register(FirLazyDeclarationResolver::class, FirDummyCompilerLazyDeclarationResolver)
|
||||||
registerCommonComponents(LanguageVersionSettingsImpl.DEFAULT/*TODO*/)
|
registerCommonComponents(LanguageVersionSettingsImpl.DEFAULT/*TODO*/)
|
||||||
|
registerCommonComponentsAfterExtensionsAreConfigured()
|
||||||
registerCommonJavaComponents(JavaModuleResolver.getInstance(project))
|
registerCommonJavaComponents(JavaModuleResolver.getInstance(project))
|
||||||
registerModuleData(moduleData)
|
registerModuleData(moduleData)
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -22,10 +22,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
|||||||
import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
|
import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirDummyCompilerLazyDeclarationResolver
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirDummyCompilerLazyDeclarationResolver
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.session.registerCommonComponents
|
import org.jetbrains.kotlin.fir.session.*
|
||||||
import org.jetbrains.kotlin.fir.session.registerCommonJavaComponents
|
|
||||||
import org.jetbrains.kotlin.fir.session.registerJavaSpecificResolveComponents
|
|
||||||
import org.jetbrains.kotlin.fir.session.registerModuleData
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver
|
import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver
|
||||||
import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver
|
import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver
|
||||||
|
|
||||||
@@ -53,6 +50,7 @@ class LLFirLibrarySessionFactory(
|
|||||||
registerIdeComponents(project)
|
registerIdeComponents(project)
|
||||||
register(FirLazyDeclarationResolver::class, FirDummyCompilerLazyDeclarationResolver)
|
register(FirLazyDeclarationResolver::class, FirDummyCompilerLazyDeclarationResolver)
|
||||||
registerCommonComponents(LanguageVersionSettingsImpl.DEFAULT/*TODO*/)
|
registerCommonComponents(LanguageVersionSettingsImpl.DEFAULT/*TODO*/)
|
||||||
|
registerCommonComponentsAfterExtensionsAreConfigured()
|
||||||
registerCommonJavaComponents(JavaModuleResolver.getInstance(project))
|
registerCommonJavaComponents(JavaModuleResolver.getInstance(project))
|
||||||
registerJavaSpecificResolveComponents()
|
registerJavaSpecificResolveComponents()
|
||||||
|
|
||||||
|
|||||||
+3
@@ -108,6 +108,7 @@ internal object LLFirSessionFactory {
|
|||||||
|
|
||||||
registerCompilerPluginServices(contentScope, project, module)
|
registerCompilerPluginServices(contentScope, project, module)
|
||||||
registerCompilerPluginExtensions(project, module)
|
registerCompilerPluginExtensions(project, module)
|
||||||
|
registerCommonComponentsAfterExtensionsAreConfigured()
|
||||||
|
|
||||||
val switchableExtensionDeclarationsSymbolProvider = FirSwitchableExtensionDeclarationsSymbolProvider.create(session)?.also {
|
val switchableExtensionDeclarationsSymbolProvider = FirSwitchableExtensionDeclarationsSymbolProvider.create(session)?.also {
|
||||||
register(FirSwitchableExtensionDeclarationsSymbolProvider::class, it)
|
register(FirSwitchableExtensionDeclarationsSymbolProvider::class, it)
|
||||||
@@ -206,6 +207,7 @@ internal object LLFirSessionFactory {
|
|||||||
|
|
||||||
registerIdeComponents(project)
|
registerIdeComponents(project)
|
||||||
registerCommonComponents(languageVersionSettings)
|
registerCommonComponents(languageVersionSettings)
|
||||||
|
registerCommonComponentsAfterExtensionsAreConfigured()
|
||||||
registerCommonJavaComponents(JavaModuleResolver.getInstance(project))
|
registerCommonJavaComponents(JavaModuleResolver.getInstance(project))
|
||||||
registerResolveComponents()
|
registerResolveComponents()
|
||||||
registerJavaSpecificResolveComponents()
|
registerJavaSpecificResolveComponents()
|
||||||
@@ -288,6 +290,7 @@ internal object LLFirSessionFactory {
|
|||||||
|
|
||||||
registerIdeComponents(project)
|
registerIdeComponents(project)
|
||||||
registerCommonComponents(languageVersionSettings)
|
registerCommonComponents(languageVersionSettings)
|
||||||
|
registerCommonComponentsAfterExtensionsAreConfigured()
|
||||||
registerCommonJavaComponents(JavaModuleResolver.getInstance(project))
|
registerCommonJavaComponents(JavaModuleResolver.getInstance(project))
|
||||||
registerResolveComponents()
|
registerResolveComponents()
|
||||||
registerJavaSpecificResolveComponents()
|
registerJavaSpecificResolveComponents()
|
||||||
|
|||||||
@@ -85,6 +85,10 @@ abstract class ConeFunctionalTypeKind internal constructor(
|
|||||||
|
|
||||||
fun numberedClassName(arity: Int): Name = Name.identifier("$classNamePrefix$arity")
|
fun numberedClassName(arity: Int): Name = Name.identifier("$classNamePrefix$arity")
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "$packageFqName.${classNamePrefix}N"
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------- Builtin functional kinds -------------------------------------------
|
// ------------------------------------------- Builtin functional kinds -------------------------------------------
|
||||||
|
|
||||||
object Function : ConeFunctionalTypeKind(
|
object Function : ConeFunctionalTypeKind(
|
||||||
|
|||||||
+11
@@ -32,6 +32,7 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
|
|||||||
FirSamConversionTransformerExtension::class,
|
FirSamConversionTransformerExtension::class,
|
||||||
FirAssignExpressionAltererExtension::class,
|
FirAssignExpressionAltererExtension::class,
|
||||||
FirScriptConfiguratorExtension::class,
|
FirScriptConfiguratorExtension::class,
|
||||||
|
FirFunctionalTypeKindExtension::class,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,6 +91,11 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
|
|||||||
registerExtension(FirScriptConfiguratorExtension::class, this)
|
registerExtension(FirScriptConfiguratorExtension::class, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmName("plusFunctionalTypeKindExtension")
|
||||||
|
operator fun (FirFunctionalTypeKindExtension.Factory).unaryPlus() {
|
||||||
|
registerExtension(FirFunctionalTypeKindExtension::class, this)
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------ reference methods ------------------
|
// ------------------ reference methods ------------------
|
||||||
|
|
||||||
@JvmName("plusStatusTransformerExtension")
|
@JvmName("plusStatusTransformerExtension")
|
||||||
@@ -142,6 +148,11 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
|
|||||||
FirScriptConfiguratorExtension.Factory { this.invoke(it) }.unaryPlus()
|
FirScriptConfiguratorExtension.Factory { this.invoke(it) }.unaryPlus()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmName("plusFunctionalTypeKindExtension")
|
||||||
|
operator fun ((FirSession) -> FirFunctionalTypeKindExtension).unaryPlus() {
|
||||||
|
FirFunctionalTypeKindExtension.Factory { this.invoke(it) }.unaryPlus()
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------ utilities ------------------
|
// ------------------ utilities ------------------
|
||||||
|
|
||||||
@JvmName("bindLeft")
|
@JvmName("bindLeft")
|
||||||
|
|||||||
+5
-2
@@ -47,6 +47,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirSubstitutionOverrideStorage
|
|||||||
import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver
|
import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver
|
||||||
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
|
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
|
||||||
import org.jetbrains.kotlin.fir.types.FirFunctionalTypeKindService
|
import org.jetbrains.kotlin.fir.types.FirFunctionalTypeKindService
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirFunctionalTypeKindServiceImpl
|
||||||
import org.jetbrains.kotlin.fir.types.TypeComponents
|
import org.jetbrains.kotlin.fir.types.TypeComponents
|
||||||
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
|
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||||
@@ -72,9 +73,11 @@ fun FirSession.registerCommonComponents(languageVersionSettings: LanguageVersion
|
|||||||
register(FirSamConstructorStorage::class, FirSamConstructorStorage(this))
|
register(FirSamConstructorStorage::class, FirSamConstructorStorage(this))
|
||||||
register(FirOverrideService::class, FirOverrideService(this))
|
register(FirOverrideService::class, FirOverrideService(this))
|
||||||
register(FirDynamicMembersStorage::class, FirDynamicMembersStorage(this))
|
register(FirDynamicMembersStorage::class, FirDynamicMembersStorage(this))
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: replace with proper implementation
|
@OptIn(SessionConfiguration::class)
|
||||||
register(FirFunctionalTypeKindService::class, FirFunctionalTypeKindService.Default)
|
fun FirSession.registerCommonComponentsAfterExtensionsAreConfigured() {
|
||||||
|
register(FirFunctionalTypeKindService::class, FirFunctionalTypeKindServiceImpl(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(SessionConfiguration::class)
|
@OptIn(SessionConfiguration::class)
|
||||||
|
|||||||
+2
@@ -44,6 +44,7 @@ abstract class FirAbstractSessionFactory {
|
|||||||
|
|
||||||
registerCliCompilerOnlyComponents()
|
registerCliCompilerOnlyComponents()
|
||||||
registerCommonComponents(languageVersionSettings)
|
registerCommonComponents(languageVersionSettings)
|
||||||
|
registerCommonComponentsAfterExtensionsAreConfigured()
|
||||||
registerExtraComponents(this)
|
registerExtraComponents(this)
|
||||||
|
|
||||||
val kotlinScopeProvider = createKotlinScopeProvider.invoke()
|
val kotlinScopeProvider = createKotlinScopeProvider.invoke()
|
||||||
@@ -105,6 +106,7 @@ abstract class FirAbstractSessionFactory {
|
|||||||
}
|
}
|
||||||
init()
|
init()
|
||||||
}.configure()
|
}.configure()
|
||||||
|
registerCommonComponentsAfterExtensionsAreConfigured()
|
||||||
|
|
||||||
val dependencyProviders = computeDependencyProviderList(moduleData)
|
val dependencyProviders = computeDependencyProviderList(moduleData)
|
||||||
val generatedSymbolsProvider = FirSwitchableExtensionDeclarationsSymbolProvider.create(this)
|
val generatedSymbolsProvider = FirSwitchableExtensionDeclarationsSymbolProvider.create(this)
|
||||||
|
|||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.types
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.extensions.FirFunctionalTypeKindExtension
|
||||||
|
import org.jetbrains.kotlin.fir.extensions.extensionService
|
||||||
|
import org.jetbrains.kotlin.fir.extensions.functionalTypeKindExtensions
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
|
||||||
|
class FirFunctionalTypeKindServiceImpl(session: FirSession) : FirFunctionalTypeKindService() {
|
||||||
|
private val knownKindsByPackageFqName = buildList {
|
||||||
|
add(ConeFunctionalTypeKind.Function)
|
||||||
|
add(ConeFunctionalTypeKind.SuspendFunction)
|
||||||
|
add(ConeFunctionalTypeKind.KFunction)
|
||||||
|
add(ConeFunctionalTypeKind.KSuspendFunction)
|
||||||
|
|
||||||
|
val registrar = object : FirFunctionalTypeKindExtension.FunctionalTypeKindRegistrar {
|
||||||
|
override fun registerKind(nonReflectKind: ConeFunctionalTypeKind, reflectKind: ConeFunctionalTypeKind) {
|
||||||
|
require(nonReflectKind.reflectKind() == reflectKind)
|
||||||
|
require(reflectKind.nonReflectKind() == nonReflectKind)
|
||||||
|
add(nonReflectKind)
|
||||||
|
add(reflectKind)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (extension in session.extensionService.functionalTypeKindExtensions) {
|
||||||
|
with(extension) { registrar.registerKinds() }
|
||||||
|
}
|
||||||
|
}.also { kinds ->
|
||||||
|
val allNames = kinds.map { "${it.packageFqName}.${it.classNamePrefix}" }
|
||||||
|
require(allNames.distinct() == allNames) {
|
||||||
|
"There are clashing functional type kinds: $allNames"
|
||||||
|
}
|
||||||
|
}.groupBy { it.packageFqName }
|
||||||
|
|
||||||
|
override fun getKindByClassNamePrefix(packageFqName: FqName, className: String): ConeFunctionalTypeKind? {
|
||||||
|
val kinds = knownKindsByPackageFqName[packageFqName] ?: return null
|
||||||
|
for (kind in kinds) {
|
||||||
|
if (!className.startsWith(kind.classNamePrefix)) continue
|
||||||
|
if (!FunctionClassKind.hasArityAtTheEnd(kind.classNamePrefix, className)) continue
|
||||||
|
return kind
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.extensions
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.types.ConeFunctionalTypeKind
|
||||||
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
abstract class FirFunctionalTypeKindExtension(session: FirSession) : FirExtension(session) {
|
||||||
|
companion object {
|
||||||
|
val NAME = FirExtensionPointName("CustomFunctionalTypeKindExtension")
|
||||||
|
}
|
||||||
|
|
||||||
|
final override val name: FirExtensionPointName
|
||||||
|
get() = NAME
|
||||||
|
|
||||||
|
final override val extensionType: KClass<out FirExtension>
|
||||||
|
get() = FirFunctionalTypeKindExtension::class
|
||||||
|
|
||||||
|
interface FunctionalTypeKindRegistrar {
|
||||||
|
fun registerKind(nonReflectKind: ConeFunctionalTypeKind, reflectKind: ConeFunctionalTypeKind)
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract fun FunctionalTypeKindRegistrar.registerKinds()
|
||||||
|
|
||||||
|
fun interface Factory : FirExtension.Factory<FirFunctionalTypeKindExtension>
|
||||||
|
}
|
||||||
|
|
||||||
|
val FirExtensionService.functionalTypeKindExtensions: List<FirFunctionalTypeKindExtension> by FirExtensionService.registeredExtensions()
|
||||||
@@ -43,6 +43,10 @@ enum class FunctionClassKind(
|
|||||||
fun getFunctionalClassKind(className: String, packageFqName: FqName) =
|
fun getFunctionalClassKind(className: String, packageFqName: FqName) =
|
||||||
parseClassName(className, packageFqName)?.kind
|
parseClassName(className, packageFqName)?.kind
|
||||||
|
|
||||||
|
fun hasArityAtTheEnd(prefix: String, className: String): Boolean {
|
||||||
|
return toInt(className.substring(prefix.length)) != null
|
||||||
|
}
|
||||||
|
|
||||||
private fun toInt(s: String): Int? {
|
private fun toInt(s: String): Int? {
|
||||||
if (s.isEmpty()) return null
|
if (s.isEmpty()) return null
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user