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