FIR: partial implementation of delegate resolve #KT-32217 Fixed
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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
|
||||
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
interface FirDelegateFieldReference : FirResolvedCallableReference {
|
||||
|
||||
override val name: Name
|
||||
get() = NAME
|
||||
|
||||
override val coneSymbol: FirDelegateFieldSymbol<*>
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
|
||||
visitor.visitDelegateFieldReference(this, data)
|
||||
|
||||
companion object {
|
||||
val NAME = Name.identifier("\$delegate")
|
||||
}
|
||||
}
|
||||
@@ -346,8 +346,8 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
|
||||
visitVariable(property)
|
||||
println()
|
||||
pushIndent()
|
||||
property.getter.accept(this)
|
||||
if (property.getter.body == null) {
|
||||
property.getter?.accept(this)
|
||||
if (property.getter?.body == null) {
|
||||
println()
|
||||
}
|
||||
if (property.isVar) {
|
||||
@@ -804,6 +804,12 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
|
||||
print("|")
|
||||
}
|
||||
|
||||
override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference) {
|
||||
print("D|")
|
||||
print(delegateFieldReference.coneSymbol.callableId)
|
||||
print("|")
|
||||
}
|
||||
|
||||
override fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference) {
|
||||
print("R|")
|
||||
val isFakeOverride = (resolvedCallableReference.coneSymbol as? FirNamedFunctionSymbol)?.isFakeOverride == true
|
||||
|
||||
@@ -23,14 +23,13 @@ interface FirProperty :
|
||||
override val isOverride: Boolean get() = status.isOverride
|
||||
|
||||
// Should it be nullable or have some default?
|
||||
val getter: FirPropertyAccessor
|
||||
override val getter: FirPropertyAccessor?
|
||||
|
||||
val setter: FirPropertyAccessor?
|
||||
override val setter: FirPropertyAccessor?
|
||||
|
||||
// TODO: it should be probably nullable
|
||||
val backingFieldSymbol: FirBackingFieldSymbol
|
||||
|
||||
fun <D> transformChildrenWithoutAccessors(transformer: FirTransformer<D>, data: D)
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
|
||||
visitor.visitProperty(this, data)
|
||||
|
||||
@@ -38,7 +37,7 @@ interface FirProperty :
|
||||
super<FirCallableMemberDeclaration>.acceptChildren(visitor, data)
|
||||
initializer?.accept(visitor, data)
|
||||
delegate?.accept(visitor, data)
|
||||
getter.accept(visitor, data)
|
||||
getter?.accept(visitor, data)
|
||||
setter?.accept(visitor, data)
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.VisitedSupertype
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirVariable
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
|
||||
@BaseTransformedType
|
||||
@@ -24,6 +25,10 @@ interface FirValueParameter : @VisitedSupertype FirDeclaration, FirTypedDeclarat
|
||||
|
||||
override val symbol: FirVariableSymbol<FirValueParameter>
|
||||
|
||||
override fun <D> transformChildrenWithoutAccessors(transformer: FirTransformer<D>, data: D) {
|
||||
transformChildren(transformer, data)
|
||||
}
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
|
||||
visitor.visitValueParameter(this, data)
|
||||
|
||||
|
||||
+3
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
@@ -33,6 +34,8 @@ class FirDefaultSetterValueParameter(
|
||||
get() = null
|
||||
override val receiverTypeRef: FirTypeRef?
|
||||
get() = null
|
||||
override val delegateFieldSymbol: FirDelegateFieldSymbol<FirValueParameter>?
|
||||
get() = null
|
||||
|
||||
override val isCrossinline = false
|
||||
|
||||
|
||||
+12
-4
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.transformInplace
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
@@ -37,17 +38,24 @@ class FirMemberPropertyImpl(
|
||||
returnTypeRef: FirTypeRef,
|
||||
override val isVar: Boolean,
|
||||
override var initializer: FirExpression?,
|
||||
override var getter: FirPropertyAccessor,
|
||||
override var setter: FirPropertyAccessor?,
|
||||
override var delegate: FirExpression?
|
||||
) : FirAbstractCallableMember<FirProperty>(
|
||||
session, psi, name, visibility, modality, isExpect, isActual, isOverride, receiverTypeRef, returnTypeRef
|
||||
), FirProperty {
|
||||
), FirProperty, FirModifiableAccessorsOwner {
|
||||
// TODO: backing field may not exist
|
||||
override val backingFieldSymbol = FirBackingFieldSymbol(symbol.callableId)
|
||||
|
||||
override val delegateFieldSymbol: FirDelegateFieldSymbol<FirProperty>? =
|
||||
delegate?.let { FirDelegateFieldSymbol(symbol.callableId) }
|
||||
|
||||
override var getter: FirPropertyAccessor? = null
|
||||
|
||||
override var setter: FirPropertyAccessor? = null
|
||||
|
||||
init {
|
||||
symbol.bind(this)
|
||||
backingFieldSymbol.bind(this)
|
||||
delegateFieldSymbol?.bind(this)
|
||||
status.isConst = isConst
|
||||
status.isLateInit = isLateInit
|
||||
}
|
||||
@@ -63,7 +71,7 @@ class FirMemberPropertyImpl(
|
||||
}
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
getter = getter.transformSingle(transformer, data)
|
||||
getter = getter?.transformSingle(transformer, data)
|
||||
setter = setter?.transformSingle(transformer, data)
|
||||
transformChildrenWithoutAccessors(transformer, data)
|
||||
// Everything other (annotations, etc.) is done above
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* 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.declarations.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
|
||||
interface FirModifiableAccessorsOwner {
|
||||
var getter: FirPropertyAccessor?
|
||||
|
||||
var setter: FirPropertyAccessor?
|
||||
|
||||
val delegateFieldSymbol: FirDelegateFieldSymbol<*>?
|
||||
}
|
||||
+3
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
@@ -40,6 +41,8 @@ open class FirValueParameterImpl(
|
||||
get() = null
|
||||
override val receiverTypeRef: FirTypeRef?
|
||||
get() = null
|
||||
override val delegateFieldSymbol: FirDelegateFieldSymbol<FirValueParameter>?
|
||||
get() = null
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
returnTypeRef = returnTypeRef.transformSingle(transformer, data)
|
||||
|
||||
+22
-3
@@ -8,9 +8,13 @@ package org.jetbrains.kotlin.fir.declarations.impl
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirVariable
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.transformInplace
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
@@ -25,21 +29,36 @@ class FirVariableImpl(
|
||||
override var initializer: FirExpression?,
|
||||
override val symbol: FirVariableSymbol<FirVariableImpl> = FirVariableSymbol(name),
|
||||
override var delegate: FirExpression? = null
|
||||
) : FirAbstractNamedAnnotatedDeclaration(session, psiElement, name), FirVariable<FirVariableImpl> {
|
||||
) : FirAbstractNamedAnnotatedDeclaration(session, psiElement, name), FirVariable<FirVariableImpl>, FirModifiableAccessorsOwner {
|
||||
|
||||
override val delegateFieldSymbol: FirDelegateFieldSymbol<FirVariableImpl>? =
|
||||
delegate?.let { FirDelegateFieldSymbol(symbol.callableId) }
|
||||
|
||||
override var getter: FirPropertyAccessor? = null
|
||||
|
||||
override var setter: FirPropertyAccessor? = null
|
||||
|
||||
init {
|
||||
symbol.bind(this)
|
||||
delegateFieldSymbol?.bind(this)
|
||||
}
|
||||
|
||||
override val receiverTypeRef: FirTypeRef?
|
||||
get() = null
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
override fun <D> transformChildrenWithoutAccessors(transformer: FirTransformer<D>, data: D) {
|
||||
returnTypeRef = returnTypeRef.transformSingle(transformer, data)
|
||||
initializer = initializer?.transformSingle(transformer, data)
|
||||
delegate = delegate?.transformSingle(transformer, data)
|
||||
annotations.transformInplace(transformer, data)
|
||||
}
|
||||
|
||||
return super<FirAbstractNamedAnnotatedDeclaration>.transformChildren(transformer, data)
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
getter = getter?.transformSingle(transformer, data)
|
||||
setter = setter?.transformSingle(transformer, data)
|
||||
transformChildrenWithoutAccessors(transformer, data)
|
||||
// Everything other (annotations, etc.) is done above
|
||||
return this
|
||||
}
|
||||
|
||||
override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D) {
|
||||
|
||||
@@ -7,7 +7,9 @@ package org.jetbrains.kotlin.fir.expressions
|
||||
|
||||
import org.jetbrains.kotlin.fir.VisitedSupertype
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
|
||||
interface FirVariable<F : FirVariable<F>> :
|
||||
@@ -23,12 +25,22 @@ interface FirVariable<F : FirVariable<F>> :
|
||||
|
||||
override val symbol: FirVariableSymbol<F>
|
||||
|
||||
val getter: FirPropertyAccessor? get() = null
|
||||
|
||||
val setter: FirPropertyAccessor? get() = null
|
||||
|
||||
val delegateFieldSymbol: FirDelegateFieldSymbol<F>?
|
||||
|
||||
fun <D> transformChildrenWithoutAccessors(transformer: FirTransformer<D>, data: D)
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
|
||||
visitor.visitVariable(this, data)
|
||||
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||
initializer?.accept(visitor, data)
|
||||
delegate?.accept(visitor, data)
|
||||
getter?.accept(visitor, data)
|
||||
setter?.accept(visitor, data)
|
||||
super<FirCallableDeclaration>.acceptChildren(visitor, data)
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* 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.FirAbstractElement
|
||||
import org.jetbrains.kotlin.fir.FirDelegateFieldReference
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
|
||||
class FirDelegateFieldReferenceImpl(
|
||||
session: FirSession,
|
||||
psi: PsiElement?,
|
||||
override val coneSymbol: FirDelegateFieldSymbol<*>
|
||||
) : FirAbstractElement(session, psi), FirDelegateFieldReference
|
||||
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.symbols.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.FirField
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirVariable
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
|
||||
@@ -23,4 +24,9 @@ open class FirPropertySymbol(callableId: CallableId) : ConePropertySymbol, FirVa
|
||||
|
||||
class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirProperty>(callableId)
|
||||
|
||||
class FirDelegateFieldSymbol<D : FirVariable<D>>(callableId: CallableId) : FirVariableSymbol<D>(callableId) {
|
||||
val delegate: FirExpression
|
||||
get() = fir.delegate!!
|
||||
}
|
||||
|
||||
class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirField>(callableId)
|
||||
|
||||
+9
-2
@@ -12,18 +12,20 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinTypeProjection
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
sealed class FirImplicitBuiltinTypeRef(
|
||||
session: FirSession,
|
||||
psi: PsiElement?,
|
||||
val id: ClassId
|
||||
val id: ClassId,
|
||||
typeArguments: Array<out ConeKotlinTypeProjection> = emptyArray()
|
||||
) : FirResolvedTypeRef, FirAbstractElement(session, psi) {
|
||||
override val annotations: List<FirAnnotationCall>
|
||||
get() = emptyList()
|
||||
|
||||
override val type: ConeKotlinType = ConeClassTypeImpl(ConeClassLikeLookupTagImpl(id), emptyArray(), false)
|
||||
override val type: ConeKotlinType = ConeClassTypeImpl(ConeClassLikeLookupTagImpl(id), typeArguments, false)
|
||||
}
|
||||
|
||||
class FirImplicitUnitTypeRef(
|
||||
@@ -61,3 +63,8 @@ class FirImplicitStringTypeRef(
|
||||
psi: PsiElement?
|
||||
) : FirImplicitBuiltinTypeRef(session, psi, StandardClassIds.String)
|
||||
|
||||
class FirImplicitKPropertyTypeRef(
|
||||
session: FirSession,
|
||||
psi: PsiElement?,
|
||||
typeArgument: ConeKotlinTypeProjection
|
||||
) : FirImplicitBuiltinTypeRef(session, psi, StandardClassIds.KProperty, arrayOf(typeArgument))
|
||||
+8
@@ -168,6 +168,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
|
||||
return transformResolvedCallableReference(backingFieldReference, data)
|
||||
}
|
||||
|
||||
open fun transformDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): CompositeTransformResult<FirNamedReference> {
|
||||
return transformResolvedCallableReference(delegateFieldReference, data)
|
||||
}
|
||||
|
||||
open fun <E : FirReference> transformSuperReference(superReference: E, data: D): CompositeTransformResult<E> {
|
||||
return transformReference(superReference, data)
|
||||
}
|
||||
@@ -552,6 +556,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
|
||||
return transformDefaultPropertyAccessor(defaultPropertyAccessor, data)
|
||||
}
|
||||
|
||||
final override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): CompositeTransformResult<FirElement> {
|
||||
return transformDelegateFieldReference(delegateFieldReference, data)
|
||||
}
|
||||
|
||||
final override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult<FirElement> {
|
||||
return transformDelegatedConstructorCall(delegatedConstructorCall, data)
|
||||
}
|
||||
|
||||
@@ -168,6 +168,10 @@ abstract class FirVisitor<out R, in D> {
|
||||
return visitResolvedCallableReference(backingFieldReference, data)
|
||||
}
|
||||
|
||||
open fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): R {
|
||||
return visitResolvedCallableReference(delegateFieldReference, data)
|
||||
}
|
||||
|
||||
open fun visitSuperReference(superReference: FirSuperReference, data: D): R {
|
||||
return visitReference(superReference, data)
|
||||
}
|
||||
|
||||
+8
@@ -168,6 +168,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
||||
visitResolvedCallableReference(backingFieldReference, null)
|
||||
}
|
||||
|
||||
open fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference) {
|
||||
visitResolvedCallableReference(delegateFieldReference, null)
|
||||
}
|
||||
|
||||
open fun visitSuperReference(superReference: FirSuperReference) {
|
||||
visitReference(superReference, null)
|
||||
}
|
||||
@@ -552,6 +556,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
||||
visitDefaultPropertyAccessor(defaultPropertyAccessor)
|
||||
}
|
||||
|
||||
final override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: Nothing?) {
|
||||
visitDelegateFieldReference(delegateFieldReference)
|
||||
}
|
||||
|
||||
final override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: Nothing?) {
|
||||
visitDelegatedConstructorCall(delegatedConstructorCall)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user