FIR: Unbound TypeResolver from IterableScope

This commit is contained in:
Denis Zharkov
2020-06-26 10:55:44 +03:00
parent b607cecc2b
commit cea38771f1
3 changed files with 20 additions and 24 deletions
@@ -6,13 +6,13 @@
package org.jetbrains.kotlin.fir.resolve package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.scopes.FirIterableScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
interface FirTypeResolver : FirSessionComponent { interface FirTypeResolver : FirSessionComponent {
fun resolveType(typeRef: FirTypeRef, scope: FirIterableScope): ConeKotlinType fun resolveType(typeRef: FirTypeRef, scope: FirScope): ConeKotlinType
fun resolveToSymbol(typeRef: FirTypeRef, scope: FirIterableScope): FirClassifierSymbol<*>? fun resolveToSymbol(typeRef: FirTypeRef, scope: FirScope): FirClassifierSymbol<*>?
} }
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.constructType
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.qualifierResolver import org.jetbrains.kotlin.fir.resolve.qualifierResolver
import org.jetbrains.kotlin.fir.scopes.FirIterableScope
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.processClassifiersByName import org.jetbrains.kotlin.fir.scopes.processClassifiersByName
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
@@ -43,7 +42,7 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver {
override fun resolveToSymbol( override fun resolveToSymbol(
typeRef: FirTypeRef, typeRef: FirTypeRef,
scope: FirIterableScope scope: FirScope
): FirClassifierSymbol<*>? { ): FirClassifierSymbol<*>? {
return when (typeRef) { return when (typeRef) {
is FirResolvedTypeRef -> typeRef.coneTypeSafe<ConeLookupTagBasedType>()?.lookupTag?.let(symbolProvider::getSymbolByLookupTag) is FirResolvedTypeRef -> typeRef.coneTypeSafe<ConeLookupTagBasedType>()?.lookupTag?.let(symbolProvider::getSymbolByLookupTag)
@@ -52,25 +51,22 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver {
val qualifierResolver = session.qualifierResolver val qualifierResolver = session.qualifierResolver
var resolvedSymbol: FirClassifierSymbol<*>? = null var resolvedSymbol: FirClassifierSymbol<*>? = null
for (typeScope in scope.scopes) { scope.processClassifiersByName(typeRef.qualifier.first().name) { symbol ->
typeScope.processClassifiersByName(typeRef.qualifier.first().name) { symbol -> if (resolvedSymbol != null) return@processClassifiersByName
if (resolvedSymbol != null) return@processClassifiersByName resolvedSymbol = when (symbol) {
resolvedSymbol = when (symbol) { is FirClassLikeSymbol<*> -> {
is FirClassLikeSymbol<*> -> { if (typeRef.qualifier.size == 1) {
if (typeRef.qualifier.size == 1) {
symbol
} else {
qualifierResolver.resolveSymbolWithPrefix(typeRef.qualifier, symbol.classId)
}
}
is FirTypeParameterSymbol -> {
assert(typeRef.qualifier.size == 1)
symbol symbol
} else {
qualifierResolver.resolveSymbolWithPrefix(typeRef.qualifier, symbol.classId)
} }
else -> error("!")
} }
is FirTypeParameterSymbol -> {
assert(typeRef.qualifier.size == 1)
symbol
}
else -> error("!")
} }
if (resolvedSymbol != null) break
} }
// TODO: Imports // TODO: Imports
@@ -83,7 +79,7 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver {
} }
} }
private fun resolveUserType(typeRef: FirUserTypeRef, symbol: FirClassifierSymbol<*>?, scope: FirScope): ConeKotlinType { private fun resolveUserType(typeRef: FirUserTypeRef, symbol: FirClassifierSymbol<*>?): ConeKotlinType {
if (symbol == null) { if (symbol == null) {
return ConeKotlinErrorType("Symbol not found, for `${typeRef.render()}`") return ConeKotlinErrorType("Symbol not found, for `${typeRef.render()}`")
} }
@@ -110,12 +106,12 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver {
override fun resolveType( override fun resolveType(
typeRef: FirTypeRef, typeRef: FirTypeRef,
scope: FirIterableScope scope: FirScope
): ConeKotlinType { ): ConeKotlinType {
return when (typeRef) { return when (typeRef) {
is FirResolvedTypeRef -> typeRef.type is FirResolvedTypeRef -> typeRef.type
is FirUserTypeRef -> { is FirUserTypeRef -> {
resolveUserType(typeRef, resolveToSymbol(typeRef, scope), scope) resolveUserType(typeRef, resolveToSymbol(typeRef, scope))
} }
is FirFunctionTypeRef -> { is FirFunctionTypeRef -> {
createFunctionalType(typeRef) createFunctionalType(typeRef)
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
abstract class FirIterableScope : FirScope() { abstract class FirIterableScope : FirScope() {
abstract val scopes: Iterable<FirScope> protected abstract val scopes: Iterable<FirScope>
override fun processClassifiersByNameWithSubstitution( override fun processClassifiersByNameWithSubstitution(
name: Name, name: Name,