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
@@ -14,8 +14,6 @@ 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
@@ -42,7 +42,7 @@ class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransf
// from high priority to low priority
FirExplicitImportingScope(file.imports),
FirSelfImportingScope(file.packageFqName, file.session),
FirStarImportingScope(file.imports)
FirStarImportingScope(file.imports, file.session)
)
)
packageFqName = file.packageFqName
@@ -15,7 +15,9 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
interface FirProvider {
fun getFirClassifierByFqName(fqName: ClassId): FirMemberDeclaration? // FirSymbol?
fun getFirClassifierByFqName(fqName: ClassId): FirMemberDeclaration?
fun getSymbolByFqName(fqName: ClassId): ConeSymbol?
fun getFirClassifierContainerFile(fqName: ClassId): FirFile
@@ -12,6 +12,7 @@ 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.symbols.FirSymbolOwner
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
@@ -25,6 +26,10 @@ class FirProviderImpl(val session: FirSession) : FirProvider {
}
}
override fun getSymbolByFqName(fqName: ClassId): ConeSymbol? {
return (getFirClassifierByFqName(fqName) as? FirSymbolOwner<*>)?.symbol
}
override fun getFirClassifierContainerFile(fqName: ClassId): FirFile {
return classifierContainerFileMap[fqName] ?: error("Couldn't find container for $fqName")
}
@@ -6,19 +6,13 @@
package org.jetbrains.kotlin.fir.resolve.impl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass
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.ConeClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
import org.jetbrains.kotlin.fir.symbols.toSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
import org.jetbrains.kotlin.fir.types.FirQualifierPart
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.types.Variance
class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver {
@@ -30,9 +24,9 @@ class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver {
parts.drop(1).fold(prefix.relativeClassName) { prefix, suffix -> prefix.child(suffix.name) },
false
)
firProvider.getFirClassifierByFqName(fqName) ?: return null
val classifier = firProvider.getFirClassifierByFqName(fqName) ?: return null
return ConeClassLikeSymbol(fqName)
return (classifier as? FirSymbolOwner<*>)?.symbol
}
override fun resolveSymbol(parts: List<FirQualifierPart>): ConeSymbol? {
@@ -48,15 +42,12 @@ class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver {
val fqName = ClassId(firstPart.toFqName(), lastPart.toFqName(), false)
val foundClassifier = firProvider.getFirClassifierByFqName(fqName)
if (foundClassifier != null) {
return ConeClassLikeSymbol(fqName)
return (foundClassifier as? FirSymbolOwner<*>)?.symbol
}
}
return null
} else {
return null
}
return null
}
private fun List<FirQualifierPart>.toFqNameUnsafe() = toFqName().toUnsafe()
@@ -7,10 +7,10 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.scopes.FirPosition
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.Name
class FirExplicitImportingScope(imports: List<FirImport>) : FirScope {
@@ -26,8 +26,11 @@ class FirExplicitImportingScope(imports: List<FirImport>) : FirScope {
processor: (ConeSymbol) -> Boolean
): Boolean {
val imports = simpleImports[name] ?: return true
if (imports.isEmpty()) return true
val provider = FirProvider.getInstance(imports.first().session)
for (import in imports) {
if (!processor(import.resolvedFqName.toSymbol())) {
val symbol = provider.getSymbolByFqName(import.resolvedFqName) ?: continue
if (!processor(symbol)) {
return false
}
}
@@ -6,12 +6,10 @@
package org.jetbrains.kotlin.fir.scopes.impl
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.FirPosition
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
@@ -19,16 +17,15 @@ class FirNestedClassifierScope(val classId: ClassId, val session: FirSession) :
private val firProvider = FirProvider.getInstance(session)
private fun ClassId.getFir(): FirMemberDeclaration? {
return firProvider.getFirClassifierByFqName(this)
}
override fun processClassifiersByName(
name: Name,
position: FirPosition,
processor: (ConeSymbol) -> Boolean
): Boolean {
val child = ClassId(classId.packageFqName, classId.relativeClassName.child(name), false)
return child.getFir() == null || processor(child.toSymbol())
val child = classId.createNestedClassId(name)
val symbol = firProvider.getSymbolByFqName(child)
return symbol == null || processor(symbol)
}
}
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.scopes.FirPosition
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
@@ -26,8 +25,9 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc
val firProvider = session.service<FirProvider>()
return if (firProvider.getFirClassifierByFqName(unambiguousFqName) != null) {
processor(unambiguousFqName.toSymbol())
val symbol = firProvider.getSymbolByFqName(unambiguousFqName)
return if (symbol != null) {
processor(symbol)
} else {
true
}
@@ -5,16 +5,18 @@
package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.scopes.FirPosition
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.fir.symbols.FirSymbolOwner
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
class FirStarImportingScope(imports: List<FirImport>) : FirScope {
class FirStarImportingScope(imports: List<FirImport>, val session: FirSession) : FirScope {
private val starImports = imports.filterIsInstance<FirResolvedImport>().filter { it.isAllUnder }
@@ -23,13 +25,15 @@ class FirStarImportingScope(imports: List<FirImport>) : FirScope {
position: FirPosition,
processor: (ConeSymbol) -> Boolean
): Boolean {
val provider = FirProvider.getInstance(session)
for (import in starImports) {
val relativeClassName = import.relativeClassName
val symbol = if (relativeClassName == null) {
val classId = if (relativeClassName == null) {
ClassId(import.packageFqName, name)
} else {
ClassId(import.packageFqName, relativeClassName.child(name), false)
}.toSymbol()
}
val symbol = provider.getSymbolByFqName(classId) ?: continue
if (!processor(symbol)) {
return false
}