From 907d2e9ed4e98080c9dc5fb386492cbbf03a09df Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 18 Oct 2021 23:09:21 -0700 Subject: [PATCH] FIR LC: populate delegates to interface methods --- .../symbol/classes/FirLightClassForSymbol.kt | 32 +++++++++++++++++++ .../asJava/lightClasses/DelegatedNested.kt | 3 +- .../asJava/lightClasses/Delegation.kt | 3 +- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt index dc2333c4faa..1cef63b28d4 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_BASE +import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_NON_ORIGIN_METHOD import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightMethod @@ -20,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.light.classes.symbol.classes.* import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.DataClassResolver import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS @@ -121,6 +123,7 @@ internal class FirLightClassForSymbol( addMethodsFromCompanionIfNeeded(result) addMethodsFromDataClass(result) + addDelegatesToInterfaceMethods(result) result } @@ -183,6 +186,35 @@ internal class FirLightClassForSymbol( private val Name.isFromAny: Boolean get() = this == EQUALS || this == HASHCODE_NAME || this == TO_STRING + private fun addDelegatesToInterfaceMethods(result: MutableList) { + + fun createDelegateMethod(ktFunctionSymbol: KtFunctionSymbol) { + val kotlinOrigin = ktFunctionSymbol.psi as? KtDeclaration ?: kotlinOrigin!! + val lightMemberOrigin = LightMemberOriginForDeclaration(kotlinOrigin, JvmDeclarationOriginKind.DELEGATION) + result.add( + FirLightSimpleMethodForSymbol( + functionSymbol = ktFunctionSymbol, + lightMemberOrigin = lightMemberOrigin, + containingClass = this, + isTopLevel = false, + methodIndex = METHOD_INDEX_FOR_NON_ORIGIN_METHOD, + suppressStatic = false + ) + ) + } + + analyzeWithSymbolAsContext(classOrObjectSymbol) { + // NB: delegated members are not available at _declared_ member scope. + // Thus, use member scope to get "all" callable members, including members from (interface) supertypes, + // and accept fake overrides with delegated origin to create delegate methods. + classOrObjectSymbol.getMemberScope().getCallableSymbols().forEach { functionSymbol -> + if (functionSymbol is KtFunctionSymbol && functionSymbol.origin == KtSymbolOrigin.DELEGATED) { + createDelegateMethod(functionSymbol) + } + } + } + } + private val _ownFields: List by lazyPub { val result = mutableListOf() diff --git a/compiler/testData/asJava/lightClasses/DelegatedNested.kt b/compiler/testData/asJava/lightClasses/DelegatedNested.kt index 59b11dc52aa..88fc0bc630a 100644 --- a/compiler/testData/asJava/lightClasses/DelegatedNested.kt +++ b/compiler/testData/asJava/lightClasses/DelegatedNested.kt @@ -12,4 +12,5 @@ interface I { fun f() } -// LAZINESS:NoLaziness \ No newline at end of file +// LAZINESS:NoLaziness +// FIR_COMPARISON diff --git a/compiler/testData/asJava/lightClasses/Delegation.kt b/compiler/testData/asJava/lightClasses/Delegation.kt index 2c1b3d9af0c..c3d4b65bbef 100644 --- a/compiler/testData/asJava/lightClasses/Delegation.kt +++ b/compiler/testData/asJava/lightClasses/Delegation.kt @@ -10,4 +10,5 @@ interface I { fun f() } -// LAZINESS:NoLaziness \ No newline at end of file +// LAZINESS:NoLaziness +// FIR_COMPARISON