[FIR] Use builder to create synthetic properties

This commit is contained in:
Mikhail Glukhikh
2020-02-10 12:32:27 +03:00
parent 9a80850700
commit d19d52292e
6 changed files with 61 additions and 34 deletions
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.* import org.jetbrains.kotlin.fir.declarations.impl.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
import org.jetbrains.kotlin.fir.expressions.FirConstKind import org.jetbrains.kotlin.fir.expressions.FirConstKind
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
@@ -110,11 +111,12 @@ class JavaClassEnhancementScope(
val enhancedFunctionSymbol = enhanceMethod( val enhancedFunctionSymbol = enhanceMethod(
firElement.getter.delegate, accessorSymbol.accessorId, accessorSymbol.accessorId.callableName firElement.getter.delegate, accessorSymbol.accessorId, accessorSymbol.accessorId.callableName
) )
val enhancedProperty = FirSyntheticProperty( return buildSyntheticProperty {
session, name, FirAccessorSymbol(accessorSymbol.callableId, accessorSymbol.accessorId), session = this@JavaClassEnhancementScope.session
enhancedFunctionSymbol.fir as FirSimpleFunction this.name = name
) symbol = FirAccessorSymbol(accessorSymbol.callableId, accessorSymbol.accessorId)
return enhancedProperty.symbol delegateGetter = enhancedFunctionSymbol.fir as FirSimpleFunction
}.symbol
} }
else -> { else -> {
if (original is FirPropertySymbol || original is FirAccessorSymbol) return original if (original is FirPropertySymbol || original is FirAccessorSymbol) return original
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirValueParameterBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirValueParameterBuilder
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
import org.jetbrains.kotlin.fir.java.declarations.* import org.jetbrains.kotlin.fir.java.declarations.*
@@ -66,15 +67,15 @@ class JavaClassUseSiteMemberScope(
} }
} }
overrideCandidates += functionSymbol overrideCandidates += functionSymbol
val accessorProperty = FirSyntheticProperty( return buildSyntheticProperty {
session, syntheticPropertyName, session = this@JavaClassUseSiteMemberScope.session
name = syntheticPropertyName
symbol = FirAccessorSymbol( symbol = FirAccessorSymbol(
accessorId = functionSymbol.callableId, accessorId = functionSymbol.callableId,
callableId = CallableId(functionSymbol.callableId.packageName, functionSymbol.callableId.className, syntheticPropertyName) callableId = CallableId(functionSymbol.callableId.packageName, functionSymbol.callableId.className, syntheticPropertyName)
), )
delegateGetter = fir delegateGetter = fir
) }.symbol
return accessorProperty.symbol
} }
private fun processAccessorFunctionsAndPropertiesByName( private fun processAccessorFunctionsAndPropertiesByName(
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.isStatic import org.jetbrains.kotlin.fir.declarations.isStatic
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.StandardClassIds
@@ -65,15 +66,16 @@ class FirSyntheticPropertiesScope(
}) })
} }
val property = FirSyntheticProperty( val property = buildSyntheticProperty {
session, propertyName, session = this@FirSyntheticPropertiesScope.session
name = propertyName
symbol = SyntheticPropertySymbol( symbol = SyntheticPropertySymbol(
accessorId = getterSymbol.callableId, accessorId = getterSymbol.callableId,
callableId = CallableId(getterSymbol.callableId.packageName, getterSymbol.callableId.className, propertyName) callableId = CallableId(getterSymbol.callableId.packageName, getterSymbol.callableId.className, propertyName)
), )
delegateGetter = getter, delegateGetter = getter
delegateSetter = matchingSetter delegateSetter = matchingSetter
) }
processor(property.symbol) processor(property.symbol)
} }
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
@@ -333,10 +334,12 @@ class FirClassSubstitutionScope(
val function = createFakeOverrideFunction( val function = createFakeOverrideFunction(
functionSymbol, session, baseProperty.getter.delegate, null, newReturnType, newParameterTypes functionSymbol, session, baseProperty.getter.delegate, null, newReturnType, newParameterTypes
) )
val property = FirSyntheticProperty( return buildSyntheticProperty {
session, baseProperty.name, FirAccessorSymbol(baseSymbol.callableId, baseSymbol.accessorId), function this.session = session
) name = baseProperty.name
return property.symbol symbol = FirAccessorSymbol(baseSymbol.callableId, baseSymbol.accessorId)
delegateGetter = function
}.symbol
} }
} }
} }
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
class FirSyntheticProperty private constructor( class FirSyntheticProperty(
override val session: FirSession, override val session: FirSession,
override val returnTypeRef: FirTypeRef, override val returnTypeRef: FirTypeRef,
override val name: Name, override val name: Name,
@@ -37,20 +37,6 @@ class FirSyntheticProperty private constructor(
symbol.bind(this) symbol.bind(this)
} }
constructor(
session: FirSession,
name: Name,
symbol: FirAccessorSymbol,
delegateGetter: FirSimpleFunction,
delegateSetter: FirSimpleFunction? = null
) : this(
session, delegateGetter.returnTypeRef, name, isVar = delegateSetter != null, symbol = symbol,
status = FirDeclarationStatusImpl(delegateGetter.visibility, delegateGetter.modality),
resolvePhase = delegateGetter.resolvePhase,
getter = FirSyntheticPropertyAccessor(delegateGetter, isGetter = true),
setter = delegateSetter?.let { FirSyntheticPropertyAccessor(it, isGetter = false) }
)
override val source: FirSourceElement? override val source: FirSourceElement?
get() = null get() = null
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2020 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.synthetic
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.modality
import org.jetbrains.kotlin.fir.declarations.visibility
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
import org.jetbrains.kotlin.name.Name
class FirSyntheticPropertyBuilder {
lateinit var session: FirSession
lateinit var name: Name
lateinit var symbol: FirAccessorSymbol
lateinit var delegateGetter: FirSimpleFunction
var delegateSetter: FirSimpleFunction? = null
fun build(): FirSyntheticProperty = FirSyntheticProperty(
session, delegateGetter.returnTypeRef, name, isVar = delegateSetter != null, symbol = symbol,
status = FirDeclarationStatusImpl(delegateGetter.visibility, delegateGetter.modality),
resolvePhase = delegateGetter.resolvePhase,
getter = FirSyntheticPropertyAccessor(delegateGetter, isGetter = true),
setter = delegateSetter?.let { FirSyntheticPropertyAccessor(it, isGetter = false) }
)
}
fun buildSyntheticProperty(f: FirSyntheticPropertyBuilder.() -> Unit): FirSyntheticProperty =
FirSyntheticPropertyBuilder().apply { f() }.build()