FIR: replace UnambiguousFqName with ClassId

This commit is contained in:
Mikhail Glukhikh
2018-03-20 15:39:02 +03:00
parent 6c8a326e15
commit be35b904f2
20 changed files with 65 additions and 95 deletions
@@ -1,22 +0,0 @@
/*
* 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
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
/*
* 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.
*/
data class UnambiguousFqName(val packageFqName: FqNameUnsafe, val classFqName: FqName) {
override fun toString(): String {
return packageFqName.asString() + "/" + classFqName.asString()
}
}
@@ -5,8 +5,8 @@
package org.jetbrains.kotlin.fir.descriptors package org.jetbrains.kotlin.fir.descriptors
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.name.ClassId
interface ConeDescriptor interface ConeDescriptor
@@ -16,7 +16,7 @@ interface ConeClassifierDescriptor : ConeDescriptor
interface ConeClassifierDescriptorWithTypeParameters : ConeClassifierDescriptor { interface ConeClassifierDescriptorWithTypeParameters : ConeClassifierDescriptor {
val typeParameters: List<ConeTypeParameterDescriptor> val typeParameters: List<ConeTypeParameterDescriptor>
val fqName: UnambiguousFqName val fqName: ClassId
} }
interface ConeTypeParameterDescriptor : ConeClassifierDescriptor interface ConeTypeParameterDescriptor : ConeClassifierDescriptor
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.types package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.fir.UnambiguousFqName import org.jetbrains.kotlin.name.ClassId
sealed class ConeKotlinTypeProjection(val kind: ProjectionKind) sealed class ConeKotlinTypeProjection(val kind: ProjectionKind)
@@ -29,5 +29,5 @@ abstract class ConeKotlinType : ConeKotlinTypeProjection(ProjectionKind.INVARIAN
} }
abstract class ConeClassType : ConeKotlinType() { abstract class ConeClassType : ConeKotlinType() {
abstract val fqName: UnambiguousFqName abstract val fqName: ClassId
} }
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.fir.types.impl package org.jetbrains.kotlin.fir.types.impl
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.ClassId
class ConeClassTypeImpl( class ConeClassTypeImpl(
override val fqName: UnambiguousFqName, override val fqName: ClassId,
override val typeArguments: List<ConeKotlinTypeProjection> override val typeArguments: List<ConeKotlinTypeProjection>
) : ConeClassType() ) : ConeClassType()
@@ -5,16 +5,16 @@
package org.jetbrains.kotlin.descriptors package org.jetbrains.kotlin.descriptors
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.declarations.FirResolvedClass import org.jetbrains.kotlin.fir.declarations.FirResolvedClass
import org.jetbrains.kotlin.fir.descriptors.ConeClassDescriptor import org.jetbrains.kotlin.fir.descriptors.ConeClassDescriptor
import org.jetbrains.kotlin.fir.descriptors.ConeClassifierDescriptor import org.jetbrains.kotlin.fir.descriptors.ConeClassifierDescriptor
import org.jetbrains.kotlin.fir.descriptors.ConeTypeParameterDescriptor import org.jetbrains.kotlin.fir.descriptors.ConeTypeParameterDescriptor
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.name.ClassId
class ConeClassDescriptorImpl( class ConeClassDescriptorImpl(
override val typeParameters: List<ConeTypeParameterDescriptor>, override val typeParameters: List<ConeTypeParameterDescriptor>,
override val fqName: UnambiguousFqName, override val fqName: ClassId,
override val superTypes: List<ConeKotlinType>, override val superTypes: List<ConeKotlinType>,
override val nestedClassifiers: List<ConeClassifierDescriptor> override val nestedClassifiers: List<ConeClassifierDescriptor>
) : ConeClassDescriptor, AbstractFirBasedDescriptor<FirResolvedClass>() { ) : ConeClassDescriptor, AbstractFirBasedDescriptor<FirResolvedClass>() {
@@ -7,34 +7,29 @@ package org.jetbrains.kotlin.descriptors
import org.jetbrains.kotlin.fir.FirDescriptorOwner import org.jetbrains.kotlin.fir.FirDescriptorOwner
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.UnambiguousFqName import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvedClass
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedClassImpl import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedClassImpl
import org.jetbrains.kotlin.fir.descriptors.ConeClassifierDescriptor import org.jetbrains.kotlin.fir.descriptors.ConeClassifierDescriptor
import org.jetbrains.kotlin.fir.descriptors.ConeTypeParameterDescriptor import org.jetbrains.kotlin.fir.descriptors.ConeTypeParameterDescriptor
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
import org.jetbrains.kotlin.fir.scopes.FirImportingScope
import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeImportingScope
import org.jetbrains.kotlin.fir.scopes.impl.FirExplicitImportingScope
import org.jetbrains.kotlin.fir.scopes.impl.FirSelfImportingScope
import org.jetbrains.kotlin.fir.types.FirResolvedType import org.jetbrains.kotlin.fir.types.FirResolvedType
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeImpl
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
class FirClassifierResolveTransformer : FirTransformer<Nothing?>() { class FirClassifierResolveTransformer : FirTransformer<Nothing?>() {
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> { override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
return element.compose() return element.compose()
} }
lateinit var packageFqName: FqNameUnsafe lateinit var packageFqName: FqName
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> { override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
packageFqName = file.packageFqName.toUnsafe() packageFqName = file.packageFqName
return file.also { it.transformChildren(this, null) }.compose() return file.also { it.transformChildren(this, null) }.compose()
} }
@@ -60,7 +55,7 @@ class FirClassifierResolveTransformer : FirTransformer<Nothing?>() {
val descriptor = ConeClassDescriptorImpl( val descriptor = ConeClassDescriptorImpl(
typeParameters, typeParameters,
UnambiguousFqName(packageFqName, actualClassName), ClassId(packageFqName, actualClassName, false),
superTypes, superTypes,
nestedClassifiers nestedClassifiers
) )
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.descriptors package org.jetbrains.kotlin.descriptors
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirImport import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
@@ -14,6 +13,7 @@ import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
class FirImportResolveTransformer : FirTransformer<Nothing?>() { class FirImportResolveTransformer : FirTransformer<Nothing?>() {
@@ -37,7 +37,7 @@ class FirImportResolveTransformer : FirTransformer<Nothing?>() {
lastPart.add(0, firstPart.shortName().asString()) lastPart.add(0, firstPart.shortName().asString())
firstPart = firstPart.parent() firstPart = firstPart.parent()
val resolvedFqName = UnambiguousFqName(firstPart.toUnsafe(), FqName.fromSegments(lastPart)) val resolvedFqName = ClassId(firstPart, FqName.fromSegments(lastPart), false)
val foundClassifier = firProvider.getFirClassifierByFqName(resolvedFqName) val foundClassifier = firProvider.getFirClassifierByFqName(resolvedFqName)
if (foundClassifier != null) { if (foundClassifier != null) {
@@ -29,7 +29,7 @@ class FirTypeResolveTransformer : FirTransformer<Nothing?>() {
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> { override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
importingScope = FirCompositeImportingScope( importingScope = FirCompositeImportingScope(
FirExplicitImportingScope(file.imports), FirExplicitImportingScope(file.imports),
FirSelfImportingScope(file.packageFqName.toUnsafe(), file.session) FirSelfImportingScope(file.packageFqName, file.session)
) )
return file.also { it.transformChildren(this, null) }.compose() return file.also { it.transformChildren(this, null) }.compose()
} }
@@ -6,23 +6,23 @@
package org.jetbrains.kotlin.fir.resolve package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.service import org.jetbrains.kotlin.fir.service
import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface FirProvider { interface FirProvider {
fun getFirFilesByPackage(fqName: FqNameUnsafe): List<FirFile> fun getFirClassifierByFqName(fqName: ClassId): FirMemberDeclaration?
fun getFirClassifierByFqName(fqName: UnambiguousFqName): FirMemberDeclaration? fun getFirTypeParameterByFqName(fqName: ClassId, parameterName: Name): FirTypeParameter?
fun getFirTypeParameterByFqName(fqName: UnambiguousFqName, parameterName: Name): FirTypeParameter?
companion object { companion object {
fun getInstance(session: FirSession): FirProvider = session.service() fun getInstance(session: FirSession): FirProvider = session.service()
} }
fun getFirFilesByPackage(fqName: FqName): List<FirFile>
} }
@@ -6,14 +6,14 @@
package org.jetbrains.kotlin.fir.resolve package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.service import org.jetbrains.kotlin.fir.service
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirQualifierPart import org.jetbrains.kotlin.fir.types.FirQualifierPart
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
interface FirQualifierResolver { interface FirQualifierResolver {
fun resolveTypeWithPrefix(parts: List<FirQualifierPart>, prefix: UnambiguousFqName): ConeKotlinType? fun resolveTypeWithPrefix(parts: List<FirQualifierPart>, prefix: ClassId): ConeKotlinType?
fun resolveType(parts: List<FirQualifierPart>): ConeKotlinType? fun resolveType(parts: List<FirQualifierPart>): ConeKotlinType?
@@ -7,18 +7,17 @@ package org.jetbrains.kotlin.fir.resolve.impl
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.FirProvider import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirProviderImpl(val session: FirSession) : FirProvider { class FirProviderImpl(val session: FirSession) : FirProvider {
fun recordFile(file: FirFile) { fun recordFile(file: FirFile) {
val packageName = file.packageFqName.toUnsafe() val packageName = file.packageFqName
fileMap.merge(packageName, listOf(file)) { a, b -> a + b } fileMap.merge(packageName, listOf(file)) { a, b -> a + b }
file.acceptChildren(object : FirVisitorVoid() { file.acceptChildren(object : FirVisitorVoid() {
@@ -28,7 +27,7 @@ class FirProviderImpl(val session: FirSession) : FirProvider {
override fun visitClass(klass: FirClass) { override fun visitClass(klass: FirClass) {
val fqName = containerFqName.child(klass.name) val fqName = containerFqName.child(klass.name)
classifierMap[UnambiguousFqName(packageName, fqName)] = klass classifierMap[ClassId(packageName, fqName, false)] = klass
containerFqName = fqName containerFqName = fqName
klass.acceptChildren(this) klass.acceptChildren(this)
@@ -37,25 +36,23 @@ class FirProviderImpl(val session: FirSession) : FirProvider {
override fun visitTypeAlias(typeAlias: FirTypeAlias) { override fun visitTypeAlias(typeAlias: FirTypeAlias) {
val fqName = containerFqName.child(typeAlias.name) val fqName = containerFqName.child(typeAlias.name)
classifierMap[UnambiguousFqName(packageName, fqName)] = typeAlias classifierMap[ClassId(packageName, fqName, false)] = typeAlias
} }
}) })
} }
private val fileMap = mutableMapOf<FqNameUnsafe, List<FirFile>>() private val fileMap = mutableMapOf<FqName, List<FirFile>>()
private val classifierMap = mutableMapOf<UnambiguousFqName, FirMemberDeclaration>() private val classifierMap = mutableMapOf<ClassId, FirMemberDeclaration>()
override fun getFirFilesByPackage(fqName: FqNameUnsafe): List<FirFile> {
override fun getFirFilesByPackage(fqName: FqName): List<FirFile> {
return fileMap[fqName].orEmpty() return fileMap[fqName].orEmpty()
} }
override fun getFirClassifierByFqName(fqName: UnambiguousFqName): FirMemberDeclaration? { override fun getFirClassifierByFqName(fqName: ClassId): FirMemberDeclaration? {
return classifierMap[fqName] return classifierMap[fqName]
} }
override fun getFirTypeParameterByFqName(fqName: UnambiguousFqName, parameterName: Name): FirTypeParameter? { override fun getFirTypeParameterByFqName(fqName: ClassId, parameterName: Name): FirTypeParameter? {
val typeParameterContainer = (getFirClassifierByFqName(fqName) as? FirTypeParameterContainer) ?: return null val typeParameterContainer = (getFirClassifierByFqName(fqName) as? FirTypeParameterContainer) ?: return null
// TODO: Optimize search here // TODO: Optimize search here
return typeParameterContainer.typeParameters.find { it.name == parameterName } return typeParameterContainer.typeParameters.find { it.name == parameterName }
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.fir.resolve.impl package org.jetbrains.kotlin.fir.resolve.impl
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.resolve.FirProvider import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver
@@ -14,12 +13,13 @@ import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeKotlinTypeProjectionInImpl import org.jetbrains.kotlin.fir.types.impl.ConeKotlinTypeProjectionInImpl
import org.jetbrains.kotlin.fir.types.impl.ConeKotlinTypeProjectionOutImpl import org.jetbrains.kotlin.fir.types.impl.ConeKotlinTypeProjectionOutImpl
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver { class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver {
private fun FirMemberDeclaration.toConeKotlinType(fqName: UnambiguousFqName, parts: List<FirQualifierPart>): ConeKotlinType? { private fun FirMemberDeclaration.toConeKotlinType(fqName: ClassId, parts: List<FirQualifierPart>): ConeKotlinType? {
return ConeClassTypeImpl(fqName, parts.flatMap { return ConeClassTypeImpl(fqName, parts.flatMap {
it.typeArguments.map { it.typeArguments.map {
when (it) { when (it) {
@@ -38,10 +38,14 @@ class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver {
}) })
} }
override fun resolveTypeWithPrefix(parts: List<FirQualifierPart>, prefix: UnambiguousFqName): ConeKotlinType? { override fun resolveTypeWithPrefix(parts: List<FirQualifierPart>, prefix: ClassId): ConeKotlinType? {
val firProvider = FirProvider.getInstance(session) val firProvider = FirProvider.getInstance(session)
val fqName = UnambiguousFqName(prefix.packageFqName, parts.fold(prefix.classFqName) { prefix, suffix -> prefix.child(suffix.name) }) val fqName = ClassId(
prefix.packageFqName,
parts.fold(prefix.relativeClassName) { prefix, suffix -> prefix.child(suffix.name) },
false
)
val foundClassifier = firProvider.getFirClassifierByFqName(fqName) val foundClassifier = firProvider.getFirClassifierByFqName(fqName)
return foundClassifier?.toConeKotlinType(fqName, parts) return foundClassifier?.toConeKotlinType(fqName, parts)
@@ -58,7 +62,7 @@ class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver {
lastPart.add(0, firstPart.last()) lastPart.add(0, firstPart.last())
firstPart.removeAt(firstPart.lastIndex) firstPart.removeAt(firstPart.lastIndex)
val fqName = UnambiguousFqName(firstPart.toFqNameUnsafe(), lastPart.toFqName()) val fqName = ClassId(firstPart.toFqName(), lastPart.toFqName(), false)
val foundClassifier = firProvider.getFirClassifierByFqName(fqName) val foundClassifier = firProvider.getFirClassifierByFqName(fqName)
if (foundClassifier != null) { if (foundClassifier != null) {
@@ -5,9 +5,9 @@
package org.jetbrains.kotlin.fir.scopes package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.kotlin.fir.UnambiguousFqName import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface FirImportingScope { interface FirImportingScope {
fun processClassifiersByName(name: Name, processor: (UnambiguousFqName) -> Boolean): Boolean fun processClassifiersByName(name: Name, processor: (ClassId) -> Boolean): Boolean
} }
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.fir.scopes.impl package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.scopes.FirImportingScope import org.jetbrains.kotlin.fir.scopes.FirImportingScope
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirCompositeImportingScope(vararg val scopes: FirImportingScope) : FirImportingScope { class FirCompositeImportingScope(vararg val scopes: FirImportingScope) : FirImportingScope {
override fun processClassifiersByName(name: Name, processor: (UnambiguousFqName) -> Boolean): Boolean { override fun processClassifiersByName(name: Name, processor: (ClassId) -> Boolean): Boolean {
for (scope in scopes) { for (scope in scopes) {
if (!scope.processClassifiersByName(name, processor)) { if (!scope.processClassifiersByName(name, processor)) {
return false return false
@@ -5,11 +5,10 @@
package org.jetbrains.kotlin.fir.scopes.impl package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.declarations.FirImport import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver
import org.jetbrains.kotlin.fir.scopes.FirImportingScope import org.jetbrains.kotlin.fir.scopes.FirImportingScope
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirExplicitImportingScope(imports: List<FirImport>) : FirImportingScope { class FirExplicitImportingScope(imports: List<FirImport>) : FirImportingScope {
@@ -18,9 +17,9 @@ class FirExplicitImportingScope(imports: List<FirImport>) : FirImportingScope {
private val simpleImports = private val simpleImports =
imports.filterIsInstance<FirResolvedImport>() imports.filterIsInstance<FirResolvedImport>()
.filter { !it.isAllUnder } .filter { !it.isAllUnder }
.groupBy { it.aliasName ?: it.resolvedFqName.classFqName.shortName() } .groupBy { it.aliasName ?: it.resolvedFqName.shortClassName }
override fun processClassifiersByName(name: Name, processor: (UnambiguousFqName) -> Boolean): Boolean { override fun processClassifiersByName(name: Name, processor: (ClassId) -> Boolean): Boolean {
val imports = simpleImports[name] ?: return true val imports = simpleImports[name] ?: return true
for (import in imports) { for (import in imports) {
if (!processor(import.resolvedFqName)) { if (!processor(import.resolvedFqName)) {
@@ -6,20 +6,18 @@
package org.jetbrains.kotlin.fir.scopes.impl package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.resolve.FirProvider import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver
import org.jetbrains.kotlin.fir.scopes.FirImportingScope import org.jetbrains.kotlin.fir.scopes.FirImportingScope
import org.jetbrains.kotlin.fir.service import org.jetbrains.kotlin.fir.service
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirSelfImportingScope(val fqName: FqNameUnsafe, val session: FirSession) : FirImportingScope { class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirImportingScope {
override fun processClassifiersByName(name: Name, processor: (UnambiguousFqName) -> Boolean): Boolean { override fun processClassifiersByName(name: Name, processor: (ClassId) -> Boolean): Boolean {
val unambiguousFqName = UnambiguousFqName(fqName, FqName.topLevel(name)) val unambiguousFqName = ClassId(fqName, name)
val firProvider = session.service<FirProvider>() val firProvider = session.service<FirProvider>()
@@ -384,7 +384,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
sb.append(packageFqName.asString().replace('.', '/')) sb.append(packageFqName.asString().replace('.', '/'))
} }
sb.append('.') sb.append('.')
sb.append(fqName.classFqName.asString()) sb.append(fqName.relativeClassName.asString())
sb.append(typeArguments.joinToString { it -> sb.append(typeArguments.joinToString { it ->
when (it) { when (it) {
StarProjection -> "*" StarProjection -> "*"
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.fir.declarations package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.ClassId
interface FirResolvedImport : FirImport { interface FirResolvedImport : FirImport {
val resolvedFqName: UnambiguousFqName val resolvedFqName: ClassId
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitResolvedImport(this, data) visitor.visitResolvedImport(this, data)
@@ -5,14 +5,14 @@
package org.jetbrains.kotlin.fir.declarations.impl package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.declarations.FirImport import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.ClassId
class FirResolvedImportImpl( class FirResolvedImportImpl(
val delegate: FirImport, val delegate: FirImport,
override val resolvedFqName: UnambiguousFqName override val resolvedFqName: ClassId
) : FirResolvedImport, FirImport by delegate { ) : FirResolvedImport, FirImport by delegate {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitResolvedImport(this, data) visitor.visitResolvedImport(this, data)
@@ -7,12 +7,11 @@ package org.jetbrains.kotlin.fir.types.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.UnambiguousFqName
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirResolvedType import org.jetbrains.kotlin.fir.types.FirResolvedType
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
sealed class FirBuiltinType( sealed class FirBuiltinType(
@@ -21,9 +20,9 @@ sealed class FirBuiltinType(
val name: String val name: String
) : FirResolvedType { ) : FirResolvedType {
final override val type: ConeKotlinType = ConeClassTypeImpl( final override val type: ConeKotlinType = ConeClassTypeImpl(
UnambiguousFqName( ClassId(
KOTLIN_PACKAGE_FQ_NAME, KOTLIN_PACKAGE_FQ_NAME,
FqName.topLevel(Name.identifier(name)) Name.identifier(name)
), emptyList() ), emptyList()
) )
@@ -33,7 +32,7 @@ sealed class FirBuiltinType(
get() = emptyList() get() = emptyList()
companion object { companion object {
private val KOTLIN_PACKAGE_FQ_NAME = FqNameUnsafe.topLevel(Name.identifier("kotlin")) private val KOTLIN_PACKAGE_FQ_NAME = FqName.topLevel(Name.identifier("kotlin"))
} }
} }