From f339748f5bc3c99ba50cc581e1664ccc6af2a840 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 11 Mar 2021 20:48:19 +0100 Subject: [PATCH] FIR IDE: fix origin of synthetic functional interfaces ^KT-45312 fixed --- .../impl/FirBuiltinSymbolProvider.kt | 10 +-- .../frontend/api/fir/symbols/KtFirSymbol.kt | 11 --- .../memberScopeByFqName/kotlin.Function2.txt | 86 +++++++++++++++++++ .../MemberScopeByFqNameTestGenerated.java | 5 ++ 4 files changed, 96 insertions(+), 16 deletions(-) create mode 100644 idea/idea-frontend-fir/testData/memberScopeByFqName/kotlin.Function2.txt diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt index 8e722b9cbf2..c12a86a7f04 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt @@ -90,7 +90,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot FirRegularClassSymbol(this).apply symbol@{ buildRegularClass klass@{ session = this@FirBuiltinSymbolProvider.session - origin = FirDeclarationOrigin.Synthetic + origin = FirDeclarationOrigin.BuiltIns name = relativeClassName.shortName() status = FirResolvedDeclarationStatusImpl( Visibilities.Public, @@ -112,7 +112,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot buildTypeParameter { session = this@FirBuiltinSymbolProvider.session resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES - origin = FirDeclarationOrigin.Synthetic + origin = FirDeclarationOrigin.BuiltIns name = Name.identifier("P$it") symbol = FirTypeParameterSymbol() variance = Variance.IN_VARIANCE @@ -125,7 +125,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot buildTypeParameter { session = this@FirBuiltinSymbolProvider.session resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES - origin = FirDeclarationOrigin.Synthetic + origin = FirDeclarationOrigin.BuiltIns name = Name.identifier("R") symbol = FirTypeParameterSymbol() variance = Variance.OUT_VARIANCE @@ -200,7 +200,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot buildSimpleFunction { session = this@FirBuiltinSymbolProvider.session resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES - origin = FirDeclarationOrigin.Synthetic + origin = FirDeclarationOrigin.BuiltIns returnTypeRef = typeArguments.last() this.name = name status = functionStatus @@ -212,7 +212,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot val parameterName = Name.identifier("p${index + 1}") buildValueParameter { session = this@FirBuiltinSymbolProvider.session - origin = FirDeclarationOrigin.Synthetic + origin = FirDeclarationOrigin.BuiltIns resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES returnTypeRef = typeArgument this.name = parameterName diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbol.kt index 14498662260..451a55ffd46 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbol.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols -import org.jetbrains.kotlin.builtins.functions.FunctionClassKind import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty @@ -15,7 +14,6 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbolOrigin -import org.jetbrains.kotlin.name.ClassId internal interface KtFirSymbol : KtSymbol, ValidityTokenOwner { val firRef: FirRefWithValidityCheck @@ -40,7 +38,6 @@ private tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (orig FirDeclarationOrigin.Delegated -> KtSymbolOrigin.DELEGATED FirDeclarationOrigin.Synthetic -> { when { - isSyntheticFunctionalInterface() -> KtSymbolOrigin.LIBRARY this is FirSyntheticProperty -> KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY else -> throw InvalidFirDeclarationOriginForSymbol(this) } @@ -53,14 +50,6 @@ private tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (orig } } -private fun FirDeclaration.isSyntheticFunctionalInterface(): Boolean { - if (this !is FirRegularClass) return false - return classId.isSyntheticFunctionalInterface() -} - -private fun ClassId.isSyntheticFunctionalInterface(): Boolean { - return FunctionClassKind.byClassNamePrefix(packageFqName, relativeClassName.asString()) != null -} class InvalidFirDeclarationOriginForSymbol(declaration: FirDeclaration) : IllegalStateException("Invalid FirDeclarationOrigin ${declaration.origin::class.simpleName} for ${declaration.render()}") diff --git a/idea/idea-frontend-fir/testData/memberScopeByFqName/kotlin.Function2.txt b/idea/idea-frontend-fir/testData/memberScopeByFqName/kotlin.Function2.txt new file mode 100644 index 00000000000..f1084d4b380 --- /dev/null +++ b/idea/idea-frontend-fir/testData/memberScopeByFqName/kotlin.Function2.txt @@ -0,0 +1,86 @@ +class: kotlin/Function2 + +// SYMBOLS: +KtFirFunctionSymbol: + annotatedType: [] R + annotationClassIds: [] + annotations: [] + callableIdIfNonLocal: kotlin.Function2.invoke + dispatchType: kotlin/Function2 + isExtension: false + isExternal: false + isInline: false + isOperator: true + isOverride: false + isSuspend: false + modality: ABSTRACT + name: invoke + origin: LIBRARY + receiverType: null + symbolKind: MEMBER + typeParameters: [] + valueParameters: [KtFirFunctionValueParameterSymbol(p1), KtFirFunctionValueParameterSymbol(p2)] + visibility: PUBLIC + +KtFirFunctionSymbol: + annotatedType: [] kotlin/Boolean + annotationClassIds: [] + annotations: [] + callableIdIfNonLocal: kotlin.Any.equals + dispatchType: kotlin/Any + isExtension: false + isExternal: false + isInline: false + isOperator: true + isOverride: false + isSuspend: false + modality: OPEN + name: equals + origin: LIBRARY + receiverType: null + symbolKind: MEMBER + typeParameters: [] + valueParameters: [KtFirFunctionValueParameterSymbol(other)] + visibility: PUBLIC + +KtFirFunctionSymbol: + annotatedType: [] kotlin/Int + annotationClassIds: [] + annotations: [] + callableIdIfNonLocal: kotlin.Any.hashCode + dispatchType: kotlin/Any + isExtension: false + isExternal: false + isInline: false + isOperator: false + isOverride: false + isSuspend: false + modality: OPEN + name: hashCode + origin: LIBRARY + receiverType: null + symbolKind: MEMBER + typeParameters: [] + valueParameters: [] + visibility: PUBLIC + +KtFirFunctionSymbol: + annotatedType: [] kotlin/String + annotationClassIds: [] + annotations: [] + callableIdIfNonLocal: kotlin.Any.toString + dispatchType: kotlin/Any + isExtension: false + isExternal: false + isInline: false + isOperator: false + isOverride: false + isSuspend: false + modality: OPEN + name: toString + origin: LIBRARY + receiverType: null + symbolKind: MEMBER + typeParameters: [] + valueParameters: [] + visibility: PUBLIC diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/scopes/MemberScopeByFqNameTestGenerated.java b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/scopes/MemberScopeByFqNameTestGenerated.java index 5dd71740025..6838f1c779b 100644 --- a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/scopes/MemberScopeByFqNameTestGenerated.java +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/scopes/MemberScopeByFqNameTestGenerated.java @@ -39,6 +39,11 @@ public class MemberScopeByFqNameTestGenerated extends AbstractMemberScopeByFqNam runTest("idea/idea-frontend-fir/testData/memberScopeByFqName/java.lang.String.txt"); } + @TestMetadata("kotlin.Function2.txt") + public void testKotlin_Function2() throws Exception { + runTest("idea/idea-frontend-fir/testData/memberScopeByFqName/kotlin.Function2.txt"); + } + @TestMetadata("MutableList.txt") public void testMutableList() throws Exception { runTest("idea/idea-frontend-fir/testData/memberScopeByFqName/MutableList.txt");