From 010f1cb634def21b2613dc179d0ed35efd519df8 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 15 Mar 2021 18:24:40 +0100 Subject: [PATCH] FIR IDE: build KtJavaFieldSymbol only for Java fields --- .../fir/declarations/builder/FirFieldBuilder.kt | 2 ++ .../fir/declarations/impl/FirFieldImpl.kt | 3 ++- .../generator/ImplementationConfigurator.kt | 1 + .../frontend/api/fir/KtSymbolByFirBuilder.kt | 17 +++++++++++++---- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFieldBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFieldBuilder.kt index a4e41f30d4e..e2434d5ce6e 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFieldBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFieldBuilder.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.declarations.builder import kotlin.contracts.* +import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder @@ -51,6 +52,7 @@ open class FirFieldBuilder : FirAnnotationContainerBuilder { open var containerSource: DeserializedContainerSource? = null open var dispatchReceiverType: ConeKotlinType? = null + @OptIn(FirImplementationDetail::class) override fun build(): FirField { return FirFieldImpl( source, diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt index 532753588ff..85abdddc5be 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.declarations.impl +import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes @@ -29,7 +30,7 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -internal class FirFieldImpl( +class FirFieldImpl @FirImplementationDetail constructor( override val source: FirSourceElement?, override val session: FirSession, override var resolvePhase: FirResolvePhase, diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index ddede3e0d74..5dae160a747 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -209,6 +209,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() value = "!isVar" withGetter = true } + publicImplementation() defaultNull("delegateFieldSymbol", "receiverTypeRef", "delegate", "getter", "setter", withGetter = true) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt index a8e98ed2aa3..e7555e00bd1 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt @@ -8,11 +8,12 @@ package org.jetbrains.kotlin.idea.frontend.api.fir import com.google.common.collect.MapMaker import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.impl.FirFieldImpl import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.resolve.calls.originalConstructorIfTypeAlias +import org.jetbrains.kotlin.fir.java.declarations.FirJavaField import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.fir.resolve.getSymbolByLookupTag import org.jetbrains.kotlin.fir.resolve.inference.isFunctionalType @@ -236,10 +237,18 @@ internal class KtSymbolByFirBuilder private constructor( } - // todo handle cases fun buildFieldSymbol(fir: FirField): KtFirJavaFieldSymbol { + if (!fir.isJavaFieldOrSubstitutionOverrideOfJavaField()) { + error("Could not build symbol for non-Java field symbol") + } return symbolsCache.cache(fir) { KtFirJavaFieldSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } } + + private fun FirField.isJavaFieldOrSubstitutionOverrideOfJavaField(): Boolean = when (this) { + is FirJavaField -> true + is FirFieldImpl -> (this as FirField).originalForSubstitutionOverride?.isJavaFieldOrSubstitutionOverrideOfJavaField() == true + else -> throwUnexpectedElementError(this) + } } inner class CallableSymbolBuilder { @@ -309,7 +318,7 @@ internal class KtSymbolByFirBuilder private constructor( } } - + companion object { private fun throwUnexpectedElementError(element: Any): Nothing { error("Unexpected ${element::class.simpleName}")