From a6f8859a49eb70e92222280b437bf4de730b58c2 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 29 Nov 2019 16:47:52 +0300 Subject: [PATCH] FIR Java: generate accessors only in override Kotlin case, make them non-synthetic --- .../scopes/JavaClassUseSiteMemberScope.kt | 36 ++++++++++--------- .../kotlin/fir/resolve/calls/Synthetics.kt | 2 +- .../testData/resolve/stdlib/j+k/MapEntry.txt | 4 +-- .../kotlin/fir/symbols/SyntheticSymbol.kt | 2 +- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index 864615d4f99..ba5e22dfa94 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -53,24 +53,23 @@ class JavaClassUseSiteMemberScope( } } - private fun processAccessorFunction( + private fun generateAccessorSymbol( functionSymbol: FirFunctionSymbol<*>, syntheticPropertyName: Name, overrideCandidates: MutableSet>, - processor: (FirCallableSymbol<*>) -> ProcessorAction, isGetter: Boolean - ): ProcessorAction { + ): FirAccessorSymbol? { if (functionSymbol is FirNamedFunctionSymbol) { val fir = functionSymbol.fir if (fir.isStatic) { - return NEXT + return null } when (isGetter) { true -> if (fir.valueParameters.isNotEmpty()) { - return NEXT + return null } false -> if (fir.valueParameters.size != 1) { - return NEXT + return null } } } @@ -82,7 +81,7 @@ class JavaClassUseSiteMemberScope( if (functionSymbol is FirNamedFunctionSymbol) { functionSymbol.fir.let { callableMember -> accessorSymbol.bind(callableMember) } } - return processor(accessorSymbol) + return accessorSymbol } private fun processAccessorFunctionsAndPropertiesByName( @@ -100,10 +99,16 @@ class JavaClassUseSiteMemberScope( ) return STOP if (klass is FirJavaClass) { for (getterName in getterNames) { - if (!declaredMemberScope.processFunctionsByName(getterName) { functionSymbol -> - processAccessorFunction(functionSymbol, propertyName, overrideCandidates, processor, isGetter = true) + declaredMemberScope.processFunctionsByName(getterName) { functionSymbol -> + val accessorSymbol = generateAccessorSymbol( + functionSymbol, propertyName, overrideCandidates, isGetter = true + ) + if (accessorSymbol != null) { + // NB: accessor should not be processed directly unless we find matching property symbol in supertype + overrideCandidates += accessorSymbol } - ) return STOP + NEXT + } } } @@ -112,11 +117,10 @@ class JavaClassUseSiteMemberScope( if (firCallableMember?.isStatic == true) { processor(it) } else { - val overriddenBy = it.getOverridden(overrideCandidates) - if (overriddenBy == null) { - processor(it) - } else { - NEXT + when (val overriddenBy = it.getOverridden(overrideCandidates)) { + null -> processor(it) + is FirAccessorSymbol -> processor(overriddenBy) + else -> NEXT } } } @@ -149,7 +153,7 @@ class JavaClassUseSiteMemberScope( override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction { // Do not generate accessors at all? - if (true) { + if (name.isSpecial) { return processAccessorFunctionsAndPropertiesByName(name, emptyList(), null, processor) } val getterNames = FirSyntheticPropertiesScope.possibleGetterNamesByPropertyName(name) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt index a9044e6202b..81dfcf85b99 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeFirstWord class SyntheticPropertySymbol( callableId: CallableId, override val accessorId: CallableId -) : FirNamedFunctionSymbol(callableId), AccessorSymbol +) : FirNamedFunctionSymbol(callableId), AccessorSymbol, SyntheticSymbol class FirSyntheticFunctionSymbol( callableId: CallableId diff --git a/compiler/fir/resolve/testData/resolve/stdlib/j+k/MapEntry.txt b/compiler/fir/resolve/testData/resolve/stdlib/j+k/MapEntry.txt index e8e6310b102..61f54feae89 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/j+k/MapEntry.txt +++ b/compiler/fir/resolve/testData/resolve/stdlib/j+k/MapEntry.txt @@ -7,7 +7,7 @@ FILE: main.kt } public final fun test(): R|kotlin/Unit| { lval b: R|MyMapEntry| = R|/MyMapEntry.MyMapEntry|() - R|/b|.R|FakeOverride| - R|/b|.R|FakeOverride| + R|/b|.R|/Test.MapEntryImpl.key| + R|/b|.R|/Test.MapEntryImpl.value| R|/b|.R|/Test.MapEntryImpl.setValue|(Null(null)) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/SyntheticSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/SyntheticSymbol.kt index d29c788f60a..68c18461618 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/SyntheticSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/SyntheticSymbol.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.symbols interface SyntheticSymbol -interface AccessorSymbol : SyntheticSymbol { +interface AccessorSymbol { val callableId: CallableId // it's an id of related property (synthetic or not) val accessorId: CallableId // it's an id of accessor function } \ No newline at end of file