FIR: introduce class & type alias symbols

This commit is contained in:
Mikhail Glukhikh
2018-03-22 13:33:28 +03:00
parent 093a236e34
commit ce113fbe2e
23 changed files with 196 additions and 97 deletions
@@ -7,13 +7,14 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
import org.jetbrains.kotlin.fir.types.FirType
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 FirClass : FirDeclarationContainer, FirMemberDeclaration {
interface FirClass : FirDeclarationContainer, FirMemberDeclaration, FirSymbolOwner<FirClass> {
// including delegated types
val superTypes: List<FirType>
@@ -5,10 +5,11 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirTypeAlias : FirMemberDeclaration {
interface FirTypeAlias : FirMemberDeclaration, FirSymbolOwner<FirTypeAlias> {
val expandedType: FirType
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberPlatformStatus
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.name.Name
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
open class FirClassImpl(
session: FirSession,
psi: PsiElement?,
final override val symbol: FirBasedSymbol<FirClass>,
name: Name,
visibility: Visibility,
modality: Modality?,
@@ -30,6 +32,11 @@ open class FirClassImpl(
final override val isCompanion: Boolean,
final override val isData: Boolean
) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality, platformStatus), FirClass {
init {
symbol.bind(this)
}
override val superTypes = mutableListOf<FirType>()
override val declarations = mutableListOf<FirDeclaration>()
@@ -13,15 +13,18 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.FirMemberPlatformStatus
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.name.Name
class FirEnumEntryImpl(
session: FirSession,
psi: PsiElement?,
symbol: FirClassSymbol,
name: Name
) : FirClassImpl(
session,
psi,
symbol,
name,
visibility = Visibilities.UNKNOWN,
modality = Modality.FINAL,
@@ -17,6 +17,7 @@ class FirResolvedClassImpl(val delegate: FirClass, override val descriptor: FirB
FirResolvedClass, FirClass by delegate {
init {
symbol.bind(this)
descriptor.bind(this)
}
@@ -17,6 +17,7 @@ class FirResolvedEnumEntryImpl(
) : FirResolvedEnumEntry, FirEnumEntry by delegate {
init {
symbol.bind(this)
descriptor.bind(this)
}
@@ -19,6 +19,7 @@ class FirResolvedTypeAliasImpl(val delegate: FirTypeAlias, override val descript
get() = delegate.modality ?: Modality.FINAL
init {
symbol.bind(this)
descriptor.bind(this)
}
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirMemberPlatformStatus
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirType
@@ -21,11 +22,17 @@ import org.jetbrains.kotlin.name.Name
class FirTypeAliasImpl(
session: FirSession,
psi: PsiElement?,
override val symbol: FirTypeAliasSymbol,
name: Name,
visibility: Visibility,
platformStatus: FirMemberPlatformStatus,
override var expandedType: FirType
) : FirAbstractMemberDeclaration(session, psi, name, visibility, Modality.FINAL, platformStatus), FirTypeAlias {
init {
symbol.bind(this)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeParameters.transformInplace(transformer, data)
expandedType = expandedType.transformSingle(transformer, data)
@@ -19,10 +19,10 @@ import org.jetbrains.kotlin.types.Variance
class FirTypeParameterImpl(
session: FirSession,
psi: PsiElement?,
override val symbol: FirTypeParameterSymbol,
name: Name,
override val variance: Variance,
override val isReified: Boolean,
override val symbol: FirTypeParameterSymbol
override val isReified: Boolean
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirTypeParameter {
init {
symbol.bind(this)
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2018 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.symbols.impl
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
import org.jetbrains.kotlin.name.ClassId
class FirClassSymbol(override val classId: ClassId) : ConeClassSymbol, AbstractFirBasedSymbol<FirClass>() {
override val superTypes: List<ConeClassLikeType>
get() = fir.superTypes.map { it.coneTypeUnsafe<ConeClassLikeType>() }
}
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2018 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.symbols.impl
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.ConeTypeAliasSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
import org.jetbrains.kotlin.name.ClassId
class FirTypeAliasSymbol(override val classId: ClassId) : ConeTypeAliasSymbol, AbstractFirBasedSymbol<FirTypeAlias>() {
override val expansionType: ConeClassLikeType
get() = fir.expandedType.coneTypeUnsafe()
}
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.types.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.symbols.toSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirResolvedType
import org.jetbrains.kotlin.name.ClassId
@@ -21,10 +21,12 @@ sealed class FirBuiltinType(
val name: String
) : FirResolvedType {
final override val type: ConeKotlinType = ConeClassTypeImpl(
ClassId(
KOTLIN_PACKAGE_FQ_NAME,
Name.identifier(name)
).toSymbol(),
FirClassSymbol(
ClassId(
KOTLIN_PACKAGE_FQ_NAME,
Name.identifier(name)
)
),
emptyList()
)