FIR: Add two label-related fields to FirContextReceiver
This commit is contained in:
+8
-3
@@ -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)
|
||||
|
||||
|
||||
+4
-2
@@ -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,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
+2
-1
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user