From c595780d83f3fb0987c4e83cbd67440a93c259c9 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Thu, 17 Feb 2022 18:14:18 +0300 Subject: [PATCH] FIR: Add two label-related fields to FirContextReceiver --- .../fir/lightTree/converter/DeclarationsConverter.kt | 11 ++++++++--- .../org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt | 4 ++-- .../kotlin/fir/declarations/FirContextReceiver.kt | 3 ++- .../declarations/builder/FirContextReceiverBuilder.kt | 6 ++++-- .../fir/declarations/impl/FirContextReceiverImpl.kt | 3 ++- .../tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt | 2 +- .../fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt | 3 +++ .../kotlin/fir/tree/generator/NodeConfigurator.kt | 3 ++- 8 files changed, 24 insertions(+), 11 deletions(-) diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index aea2060fb83..9a86e742754 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -34,7 +34,6 @@ import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.* -import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyAnnotationArgumentMapping import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.lightTree.fir.* @@ -2261,14 +2260,20 @@ class DeclarationsConverter( return receivers.map { contextReceiverElement -> buildContextReceiver { this.source = contextReceiverElement.toFirSourceElement() - this.labelName = + this.customLabelName = contextReceiverElement .getChildNodeByType(LABEL_QUALIFIER) ?.getChildNodeByType(LABEL) ?.getChildNodeByType(IDENTIFIER) ?.getReferencedNameAsName() - contextReceiverElement.getChildNodeByType(TYPE_REFERENCE)?.let { + val typeReference = contextReceiverElement.getChildNodeByType(TYPE_REFERENCE) + + this.labelNameFromTypeRef = typeReference?.getChildNodeByType(USER_TYPE) + ?.getChildNodeByType(REFERENCE_EXPRESSION) + ?.getReferencedNameAsName() + + typeReference?.let { this.typeRef = convertType(it) } } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index a0c35c91ae9..978fad28ed1 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -25,7 +25,6 @@ import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.diagnostics.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.* -import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyAnnotationArgumentMapping import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock import org.jetbrains.kotlin.fir.references.builder.* import org.jetbrains.kotlin.fir.scopes.FirScopeProvider @@ -1028,7 +1027,8 @@ open class RawFirBuilder( return receivers.map { contextReceiverElement -> buildContextReceiver { this.source = contextReceiverElement.toFirSourceElement() - this.labelName = contextReceiverElement.labelNameAsName() + this.customLabelName = contextReceiverElement.labelNameAsName() + this.labelNameFromTypeRef = contextReceiverElement.typeReference()?.nameForReceiverLabel()?.let(Name::identifier) contextReceiverElement.typeReference().convertSafe()?.let { this.typeRef = it diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirContextReceiver.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirContextReceiver.kt index abc64103094..78c0a750722 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirContextReceiver.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirContextReceiver.kt @@ -20,7 +20,8 @@ import org.jetbrains.kotlin.fir.visitors.* abstract class FirContextReceiver : FirPureAbstractElement(), FirElement { abstract override val source: KtSourceElement? abstract val typeRef: FirTypeRef - abstract val labelName: Name? + abstract val customLabelName: Name? + abstract val labelNameFromTypeRef: Name? override fun accept(visitor: FirVisitor, data: D): R = visitor.visitContextReceiver(this, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirContextReceiverBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirContextReceiverBuilder.kt index 249cf2f8142..e13c3a037a5 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirContextReceiverBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirContextReceiverBuilder.kt @@ -23,13 +23,15 @@ import org.jetbrains.kotlin.name.Name class FirContextReceiverBuilder { var source: KtSourceElement? = null lateinit var typeRef: FirTypeRef - var labelName: Name? = null + var customLabelName: Name? = null + var labelNameFromTypeRef: Name? = null fun build(): FirContextReceiver { return FirContextReceiverImpl( source, typeRef, - labelName, + customLabelName, + labelNameFromTypeRef, ) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirContextReceiverImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirContextReceiverImpl.kt index b3dbbfd8d25..4e921676aa0 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirContextReceiverImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirContextReceiverImpl.kt @@ -19,7 +19,8 @@ import org.jetbrains.kotlin.fir.visitors.* internal class FirContextReceiverImpl( override val source: KtSourceElement?, override var typeRef: FirTypeRef, - override val labelName: Name?, + override val customLabelName: Name?, + override val labelNameFromTypeRef: Name?, ) : FirContextReceiver() { override fun acceptChildren(visitor: FirVisitor, data: D) { typeRef.accept(visitor, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 219883a3a1c..e36956baf04 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -280,7 +280,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode = } override fun visitContextReceiver(contextReceiver: FirContextReceiver) { - contextReceiver.labelName?.let { + contextReceiver.customLabelName?.let { print(it.asString() + "@") } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt index 58e449e83cf..e8e5dff1145 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.KtPsiSourceElement import org.jetbrains.kotlin.KtRealPsiSourceElement import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.fakeElement +import org.jetbrains.kotlin.fir.declarations.FirContextReceiver import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirExpression @@ -21,6 +22,7 @@ import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.* import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name fun ModuleInfo.dependenciesWithoutSelf(): Sequence = dependencies().asSequence().filter { it != this } @@ -78,3 +80,4 @@ val FirElement.realPsi: PsiElement? get() = (source as? KtRealPsiSourceElement)? val FirReference.resolved: FirResolvedNamedReference? get() = this as? FirResolvedNamedReference val FirReference.resolvedSymbol: FirBasedSymbol<*>? get() = resolved?.resolvedSymbol +val FirContextReceiver.labelName: Name? get() = customLabelName ?: labelNameFromTypeRef diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index ffd94ce0368..1da5a337229 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -72,7 +72,8 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild contextReceiver.configure { +field(typeRef, withReplace = true).withTransform() - +field("labelName", nameType, nullable = true) + +field("customLabelName", nameType, nullable = true) + +field("labelNameFromTypeRef", nameType, nullable = true) } declaration.configure {