FIR: introduce symbols + type parameter resolve #KT-24064 Fixed
This commit is contained in:
+1
-1
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
class ConeClassDescriptorImpl(
|
||||
override val typeParameters: List<ConeTypeParameterDescriptor>,
|
||||
override val fqName: ClassId,
|
||||
override val classId: ClassId,
|
||||
override val superTypes: List<ConeKotlinType>,
|
||||
override val nestedClassifiers: List<ConeClassifierDescriptor>
|
||||
) : ConeClassDescriptor, AbstractFirBasedDescriptor<FirResolvedClass>()
|
||||
+1
-1
@@ -13,6 +13,6 @@ import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
class ConeTypeAliasDescriptorImpl(
|
||||
override val typeParameters: List<ConeTypeParameterDescriptor>,
|
||||
override val fqName: ClassId,
|
||||
override val classId: ClassId,
|
||||
override val expandedType: ConeKotlinType
|
||||
) : ConeTypeAliasDescriptor, AbstractFirBasedDescriptor<FirResolvedTypeAlias>()
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* 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.descriptors
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvedTypeParameter
|
||||
import org.jetbrains.kotlin.fir.descriptors.ConeTypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class ConeTypeParameterDescriptorImpl(
|
||||
override val symbol: ConeTypeParameterSymbol
|
||||
) : ConeTypeParameterDescriptor, AbstractFirBasedDescriptor<FirResolvedTypeParameter>()
|
||||
+38
-5
@@ -10,14 +10,18 @@ import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedClassImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedTypeAliasImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedTypeParameterImpl
|
||||
import org.jetbrains.kotlin.fir.descriptors.ConeClassifierDescriptor
|
||||
import org.jetbrains.kotlin.fir.descriptors.ConeTypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.toSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedType
|
||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.compose
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirClassifierResolveTransformer : FirTransformer<Nothing?>() {
|
||||
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
|
||||
@@ -31,11 +35,11 @@ class FirClassifierResolveTransformer : FirTransformer<Nothing?>() {
|
||||
return file.also { it.transformChildren(this, null) }.compose()
|
||||
}
|
||||
|
||||
var className: FqName = FqName.ROOT
|
||||
private var classLikeName: FqName = FqName.ROOT
|
||||
|
||||
override fun transformClass(klass: FirClass, data: Nothing?): CompositeTransformResult<FirDeclaration> {
|
||||
val actualClassName = className.child(klass.name)
|
||||
className = actualClassName
|
||||
val actualClassName = classLikeName.child(klass.name)
|
||||
classLikeName = actualClassName
|
||||
|
||||
klass.transformChildren(this, data)
|
||||
|
||||
@@ -43,7 +47,7 @@ class FirClassifierResolveTransformer : FirTransformer<Nothing?>() {
|
||||
(it as FirResolvedType).type
|
||||
}
|
||||
|
||||
className = className.parent()
|
||||
classLikeName = classLikeName.parent()
|
||||
|
||||
val typeParameters =
|
||||
klass.typeParameters.filterIsInstance<FirDescriptorOwner<*>>().mapNotNull { it.descriptor as? ConeTypeParameterDescriptor }
|
||||
@@ -65,15 +69,30 @@ class FirClassifierResolveTransformer : FirTransformer<Nothing?>() {
|
||||
return resolvedClass.compose()
|
||||
}
|
||||
|
||||
var memberName: Name? = null
|
||||
|
||||
override fun transformNamedFunction(namedFunction: FirNamedFunction, data: Nothing?): CompositeTransformResult<FirDeclaration> {
|
||||
memberName = namedFunction.name
|
||||
return super.transformNamedFunction(namedFunction, data).also {
|
||||
memberName = null
|
||||
}
|
||||
}
|
||||
|
||||
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Nothing?): CompositeTransformResult<FirDeclaration> {
|
||||
val actualClassName = classLikeName.child(typeAlias.name)
|
||||
classLikeName = actualClassName
|
||||
|
||||
typeAlias.transformChildren(this, data)
|
||||
|
||||
classLikeName = classLikeName.parent()
|
||||
|
||||
val expandedType = (typeAlias.expandedType as FirResolvedType).type
|
||||
val typeParameters =
|
||||
typeAlias.typeParameters.filterIsInstance<FirDescriptorOwner<*>>().mapNotNull { it.descriptor as? ConeTypeParameterDescriptor }
|
||||
|
||||
val descriptor = ConeTypeAliasDescriptorImpl(
|
||||
typeParameters,
|
||||
ClassId(packageFqName, className.child(typeAlias.name), false),
|
||||
ClassId(packageFqName, classLikeName.child(typeAlias.name), false),
|
||||
expandedType
|
||||
)
|
||||
|
||||
@@ -86,4 +105,18 @@ class FirClassifierResolveTransformer : FirTransformer<Nothing?>() {
|
||||
): CompositeTransformResult<FirDeclaration> {
|
||||
return resolvedTypeAlias.compose()
|
||||
}
|
||||
|
||||
override fun transformResolvedTypeParameter(
|
||||
resolvedTypeParameter: FirResolvedTypeParameter,
|
||||
data: Nothing?
|
||||
): CompositeTransformResult<FirDeclaration> {
|
||||
return resolvedTypeParameter.compose()
|
||||
}
|
||||
|
||||
override fun transformTypeParameter(typeParameter: FirTypeParameter, data: Nothing?): CompositeTransformResult<FirDeclaration> {
|
||||
typeParameter.transformChildren(this, data)
|
||||
|
||||
val descriptor = ConeTypeParameterDescriptorImpl(typeParameter.symbol)
|
||||
return FirResolvedTypeParameterImpl(typeParameter, descriptor).compose()
|
||||
}
|
||||
}
|
||||
+41
-22
@@ -6,16 +6,11 @@
|
||||
package org.jetbrains.kotlin.descriptors
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
|
||||
import org.jetbrains.kotlin.fir.FirRenderer
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirExplicitImportingScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirNestedClassifierScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirSelfImportingScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.*
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeImpl
|
||||
@@ -26,6 +21,8 @@ import org.jetbrains.kotlin.fir.visitors.compose
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
fun FirElement.render(): String = buildString { this@render.accept(FirRenderer(this)) }
|
||||
|
||||
class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransformer<Nothing?>() {
|
||||
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
|
||||
return if (superTypesOnly) {
|
||||
@@ -37,7 +34,7 @@ class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransf
|
||||
|
||||
lateinit var scope: FirCompositeScope
|
||||
lateinit var packageFqName: FqName
|
||||
var className: FqName = FqName.ROOT
|
||||
private var classLikeName: FqName = FqName.ROOT
|
||||
|
||||
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
|
||||
scope = FirCompositeScope(
|
||||
@@ -56,26 +53,48 @@ class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransf
|
||||
return superTypesBuilder.classes
|
||||
}
|
||||
|
||||
override fun transformClass(klass: FirClass, data: Nothing?): CompositeTransformResult<FirDeclaration> {
|
||||
klass.transformChildren(SuperTypeResolver(), null)
|
||||
className = className.child(klass.name)
|
||||
private fun resolveSuperTypesAndExpansions(element: FirMemberDeclaration) {
|
||||
try {
|
||||
element.transformChildren(SuperTypeResolver(), null)
|
||||
} catch (e: Exception) {
|
||||
class SuperTypeResolveException(cause: Exception) : Exception(element.render(), cause)
|
||||
throw SuperTypeResolveException(e)
|
||||
}
|
||||
}
|
||||
|
||||
scope.scopes += FirNestedClassifierScope(ClassId(packageFqName, className, false), klass.session)
|
||||
scope.scopes.addAll(lookupSuperTypes(klass).map { FirNestedClassifierScope(it, klass.session) })
|
||||
override fun transformClass(klass: FirClass, data: Nothing?): CompositeTransformResult<FirDeclaration> {
|
||||
classLikeName = classLikeName.child(klass.name)
|
||||
val classId = ClassId(packageFqName, classLikeName, false)
|
||||
scope = FirCompositeScope(mutableListOf(scope))
|
||||
scope.scopes += FirClassLikeTypeParameterScope(classId, klass.session)
|
||||
resolveSuperTypesAndExpansions(klass)
|
||||
|
||||
scope.scopes += FirNestedClassifierScope(classId, klass.session)
|
||||
val superTypeScopes = lookupSuperTypes(klass).map { FirNestedClassifierScope(it, klass.session) }
|
||||
scope.scopes.addAll(superTypeScopes)
|
||||
val result = super.transformClass(klass, data)
|
||||
scope.scopes.also { it.removeAt(it.lastIndex) }
|
||||
className = className.parent()
|
||||
scope = scope.scopes[0] as FirCompositeScope
|
||||
classLikeName = classLikeName.parent()
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Nothing?): CompositeTransformResult<FirDeclaration> {
|
||||
typeAlias.transformChildren(SuperTypeResolver(), null)
|
||||
classLikeName = classLikeName.child(typeAlias.name)
|
||||
val classId = ClassId(packageFqName, classLikeName, false)
|
||||
scope = FirCompositeScope(mutableListOf(scope))
|
||||
scope.scopes += FirClassLikeTypeParameterScope(classId, typeAlias.session)
|
||||
|
||||
resolveSuperTypesAndExpansions(typeAlias)
|
||||
|
||||
scope = scope.scopes[0] as FirCompositeScope
|
||||
classLikeName = classLikeName.parent()
|
||||
return super.transformTypeAlias(typeAlias, data)
|
||||
}
|
||||
|
||||
override fun transformType(type: FirType, data: Nothing?): CompositeTransformResult<FirType> {
|
||||
val typeResolver = FirTypeResolver.getInstance(type.session)
|
||||
type.transformChildren(this, data)
|
||||
return FirResolvedTypeImpl(
|
||||
type.session,
|
||||
type.psi,
|
||||
@@ -98,7 +117,7 @@ class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransf
|
||||
override fun transformType(type: FirType, data: Nothing?): CompositeTransformResult<FirType> {
|
||||
val transformedType = this@FirTypeResolveTransformer.transformType(type, data).single as FirResolvedType
|
||||
|
||||
val classId = (transformedType.type as? ConeClassType)?.fqName ?: return transformedType.compose()
|
||||
val classId = (transformedType.type as? ConeClassLikeType)?.symbol?.classId ?: return transformedType.compose()
|
||||
val firProvider = FirProvider.getInstance(transformedType.session)
|
||||
|
||||
val classes = generateSequence(classId) { it.outerClassId }.toList()
|
||||
@@ -123,10 +142,10 @@ class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransf
|
||||
return false
|
||||
}
|
||||
|
||||
private tailrec fun ConeClassType.computePartialExpansion(): ClassId {
|
||||
private tailrec fun ConeClassLikeType.computePartialExpansion(): ClassId {
|
||||
return when (this) {
|
||||
!is ConeAbbreviatedType -> this.fqName
|
||||
else -> (this.directExpansion as ConeClassType).computePartialExpansion()
|
||||
!is ConeAbbreviatedType -> this.symbol.classId
|
||||
else -> this.directExpansion.computePartialExpansion()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,7 +153,7 @@ class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransf
|
||||
|
||||
override fun visitResolvedType(resolvedType: FirResolvedType, data: Nothing?): Boolean {
|
||||
val provider = FirProvider.getInstance(resolvedType.session)
|
||||
val targetClassId = resolvedType.coneTypeSafe<ConeClassType>()?.computePartialExpansion() ?: return false
|
||||
val targetClassId = resolvedType.coneTypeSafe<ConeClassLikeType>()?.computePartialExpansion() ?: return false
|
||||
val classifier = provider.getFirClassifierByFqName(targetClassId)!!
|
||||
when (classifier) {
|
||||
is FirClass -> {
|
||||
|
||||
@@ -6,22 +6,20 @@
|
||||
package org.jetbrains.kotlin.fir.resolve
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
interface FirProvider {
|
||||
fun getFirClassifierByFqName(fqName: ClassId): FirMemberDeclaration?
|
||||
|
||||
fun getFirTypeParameterByFqName(fqName: ClassId, parameterName: Name): FirTypeParameter?
|
||||
fun getFirClassifierByFqName(fqName: ClassId): FirMemberDeclaration? // FirSymbol?
|
||||
|
||||
fun getFirClassifierContainerFile(fqName: ClassId): FirFile
|
||||
|
||||
fun getFirClassifierBySymbol(symbol: ConeSymbol): FirMemberDeclaration?
|
||||
|
||||
companion object {
|
||||
fun getInstance(session: FirSession): FirProvider = session.service()
|
||||
}
|
||||
|
||||
@@ -9,12 +9,22 @@ import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirProviderImpl(val session: FirSession) : FirProvider {
|
||||
override fun getFirClassifierBySymbol(symbol: ConeSymbol): FirMemberDeclaration? {
|
||||
return when(symbol) {
|
||||
is FirBasedSymbol<*> -> symbol.fir as? FirMemberDeclaration
|
||||
is ConeClassLikeSymbol -> getFirClassifierByFqName(symbol.classId)
|
||||
else -> error("!")
|
||||
}
|
||||
}
|
||||
|
||||
override fun getFirClassifierContainerFile(fqName: ClassId): FirFile {
|
||||
return classifierContainerFileMap[fqName] ?: error("Couldn't find container for $fqName")
|
||||
}
|
||||
@@ -60,9 +70,4 @@ class FirProviderImpl(val session: FirSession) : FirProvider {
|
||||
return classifierMap[fqName]
|
||||
}
|
||||
|
||||
override fun getFirTypeParameterByFqName(fqName: ClassId, parameterName: Name): FirTypeParameter? {
|
||||
val typeParameterContainer = (getFirClassifierByFqName(fqName) as? FirTypeParameterContainer) ?: return null
|
||||
// TODO: Optimize search here
|
||||
return typeParameterContainer.typeParameters.find { it.name == parameterName }
|
||||
}
|
||||
}
|
||||
+11
-11
@@ -11,11 +11,9 @@ import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
|
||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver
|
||||
import org.jetbrains.kotlin.fir.symbols.toSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeAbbreviatedTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeKotlinTypeProjectionInImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeKotlinTypeProjectionOutImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
@@ -42,15 +40,17 @@ class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver {
|
||||
private fun FirMemberDeclaration.toConeKotlinType(fqName: ClassId, parts: List<FirQualifierPart>): ConeKotlinType? {
|
||||
return when (this) {
|
||||
is FirClass -> {
|
||||
ConeClassTypeImpl(fqName, parts.toTypeProjections())
|
||||
ConeClassTypeImpl(fqName.toSymbol(), parts.toTypeProjections())
|
||||
}
|
||||
is FirTypeAlias -> {
|
||||
ConeAbbreviatedTypeImpl(
|
||||
abbreviationFqName = fqName,
|
||||
typeArguments = parts.toTypeProjections(),
|
||||
directExpansion = (this.expandedType as FirResolvedType).type
|
||||
)
|
||||
val expansion = expandedType.coneTypeSafe<ConeClassLikeType>()
|
||||
?: return ConeKotlinErrorType("Couldn't resolve expansion")
|
||||
|
||||
ConeAbbreviatedTypeImpl(
|
||||
abbreviationSymbol = fqName.toSymbol(),
|
||||
typeArguments = parts.toTypeProjections(),
|
||||
directExpansion = expansion
|
||||
)
|
||||
}
|
||||
else -> error("!")
|
||||
}
|
||||
@@ -61,7 +61,7 @@ class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver {
|
||||
|
||||
val fqName = ClassId(
|
||||
prefix.packageFqName,
|
||||
parts.fold(prefix.relativeClassName) { prefix, suffix -> prefix.child(suffix.name) },
|
||||
parts.drop(1).fold(prefix.relativeClassName) { prefix, suffix -> prefix.child(suffix.name) },
|
||||
false
|
||||
)
|
||||
val foundClassifier = firProvider.getFirClassifierByFqName(fqName)
|
||||
|
||||
+14
-2
@@ -8,8 +8,11 @@ package org.jetbrains.kotlin.fir.resolve.impl
|
||||
import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver
|
||||
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeKotlinErrorType
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
|
||||
class FirTypeResolverImpl : FirTypeResolver {
|
||||
override fun resolveType(type: FirType, scope: FirScope): ConeKotlinType {
|
||||
@@ -20,8 +23,17 @@ class FirTypeResolverImpl : FirTypeResolver {
|
||||
val qualifierResolver = FirQualifierResolver.getInstance(type.session)
|
||||
|
||||
var resolvedType: ConeKotlinType? = null
|
||||
scope.processClassifiersByName(type.qualifier.first().name) { fqName ->
|
||||
resolvedType = qualifierResolver.resolveTypeWithPrefix(type.qualifier.drop(1), fqName)
|
||||
scope.processClassifiersByName(type.qualifier.first().name) { symbol ->
|
||||
resolvedType = when (symbol) {
|
||||
is ConeClassLikeSymbol -> {
|
||||
qualifierResolver.resolveTypeWithPrefix(type.qualifier, symbol.classId)
|
||||
}
|
||||
is ConeTypeParameterSymbol -> {
|
||||
assert(type.qualifier.size == 1)
|
||||
ConeTypeParameterTypeImpl(symbol)
|
||||
}
|
||||
else -> error("!")
|
||||
}
|
||||
resolvedType == null
|
||||
}
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.scopes
|
||||
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
interface FirScope {
|
||||
fun processClassifiersByName(name: Name, processor: (ClassId) -> Boolean): Boolean
|
||||
fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* 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.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirClassLikeTypeParameterScope(val classId: ClassId, val session: FirSession) : FirScope {
|
||||
|
||||
private val firProvider = FirProvider.getInstance(session)
|
||||
|
||||
val typeParameters = firProvider.getFirClassifierByFqName(classId)?.typeParameters.orEmpty().groupBy { it.name }
|
||||
|
||||
override fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean {
|
||||
val matchedTypeParameters = typeParameters[name] ?: return true
|
||||
|
||||
return matchedTypeParameters.all { processor(it.symbol) }
|
||||
}
|
||||
}
|
||||
@@ -6,11 +6,11 @@
|
||||
package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirCompositeScope(val scopes: MutableList<FirScope>) : FirScope {
|
||||
override fun processClassifiersByName(name: Name, processor: (ClassId) -> Boolean): Boolean {
|
||||
override fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean {
|
||||
for (scope in scopes) {
|
||||
if (!scope.processClassifiersByName(name, processor)) {
|
||||
return false
|
||||
|
||||
+4
-3
@@ -8,7 +8,8 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirImport
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.toSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirExplicitImportingScope(imports: List<FirImport>) : FirScope {
|
||||
@@ -19,10 +20,10 @@ class FirExplicitImportingScope(imports: List<FirImport>) : FirScope {
|
||||
.filter { !it.isAllUnder }
|
||||
.groupBy { it.aliasName ?: it.resolvedFqName.shortClassName }
|
||||
|
||||
override fun processClassifiersByName(name: Name, processor: (ClassId) -> Boolean): Boolean {
|
||||
override fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean {
|
||||
val imports = simpleImports[name] ?: return true
|
||||
for (import in imports) {
|
||||
if (!processor(import.resolvedFqName)) {
|
||||
if (!processor(import.resolvedFqName.toSymbol())) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
+4
-2
@@ -9,6 +9,8 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.toSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@@ -20,8 +22,8 @@ class FirNestedClassifierScope(val classId: ClassId, val session: FirSession) :
|
||||
return firProvider.getFirClassifierByFqName(this)
|
||||
}
|
||||
|
||||
override fun processClassifiersByName(name: Name, processor: (ClassId) -> Boolean): Boolean {
|
||||
override fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean {
|
||||
val child = ClassId(classId.packageFqName, classId.relativeClassName.child(name), false)
|
||||
return child.getFir() == null || processor(child)
|
||||
return child.getFir() == null || processor(child.toSymbol())
|
||||
}
|
||||
}
|
||||
|
||||
+6
-6
@@ -9,22 +9,22 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.toSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirScope {
|
||||
override fun processClassifiersByName(name: Name, processor: (ClassId) -> Boolean): Boolean {
|
||||
|
||||
|
||||
override fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean {
|
||||
val unambiguousFqName = ClassId(fqName, name)
|
||||
|
||||
val firProvider = session.service<FirProvider>()
|
||||
|
||||
if (firProvider.getFirClassifierByFqName(unambiguousFqName) != null) {
|
||||
return processor(unambiguousFqName)
|
||||
return if (firProvider.getFirClassifierByFqName(unambiguousFqName) != null) {
|
||||
processor(unambiguousFqName.toSymbol())
|
||||
} else {
|
||||
return true
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user