Refactor FIR symbols to make them and their FIR element types more clear

This commit also fixes work with Java synthetic properties
This commit is contained in:
Mikhail Glukhikh
2019-06-24 15:17:11 +03:00
parent 701b9ce166
commit c35d7eab70
99 changed files with 609 additions and 610 deletions
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
@@ -146,7 +146,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
}
}
override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) {
override fun <F : FirCallableDeclaration<F>> visitCallableDeclaration(callableDeclaration: FirCallableDeclaration<F>) {
if (callableDeclaration is FirMemberDeclaration) {
visitMemberDeclaration(callableDeclaration)
} else {
@@ -178,7 +178,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
private fun FirMemberDeclaration.modalityAsString(): String {
return modality?.name?.toLowerCase() ?: run {
if (this is FirCallableMemberDeclaration && this.isOverride) {
if (this is FirCallableMemberDeclaration<*> && this.isOverride) {
"open?"
} else {
"final?"
@@ -203,7 +203,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
if (memberDeclaration.isActual) {
print("actual ")
}
if (memberDeclaration is FirCallableMemberDeclaration) {
if (memberDeclaration is FirCallableMemberDeclaration<*>) {
if (memberDeclaration.isOverride) {
print("override ")
}
@@ -257,9 +257,9 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitNamedDeclaration(namedDeclaration: FirNamedDeclaration) {
visitDeclaration(namedDeclaration)
if (namedDeclaration !is FirCallableDeclaration) { // Handled by visitCallableDeclaration
if (namedDeclaration !is FirCallableDeclaration<*>) { // Handled by visitCallableDeclaration
print(" " + namedDeclaration.name)
if (namedDeclaration is FirClassLikeDeclaration) {
if (namedDeclaration is FirClassLikeDeclaration<*>) {
namedDeclaration.typeParameters.renderTypeParameters()
}
} else if (namedDeclaration is FirMemberDeclaration) {
@@ -278,7 +278,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
is FirNamedFunction -> "fun"
is FirProperty -> if (declaration.isVal) "val" else "var"
is FirField -> "field"
is FirVariable -> if (declaration.isVal) "lval" else "lvar"
is FirVariable<*> -> if (declaration.isVal) "lval" else "lvar"
else -> "unknown"
}
)
@@ -325,7 +325,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
anonymousObject.renderDeclarations()
}
override fun visitVariable(variable: FirVariable) {
override fun <F : FirVariable<F>> visitVariable(variable: FirVariable<F>) {
visitCallableDeclaration(variable)
variable.initializer?.let {
print(" = ")
@@ -798,7 +798,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference) {
print("R|")
val isFakeOverride = (resolvedCallableReference.coneSymbol as? FirFunctionSymbol)?.isFakeOverride == true
val isFakeOverride = (resolvedCallableReference.coneSymbol as? FirNamedFunctionSymbol)?.isFakeOverride == true
if (isFakeOverride) {
print("FakeOverride<")
@@ -810,7 +810,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
print(symbol.classId)
if (isFakeOverride) {
when (symbol) {
is FirFunctionSymbol -> {
is FirNamedFunctionSymbol -> {
print(": ")
symbol.fir.returnTypeRef.accept(this)
}
@@ -12,11 +12,11 @@ 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 FirCallableDeclaration :
interface FirCallableDeclaration<F : FirCallableDeclaration<F>> :
@VisitedSupertype FirDeclaration,
FirTypedDeclaration, FirSymbolOwner<FirCallableDeclaration> {
FirTypedDeclaration, FirSymbolOwner<F> {
override val symbol: FirCallableSymbol
override val symbol: FirCallableSymbol<F>
val receiverTypeRef: FirTypeRef?
@@ -9,7 +9,8 @@ import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
interface FirCallableMemberDeclaration : @VisitedSupertype FirDeclaration, FirMemberDeclaration, FirCallableDeclaration {
interface FirCallableMemberDeclaration<F : FirCallableMemberDeclaration<F>> :
@VisitedSupertype FirDeclaration, FirMemberDeclaration, FirCallableDeclaration<F> {
val isOverride: Boolean get() = status.isOverride
@@ -7,14 +7,16 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirClassLikeDeclaration : @VisitedSupertype FirMemberDeclaration, FirStatement {
val symbol: ConeClassLikeSymbol
interface FirClassLikeDeclaration<F : FirClassLikeDeclaration<F>> :
@VisitedSupertype FirMemberDeclaration, FirStatement, FirSymbolOwner<F> {
override val symbol: FirClassLikeSymbol<F>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R {
return super<FirMemberDeclaration>.accept(visitor, data)
@@ -25,7 +27,7 @@ interface FirClassLikeDeclaration : @VisitedSupertype FirMemberDeclaration, FirS
}
}
fun ConeClassifierSymbol.toFirClassLike(): FirClassLikeDeclaration? =
fun ConeClassifierSymbol.toFirClassLike(): FirClassLikeDeclaration<*>? =
when (this) {
is FirClassSymbol -> this.fir
is FirTypeAliasSymbol -> this.fir
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirConstructor : @VisitedSupertype FirFunction, FirCallableMemberDeclaration {
interface FirConstructor : @VisitedSupertype FirMemberFunction<FirConstructor> {
val isPrimary: Boolean get() = false
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirVariable
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirField : @VisitedSupertype FirDeclaration, FirCallableMemberDeclaration, FirVariable {
interface FirField : @VisitedSupertype FirDeclaration, FirCallableMemberDeclaration<FirField>, FirVariable<FirField> {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitField(this, data)
@@ -0,0 +1,29 @@
/*
* 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
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirMemberFunction<F : FirMemberFunction<F>> :
@VisitedSupertype FirFunction, FirCallableMemberDeclaration<F> {
override val symbol: FirFunctionSymbol<F>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R {
return visitor.visitMemberFunction(this, data)
}
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirCallableMemberDeclaration>.acceptChildren(visitor, data)
for (parameter in valueParameters) {
parameter.accept(visitor, data)
}
body?.accept(visitor, data)
}
}
@@ -7,12 +7,10 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirNamedFunction : @VisitedSupertype FirFunction, FirCallableMemberDeclaration, FirMemberDeclaration {
interface FirNamedFunction : @VisitedSupertype FirMemberFunction<FirNamedFunction>, FirMemberDeclaration {
val isOperator: Boolean get() = status.isOperator
val isInfix: Boolean get() = status.isInfix
@@ -29,12 +27,4 @@ interface FirNamedFunction : @VisitedSupertype FirFunction, FirCallableMemberDec
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<FirCallableMemberDeclaration>.acceptChildren(visitor, data)
for (parameter in valueParameters) {
parameter.accept(visitor, data)
}
body?.accept(visitor, data)
}
}
@@ -14,7 +14,8 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
// May be should not inherit FirVariable
@BaseTransformedType
interface FirProperty : @VisitedSupertype FirDeclaration, FirCallableMemberDeclaration, FirVariable, FirMemberDeclaration {
interface FirProperty :
@VisitedSupertype FirDeclaration, FirCallableMemberDeclaration<FirProperty>, FirVariable<FirProperty>, FirMemberDeclaration {
val isConst: Boolean get() = status.isConst
val isLateInit: Boolean get() = status.isLateInit
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@@ -15,7 +14,7 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
// May be all containers should be properties and not base classes
// About descriptors: introduce something like FirDescriptor which is FirUnresolved at the beginning and FirSymbol(descriptor) at the end
@BaseTransformedType
interface FirRegularClass : FirClass, @VisitedSupertype FirClassLikeDeclaration, FirSymbolOwner<FirRegularClass> {
interface FirRegularClass : FirClass, @VisitedSupertype FirClassLikeDeclaration<FirRegularClass> {
val isInner: Boolean get() = status.isInner
val isCompanion: Boolean get() = status.isCompanion
@@ -5,14 +5,13 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.coneTypeSafe
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirTypeAlias : FirClassLikeDeclaration, FirSymbolOwner<FirTypeAlias> {
interface FirTypeAlias : FirClassLikeDeclaration<FirTypeAlias> {
fun replaceExpandTypeRef(typeRef: FirTypeRef): FirTypeAlias
val expandedTypeRef: FirTypeRef
@@ -9,12 +9,11 @@ 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, FirVariable {
interface FirValueParameter : @VisitedSupertype FirDeclaration, FirTypedDeclaration, FirNamedDeclaration, FirVariable<FirValueParameter> {
val isCrossinline: Boolean
val isNoinline: Boolean
@@ -23,7 +22,7 @@ interface FirValueParameter : @VisitedSupertype FirDeclaration, FirTypedDeclarat
val defaultValue: FirExpression?
override val symbol: FirVariableSymbol
override val symbol: FirVariableSymbol<FirValueParameter>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitValueParameter(this, data)
@@ -17,9 +17,9 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCallableMemberDeclaration {
abstract class FirAbstractCallableMember<F : FirCallableMemberDeclaration<F>> :
FirAbstractMemberDeclaration, FirCallableMemberDeclaration<F> {
// final override val symbol: FirBasedSymbol<FirCallableDeclaration>
final override var receiverTypeRef: FirTypeRef?
final override var returnTypeRef: FirTypeRef
@@ -14,23 +14,23 @@ import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
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
import org.jetbrains.kotlin.name.Name
open class FirConstructorImpl : FirAbstractCallableMember, FirConstructor {
open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirConstructor {
override val symbol: FirFunctionSymbol
override val symbol: FirConstructorSymbol
final override var delegatedConstructor: FirDelegatedConstructorCall? = null
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirFunctionSymbol,
symbol: FirConstructorSymbol,
visibility: Visibility,
isExpect: Boolean,
isActual: Boolean,
@@ -48,7 +48,7 @@ open class FirConstructorImpl : FirAbstractCallableMember, FirConstructor {
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirFunctionSymbol,
symbol: FirConstructorSymbol,
receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef
) : super(session, psi, NAME, receiverTypeRef, returnTypeRef) {
@@ -20,7 +20,7 @@ class FirDefaultSetterValueParameter(
session: FirSession,
psi: PsiElement?,
override var returnTypeRef: FirTypeRef,
override val symbol: FirVariableSymbol = FirVariableSymbol(name)
override val symbol: FirVariableSymbol<FirValueParameter> = FirVariableSymbol(name)
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter {
init {
@@ -12,22 +12,23 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
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
import org.jetbrains.kotlin.name.Name
open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction, FirModifiableFunction {
open class FirMemberFunctionImpl : FirAbstractCallableMember<FirNamedFunction>, FirNamedFunction, FirModifiableFunction {
override val symbol: FirCallableSymbol
// NB: FirAccessorSymbol can be here
override val symbol: FirFunctionSymbol<FirNamedFunction>
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirCallableSymbol,
symbol: FirFunctionSymbol<FirNamedFunction>,
name: Name,
receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef
@@ -39,7 +40,7 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction,
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirFunctionSymbol,
symbol: FirNamedFunctionSymbol,
name: Name,
visibility: Visibility,
modality: Modality?,
@@ -40,7 +40,7 @@ class FirMemberPropertyImpl(
override var getter: FirPropertyAccessor,
override var setter: FirPropertyAccessor?,
override var delegate: FirExpression?
) : FirAbstractCallableMember(
) : FirAbstractCallableMember<FirProperty>(
session, psi, name, visibility, modality, isExpect, isActual, isOverride, receiverTypeRef, returnTypeRef
), FirProperty {
override val backingFieldSymbol = FirBackingFieldSymbol(symbol.callableId)
@@ -9,13 +9,13 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
class FirPrimaryConstructorImpl(
session: FirSession,
psi: PsiElement?,
symbol: FirFunctionSymbol,
symbol: FirConstructorSymbol,
visibility: Visibility,
isExpect: Boolean,
isActual: Boolean,
@@ -25,7 +25,7 @@ open class FirValueParameterImpl(
override val isCrossinline: Boolean,
override val isNoinline: Boolean,
override val isVararg: Boolean,
override val symbol: FirVariableSymbol = FirVariableSymbol(name)
override val symbol: FirVariableSymbol<FirValueParameter> = FirVariableSymbol(name)
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter {
init {
@@ -8,10 +8,8 @@ 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
@@ -25,9 +23,9 @@ class FirVariableImpl(
override var returnTypeRef: FirTypeRef,
override val isVar: Boolean,
override var initializer: FirExpression?,
override val symbol: FirVariableSymbol = FirVariableSymbol(name),
override val symbol: FirVariableSymbol<FirVariableImpl> = FirVariableSymbol(name),
override var delegate: FirExpression? = null
) : FirAbstractNamedAnnotatedDeclaration(session, psiElement, name), FirVariable {
) : FirAbstractNamedAnnotatedDeclaration(session, psiElement, name), FirVariable<FirVariableImpl> {
init {
symbol.bind(this)
@@ -10,7 +10,8 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirVariable : @VisitedSupertype FirDeclaration, FirTypedDeclaration, FirCallableDeclaration, FirNamedDeclaration, FirStatement {
interface FirVariable<F : FirVariable<F>> :
@VisitedSupertype FirDeclaration, FirTypedDeclaration, FirCallableDeclaration<F>, FirNamedDeclaration, FirStatement {
val isVar: Boolean
val isVal: Boolean
@@ -20,7 +21,7 @@ interface FirVariable : @VisitedSupertype FirDeclaration, FirTypedDeclaration, F
val delegate: FirExpression?
override val symbol: FirVariableSymbol
override val symbol: FirVariableSymbol<F>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitVariable(this, data)
@@ -17,7 +17,7 @@ abstract class FirWhenExpression(
abstract val subject: FirExpression?
// when (val subjectVariable = subject()) { ... }
abstract val subjectVariable: FirVariable?
abstract val subjectVariable: FirVariable<*>?
abstract val branches: List<FirWhenBranch>
@@ -17,7 +17,7 @@ class FirWhenExpressionImpl(
session: FirSession,
psiElement: PsiElement?,
override var subject: FirExpression? = null,
override var subjectVariable: FirVariable? = null
override var subjectVariable: FirVariable<*>? = null
) : FirWhenExpression(session, psiElement) {
override val branches = mutableListOf<FirWhenBranch>()
@@ -16,5 +16,5 @@ class FirPropertyFromParameterCallableReference(
session: FirSession,
psi: PsiElement?,
override val name: Name,
override val coneSymbol: FirVariableSymbol
override val coneSymbol: FirVariableSymbol<*>
) : FirAbstractElement(session, psi), FirResolvedCallableReference
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.name.Name
abstract class FirScope {
@@ -25,12 +25,13 @@ abstract class FirScope {
open fun processFunctionsByName(
name: Name,
processor: (ConeFunctionSymbol) -> ProcessorAction
processor: (FirFunctionSymbol<*>) -> ProcessorAction
): ProcessorAction = NEXT
open fun processPropertiesByName(
name: Name,
processor: (ConeVariableSymbol) -> ProcessorAction
// NB: it'd be great to write FirVariableSymbol<*> here, but there is FirAccessorSymbol :(
processor: (FirCallableSymbol<*>) -> ProcessorAction
): ProcessorAction = NEXT
}
@@ -5,9 +5,9 @@
package org.jetbrains.kotlin.fir.symbols
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
abstract class AbstractFirBasedSymbol<E> : FirBasedSymbol<E> where E : FirElement, E : FirSymbolOwner<E> {
abstract class AbstractFirBasedSymbol<E> : FirBasedSymbol<E> where E : FirDeclaration, E : FirSymbolOwner<E> {
override lateinit var fir: E
@@ -1,14 +0,0 @@
/*
* 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.symbols.impl
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
class FirAccessorSymbol(
override val callableId: CallableId,
val accessorId: CallableId
) : ConePropertySymbol, FirCallableSymbol()
@@ -9,4 +9,4 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
abstract class FirCallableSymbol : ConeCallableSymbol, AbstractFirBasedSymbol<FirCallableDeclaration>()
abstract class FirCallableSymbol<D : FirCallableDeclaration<D>> : ConeCallableSymbol, AbstractFirBasedSymbol<D>()
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2018 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.symbols.impl
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.name.ClassId
sealed class FirClassLikeSymbol<D : FirClassLikeDeclaration<D>>(
override val classId: ClassId
) : ConeClassLikeSymbol, AbstractFirBasedSymbol<D>() {
override fun equals(other: Any?): Boolean =
other is FirClassLikeSymbol<*> && fir == other.fir
override fun hashCode(): Int = fir.hashCode()
}
class FirClassSymbol(classId: ClassId) : FirClassLikeSymbol<FirRegularClass>(classId), ConeClassSymbol {
override fun toLookupTag(): ConeClassLikeLookupTag = ConeClassLikeLookupTagImpl(classId)
}
class FirTypeAliasSymbol(override val classId: ClassId) : FirClassLikeSymbol<FirTypeAlias>(classId), ConeTypeAliasSymbol {
override fun toLookupTag(): TypeAliasLookupTagImpl = TypeAliasLookupTagImpl(classId)
}
class TypeAliasLookupTagImpl(
override val classId: ClassId
) : ConeTypeAliasLookupTag()
@@ -1,22 +0,0 @@
/*
* Copyright 2010-2018 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.symbols.impl
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.ConeClassSymbol
import org.jetbrains.kotlin.name.ClassId
class FirClassSymbol(override val classId: ClassId) : ConeClassSymbol, AbstractFirBasedSymbol<FirRegularClass>() {
override fun toLookupTag(): ConeClassLikeLookupTag = ConeClassLikeLookupTagImpl(classId)
override fun equals(other: Any?): Boolean =
other is FirClassSymbol && fir == other.fir
override fun hashCode(): Int = fir.hashCode()
}
@@ -1,8 +0,0 @@
/*
* 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.symbols.impl
typealias FirFieldSymbol = FirPropertySymbol
@@ -5,16 +5,31 @@
package org.jetbrains.kotlin.fir.symbols.impl
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
class FirFunctionSymbol(
override val callableId: CallableId,
val isFakeOverride: Boolean = false,
// Actual for fake override only
val overriddenSymbol: FirFunctionSymbol? = null
) : ConeFunctionSymbol, FirCallableSymbol() {
sealed class FirFunctionSymbol<D : FirMemberFunction<D>>(
override val callableId: CallableId
) : ConeFunctionSymbol, FirCallableSymbol<D>() {
override val parameters: List<ConeKotlinType>
get() = emptyList()
}
class FirNamedFunctionSymbol(
callableId: CallableId,
val isFakeOverride: Boolean = false,
// Actual for fake override only
val overriddenSymbol: FirNamedFunctionSymbol? = null
) : FirFunctionSymbol<FirNamedFunction>(callableId)
class FirConstructorSymbol(
callableId: CallableId
) : FirFunctionSymbol<FirConstructor>(callableId)
class FirAccessorSymbol(
callableId: CallableId,
val accessorId: CallableId
) : ConePropertySymbol, FirFunctionSymbol<FirNamedFunction>(callableId)
@@ -12,22 +12,3 @@ import org.jetbrains.kotlin.fir.symbols.ConeTypeAliasLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeTypeAliasSymbol
import org.jetbrains.kotlin.name.ClassId
class FirTypeAliasSymbol(
override val classId: ClassId
) : ConeTypeAliasSymbol, AbstractFirBasedSymbol<FirTypeAlias>() {
override fun toLookupTag(): ConeClassLikeLookupTag = TypeAliasLookupTagImpl(classId)
override fun equals(other: Any?): Boolean =
other is FirTypeAliasSymbol && classId == other.classId && fir == other.fir
override fun hashCode(): Int {
var result = 31
result = result * 19 + classId.hashCode()
result = result * 19 + fir.hashCode()
return result
}
}
class TypeAliasLookupTagImpl(
override val classId: ClassId
) : ConeTypeAliasLookupTag()
@@ -5,17 +5,22 @@
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.FirVariable
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.Name
open class FirPropertySymbol(callableId: CallableId) : FirVariableSymbol(callableId), ConePropertySymbol
class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol(callableId)
open class FirVariableSymbol(override val callableId: CallableId) : ConeVariableSymbol, FirCallableSymbol() {
open class FirVariableSymbol<D : FirVariable<D>>(override val callableId: CallableId) : ConeVariableSymbol, FirCallableSymbol<D>() {
@Deprecated("TODO: Better solution for local vars?")
constructor(name: Name) : this(CallableId(name)) // TODO?
}
open class FirPropertySymbol(callableId: CallableId) : ConePropertySymbol, FirVariableSymbol<FirProperty>(callableId)
class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirProperty>(callableId)
class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirField>(callableId)
@@ -24,11 +24,11 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(declaration, data)
}
open fun transformCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: D): CompositeTransformResult<FirDeclaration> {
open fun <F : FirCallableDeclaration<F>> transformCallableDeclaration(callableDeclaration: FirCallableDeclaration<F>, data: D): CompositeTransformResult<FirDeclaration> {
return transformDeclaration(callableDeclaration, data)
}
open fun transformCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): CompositeTransformResult<FirDeclaration> {
open fun <F : FirCallableMemberDeclaration<F>> transformCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration<F>, data: D): CompositeTransformResult<FirDeclaration> {
return transformDeclaration(callableMemberDeclaration, data)
}
@@ -48,18 +48,22 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformFunction(anonymousFunction, data)
}
open fun <F : FirMemberFunction<F>> transformMemberFunction(memberFunction: FirMemberFunction<F>, data: D): CompositeTransformResult<FirDeclaration> {
return transformFunction(memberFunction, data)
}
open fun transformConstructor(constructor: FirConstructor, data: D): CompositeTransformResult<FirDeclaration> {
return transformFunction(constructor, data)
return transformMemberFunction(constructor, data)
}
open fun transformNamedFunction(namedFunction: FirNamedFunction, data: D): CompositeTransformResult<FirDeclaration> {
return transformMemberFunction(namedFunction, data)
}
open fun transformModifiableFunction(modifiableFunction: FirModifiableFunction, data: D): CompositeTransformResult<FirDeclaration> {
return transformFunction(modifiableFunction, data)
}
open fun transformNamedFunction(namedFunction: FirNamedFunction, data: D): CompositeTransformResult<FirDeclaration> {
return transformFunction(namedFunction, data)
}
open fun transformPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: D): CompositeTransformResult<FirDeclaration> {
return transformFunction(propertyAccessor, data)
}
@@ -84,7 +88,7 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformNamedDeclaration(memberDeclaration, data)
}
open fun transformClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration, data: D): CompositeTransformResult<FirDeclaration> {
open fun <F : FirClassLikeDeclaration<F>> transformClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration<F>, data: D): CompositeTransformResult<FirDeclaration> {
return transformMemberDeclaration(classLikeDeclaration, data)
}
@@ -116,7 +120,7 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformDeclaration(valueParameter, data)
}
open fun transformVariable(variable: FirVariable, data: D): CompositeTransformResult<FirDeclaration> {
open fun <F : FirVariable<F>> transformVariable(variable: FirVariable<F>, data: D): CompositeTransformResult<FirDeclaration> {
return transformDeclaration(variable, data)
}
@@ -488,11 +492,11 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformCallWithArgumentList(callWithArgumentList, data)
}
final override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: D): CompositeTransformResult<FirElement> {
final override fun <F : FirCallableDeclaration<F>> visitCallableDeclaration(callableDeclaration: FirCallableDeclaration<F>, data: D): CompositeTransformResult<FirElement> {
return transformCallableDeclaration(callableDeclaration, data)
}
final override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): CompositeTransformResult<FirElement> {
final override fun <F : FirCallableMemberDeclaration<F>> visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration<F>, data: D): CompositeTransformResult<FirElement> {
return transformCallableMemberDeclaration(callableMemberDeclaration, data)
}
@@ -508,7 +512,7 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformClass(klass, data)
}
final override fun visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration, data: D): CompositeTransformResult<FirElement> {
final override fun <F : FirClassLikeDeclaration<F>> visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration<F>, data: D): CompositeTransformResult<FirElement> {
return transformClassLikeDeclaration(classLikeDeclaration, data)
}
@@ -648,6 +652,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformMemberDeclaration(memberDeclaration, data)
}
final override fun <F : FirMemberFunction<F>> visitMemberFunction(memberFunction: FirMemberFunction<F>, data: D): CompositeTransformResult<FirElement> {
return transformMemberFunction(memberFunction, data)
}
final override fun visitModifiableClass(modifiableClass: FirModifiableClass, data: D): CompositeTransformResult<FirElement> {
return transformModifiableClass(modifiableClass, data)
}
@@ -828,7 +836,7 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformValueParameter(valueParameter, data)
}
final override fun visitVariable(variable: FirVariable, data: D): CompositeTransformResult<FirElement> {
final override fun <F : FirVariable<F>> visitVariable(variable: FirVariable<F>, data: D): CompositeTransformResult<FirElement> {
return transformVariable(variable, data)
}
@@ -24,11 +24,11 @@ abstract class FirVisitor<out R, in D> {
return visitElement(declaration, data)
}
open fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: D): R {
open fun <F : FirCallableDeclaration<F>> visitCallableDeclaration(callableDeclaration: FirCallableDeclaration<F>, data: D): R {
return visitDeclaration(callableDeclaration, data)
}
open fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): R {
open fun <F : FirCallableMemberDeclaration<F>> visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration<F>, data: D): R {
return visitDeclaration(callableMemberDeclaration, data)
}
@@ -48,18 +48,22 @@ abstract class FirVisitor<out R, in D> {
return visitFunction(anonymousFunction, data)
}
open fun <F : FirMemberFunction<F>> visitMemberFunction(memberFunction: FirMemberFunction<F>, data: D): R {
return visitFunction(memberFunction, data)
}
open fun visitConstructor(constructor: FirConstructor, data: D): R {
return visitFunction(constructor, data)
return visitMemberFunction(constructor, data)
}
open fun visitNamedFunction(namedFunction: FirNamedFunction, data: D): R {
return visitMemberFunction(namedFunction, data)
}
open fun visitModifiableFunction(modifiableFunction: FirModifiableFunction, data: D): R {
return visitFunction(modifiableFunction, data)
}
open fun visitNamedFunction(namedFunction: FirNamedFunction, data: D): R {
return visitFunction(namedFunction, data)
}
open fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: D): R {
return visitFunction(propertyAccessor, data)
}
@@ -84,7 +88,7 @@ abstract class FirVisitor<out R, in D> {
return visitNamedDeclaration(memberDeclaration, data)
}
open fun visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration, data: D): R {
open fun <F : FirClassLikeDeclaration<F>> visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration<F>, data: D): R {
return visitMemberDeclaration(classLikeDeclaration, data)
}
@@ -116,7 +120,7 @@ abstract class FirVisitor<out R, in D> {
return visitDeclaration(valueParameter, data)
}
open fun visitVariable(variable: FirVariable, data: D): R {
open fun <F : FirVariable<F>> visitVariable(variable: FirVariable<F>, data: D): R {
return visitDeclaration(variable, data)
}
@@ -24,11 +24,11 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(declaration, null)
}
open fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) {
open fun <F : FirCallableDeclaration<F>> visitCallableDeclaration(callableDeclaration: FirCallableDeclaration<F>) {
visitDeclaration(callableDeclaration, null)
}
open fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration) {
open fun <F : FirCallableMemberDeclaration<F>> visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration<F>) {
visitDeclaration(callableMemberDeclaration, null)
}
@@ -48,18 +48,22 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitFunction(anonymousFunction, null)
}
open fun <F : FirMemberFunction<F>> visitMemberFunction(memberFunction: FirMemberFunction<F>) {
visitFunction(memberFunction, null)
}
open fun visitConstructor(constructor: FirConstructor) {
visitFunction(constructor, null)
visitMemberFunction(constructor, null)
}
open fun visitNamedFunction(namedFunction: FirNamedFunction) {
visitMemberFunction(namedFunction, null)
}
open fun visitModifiableFunction(modifiableFunction: FirModifiableFunction) {
visitFunction(modifiableFunction, null)
}
open fun visitNamedFunction(namedFunction: FirNamedFunction) {
visitFunction(namedFunction, null)
}
open fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor) {
visitFunction(propertyAccessor, null)
}
@@ -84,7 +88,7 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitNamedDeclaration(memberDeclaration, null)
}
open fun visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration) {
open fun <F : FirClassLikeDeclaration<F>> visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration<F>) {
visitMemberDeclaration(classLikeDeclaration, null)
}
@@ -116,7 +120,7 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitDeclaration(valueParameter, null)
}
open fun visitVariable(variable: FirVariable) {
open fun <F : FirVariable<F>> visitVariable(variable: FirVariable<F>) {
visitDeclaration(variable, null)
}
@@ -488,11 +492,11 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitCallWithArgumentList(callWithArgumentList)
}
final override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: Nothing?) {
final override fun <F : FirCallableDeclaration<F>> visitCallableDeclaration(callableDeclaration: FirCallableDeclaration<F>, data: Nothing?) {
visitCallableDeclaration(callableDeclaration)
}
final override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: Nothing?) {
final override fun <F : FirCallableMemberDeclaration<F>> visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration<F>, data: Nothing?) {
visitCallableMemberDeclaration(callableMemberDeclaration)
}
@@ -508,7 +512,7 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitClass(klass)
}
final override fun visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration, data: Nothing?) {
final override fun <F : FirClassLikeDeclaration<F>> visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration<F>, data: Nothing?) {
visitClassLikeDeclaration(classLikeDeclaration)
}
@@ -648,6 +652,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitMemberDeclaration(memberDeclaration)
}
final override fun <F : FirMemberFunction<F>> visitMemberFunction(memberFunction: FirMemberFunction<F>, data: Nothing?) {
visitMemberFunction(memberFunction)
}
final override fun visitModifiableClass(modifiableClass: FirModifiableClass, data: Nothing?) {
visitModifiableClass(modifiableClass)
}
@@ -828,7 +836,7 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitValueParameter(valueParameter)
}
final override fun visitVariable(variable: FirVariable, data: Nothing?) {
final override fun <F : FirVariable<F>> visitVariable(variable: FirVariable<F>, data: Nothing?) {
visitVariable(variable)
}