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.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)
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -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
|
||||||
|
|||||||
+2
-1
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user