From cdb2bb2b45d8e1ef5d1108f19fa408b212815bab Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 10 Oct 2019 18:36:48 +0300 Subject: [PATCH] FIR: Prepare tree for callable references resolution ^KT-32725 In Progress --- .../converter/ExpressionsConverter.kt | 6 ++-- .../expressions/FirCallableReferenceAccess.kt | 4 +-- .../impl/FirCallableReferenceAccessImpl.kt | 4 +-- .../FirResolvedRealCallableReference.kt | 27 +++++++++++++++ .../FirResolvedRealCallableReferenceImpl.kt | 34 +++++++++++++++++++ .../kotlin/fir/visitors/FirTransformer.kt | 9 +++++ .../kotlin/fir/visitors/FirVisitor.kt | 3 ++ .../kotlin/fir/visitors/FirVisitorVoid.kt | 9 +++++ .../fir/tree/generator/FirTreeBuilder.kt | 4 ++- .../generator/ImplementationConfigurator.kt | 6 +++- .../fir/tree/generator/NodeConfigurator.kt | 8 +++++ 11 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirResolvedRealCallableReference.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/impl/FirResolvedRealCallableReferenceImpl.kt diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index 173493b583e..37db15c0c10 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -27,7 +27,7 @@ import org.jetbrains.kotlin.fir.impl.FirLabelImpl import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.lightTree.fir.ValueParameter import org.jetbrains.kotlin.fir.lightTree.fir.WhenEntry -import org.jetbrains.kotlin.fir.references.FirErrorNamedReference +import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.references.impl.FirExplicitSuperReference import org.jetbrains.kotlin.fir.references.impl.FirExplicitThisReference @@ -387,7 +387,7 @@ class ExpressionsConverter( } return FirCallableReferenceAccessImpl(null).apply { - calleeReference = firCallableReference.calleeReference + calleeReference = firCallableReference.calleeReference as FirNamedReference explicitReceiver = firReceiverExpression } } @@ -984,4 +984,4 @@ class ExpressionsConverter( else -> firExpression } } -} \ No newline at end of file +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCallableReferenceAccess.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCallableReferenceAccess.kt index b65daa2b939..28c250c81c0 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCallableReferenceAccess.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCallableReferenceAccess.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.fir.expressions import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.* @@ -23,7 +23,7 @@ abstract class FirCallableReferenceAccess : FirQualifiedAccessExpression() { abstract override val explicitReceiver: FirExpression? abstract override val dispatchReceiver: FirExpression abstract override val extensionReceiver: FirExpression - abstract override val calleeReference: FirReference + abstract override val calleeReference: FirNamedReference override fun accept(visitor: FirVisitor, data: D): R = visitor.visitCallableReferenceAccess(this, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt index 34a4aff7200..8c502638cfe 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement -import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl import org.jetbrains.kotlin.fir.visitors.* @@ -29,7 +29,7 @@ class FirCallableReferenceAccessImpl( override var explicitReceiver: FirExpression? = null override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression - override lateinit var calleeReference: FirReference + override lateinit var calleeReference: FirNamedReference override fun acceptChildren(visitor: FirVisitor, data: D) { typeRef.accept(visitor, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirResolvedRealCallableReference.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirResolvedRealCallableReference.kt new file mode 100644 index 00000000000..f55bcb16163 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirResolvedRealCallableReference.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.references + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.visitors.FirVisitor +import org.jetbrains.kotlin.name.Name + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirResolvedRealCallableReference : FirResolvedCallableReference() { + abstract override val psi: PsiElement? + abstract override val name: Name + abstract override val candidateSymbol: AbstractFirBasedSymbol<*>? + abstract override val resolvedSymbol: AbstractFirBasedSymbol<*> + abstract val inferredTypeArguments: List + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitResolvedRealCallableReference(this, data) +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/impl/FirResolvedRealCallableReferenceImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/impl/FirResolvedRealCallableReferenceImpl.kt new file mode 100644 index 00000000000..45513337250 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/impl/FirResolvedRealCallableReferenceImpl.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.references.impl + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.references.FirResolvedRealCallableReference +import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.FirVisitor +import org.jetbrains.kotlin.name.Name + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +class FirResolvedRealCallableReferenceImpl( + override val psi: PsiElement?, + override val name: Name, + override val resolvedSymbol: AbstractFirBasedSymbol<*> +) : FirResolvedRealCallableReference() { + override val candidateSymbol: AbstractFirBasedSymbol<*>? get() = null + override val inferredTypeArguments: MutableList = mutableListOf() + + override fun acceptChildren(visitor: FirVisitor, data: D) {} + + override fun transformChildren(transformer: FirTransformer, data: D): FirResolvedRealCallableReferenceImpl { + return this + } +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index f4117b4dc07..f5e78c24e2c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -103,6 +103,7 @@ import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference +import org.jetbrains.kotlin.fir.references.FirResolvedRealCallableReference import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirErrorTypeRef import org.jetbrains.kotlin.fir.types.FirDelegatedTypeRef @@ -511,6 +512,10 @@ abstract class FirTransformer : FirVisitor { + return transformElement(resolvedRealCallableReference, data) + } + open fun transformResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: D): CompositeTransformResult { return transformElement(resolvedTypeRef, data) } @@ -939,6 +944,10 @@ abstract class FirTransformer : FirVisitor { + return transformResolvedRealCallableReference(resolvedRealCallableReference, data) + } + final override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: D): CompositeTransformResult { return transformResolvedTypeRef(resolvedTypeRef, data) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index c2710981696..dca850a0de4 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -103,6 +103,7 @@ import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference +import org.jetbrains.kotlin.fir.references.FirResolvedRealCallableReference import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirErrorTypeRef import org.jetbrains.kotlin.fir.types.FirDelegatedTypeRef @@ -315,6 +316,8 @@ abstract class FirVisitor { open fun visitBackingFieldReference(backingFieldReference: FirBackingFieldReference, data: D): R = visitElement(backingFieldReference, data) + open fun visitResolvedRealCallableReference(resolvedRealCallableReference: FirResolvedRealCallableReference, data: D): R = visitElement(resolvedRealCallableReference, data) + open fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: D): R = visitElement(resolvedTypeRef, data) open fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: D): R = visitElement(errorTypeRef, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index f6b61e819de..32ce8de2d4a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -103,6 +103,7 @@ import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference +import org.jetbrains.kotlin.fir.references.FirResolvedRealCallableReference import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirErrorTypeRef import org.jetbrains.kotlin.fir.types.FirDelegatedTypeRef @@ -509,6 +510,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(backingFieldReference) } + open fun visitResolvedRealCallableReference(resolvedRealCallableReference: FirResolvedRealCallableReference) { + visitElement(resolvedRealCallableReference) + } + open fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef) { visitElement(resolvedTypeRef) } @@ -937,6 +942,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitBackingFieldReference(backingFieldReference) } + final override fun visitResolvedRealCallableReference(resolvedRealCallableReference: FirResolvedRealCallableReference, data: Nothing?) { + visitResolvedRealCallableReference(resolvedRealCallableReference) + } + final override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: Nothing?) { visitResolvedTypeRef(resolvedTypeRef) } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index d03af937cfe..a2cc06511fb 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -121,6 +121,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val delegateFieldReference = element("DelegateFieldReference", Reference, resolvedCallableReference) val backingFieldReference = element("BackingFieldReference", Reference, resolvedCallableReference) + val resolvedRealCallableReference = element("ResolvedRealCallableReference", Reference, resolvedCallableReference) + val resolvedTypeRef = element("ResolvedTypeRef", TypeRef, typeRef) val errorTypeRef = element("ErrorTypeRef", TypeRef, resolvedTypeRef) val delegatedTypeRef = element("DelegatedTypeRef", TypeRef, typeRef) @@ -130,4 +132,4 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val functionTypeRef = element("FunctionTypeRef", TypeRef, typeRefWithNullability) val resolvedFunctionTypeRef = element("ResolvedFunctionTypeRef", TypeRef, resolvedTypeRef, functionTypeRef) val implicitTypeRef = element("ImplicitTypeRef", TypeRef, typeRef) -} \ No newline at end of file +} diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 6d37e7b4599..65bed531285 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -433,6 +433,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() defaultNull("candidateSymbol", withGetter = true) } + impl(resolvedRealCallableReference) { + defaultNull("candidateSymbol", withGetter = true) + } + impl(namedReference, "FirSimpleNamedReference") { kind = OpenClass } @@ -615,4 +619,4 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() it.addParent(abstractAnnotatedElement) } } -} \ No newline at end of file +} 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 593c44a24e9..4d53bd773e6 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 @@ -396,6 +396,10 @@ object NodeConfigurator : AbstractFieldConfigurator() { +field("originalType", typeRef) } + callableReferenceAccess.configure { + +field("calleeReference", namedReference) + } + getClassCall.configure { +field("argument", expression) } @@ -448,6 +452,10 @@ object NodeConfigurator : AbstractFieldConfigurator() { +field("resolvedSymbol", abstractFirBasedSymbolType, "*") } + resolvedRealCallableReference.configure { + +fieldList("inferredTypeArguments", coneKotlinTypeType) + } + delegateFieldReference.configure { +field("resolvedSymbol", delegateFieldSymbolType.withArgs("*")) }