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.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)
}
}
@@ -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<FirTypeRef>()?.let {
this.typeRef = it
@@ -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 <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 {
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,
)
}
@@ -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 <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeRef.accept(visitor, data)
@@ -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() + "@")
}
@@ -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<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.resolvedSymbol: FirBasedSymbol<*>? get() = resolved?.resolvedSymbol
val FirContextReceiver.labelName: Name? get() = customLabelName ?: labelNameFromTypeRef
@@ -72,7 +72,8 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(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 {