FIR: Add two label-related fields to FirContextReceiver

This commit is contained in:
Denis.Zharkov
2022-02-17 18:14:18 +03:00
committed by teamcity
parent 550d24f8c6
commit c595780d83
8 changed files with 24 additions and 11 deletions
@@ -34,7 +34,6 @@ import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.* 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.expressions.impl.FirSingleExpressionBlock
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
import org.jetbrains.kotlin.fir.lightTree.fir.* import org.jetbrains.kotlin.fir.lightTree.fir.*
@@ -2261,14 +2260,20 @@ class DeclarationsConverter(
return receivers.map { contextReceiverElement -> return receivers.map { contextReceiverElement ->
buildContextReceiver { buildContextReceiver {
this.source = contextReceiverElement.toFirSourceElement() this.source = contextReceiverElement.toFirSourceElement()
this.labelName = this.customLabelName =
contextReceiverElement contextReceiverElement
.getChildNodeByType(LABEL_QUALIFIER) .getChildNodeByType(LABEL_QUALIFIER)
?.getChildNodeByType(LABEL) ?.getChildNodeByType(LABEL)
?.getChildNodeByType(IDENTIFIER) ?.getChildNodeByType(IDENTIFIER)
?.getReferencedNameAsName() ?.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) this.typeRef = convertType(it)
} }
} }
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.diagnostics.* import org.jetbrains.kotlin.fir.diagnostics.*
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.* 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.expressions.impl.FirSingleExpressionBlock
import org.jetbrains.kotlin.fir.references.builder.* import org.jetbrains.kotlin.fir.references.builder.*
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
@@ -1028,7 +1027,8 @@ open class RawFirBuilder(
return receivers.map { contextReceiverElement -> return receivers.map { contextReceiverElement ->
buildContextReceiver { buildContextReceiver {
this.source = contextReceiverElement.toFirSourceElement() this.source = contextReceiverElement.toFirSourceElement()
this.labelName = contextReceiverElement.labelNameAsName() this.customLabelName = contextReceiverElement.labelNameAsName()
this.labelNameFromTypeRef = contextReceiverElement.typeReference()?.nameForReceiverLabel()?.let(Name::identifier)
contextReceiverElement.typeReference().convertSafe<FirTypeRef>()?.let { contextReceiverElement.typeReference().convertSafe<FirTypeRef>()?.let {
this.typeRef = it this.typeRef = it
@@ -20,7 +20,8 @@ import org.jetbrains.kotlin.fir.visitors.*
abstract class FirContextReceiver : FirPureAbstractElement(), FirElement { abstract class FirContextReceiver : FirPureAbstractElement(), FirElement {
abstract override val source: KtSourceElement? abstract override val source: KtSourceElement?
abstract val typeRef: FirTypeRef abstract val typeRef: FirTypeRef
abstract val labelName: Name? abstract val customLabelName: Name?
abstract val labelNameFromTypeRef: Name?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitContextReceiver(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitContextReceiver(this, data)
@@ -23,13 +23,15 @@ import org.jetbrains.kotlin.name.Name
class FirContextReceiverBuilder { class FirContextReceiverBuilder {
var source: KtSourceElement? = null var source: KtSourceElement? = null
lateinit var typeRef: FirTypeRef lateinit var typeRef: FirTypeRef
var labelName: Name? = null var customLabelName: Name? = null
var labelNameFromTypeRef: Name? = null
fun build(): FirContextReceiver { fun build(): FirContextReceiver {
return FirContextReceiverImpl( return FirContextReceiverImpl(
source, source,
typeRef, typeRef,
labelName, customLabelName,
labelNameFromTypeRef,
) )
} }
@@ -19,7 +19,8 @@ import org.jetbrains.kotlin.fir.visitors.*
internal class FirContextReceiverImpl( internal class FirContextReceiverImpl(
override val source: KtSourceElement?, override val source: KtSourceElement?,
override var typeRef: FirTypeRef, override var typeRef: FirTypeRef,
override val labelName: Name?, override val customLabelName: Name?,
override val labelNameFromTypeRef: Name?,
) : FirContextReceiver() { ) : FirContextReceiver() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeRef.accept(visitor, data) typeRef.accept(visitor, data)
@@ -280,7 +280,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
} }
override fun visitContextReceiver(contextReceiver: FirContextReceiver) { override fun visitContextReceiver(contextReceiver: FirContextReceiver) {
contextReceiver.labelName?.let { contextReceiver.customLabelName?.let {
print(it.asString() + "@") print(it.asString() + "@")
} }
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.KtPsiSourceElement
import org.jetbrains.kotlin.KtRealPsiSourceElement import org.jetbrains.kotlin.KtRealPsiSourceElement
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirExpression 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.builder.*
import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
fun ModuleInfo.dependenciesWithoutSelf(): Sequence<ModuleInfo> = dependencies().asSequence().filter { it != this } fun ModuleInfo.dependenciesWithoutSelf(): Sequence<ModuleInfo> = 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.resolved: FirResolvedNamedReference? get() = this as? FirResolvedNamedReference
val FirReference.resolvedSymbol: FirBasedSymbol<*>? get() = resolved?.resolvedSymbol val FirReference.resolvedSymbol: FirBasedSymbol<*>? get() = resolved?.resolvedSymbol
val FirContextReceiver.labelName: Name? get() = customLabelName ?: labelNameFromTypeRef
@@ -72,7 +72,8 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
contextReceiver.configure { contextReceiver.configure {
+field(typeRef, withReplace = true).withTransform() +field(typeRef, withReplace = true).withTransform()
+field("labelName", nameType, nullable = true) +field("customLabelName", nameType, nullable = true)
+field("labelNameFromTypeRef", nameType, nullable = true)
} }
declaration.configure { declaration.configure {