FIR: Update fir hierarchy, decouple member declaration from callable

This commit is contained in:
Simon Ogorodnik
2019-03-06 17:47:01 +03:00
parent 7b6f4d8ba4
commit 02079bbeb5
31 changed files with 243 additions and 94 deletions
@@ -33,7 +33,9 @@ interface ConeCallableSymbol : ConeSymbol {
val callableId: CallableId
}
interface ConePropertySymbol : ConeCallableSymbol
interface ConePropertySymbol : ConeVariableSymbol
interface ConeVariableSymbol : ConeCallableSymbol
interface ConeFunctionSymbol : ConeCallableSymbol {
val parameters: List<ConeKotlinType>
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.java
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.java.declarations.*
@@ -49,13 +49,13 @@ class JavaSymbolProvider(
is FirConstructor -> {
CallableId(callableId.packageName, callableId.className, firClass.name)
}
is FirCallableMember -> {
is FirCallableMemberDeclaration -> {
CallableId(callableId.packageName, callableId.className, declaration.name)
}
else -> null
}
if (declarationId == callableId) {
val symbol = (declaration as FirCallableMember).symbol as ConeCallableSymbol
val symbol = (declaration as FirCallableMemberDeclaration).symbol as ConeCallableSymbol
callableSymbols += symbol
}
}
@@ -19,13 +19,26 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
class FirJavaConstructor(
session: FirSession,
symbol: FirFunctionSymbol,
override val symbol: FirFunctionSymbol,
visibility: Visibility,
delegatedSelfTypeRef: FirTypeRef
) : FirAbstractCallableMember(
session, psi = null, symbol = symbol, name = NAME, visibility = visibility, modality = Modality.FINAL,
isExpect = false, isActual = false, isOverride = false, receiverTypeRef = null, returnTypeRef = delegatedSelfTypeRef
session,
psi = null,
name = NAME,
visibility = visibility,
modality = Modality.FINAL,
isExpect = false,
isActual = false,
isOverride = false,
receiverTypeRef = null,
returnTypeRef = delegatedSelfTypeRef
), FirConstructor {
init {
symbol.bind(this)
}
override val delegatedConstructor: FirDelegatedConstructorCall?
get() = null
@@ -12,12 +12,12 @@ import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.impl.FirAbstractCallableMember
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.java.types.FirJavaTypeRef
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.name.Name
class FirJavaField(
session: FirSession,
symbol: FirFieldSymbol,
override val symbol: FirPropertySymbol,
name: Name,
visibility: Visibility,
modality: Modality?,
@@ -25,11 +25,15 @@ class FirJavaField(
override val isVar: Boolean,
isStatic: Boolean
) : FirAbstractCallableMember(
session, psi = null, symbol = symbol, name = name,
session, psi = null, name = name,
visibility = visibility, modality = modality,
isExpect = false, isActual = false, isOverride = false,
receiverTypeRef = null, returnTypeRef = returnTypeRef
), FirField {
init {
symbol.bind(this)
}
override val delegate: FirExpression?
get() = null
@@ -163,7 +163,7 @@ private fun JavaClassifierType.enhanceInflexibleType(
globalArgIndex++
arg.toConeProjection(
session,
((originalSymbol as? FirBasedSymbol<*>)?.fir as? FirCallableMember)?.typeParameters?.getOrNull(localArgIndex)
((originalSymbol as? FirBasedSymbol<*>)?.fir as? FirCallableMemberDeclaration)?.typeParameters?.getOrNull(localArgIndex)
)
} else {
val argEnhancedTypeRef = arg.enhancePossiblyFlexible(session, annotations, qualifiers, globalArgIndex)
@@ -17,10 +17,13 @@ import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirExplicitThisReference
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.ir.expressions.IrConstKind
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.constants.evaluate.*
@@ -280,9 +283,11 @@ internal fun generateDestructuringBlock(
entry.typeReference.toFirOrImplicitTypeRef(), isVar,
FirComponentCallImpl(session, entry, index + 1).apply {
arguments += generateAccessExpression(session, entry, container.name)
}
},
FirVariableSymbol(entry.nameAsSafeName) // TODO?
).apply {
entry.extractAnnotationsTo(this)
symbol.bind(this)
}
}
}
@@ -290,7 +295,10 @@ internal fun generateDestructuringBlock(
internal fun generateTemporaryVariable(
session: FirSession, psi: PsiElement?, name: Name, initializer: FirExpression
): FirVariable = FirVariableImpl(session, psi, name, FirImplicitTypeRefImpl(session, psi), false, initializer)
): FirVariable =
FirVariableImpl(session, psi, name, FirImplicitTypeRefImpl(session, psi), false, initializer, FirVariableSymbol(name)).apply {
symbol.bind(this)
}
internal fun generateTemporaryVariable(
session: FirSession, psi: PsiElement?, specialName: String, initializer: FirExpression
@@ -700,7 +700,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
propertyType,
isVar,
initializer,
property.delegate?.expression?.toFirExpression("Incorrect delegate expression")
delegate = property.delegate?.expression?.toFirExpression("Incorrect delegate expression")
)
} else {
FirMemberPropertyImpl(
@@ -56,20 +56,20 @@ class FirProviderImpl(val session: FirSession) : FirProvider {
classifierContainerFileMap[classId] = file
}
override fun visitCallableMember(callableMember: FirCallableMember) {
override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration) {
val callableId = when (containerFqName) {
FqName.ROOT -> CallableId(packageName, callableMember.name)
else -> CallableId(packageName, containerFqName, callableMember.name)
FqName.ROOT -> CallableId(packageName, callableMemberDeclaration.name)
else -> CallableId(packageName, containerFqName, callableMemberDeclaration.name)
}
callableMap.merge(callableId, listOf(callableMember)) { a, b -> a + b }
callableMap.merge(callableId, listOf(callableMemberDeclaration)) { a, b -> a + b }
}
override fun visitNamedFunction(namedFunction: FirNamedFunction) {
visitCallableMember(namedFunction)
visitCallableMemberDeclaration(namedFunction)
}
override fun visitProperty(property: FirProperty) {
visitCallableMember(property)
visitCallableMemberDeclaration(property)
}
})
}
@@ -161,7 +161,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
?: return CandidateApplicability.HIDDEN
declaration as FirDeclaration
if (declaration is FirCallableMember) {
if (declaration is FirCallableDeclaration) {
if ((declaration.receiverTypeRef == null) != (explicitReceiverType == null)) return CandidateApplicability.PARAMETER_MAPPING_ERROR
}
@@ -288,7 +288,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
val lastCandidate = variableChecker.candidates.lastOrNull()
if (variableChecker.currentApplicability == CandidateApplicability.RESOLVED && lastCandidate == symbol) {
val receiverScope =
(lastCandidate as FirBasedSymbol<FirCallableMember>).fir.returnTypeRef.coneTypeUnsafe().scope(session)
(lastCandidate as FirBasedSymbol<FirCallableDeclaration>).fir.returnTypeRef.coneTypeUnsafe().scope(session)
lookupInvoke = true
@@ -393,7 +393,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
is FirErrorNamedReference ->
FirErrorTypeRefImpl(session, access.psi, newCallee.errorReason)
is FirResolvedCallableReference ->
(newCallee.callableSymbol as FirBasedSymbol<FirCallableMember>).fir.returnTypeRef
(newCallee.callableSymbol as FirBasedSymbol<FirCallableDeclaration>).fir.returnTypeRef
else -> return
}
}
@@ -33,7 +33,7 @@ class FirStatusResolveTransformer : FirAbstractTreeTransformer() {
return when (this) {
is FirEnumEntry -> Modality.FINAL
is FirRegularClass -> if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL
is FirCallableMember -> {
is FirCallableMemberDeclaration -> {
val containingClass = classes.lastOrNull()
when {
containingClass == null -> Modality.FINAL
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeAbbreviatedTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
@@ -129,7 +130,8 @@ class FirClassSubstitutionScope(
FirValueParameterImpl(
this@FirClassSubstitutionScope.session, psi,
name, this.returnTypeRef.withReplacedConeType(this@FirClassSubstitutionScope.session, newType),
defaultValue, isCrossinline, isNoinline, isVararg
defaultValue, isCrossinline, isNoinline, isVararg,
FirVariableSymbol(valueParameter.symbol.callableId)
)
}
}
@@ -7,10 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
@@ -60,18 +57,18 @@ class FirClassUseSiteScope(
}
}
fun similarFunctionsOrBothProperties(member: FirCallableMember, self: FirCallableMember): Boolean {
return when (member) {
is FirNamedFunction -> self is FirNamedFunction && isOverriddenFunCheck(member, self)
fun similarFunctionsOrBothProperties(declaration: FirCallableDeclaration, self: FirCallableDeclaration): Boolean {
return when (declaration) {
is FirNamedFunction -> self is FirNamedFunction && isOverriddenFunCheck(declaration, self)
is FirConstructor -> false
is FirProperty -> self is FirProperty
else -> error("Unknown fir callable type: $member, $self")
else -> error("Unknown fir callable type: $declaration, $self")
}
}
val self = (this as AbstractFirBasedSymbol<*>).fir as FirCallableMember
val self = (this as AbstractFirBasedSymbol<*>).fir as FirCallableMemberDeclaration
val overriding = seen.firstOrNull {
val member = (it as AbstractFirBasedSymbol<*>).fir as FirCallableMember
val member = (it as AbstractFirBasedSymbol<*>).fir as FirCallableMemberDeclaration
self.modality != Modality.FINAL
&& sameReceivers(member.receiverTypeRef, self.receiverTypeRef)
&& similarFunctionsOrBothProperties(member, self)
@@ -101,21 +101,25 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
}
}
override fun visitCallableMember(callableMember: FirCallableMember) {
visitMemberDeclaration(callableMember)
val receiverType = callableMember.receiverTypeRef
override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) {
if (callableDeclaration is FirMemberDeclaration) {
visitMemberDeclaration(callableDeclaration)
} else {
visitTypedDeclaration(callableDeclaration)
}
val receiverType = callableDeclaration.receiverTypeRef
if (receiverType != null) {
print(" ")
receiverType.accept(this)
print(".")
}
if (callableMember is FirFunction) {
callableMember.valueParameters.renderParameters()
} else if (callableMember is FirProperty) {
print(if (callableMember.isVar) "(var)" else "(val)")
if (callableDeclaration is FirFunction) {
callableDeclaration.valueParameters.renderParameters()
} else if (callableDeclaration is FirProperty) {
print(if (callableDeclaration.isVar) "(var)" else "(val)")
}
print(": ")
callableMember.returnTypeRef.accept(this)
callableDeclaration.returnTypeRef.accept(this)
}
private fun Visibility.asString() =
@@ -126,7 +130,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
private fun FirMemberDeclaration.modalityAsString(): String {
return modality?.name?.toLowerCase() ?: run {
if (this is FirCallableMember && this.isOverride) {
if (this is FirCallableMemberDeclaration && this.isOverride) {
"open?"
} else {
"final?"
@@ -148,7 +152,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
if (memberDeclaration.isActual) {
print("actual ")
}
if (memberDeclaration is FirCallableMember) {
if (memberDeclaration is FirCallableMemberDeclaration) {
if (memberDeclaration.isOverride) {
print("override ")
}
@@ -275,7 +279,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
}
override fun visitProperty(property: FirProperty) {
visitCallableMember(property)
visitCallableDeclaration(property)
property.initializer?.let {
print(" = ")
it.accept(this)
@@ -300,7 +304,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
}
override fun visitNamedFunction(namedFunction: FirNamedFunction) {
visitCallableMember(namedFunction)
visitCallableDeclaration(namedFunction)
namedFunction.body?.accept(this)
if (namedFunction.body == null) {
println()
@@ -11,21 +11,17 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor
// Good name needed (something with receiver, type parameters, return type, and name)
interface FirCallableMember :
@VisitedSupertype FirDeclaration, FirMemberDeclaration,
FirTypedDeclaration, FirSymbolOwner<FirCallableMember> {
val isOverride: Boolean get() = status.isOverride
val isStatic: Boolean get() = status.isStatic
interface FirCallableDeclaration :
@VisitedSupertype FirDeclaration,
FirTypedDeclaration, FirSymbolOwner<FirCallableDeclaration> {
val receiverTypeRef: FirTypeRef?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitCallableMember(this, data)
visitor.visitCallableDeclaration(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
receiverTypeRef?.accept(visitor, data)
super<FirMemberDeclaration>.acceptChildren(visitor, data)
returnTypeRef.accept(visitor, data)
super<FirTypedDeclaration>.acceptChildren(visitor, data)
}
}
@@ -0,0 +1,26 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. 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
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirCallableMemberDeclaration : @VisitedSupertype FirDeclaration, FirMemberDeclaration, FirCallableDeclaration {
val isOverride: Boolean get() = status.isOverride
val isStatic: Boolean get() = status.isStatic
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitCallableMemberDeclaration(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
receiverTypeRef?.accept(visitor, data)
super<FirMemberDeclaration>.acceptChildren(visitor, data)
returnTypeRef.accept(visitor, data)
}
}
@@ -11,14 +11,17 @@ import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirConstructor : @VisitedSupertype FirFunction, FirCallableMember {
interface FirConstructor : @VisitedSupertype FirFunction, FirCallableMemberDeclaration {
override val isOverride: Boolean get() = status.isOverride
val delegatedConstructor: FirDelegatedConstructorCall?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitConstructor(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirCallableMember>.acceptChildren(visitor, data)
super<FirCallableMemberDeclaration>.acceptChildren(visitor, data)
delegatedConstructor?.accept(visitor, data)
for (parameter in valueParameters) {
parameter.accept(visitor, data)
@@ -11,12 +11,12 @@ import org.jetbrains.kotlin.fir.expressions.FirVariable
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirField : @VisitedSupertype FirDeclaration, FirCallableMember, FirVariable {
interface FirField : @VisitedSupertype FirDeclaration, FirCallableMemberDeclaration, FirVariable {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitField(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirCallableMember>.acceptChildren(visitor, data)
super<FirCallableMemberDeclaration>.acceptChildren(visitor, data)
initializer?.accept(visitor, data)
delegate?.accept(visitor, data)
}
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirNamedFunction : @VisitedSupertype FirFunction, FirCallableMember {
interface FirNamedFunction : @VisitedSupertype FirFunction, FirCallableMemberDeclaration, FirMemberDeclaration {
val isOperator: Boolean get() = status.isOperator
val isInfix: Boolean get() = status.isInfix
@@ -23,11 +23,13 @@ interface FirNamedFunction : @VisitedSupertype FirFunction, FirCallableMember {
val isSuspend: Boolean get() = status.isSuspend
override val isOverride: Boolean get() = status.isOverride
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitNamedFunction(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirCallableMember>.acceptChildren(visitor, data)
super<FirCallableMemberDeclaration>.acceptChildren(visitor, data)
for (parameter in valueParameters) {
parameter.accept(visitor, data)
}
@@ -7,17 +7,18 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.BaseTransformedType
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.visitors.FirVisitor
// May be should not inherit FirVariable
@BaseTransformedType
interface FirProperty : @VisitedSupertype FirDeclaration, FirCallableMember, FirVariable {
interface FirProperty : @VisitedSupertype FirDeclaration, FirCallableMemberDeclaration, FirVariable, FirMemberDeclaration {
val isConst: Boolean get() = status.isConst
val isLateInit: Boolean get() = status.isLateInit
override val isOverride: Boolean get() = status.isOverride
// Should it be nullable or have some default?
val getter: FirPropertyAccessor
@@ -27,7 +28,7 @@ interface FirProperty : @VisitedSupertype FirDeclaration, FirCallableMember, Fir
visitor.visitProperty(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirCallableMember>.acceptChildren(visitor, data)
super<FirCallableMemberDeclaration>.acceptChildren(visitor, data)
initializer?.accept(visitor, data)
delegate?.accept(visitor, data)
getter.accept(visitor, data)
@@ -8,10 +8,13 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.BaseTransformedType
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.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirValueParameter : @VisitedSupertype FirDeclaration, FirTypedDeclaration, FirNamedDeclaration {
interface FirValueParameter : @VisitedSupertype FirDeclaration, FirTypedDeclaration, FirNamedDeclaration, FirVariable {
val isCrossinline: Boolean
val isNoinline: Boolean
@@ -20,11 +23,13 @@ interface FirValueParameter : @VisitedSupertype FirDeclaration, FirTypedDeclarat
val defaultValue: FirExpression?
override val symbol: FirVariableSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitValueParameter(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirTypedDeclaration>.acceptChildren(visitor, data)
super<FirVariable>.acceptChildren(visitor, data)
defaultValue?.accept(visitor, data)
}
}
@@ -10,16 +10,17 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCallableMember {
abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCallableMemberDeclaration {
final override val symbol: FirBasedSymbol<FirCallableMember>
final override val symbol: FirBasedSymbol<FirCallableDeclaration>
final override var receiverTypeRef: FirTypeRef?
final override var returnTypeRef: FirTypeRef
@@ -30,7 +31,7 @@ abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCall
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirBasedSymbol<FirCallableMember>,
symbol: FirBasedSymbol<FirCallableDeclaration>,
name: Name,
receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef
@@ -44,7 +45,7 @@ abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCall
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirBasedSymbol<FirCallableMember>,
symbol: FirBasedSymbol<FirCallableDeclaration>,
name: Name,
visibility: Visibility,
modality: Modality?,
@@ -13,9 +13,16 @@ import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
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.types.impl.FirImplicitUnitTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
abstract class FirDefaultPropertyAccessor(
session: FirSession,
@@ -64,7 +71,15 @@ class FirDefaultPropertySetter(
propertyTypeRef: FirTypeRef,
visibility: Visibility
) : FirDefaultPropertyAccessor(session, psi, isGetter = false, visibility = visibility) {
override val valueParameters = mutableListOf(FirDefaultSetterValueParameter(session, psi, propertyTypeRef))
override val valueParameters = mutableListOf(
FirDefaultSetterValueParameter(
session, psi, propertyTypeRef, FirVariableSymbol(
CallableId(
FqName.ROOT, Name.special("<default-setter-parameter>")
)
)
)
)
override var returnTypeRef: FirTypeRef = FirImplicitUnitTypeRef(session, psi)
@@ -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.FirVariableSymbol
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
@@ -18,14 +19,30 @@ import org.jetbrains.kotlin.name.Name
class FirDefaultSetterValueParameter(
session: FirSession,
psi: PsiElement?,
override var returnTypeRef: FirTypeRef
override var returnTypeRef: FirTypeRef,
override val symbol: FirVariableSymbol = FirVariableSymbol(name)
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter {
init {
symbol.bind(this)
}
override val initializer: FirExpression?
get() = null
override val delegate: FirExpression?
get() = null
override val receiverTypeRef: FirTypeRef?
get() = null
override val isCrossinline = false
override val isNoinline = false
override val isVararg = false
override val isVar: Boolean = false
override val isVal: Boolean = false
override val defaultValue: FirExpression? = null
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
@@ -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.FirVariableSymbol
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.Name
@@ -23,8 +24,23 @@ open class FirValueParameterImpl(
override var defaultValue: FirExpression?,
override val isCrossinline: Boolean,
override val isNoinline: Boolean,
override val isVararg: Boolean
override val isVararg: Boolean,
override val symbol: FirVariableSymbol = FirVariableSymbol(name)
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter {
init {
symbol.bind(this)
}
override val isVar: Boolean
get() = false
override val initializer: FirExpression?
get() = null
override val delegate: FirExpression?
get() = null
override val receiverTypeRef: FirTypeRef?
get() = null
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
returnTypeRef = returnTypeRef.transformSingle(transformer, data)
defaultValue = defaultValue?.transformSingle(transformer, data)
@@ -8,8 +8,11 @@ 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.FirCallableDeclaration
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirVariable
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
@@ -22,8 +25,17 @@ class FirVariableImpl(
override var returnTypeRef: FirTypeRef,
override val isVar: Boolean,
override var initializer: FirExpression?,
override val symbol: FirBasedSymbol<FirCallableDeclaration> = FirVariableSymbol(name),
override var delegate: FirExpression? = null
) : FirAbstractNamedAnnotatedDeclaration(session, psiElement, name), FirVariable {
init {
symbol.bind(this)
}
override val receiverTypeRef: FirTypeRef?
get() = null
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
returnTypeRef = returnTypeRef.transformSingle(transformer, data)
initializer = initializer?.transformSingle(transformer, data)
@@ -6,12 +6,10 @@
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirNamedDeclaration
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirVariable : @VisitedSupertype FirDeclaration, FirTypedDeclaration, FirNamedDeclaration, FirStatement {
interface FirVariable : @VisitedSupertype FirDeclaration, FirTypedDeclaration, FirCallableDeclaration, FirNamedDeclaration, FirStatement {
val isVar: Boolean
val isVal: Boolean
@@ -27,6 +25,6 @@ interface FirVariable : @VisitedSupertype FirDeclaration, FirTypedDeclaration, F
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
initializer?.accept(visitor, data)
delegate?.accept(visitor, data)
super<FirTypedDeclaration>.acceptChildren(visitor, data)
super<FirCallableDeclaration>.acceptChildren(visitor, data)
}
}
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.symbols.impl
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType
class FirFunctionSymbol(
override val callableId: CallableId,
val isFakeOverride: Boolean = false
) : ConeFunctionSymbol, AbstractFirBasedSymbol<FirCallableMember>() {
) : ConeFunctionSymbol, AbstractFirBasedSymbol<FirCallableDeclaration>() {
override val parameters: List<ConeKotlinType>
get() = emptyList()
}
@@ -5,9 +5,16 @@
package org.jetbrains.kotlin.fir.symbols.impl
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
class FirPropertySymbol(override val callableId: CallableId) : ConePropertySymbol, AbstractFirBasedSymbol<FirCallableMember>()
class FirPropertySymbol(override val callableId: CallableId) : ConePropertySymbol, AbstractFirBasedSymbol<FirCallableDeclaration>()
class FirVariableSymbol(override val callableId: CallableId) : ConeVariableSymbol, AbstractFirBasedSymbol<FirCallableDeclaration>() {
constructor(name: Name) : this(CallableId(FqName("var"), name)) // TODO?
}
@@ -24,8 +24,8 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(declaration, data)
}
open fun transformCallableMember(callableMember: FirCallableMember, data: D): CompositeTransformResult<FirDeclaration> {
return transformDeclaration(callableMember, data)
open fun transformCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: D): CompositeTransformResult<FirDeclaration> {
return transformDeclaration(callableDeclaration, data)
}
open fun transformDeclarationWithBody(declarationWithBody: FirDeclarationWithBody, data: D): CompositeTransformResult<FirDeclaration> {
@@ -76,6 +76,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformNamedDeclaration(memberDeclaration, data)
}
open fun transformCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): CompositeTransformResult<FirDeclaration> {
return transformMemberDeclaration(callableMemberDeclaration, data)
}
open fun transformClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration, data: D): CompositeTransformResult<FirDeclaration> {
return transformMemberDeclaration(classLikeDeclaration, data)
}
@@ -416,8 +420,12 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformCall(call, data)
}
final override fun visitCallableMember(callableMember: FirCallableMember, data: D): CompositeTransformResult<FirElement> {
return transformCallableMember(callableMember, data)
final override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: D): CompositeTransformResult<FirElement> {
return transformCallableDeclaration(callableDeclaration, data)
}
final override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): CompositeTransformResult<FirElement> {
return transformCallableMemberDeclaration(callableMemberDeclaration, data)
}
final override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: D): CompositeTransformResult<FirElement> {
@@ -24,8 +24,8 @@ abstract class FirVisitor<out R, in D> {
return visitElement(declaration, data)
}
open fun visitCallableMember(callableMember: FirCallableMember, data: D): R {
return visitDeclaration(callableMember, data)
open fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: D): R {
return visitDeclaration(callableDeclaration, data)
}
open fun visitDeclarationWithBody(declarationWithBody: FirDeclarationWithBody, data: D): R {
@@ -76,6 +76,10 @@ abstract class FirVisitor<out R, in D> {
return visitNamedDeclaration(memberDeclaration, data)
}
open fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): R {
return visitMemberDeclaration(callableMemberDeclaration, data)
}
open fun visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration, data: D): R {
return visitMemberDeclaration(classLikeDeclaration, data)
}
@@ -24,8 +24,8 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(declaration, null)
}
open fun visitCallableMember(callableMember: FirCallableMember) {
visitDeclaration(callableMember, null)
open fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) {
visitDeclaration(callableDeclaration, null)
}
open fun visitDeclarationWithBody(declarationWithBody: FirDeclarationWithBody) {
@@ -76,6 +76,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitNamedDeclaration(memberDeclaration, null)
}
open fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration) {
visitMemberDeclaration(callableMemberDeclaration, null)
}
open fun visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration) {
visitMemberDeclaration(classLikeDeclaration, null)
}
@@ -416,8 +420,12 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitCall(call)
}
final override fun visitCallableMember(callableMember: FirCallableMember, data: Nothing?) {
visitCallableMember(callableMember)
final override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: Nothing?) {
visitCallableDeclaration(callableDeclaration)
}
final override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: Nothing?) {
visitCallableMemberDeclaration(callableMemberDeclaration)
}
final override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: Nothing?) {