diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTypeResolveTransformer.kt index ca282005229..a9f7655657c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTypeResolveTransformer.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.FirProvider import org.jetbrains.kotlin.fir.resolve.FirTypeResolver +import org.jetbrains.kotlin.fir.scopes.FirPosition import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol import org.jetbrains.kotlin.fir.transformSingle @@ -33,7 +34,6 @@ class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransf lateinit var scope: FirCompositeScope lateinit var packageFqName: FqName - lateinit var file: FirFile private var classLikeName: FqName = FqName.ROOT override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { @@ -44,7 +44,6 @@ class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransf ) ) packageFqName = file.packageFqName - this.file = file return super.transformFile(file, data) } @@ -105,7 +104,7 @@ class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransf override fun transformType(type: FirType, data: Nothing?): CompositeTransformResult { val typeResolver = FirTypeResolver.getInstance(type.session) type.transformChildren(this, null) - return transformType(type, typeResolver.resolveType(type, scope)) + return transformType(type, typeResolver.resolveType(type, scope, position = FirPosition.OTHER)) } private fun transformType(type: FirType, resolvedType: ConeKotlinType): CompositeTransformResult { @@ -138,7 +137,7 @@ class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransf override fun transformType(type: FirType, data: Nothing?): CompositeTransformResult { val typeResolver = FirTypeResolver.getInstance(type.session) - val symbol = typeResolver.resolveToSymbol(type, scope) + val symbol = typeResolver.resolveToSymbol(type, scope, position = FirPosition.SUPER_TYPE_OR_EXPANSION) val myTransformer = this@FirTypeResolveTransformer if (type !is FirUserType) return myTransformer.transformType(type, data) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirTypeResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirTypeResolver.kt index 7ba080e9110..68e6cd980ed 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirTypeResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirTypeResolver.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.resolve import org.jetbrains.kotlin.fir.FirSession +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 @@ -15,8 +16,8 @@ import org.jetbrains.kotlin.fir.types.FirUserType interface FirTypeResolver { - fun resolveType(type: FirType, scope: FirScope): ConeKotlinType - fun resolveToSymbol(type: FirType, scope: FirScope): ConeSymbol? + fun resolveType(type: FirType, scope: FirScope, position: FirPosition): ConeKotlinType + fun resolveToSymbol(type: FirType, scope: FirScope, position: FirPosition): ConeSymbol? companion object { fun getInstance(session: FirSession): FirTypeResolver = session.service() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt index 0973c3ef45a..93eae4588b7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt @@ -9,10 +9,10 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.FirTypeParameter -import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.FirProvider import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver import org.jetbrains.kotlin.fir.resolve.FirTypeResolver +import org.jetbrains.kotlin.fir.scopes.FirPosition import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.ConeSymbol @@ -53,9 +53,7 @@ class FirTypeResolverImpl : FirTypeResolver { } is FirTypeAlias -> { val coneTypeSafe = fir.expandedType.coneTypeSafe() - val expansion = if (coneTypeSafe != null) coneTypeSafe else { - return ConeKotlinErrorType("Couldn't resolve expansion") - } + val expansion = coneTypeSafe ?: return ConeKotlinErrorType("Couldn't resolve expansion") ConeAbbreviatedTypeImpl( abbreviationSymbol = this as ConeClassLikeSymbol, @@ -67,7 +65,11 @@ class FirTypeResolverImpl : FirTypeResolver { } } - override fun resolveToSymbol(type: FirType, scope: FirScope): ConeSymbol? { + override fun resolveToSymbol( + type: FirType, + scope: FirScope, + position: FirPosition + ): ConeSymbol? { return when (type) { is FirResolvedType -> type.coneTypeSafe()?.symbol is FirUserType -> { @@ -75,7 +77,7 @@ class FirTypeResolverImpl : FirTypeResolver { val qualifierResolver = FirQualifierResolver.getInstance(type.session) var resolvedSymbol: ConeSymbol? = null - scope.processClassifiersByName(type.qualifier.first().name) { symbol -> + scope.processClassifiersByName(type.qualifier.first().name, position) { symbol -> resolvedSymbol = when (symbol) { is ConeClassLikeSymbol -> { qualifierResolver.resolveSymbolWithPrefix(type.qualifier, symbol.classId) @@ -101,11 +103,15 @@ class FirTypeResolverImpl : FirTypeResolver { return symbol.toConeKotlinType(type.qualifier, type.session) ?: ConeKotlinErrorType("Failed to resolve qualified type") } - override fun resolveType(type: FirType, scope: FirScope): ConeKotlinType { + override fun resolveType( + type: FirType, + scope: FirScope, + position: FirPosition + ): ConeKotlinType { return when (type) { is FirResolvedType -> type.type is FirUserType -> { - resolveUserType(type, resolveToSymbol(type, scope), scope) + resolveUserType(type, resolveToSymbol(type, scope, position), scope) } is FirErrorType -> { ConeKotlinErrorType(type.reason) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt index 064720b075a..782293d3563 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirScope.kt @@ -9,5 +9,14 @@ import org.jetbrains.kotlin.fir.symbols.ConeSymbol import org.jetbrains.kotlin.name.Name interface FirScope { - fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean + fun processClassifiersByName( + name: Name, + position: FirPosition, + processor: (ConeSymbol) -> Boolean + ): Boolean +} + +enum class FirPosition(val allowTypeParameters: Boolean = true) { + SUPER_TYPE_OR_EXPANSION(allowTypeParameters = false), + OTHER } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirTypeParameterScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirTypeParameterScope.kt new file mode 100644 index 00000000000..61bc9068bd9 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FirTypeParameterScope.kt @@ -0,0 +1,24 @@ +/* + * 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 + +import org.jetbrains.kotlin.fir.declarations.FirTypeParameter +import org.jetbrains.kotlin.fir.symbols.ConeSymbol +import org.jetbrains.kotlin.name.Name + +interface FirTypeParameterScope : FirScope { + val typeParameters: Map> + + override fun processClassifiersByName( + name: Name, + position: FirPosition, + processor: (ConeSymbol) -> Boolean + ): Boolean { + val matchedTypeParameters = typeParameters[name] ?: return true + + return matchedTypeParameters.all { processor(it.symbol) } + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassLikeTypeParameterScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassLikeTypeParameterScope.kt index 03845aa7643..018e709a513 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassLikeTypeParameterScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassLikeTypeParameterScope.kt @@ -6,17 +6,8 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration -import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.symbols.ConeSymbol -import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.fir.scopes.FirTypeParameterScope -class FirClassLikeTypeParameterScope(classLike: FirMemberDeclaration) : FirScope { - - val typeParameters = classLike.typeParameters.groupBy { it.name } - - override fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean { - val matchedTypeParameters = typeParameters[name] ?: return true - - return matchedTypeParameters.all { processor(it.symbol) } - } +class FirClassLikeTypeParameterScope(classLike: FirMemberDeclaration) : FirTypeParameterScope { + override val typeParameters = classLike.typeParameters.groupBy { it.name } } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirCompositeScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirCompositeScope.kt index 83ed45329ce..5ceb356131d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirCompositeScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirCompositeScope.kt @@ -5,14 +5,21 @@ package org.jetbrains.kotlin.fir.scopes.impl +import org.jetbrains.kotlin.fir.scopes.FirPosition import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.FirTypeParameterScope import org.jetbrains.kotlin.fir.symbols.ConeSymbol import org.jetbrains.kotlin.name.Name class FirCompositeScope(val scopes: MutableList) : FirScope { - override fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean { + override fun processClassifiersByName( + name: Name, + position: FirPosition, + processor: (ConeSymbol) -> Boolean + ): Boolean { for (scope in scopes) { - if (!scope.processClassifiersByName(name, processor)) { + if (!position.allowTypeParameters && scope is FirTypeParameterScope) continue + if (!scope.processClassifiersByName(name, position, processor)) { return false } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitImportingScope.kt index d497ad538a4..a9242594278 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitImportingScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitImportingScope.kt @@ -7,6 +7,7 @@ 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.FirPosition import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.ConeSymbol import org.jetbrains.kotlin.fir.symbols.toSymbol @@ -20,7 +21,11 @@ class FirExplicitImportingScope(imports: List) : FirScope { .filter { !it.isAllUnder } .groupBy { it.aliasName ?: it.resolvedFqName.shortClassName } - override fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean { + override fun processClassifiersByName( + name: Name, + position: FirPosition, + processor: (ConeSymbol) -> Boolean + ): Boolean { val imports = simpleImports[name] ?: return true for (import in imports) { if (!processor(import.resolvedFqName.toSymbol())) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirFunctionTypeParameterScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirFunctionTypeParameterScope.kt index c1d31c099e6..5a371913512 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirFunctionTypeParameterScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirFunctionTypeParameterScope.kt @@ -6,17 +6,8 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.fir.declarations.FirNamedFunction -import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.symbols.ConeSymbol -import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.fir.scopes.FirTypeParameterScope -class FirFunctionTypeParameterScope(function: FirNamedFunction) : FirScope { - - val typeParameters = function.typeParameters.groupBy { it.name } - - override fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean { - val matchedTypeParameters = typeParameters[name] ?: return true - - return matchedTypeParameters.all { processor(it.symbol) } - } +class FirFunctionTypeParameterScope(function: FirNamedFunction) : FirTypeParameterScope { + override val typeParameters = function.typeParameters.groupBy { it.name } } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt index 82ea0399e4f..d605d608cd4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt @@ -8,6 +8,7 @@ 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 @@ -22,7 +23,11 @@ class FirNestedClassifierScope(val classId: ClassId, val session: FirSession) : return firProvider.getFirClassifierByFqName(this) } - override fun processClassifiersByName(name: Name, processor: (ConeSymbol) -> Boolean): Boolean { + 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()) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSelfImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSelfImportingScope.kt index 368dee13510..216b9077478 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSelfImportingScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirSelfImportingScope.kt @@ -7,6 +7,7 @@ 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.FirPosition import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.service import org.jetbrains.kotlin.fir.symbols.ConeSymbol @@ -16,7 +17,11 @@ 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: (ConeSymbol) -> Boolean): Boolean { + override fun processClassifiersByName( + name: Name, + position: FirPosition, + processor: (ConeSymbol) -> Boolean + ): Boolean { val unambiguousFqName = ClassId(fqName, name) val firProvider = session.service() diff --git a/compiler/testData/fir/resolve/typeParameterVsNested.txt b/compiler/testData/fir/resolve/typeParameterVsNested.txt index f1bd9df9669..986265859c7 100644 --- a/compiler/testData/fir/resolve/typeParameterVsNested.txt +++ b/compiler/testData/fir/resolve/typeParameterVsNested.txt @@ -16,7 +16,7 @@ FILE: typeParameterVsNested.kt public? abstract property z(val): R/test/My.T/ public? get(): R/test/My.T/ - (resolved) public? final class Some() : R/T/ { + (resolved) public? final class Some() : R/test/My.T/ { } }