From 03bb482322a697e414936d153af606af28d9ef80 Mon Sep 17 00:00:00 2001 From: "simon.ogorodnik" Date: Wed, 23 Mar 2022 03:38:47 +0200 Subject: [PATCH] KT-45553. Hide declaration from star import if imported with alias --- .../scopes/impl/FirAbstractImportingScope.kt | 5 +++++ .../impl/FirAbstractSimpleImportingScope.kt | 2 ++ .../impl/FirAbstractStarImportingScope.kt | 11 +++++++++- .../impl/FirDefaultStarImportingScope.kt | 7 ++++-- .../impl/FirExplicitStarImportingScope.kt | 6 +++-- .../impl/FirWhenSubjectImportingScope.kt | 3 ++- .../kotlin/fir/scopes/ImportingScopes.kt | 17 +++++++++----- .../tests/imports/RenameOnImport.fir.kt | 22 ------------------- .../tests/imports/RenameOnImport.kt | 1 + 9 files changed, 40 insertions(+), 34 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/imports/RenameOnImport.fir.kt diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractImportingScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractImportingScope.kt index a50cf7cd419..e02850778ed 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractImportingScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractImportingScope.kt @@ -41,6 +41,8 @@ abstract class FirAbstractImportingScope( fun getStaticsScope(classId: ClassId): FirContainingNamesAwareScope? = provider.getClassLikeSymbolByClassId(classId)?.fullyExpandedSymbol?.getStaticsScope() + protected abstract fun isExcluded(import: FirResolvedImport, name: Name): Boolean + protected fun processImportsByName( name: Name?, imports: List, @@ -48,6 +50,7 @@ abstract class FirAbstractImportingScope( ) { for (import in imports) { val importedName = name ?: import.importedName ?: continue + if (isExcluded(import, importedName)) continue val classId = import.resolvedParentClassId?.createNestedClassId(importedName) ?: ClassId.topLevel(import.packageFqName.child(importedName)) val symbol = provider.getClassLikeSymbolByClassId(classId) ?: continue @@ -58,6 +61,7 @@ abstract class FirAbstractImportingScope( protected fun processFunctionsByName(name: Name?, imports: List, processor: (FirNamedFunctionSymbol) -> Unit) { for (import in imports) { val importedName = name ?: import.importedName ?: continue + if (isExcluded(import, importedName)) continue val staticsScope = import.resolvedParentClassId?.let(::getStaticsScope) if (staticsScope != null) { staticsScope.processFunctionsByName(importedName, processor) @@ -73,6 +77,7 @@ abstract class FirAbstractImportingScope( protected fun processPropertiesByName(name: Name?, imports: List, processor: (FirVariableSymbol<*>) -> Unit) { for (import in imports) { val importedName = name ?: import.importedName ?: continue + if (isExcluded(import, importedName)) continue val staticsScope = import.resolvedParentClassId?.let(::getStaticsScope) if (staticsScope != null) { staticsScope.processPropertiesByName(importedName, processor) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractSimpleImportingScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractSimpleImportingScope.kt index 57128dfbdab..82c095a2bca 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractSimpleImportingScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractSimpleImportingScope.kt @@ -22,6 +22,8 @@ abstract class FirAbstractSimpleImportingScope( // TODO try to hide this abstract val simpleImports: Map> + override fun isExcluded(import: FirResolvedImport, name: Name): Boolean = false + override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { val imports = simpleImports[name] ?: return processImportsByName(name = null, imports) { symbol -> diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt index 7e551aa74cd..d36d19ba1f9 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirAbstractStarImportingScope.kt @@ -12,17 +12,26 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name abstract class FirAbstractStarImportingScope( session: FirSession, scopeSession: ScopeSession, - lookupInFir: Boolean + lookupInFir: Boolean, + val excludedImportNames: Set ) : FirAbstractImportingScope(session, scopeSession, lookupInFir) { // TODO try to hide this abstract val starImports: List + override fun isExcluded(import: FirResolvedImport, name: Name): Boolean { + if (excludedImportNames.isNotEmpty()) { + return import.importedFqName!!.child(name) in excludedImportNames + } + return false + } + private val absentClassifierNames = mutableSetOf() override fun processClassifiersByNameWithSubstitution(name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit) { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirDefaultStarImportingScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirDefaultStarImportingScope.kt index fff1e9142fb..60dc25f5560 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirDefaultStarImportingScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirDefaultStarImportingScope.kt @@ -15,15 +15,18 @@ import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name class FirDefaultStarImportingScope( session: FirSession, scopeSession: ScopeSession, - priority: DefaultImportPriority + priority: DefaultImportPriority, + excludedImportNames: Set ) : FirAbstractStarImportingScope( session, scopeSession, - lookupInFir = session.languageVersionSettings.getFlag(AnalysisFlags.allowKotlinPackage) + lookupInFir = session.languageVersionSettings.getFlag(AnalysisFlags.allowKotlinPackage), + excludedImportNames ) { // TODO: put languageVersionSettings into FirSession? override val starImports = run { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitStarImportingScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitStarImportingScope.kt index 0a81626ccce..a0fa08a52f0 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitStarImportingScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitStarImportingScope.kt @@ -9,12 +9,14 @@ 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.ScopeSession +import org.jetbrains.kotlin.name.FqName open class FirExplicitStarImportingScope( imports: List, session: FirSession, - scopeSession: ScopeSession -) : FirAbstractStarImportingScope(session, scopeSession, lookupInFir = true) { + scopeSession: ScopeSession, + excludedImportNames: Set +) : FirAbstractStarImportingScope(session, scopeSession, lookupInFir = true, excludedImportNames) { override val starImports = imports.filterIsInstance().filter { it.isAllUnder } override val scopeOwnerLookupNames: List by lazy(LazyThreadSafetyMode.PUBLICATION) { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirWhenSubjectImportingScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirWhenSubjectImportingScope.kt index 95a965f7dae..9ad275cdbd7 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirWhenSubjectImportingScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirWhenSubjectImportingScope.kt @@ -23,7 +23,8 @@ class FirWhenSubjectImportingScope( classId: ClassId, session: FirSession, scopeSession: ScopeSession ) : FirExplicitStarImportingScope( listOf(buildResolvedImportByClassId(classId)), - session, scopeSession + session, scopeSession, + emptySet() ) { override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) { super.processPropertiesByName(name) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/ImportingScopes.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/ImportingScopes.kt index c8347b0bcb2..bb9fcfe7866 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/ImportingScopes.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/ImportingScopes.kt @@ -13,11 +13,14 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.scopeSessionKey import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.symbols.ensureResolved +import org.jetbrains.kotlin.name.FqName private val ALL_IMPORTS = scopeSessionKey() -private val DEFAULT_STAR_IMPORT = scopeSessionKey() +private val DEFAULT_STAR_IMPORT = scopeSessionKey() private val DEFAULT_SIMPLE_IMPORT = scopeSessionKey() +private data class DefaultStarImportKey(val priority: DefaultImportPriority, val excludedImportNames: Set) + fun createImportingScopes( file: FirFile, session: FirSession, @@ -37,14 +40,16 @@ private fun doCreateImportingScopes( scopeSession: ScopeSession ): List { file.ensureResolved(FirResolvePhase.IMPORTS) + val excludedImportNames = + file.imports.filter { it.aliasName != null }.mapNotNullTo(hashSetOf()) { it.importedFqName }.ifEmpty { emptySet() } return listOf( - scopeSession.getOrBuild(DefaultImportPriority.LOW, DEFAULT_STAR_IMPORT) { - FirDefaultStarImportingScope(session, scopeSession, DefaultImportPriority.LOW) + scopeSession.getOrBuild(DefaultStarImportKey(DefaultImportPriority.LOW, excludedImportNames), DEFAULT_STAR_IMPORT) { + FirDefaultStarImportingScope(session, scopeSession, DefaultImportPriority.LOW, excludedImportNames) }, - scopeSession.getOrBuild(DefaultImportPriority.HIGH, DEFAULT_STAR_IMPORT) { - FirDefaultStarImportingScope(session, scopeSession, DefaultImportPriority.HIGH) + scopeSession.getOrBuild(DefaultStarImportKey(DefaultImportPriority.HIGH, excludedImportNames), DEFAULT_STAR_IMPORT) { + FirDefaultStarImportingScope(session, scopeSession, DefaultImportPriority.HIGH, excludedImportNames) }, - FirExplicitStarImportingScope(file.imports, session, scopeSession), + FirExplicitStarImportingScope(file.imports, session, scopeSession, excludedImportNames), scopeSession.getOrBuild(DefaultImportPriority.LOW, DEFAULT_SIMPLE_IMPORT) { FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.LOW) diff --git a/compiler/testData/diagnostics/tests/imports/RenameOnImport.fir.kt b/compiler/testData/diagnostics/tests/imports/RenameOnImport.fir.kt deleted file mode 100644 index 5cc7b6b6f66..00000000000 --- a/compiler/testData/diagnostics/tests/imports/RenameOnImport.fir.kt +++ /dev/null @@ -1,22 +0,0 @@ -// FILE: a.kt -package a - -val x = 1 -val y = 1 - -// FILE: b.kt -package b - -val x = "" - -// FILE: c.kt -package c - -import a.x as AX -import a.* -import b.* -import a.y as AY - -val v1: Int = AX -val v2: String = x -val v3 = y diff --git a/compiler/testData/diagnostics/tests/imports/RenameOnImport.kt b/compiler/testData/diagnostics/tests/imports/RenameOnImport.kt index 04e4e4f091e..c410acee707 100644 --- a/compiler/testData/diagnostics/tests/imports/RenameOnImport.kt +++ b/compiler/testData/diagnostics/tests/imports/RenameOnImport.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: a.kt package a