From 262d1472f26a39df848526771dac1341d966ac58 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 23 Apr 2020 16:27:38 +0300 Subject: [PATCH] [FIR] Add service for fir extension points --- .../fir/extensions/FirRegisteredExtension.kt | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirRegisteredExtension.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirRegisteredExtension.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirRegisteredExtension.kt new file mode 100644 index 00000000000..6cbef064f66 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirRegisteredExtension.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2010-2020 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.FirSessionComponent +import org.jetbrains.kotlin.fir.utils.ComponentArrayOwner +import org.jetbrains.kotlin.fir.utils.ComponentTypeRegistry +import org.jetbrains.kotlin.name.Name +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KClass +import kotlin.reflect.KProperty + +abstract class FirExtensionPoint(val session: FirSession) { + abstract val name: FirExtensionPointName + + fun interface Factory

{ + fun create(session: FirSession): P + } +} + +data class FirExtensionPointName(val name: Name) { + constructor(name: String) : this(Name.identifier(name)) +} + +@Suppress("EXPERIMENTAL_FEATURE_WARNING") +inline class FirRegisteredExtension

(val extensions: List

) + +class FirExtensionPointService( + private val session: FirSession +) : ComponentArrayOwner>(), FirSessionComponent { + companion object : ComponentTypeRegistry>() { + inline fun > registeredExtensions(): ReadOnlyProperty> { + val accessor = generateAccessor(K::class) + return object : ReadOnlyProperty> { + override fun getValue(thisRef: FirExtensionPointService, property: KProperty<*>): List { + return accessor.getValue(thisRef, property).extensions + } + } + } + } + + override val typeRegistry: ComponentTypeRegistry> + get() = Companion + + fun

registerExtensions(extensionClass: KClass

, extensions: List>) { + registerComponent(extensionClass, FirRegisteredExtension(extensions.map { it.create(session) })) + } +} + +val FirSession.extensionPointService: FirExtensionPointService by FirSession.sessionComponentAccessor()