From bf153ab0f0ebdd985b71a1882fdb069486b30ec5 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Tue, 1 Jun 2021 16:33:07 +0300 Subject: [PATCH] [FIR] Implement CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON diagnostic --- .../diagnostics/FirDiagnosticsList.kt | 6 +++ .../diagnostics/model/DiagnosticData.kt | 1 + .../fir/analysis/diagnostics/FirErrors.kt | 3 ++ .../checkers/CommonDeclarationCheckers.kt | 1 + .../checkers/declaration/FirImportsChecker.kt | 35 ++++++++++++++ .../collectors/AbstractDiagnosticCollector.kt | 1 - .../ErrorNodeDiagnosticCollectorComponent.kt | 6 +++ .../diagnostics/FirDefaultErrorMessages.kt | 8 ++++ .../LightTreePositioningStrategies.kt | 12 +++++ .../SourceElementPositioningStrategies.kt | 5 ++ .../coneDiagnosticToFirDiagnostic.kt | 1 + .../fir/resolve/diagnostics/FirDiagnostics.kt | 4 ++ .../FirImportResolveTransformer.kt | 15 +++++- .../kotlin/fir/declarations/FirErrorImport.kt | 35 ++++++++++++++ .../kotlin/fir/declarations/FirImport.kt | 11 ++--- .../fir/declarations/FirResolvedImport.kt | 3 +- .../builder/FirErrorImportBuilder.kt | 43 +++++++++++++++++ .../declarations/builder/FirImportBuilder.kt | 1 + .../declarations/impl/FirErrorImportImpl.kt | 38 +++++++++++++++ .../fir/declarations/impl/FirImportImpl.kt | 3 +- .../kotlin/fir/visitors/FirTransformer.kt | 45 +++++++++++------- .../kotlin/fir/visitors/FirVisitor.kt | 15 +++--- .../kotlin/fir/visitors/FirVisitorVoid.kt | 45 +++++++++++------- .../fir/tree/generator/FirTreeBuilder.kt | 7 ++- .../generator/ImplementationConfigurator.kt | 4 ++ .../fir/tree/generator/NodeConfigurator.kt | 4 ++ .../diagnostics/PositioningStrategies.kt | 13 +++++ .../imports/ImportFromCompanionObject.fir.kt | 8 ++-- .../tests/imports/ImportFromObject.fir.kt | 8 ++-- .../diagnostics/tests/imports/Imports.fir.kt | 4 +- .../tests/imports/StarImportFromObject.fir.kt | 47 ------------------- .../tests/imports/StarImportFromObject.kt | 1 + .../tests/imports/twoImportLists.fir.kt | 4 +- .../diagnostics/tests/scopes/kt900-1.fir.kt | 24 ---------- .../diagnostics/tests/scopes/kt900-1.kt | 1 + .../diagnostics/tests/scopes/kt900-2.fir.kt | 4 +- .../diagnostics/KtFirDataClassConverters.kt | 7 +++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 5 ++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 8 ++++ 39 files changed, 347 insertions(+), 139 deletions(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorImport.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirErrorImportBuilder.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorImportImpl.kt delete mode 100644 compiler/testData/diagnostics/tests/imports/StarImportFromObject.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/scopes/kt900-1.fir.kt diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index ceb0497ee2b..d6e3adbece9 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -940,6 +940,12 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("symbol") } } + + val IMPORTS by object : DiagnosticGroup("Imports") { + val CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON by error(PositioningStrategy.IMPORT_LAST_NAME) { + parameter("objectName") + } + } } private val exposedVisibilityDiagnosticInit: DiagnosticBuilder.() -> Unit = { diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticData.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticData.kt index 98c3a3631aa..355567c5bcf 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticData.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticData.kt @@ -73,6 +73,7 @@ enum class PositioningStrategy(private val strategy: String? = null) { QUESTION_MARK_BY_TYPE, ANNOTATION_USE_SITE, ASSIGNMENT_LHS, + IMPORT_LAST_NAME, ; diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index a7c7f91816e..6d7f82093c9 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -518,4 +518,7 @@ object FirErrors { val PRIVATE_CLASS_MEMBER_FROM_INLINE by error2, AbstractFirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val SUPER_CALL_FROM_PUBLIC_INLINE by warning1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + // Imports + val CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON by error1(SourceElementPositioningStrategies.IMPORT_LAST_NAME) + } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt index 190563c7f88..a7c7e39fc5c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt @@ -100,6 +100,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirKClassWithIncorrectTypeArgumentChecker, FirTopLevelFunctionsChecker, FirTopLevelPropertiesChecker, + FirImportsChecker, ) override val controlFlowAnalyserCheckers: Set diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt new file mode 100644 index 00000000000..df0a603d4e9 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.analysis.checkers.declaration + +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn +import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.resolve.symbolProvider +import org.jetbrains.kotlin.name.ClassId + +object FirImportsChecker : FirFileChecker() { + override fun check(declaration: FirFile, context: CheckerContext, reporter: DiagnosticReporter) { + declaration.imports.forEach { import -> + if (import.isAllUnder && import !is FirResolvedImport && import !is FirErrorImport) { + checkAllUnderFromEnumEntry(import, context, reporter) + } + } + } + + private fun checkAllUnderFromEnumEntry(import: FirImport, context: CheckerContext, reporter: DiagnosticReporter) { + val fqName = import.importedFqName ?: return + if (fqName.isRoot || fqName.parent().isRoot) return + val classId = ClassId.topLevel(fqName.parent()) + val classSymbol = context.session.symbolProvider.getClassLikeSymbolByFqName(classId) ?: return + val classFir = classSymbol.fir as? FirRegularClass ?: return + if (classFir.isEnumClass && classFir.collectEnumEntries().any { it.name == fqName.shortName() }) { + reporter.reportOn(import.source, FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON, classFir.name, context) + } + } +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollector.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollector.kt index 3903aff1893..4ede2ebb449 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollector.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollector.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.analysis.collectors import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.collectors.components.* import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.resolve.ScopeSession diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt index d65df3a264e..83aec399eb3 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.toFirDiagnostics import org.jetbrains.kotlin.fir.declarations.FirErrorFunction +import org.jetbrains.kotlin.fir.declarations.FirErrorImport import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.references.FirErrorNamedReference @@ -94,6 +95,11 @@ class ErrorNodeDiagnosticCollectorComponent( reportFirDiagnostic(errorResolvedQualifier.diagnostic, source, reporter, data) } + override fun visitErrorImport(errorImport: FirErrorImport, data: CheckerContext) { + val source = errorImport.source ?: return + reportFirDiagnostic(errorImport.diagnostic, source, reporter, data) + } + private fun reportFirDiagnostic( diagnostic: ConeDiagnostic, source: FirSourceElement, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index eaea85c43a6..5a29b2127cd 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -53,6 +53,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.BOUND_ON_TYPE_ALI import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.BREAK_OR_CONTINUE_OUTSIDE_A_LOOP import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CALLABLE_REFERENCE_LHS_NOT_A_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CALLABLE_REFERENCE_TO_ANNOTATION_CONSTRUCTOR +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_CHANGE_ACCESS_PRIVILEGE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_INFER_PARAMETER_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_WEAKEN_ACCESS_PRIVILEGE @@ -1159,6 +1160,13 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension { ) map.put(SUPER_CALL_FROM_PUBLIC_INLINE, "Accessing super members from public-API inline function is deprecated", SYMBOL) + //imports + map.put( + CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON, + "Cannot import-on-demand from object ''{0}''", + TO_STRING + ) + // Extended checkers group map.put(REDUNDANT_VISIBILITY_MODIFIER, "Redundant visibility modifier") map.put(REDUNDANT_MODALITY_MODIFIER, "Redundant modality modifier") diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt index 565c2987098..0f759c6be10 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt @@ -758,6 +758,18 @@ object LightTreePositioningStrategies { return super.mark(node, startOffset, endOffset, tree) } } + + val IMPORT_LAST_NAME: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { + val nodeToMark = tree.collectDescendantsOfType(node, KtNodeTypes.REFERENCE_EXPRESSION).lastOrNull() ?: node + return markElement(nodeToMark, startOffset, endOffset, tree, node) + } + } } fun FirSourceElement.hasValOrVar(): Boolean = diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt index 64e98d5b8f8..9e915415ec0 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt @@ -252,4 +252,9 @@ object SourceElementPositioningStrategies { LightTreePositioningStrategies.ASSIGNMENT_LHS, PositioningStrategies.ASSIGNMENT_LHS ) + + val IMPORT_LAST_NAME = SourceElementPositioningStrategy( + LightTreePositioningStrategies.IMPORT_LAST_NAME, + PositioningStrategies.IMPORT_LAST_NAME + ) } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index 101881289e8..5644e0da6b1 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -73,6 +73,7 @@ private fun ConeDiagnostic.toFirDiagnostic( is ConeTypeParameterSupertype -> FirErrors.SUPERTYPE_NOT_A_CLASS_OR_INTERFACE.on(source, this.reason) is ConeTypeParameterInQualifiedAccess -> null // reported in various checkers instead is ConeNotAnnotationContainer -> null + is ConeImportFromSingleton -> FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON.on(source, this.name) else -> throw IllegalArgumentException("Unsupported diagnostic type: ${this.javaClass}") } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt index ddfc54164c4..b6715f872ef 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt @@ -122,6 +122,10 @@ class ConeCyclicTypeBound(val symbol: FirTypeParameterSymbol, val bounds: Immuta override val reason: String get() = "Type parameter ${symbol.fir.name} has cyclic bounds" } +class ConeImportFromSingleton(val name: Name) : ConeDiagnostic() { + override val reason: String get() = "Import from singleton $name is not allowed" +} + private fun describeSymbol(symbol: AbstractFirBasedSymbol<*>): String { return when (symbol) { is FirClassLikeSymbol<*> -> symbol.classId.asString() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt index 8dc72b1eefc..11f5a3f6231 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt @@ -5,14 +5,20 @@ package org.jetbrains.kotlin.fir.resolve.transformers +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirImport +import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.declarations.builder.buildErrorImport import org.jetbrains.kotlin.fir.declarations.builder.buildResolvedImport +import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic +import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.lookupTracker import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeImportFromSingleton import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol @@ -71,7 +77,14 @@ open class FirImportResolveTransformer protected constructor( get() = true private fun transformImportForFqName(fqName: FqName, delegate: FirImport): FirImport { - val (packageFqName, relativeClassFqName) = resolveToPackageOrClass(symbolProvider, fqName) ?: return delegate + val (packageFqName, relativeClassFqName, classSymbol) = resolveToPackageOrClass(symbolProvider, fqName) ?: return delegate + val firClass = classSymbol?.fir as? FirRegularClass + if (delegate.isAllUnder && firClass?.classKind?.isSingleton == true) { + return buildErrorImport { + this.delegate = delegate + this.diagnostic = ConeImportFromSingleton(firClass.name) + } + } return buildResolvedImport { this.delegate = delegate this.packageFqName = packageFqName diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorImport.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorImport.kt new file mode 100644 index 00000000000..37fa799c6cb --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorImport.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.declarations + +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirPureAbstractElement +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic +import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirErrorImport : FirPureAbstractElement(), FirImport, FirDiagnosticHolder { + abstract override val source: FirSourceElement? + abstract override val importedFqName: FqName? + abstract override val isAllUnder: Boolean + abstract override val aliasName: Name? + abstract override val diagnostic: ConeDiagnostic + abstract val delegate: FirImport + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitErrorImport(this, data) + + @Suppress("UNCHECKED_CAST") + override fun transform(transformer: FirTransformer, data: D): E = + transformer.transformErrorImport(this, data) as E +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirImport.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirImport.kt index d2dc69e0191..205601e7c18 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirImport.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirImport.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.fir.declarations import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -17,11 +16,11 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -abstract class FirImport : FirPureAbstractElement(), FirElement { - abstract override val source: FirSourceElement? - abstract val importedFqName: FqName? - abstract val isAllUnder: Boolean - abstract val aliasName: Name? +interface FirImport : FirElement { + override val source: FirSourceElement? + val importedFqName: FqName? + val isAllUnder: Boolean + val aliasName: Name? override fun accept(visitor: FirVisitor, data: D): R = visitor.visitImport(this, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirResolvedImport.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirResolvedImport.kt index 0f515a46191..5bb7b84c20c 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirResolvedImport.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirResolvedImport.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.declarations import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -17,7 +18,7 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -abstract class FirResolvedImport : FirImport() { +abstract class FirResolvedImport : FirPureAbstractElement(), FirImport { abstract override val source: FirSourceElement? abstract override val importedFqName: FqName? abstract override val isAllUnder: Boolean diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirErrorImportBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirErrorImportBuilder.kt new file mode 100644 index 00000000000..d0fa78c2550 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirErrorImportBuilder.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.declarations.builder + +import kotlin.contracts.* +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.builder.FirBuilderDsl +import org.jetbrains.kotlin.fir.declarations.FirErrorImport +import org.jetbrains.kotlin.fir.declarations.FirImport +import org.jetbrains.kotlin.fir.declarations.impl.FirErrorImportImpl +import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic +import org.jetbrains.kotlin.fir.visitors.* +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +@FirBuilderDsl +class FirErrorImportBuilder { + lateinit var diagnostic: ConeDiagnostic + lateinit var delegate: FirImport + + fun build(): FirErrorImport { + return FirErrorImportImpl( + diagnostic, + delegate, + ) + } +} + +@OptIn(ExperimentalContracts::class) +inline fun buildErrorImport(init: FirErrorImportBuilder.() -> Unit): FirErrorImport { + contract { + callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + return FirErrorImportBuilder().apply(init).build() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirImportBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirImportBuilder.kt index c169a3c6552..dda710f3155 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirImportBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirImportBuilder.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.declarations.builder import kotlin.contracts.* +import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.declarations.FirImport diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorImportImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorImportImpl.kt new file mode 100644 index 00000000000..e9d08c52eb9 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorImportImpl.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.declarations.impl + +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.declarations.FirErrorImport +import org.jetbrains.kotlin.fir.declarations.FirImport +import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +internal class FirErrorImportImpl( + override val diagnostic: ConeDiagnostic, + override var delegate: FirImport, +) : FirErrorImport() { + override val source: FirSourceElement? get() = delegate.source + override val importedFqName: FqName? get() = delegate.importedFqName + override val isAllUnder: Boolean get() = delegate.isAllUnder + override val aliasName: Name? get() = delegate.aliasName + + override fun acceptChildren(visitor: FirVisitor, data: D) { + delegate.accept(visitor, data) + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirErrorImportImpl { + delegate = delegate.transform(transformer, data) + return this + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirImportImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirImportImpl.kt index 4949b61b8dc..f9826ba348d 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirImportImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirImportImpl.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.declarations.impl +import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.declarations.FirImport import org.jetbrains.kotlin.name.FqName @@ -21,7 +22,7 @@ internal class FirImportImpl( override val importedFqName: FqName?, override val isAllUnder: Boolean, override val aliasName: Name?, -) : FirImport() { +) : FirPureAbstractElement(), FirImport { override fun acceptChildren(visitor: FirVisitor, data: D) {} override fun transformChildren(transformer: FirTransformer, data: D): FirImportImpl { diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index 5785f82fda7..8974a8772dc 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -10,8 +10,6 @@ import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.FirLabel -import org.jetbrains.kotlin.fir.declarations.FirImport -import org.jetbrains.kotlin.fir.declarations.FirResolvedImport import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.expressions.FirResolvable import org.jetbrains.kotlin.fir.FirTargetElement @@ -49,6 +47,9 @@ import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder +import org.jetbrains.kotlin.fir.declarations.FirImport +import org.jetbrains.kotlin.fir.declarations.FirResolvedImport +import org.jetbrains.kotlin.fir.declarations.FirErrorImport import org.jetbrains.kotlin.fir.expressions.FirLoop import org.jetbrains.kotlin.fir.expressions.FirErrorLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop @@ -157,14 +158,6 @@ abstract class FirTransformer : FirVisitor() { return transformElement(label, data) } - open fun transformImport(import: FirImport, data: D): FirImport { - return transformElement(import, data) - } - - open fun transformResolvedImport(resolvedImport: FirResolvedImport, data: D): FirImport { - return transformElement(resolvedImport, data) - } - open fun transformSymbolOwner(symbolOwner: FirSymbolOwner, data: D): FirSymbolOwner where E : FirSymbolOwner, E : FirDeclaration { return transformElement(symbolOwner, data) } @@ -313,6 +306,18 @@ abstract class FirTransformer : FirVisitor() { return transformElement(diagnosticHolder, data) } + open fun transformImport(import: FirImport, data: D): FirImport { + return transformElement(import, data) + } + + open fun transformResolvedImport(resolvedImport: FirResolvedImport, data: D): FirImport { + return transformElement(resolvedImport, data) + } + + open fun transformErrorImport(errorImport: FirErrorImport, data: D): FirImport { + return transformElement(errorImport, data) + } + open fun transformLoop(loop: FirLoop, data: D): FirStatement { return transformElement(loop, data) } @@ -661,14 +666,6 @@ abstract class FirTransformer : FirVisitor() { return transformLabel(label, data) } - final override fun visitImport(import: FirImport, data: D): FirImport { - return transformImport(import, data) - } - - final override fun visitResolvedImport(resolvedImport: FirResolvedImport, data: D): FirImport { - return transformResolvedImport(resolvedImport, data) - } - final override fun visitSymbolOwner(symbolOwner: FirSymbolOwner, data: D): FirSymbolOwner where E : FirSymbolOwner, E : FirDeclaration { return transformSymbolOwner(symbolOwner, data) } @@ -817,6 +814,18 @@ abstract class FirTransformer : FirVisitor() { return transformDiagnosticHolder(diagnosticHolder, data) } + final override fun visitImport(import: FirImport, data: D): FirImport { + return transformImport(import, data) + } + + final override fun visitResolvedImport(resolvedImport: FirResolvedImport, data: D): FirImport { + return transformResolvedImport(resolvedImport, data) + } + + final override fun visitErrorImport(errorImport: FirErrorImport, data: D): FirImport { + return transformErrorImport(errorImport, data) + } + final override fun visitLoop(loop: FirLoop, data: D): FirStatement { return transformLoop(loop, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index 3749d283c7a..ad93dd6f76f 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -10,8 +10,6 @@ import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.FirLabel -import org.jetbrains.kotlin.fir.declarations.FirImport -import org.jetbrains.kotlin.fir.declarations.FirResolvedImport import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.expressions.FirResolvable import org.jetbrains.kotlin.fir.FirTargetElement @@ -49,6 +47,9 @@ import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder +import org.jetbrains.kotlin.fir.declarations.FirImport +import org.jetbrains.kotlin.fir.declarations.FirResolvedImport +import org.jetbrains.kotlin.fir.declarations.FirErrorImport import org.jetbrains.kotlin.fir.expressions.FirLoop import org.jetbrains.kotlin.fir.expressions.FirErrorLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop @@ -148,10 +149,6 @@ abstract class FirVisitor { open fun visitLabel(label: FirLabel, data: D): R = visitElement(label, data) - open fun visitImport(import: FirImport, data: D): R = visitElement(import, data) - - open fun visitResolvedImport(resolvedImport: FirResolvedImport, data: D): R = visitElement(resolvedImport, data) - open fun visitSymbolOwner(symbolOwner: FirSymbolOwner, data: D): R where E : FirSymbolOwner, E : FirDeclaration = visitElement(symbolOwner, data) open fun visitResolvable(resolvable: FirResolvable, data: D): R = visitElement(resolvable, data) @@ -226,6 +223,12 @@ abstract class FirVisitor { open fun visitDiagnosticHolder(diagnosticHolder: FirDiagnosticHolder, data: D): R = visitElement(diagnosticHolder, data) + open fun visitImport(import: FirImport, data: D): R = visitElement(import, data) + + open fun visitResolvedImport(resolvedImport: FirResolvedImport, data: D): R = visitElement(resolvedImport, data) + + open fun visitErrorImport(errorImport: FirErrorImport, data: D): R = visitElement(errorImport, data) + open fun visitLoop(loop: FirLoop, data: D): R = visitElement(loop, data) open fun visitErrorLoop(errorLoop: FirErrorLoop, data: D): R = visitElement(errorLoop, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index d424151e70d..3fdb7b8ff70 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -10,8 +10,6 @@ import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.FirLabel -import org.jetbrains.kotlin.fir.declarations.FirImport -import org.jetbrains.kotlin.fir.declarations.FirResolvedImport import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.expressions.FirResolvable import org.jetbrains.kotlin.fir.FirTargetElement @@ -49,6 +47,9 @@ import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder +import org.jetbrains.kotlin.fir.declarations.FirImport +import org.jetbrains.kotlin.fir.declarations.FirResolvedImport +import org.jetbrains.kotlin.fir.declarations.FirErrorImport import org.jetbrains.kotlin.fir.expressions.FirLoop import org.jetbrains.kotlin.fir.expressions.FirErrorLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop @@ -156,14 +157,6 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(label) } - open fun visitImport(import: FirImport) { - visitElement(import) - } - - open fun visitResolvedImport(resolvedImport: FirResolvedImport) { - visitElement(resolvedImport) - } - open fun visitSymbolOwner(symbolOwner: FirSymbolOwner) where E : FirSymbolOwner, E : FirDeclaration { visitElement(symbolOwner) } @@ -312,6 +305,18 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(diagnosticHolder) } + open fun visitImport(import: FirImport) { + visitElement(import) + } + + open fun visitResolvedImport(resolvedImport: FirResolvedImport) { + visitElement(resolvedImport) + } + + open fun visitErrorImport(errorImport: FirErrorImport) { + visitElement(errorImport) + } + open fun visitLoop(loop: FirLoop) { visitElement(loop) } @@ -660,14 +665,6 @@ abstract class FirVisitorVoid : FirVisitor() { visitLabel(label) } - final override fun visitImport(import: FirImport, data: Nothing?) { - visitImport(import) - } - - final override fun visitResolvedImport(resolvedImport: FirResolvedImport, data: Nothing?) { - visitResolvedImport(resolvedImport) - } - final override fun visitSymbolOwner(symbolOwner: FirSymbolOwner, data: Nothing?) where E : FirSymbolOwner, E : FirDeclaration { visitSymbolOwner(symbolOwner) } @@ -816,6 +813,18 @@ abstract class FirVisitorVoid : FirVisitor() { visitDiagnosticHolder(diagnosticHolder) } + final override fun visitImport(import: FirImport, data: Nothing?) { + visitImport(import) + } + + final override fun visitResolvedImport(resolvedImport: FirResolvedImport, data: Nothing?) { + visitResolvedImport(resolvedImport) + } + + final override fun visitErrorImport(errorImport: FirErrorImport, data: Nothing?) { + visitErrorImport(errorImport) + } + final override fun visitLoop(loop: FirLoop, data: Nothing?) { visitLoop(loop) } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index 7284f5db49d..73d20dacd97 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -14,8 +14,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val typeRef = sealedElement("TypeRef", TypeRef, annotationContainer) val reference = element("Reference", Reference) val label = element("Label", Other) - val import = element("Import", Declaration) - val resolvedImport = element("ResolvedImport", Declaration, import) + val symbolOwner = element("SymbolOwner", Other) val resolvable = sealedElement("Resolvable", Expression) @@ -64,6 +63,10 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val diagnosticHolder = element("DiagnosticHolder", Diagnostics) + val import = element("Import", Declaration) + val resolvedImport = element("ResolvedImport", Declaration, import) + val errorImport = element("ErrorImport", Declaration, import, diagnosticHolder) + val loop = sealedElement("Loop", Expression, statement, targetElement) val errorLoop = element("ErrorLoop", Expression, loop, diagnosticHolder) val doWhileLoop = element("DoWhileLoop", Expression, loop) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index c5b303c4ffe..e43ad49b1f8 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -65,6 +65,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() } } + impl(errorImport) { + delegateFields(listOf("aliasName", "importedFqName", "isAllUnder", "source"), "delegate") + } + impl(annotationCall) { default("typeRef") { value = "annotationTypeRef" diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 03bf0c8fbd7..8c15a94f40f 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -432,6 +432,10 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild ) } + errorImport.configure { + +field("delegate", import) + } + annotationCall.configure { +field("useSiteTarget", annotationUseSiteTargetType, nullable = true) +field("annotationTypeRef", typeRef).withTransform() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt index 360ae24b76a..d8ca4a319db 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt @@ -890,6 +890,19 @@ object PositioningStrategies { } } + val IMPORT_LAST_NAME: PositioningStrategy = object : PositioningStrategy() { + override fun mark(element: PsiElement): List { + if (element is KtImportDirective) { + val importedReference = element.importedReference + if (importedReference is KtDotQualifiedExpression) { + importedReference.selectorExpression?.let { return super.mark(it) } + } + return super.mark(element.importedReference ?: element) + } + return super.mark(element) + } + } + /** * @param locateReferencedName whether to remove any nested parentheses while locating the reference element. This is useful for * diagnostics on super and unresolved references. For example, with the following, only the part inside the parentheses should be diff --git a/compiler/testData/diagnostics/tests/imports/ImportFromCompanionObject.fir.kt b/compiler/testData/diagnostics/tests/imports/ImportFromCompanionObject.fir.kt index 1bc5870127d..fa0c1a9cb51 100644 --- a/compiler/testData/diagnostics/tests/imports/ImportFromCompanionObject.fir.kt +++ b/compiler/testData/diagnostics/tests/imports/ImportFromCompanionObject.fir.kt @@ -60,12 +60,12 @@ class C3 { // FILE: b.kt package b -import a.C1.O.* +import a.C1.O.* fun testErroneusAllUnderImportFromObject() { - A() - B - bar() + A() + B + bar() } // FILE: c.kt diff --git a/compiler/testData/diagnostics/tests/imports/ImportFromObject.fir.kt b/compiler/testData/diagnostics/tests/imports/ImportFromObject.fir.kt index 14ca7028292..9b49913ce19 100644 --- a/compiler/testData/diagnostics/tests/imports/ImportFromObject.fir.kt +++ b/compiler/testData/diagnostics/tests/imports/ImportFromObject.fir.kt @@ -54,12 +54,12 @@ object K: Base(), BaseI { // FILE: b.kt package b -import a.O.* +import a.O.* fun testErroneusAllUnderImportFromObject() { - A() - B - bar() + A() + B + bar() } // FILE: c.kt diff --git a/compiler/testData/diagnostics/tests/imports/Imports.fir.kt b/compiler/testData/diagnostics/tests/imports/Imports.fir.kt index 16591b14077..91aeeb507e4 100644 --- a/compiler/testData/diagnostics/tests/imports/Imports.fir.kt +++ b/compiler/testData/diagnostics/tests/imports/Imports.fir.kt @@ -72,7 +72,7 @@ fun bar() {} //FILE:c.kt package c -import c.C.* +import c.C.* object C { fun f() { @@ -81,7 +81,7 @@ object C { } fun foo() { - if (i == 3) f() + if (i == 3) f() } //FILE:d.kt diff --git a/compiler/testData/diagnostics/tests/imports/StarImportFromObject.fir.kt b/compiler/testData/diagnostics/tests/imports/StarImportFromObject.fir.kt deleted file mode 100644 index 8302d8698ac..00000000000 --- a/compiler/testData/diagnostics/tests/imports/StarImportFromObject.fir.kt +++ /dev/null @@ -1,47 +0,0 @@ -package a - -import a.A.* -import a.A.C -import a.A.C.* -import a.A.D.* -import a.A.C.* -import a.A.C.G -import a.A.E.J.* -import a.A.CO.* -import a.A.CO - -import a.B.C.* -import a.B.C.A.* -import a.B.C.D.* - -import a.E.* -import a.E.E1 -import a.E.E2.* - -class A { - object C { - object G - } - object D { - - } - - class E { - object J - } - - companion object CO { - object H - } -} - -enum class E { - E1, E2 -} - -object B { - class C { - object A - object D - } -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/imports/StarImportFromObject.kt b/compiler/testData/diagnostics/tests/imports/StarImportFromObject.kt index 2a657b3f3aa..4b2865b6e63 100644 --- a/compiler/testData/diagnostics/tests/imports/StarImportFromObject.kt +++ b/compiler/testData/diagnostics/tests/imports/StarImportFromObject.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL package a import a.A.* diff --git a/compiler/testData/diagnostics/tests/imports/twoImportLists.fir.kt b/compiler/testData/diagnostics/tests/imports/twoImportLists.fir.kt index f672cbd68a2..777cfdf83c4 100644 --- a/compiler/testData/diagnostics/tests/imports/twoImportLists.fir.kt +++ b/compiler/testData/diagnostics/tests/imports/twoImportLists.fir.kt @@ -75,7 +75,7 @@ fun bar() {} //FILE:c.kt package c -import c.C.* +import c.C.* object C { fun f() { @@ -84,7 +84,7 @@ object C { } fun foo() { - if (i == 3) f() + if (i == 3) f() } //FILE:d.kt diff --git a/compiler/testData/diagnostics/tests/scopes/kt900-1.fir.kt b/compiler/testData/diagnostics/tests/scopes/kt900-1.fir.kt deleted file mode 100644 index e6f71feeacb..00000000000 --- a/compiler/testData/diagnostics/tests/scopes/kt900-1.fir.kt +++ /dev/null @@ -1,24 +0,0 @@ -// import all members from companion object -package c - -import c.A.Companion.B -import c.M.* - -fun foo() { - val b: B = B() - var r: R = R() -} - -class A() { - companion object { - class B() { - companion object { - } - } - } -} - -object M { - fun foo() {} - class R() {} -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/scopes/kt900-1.kt b/compiler/testData/diagnostics/tests/scopes/kt900-1.kt index 55602aa81bd..4faf6bb7b22 100644 --- a/compiler/testData/diagnostics/tests/scopes/kt900-1.kt +++ b/compiler/testData/diagnostics/tests/scopes/kt900-1.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // import all members from companion object package c diff --git a/compiler/testData/diagnostics/tests/scopes/kt900-2.fir.kt b/compiler/testData/diagnostics/tests/scopes/kt900-2.fir.kt index 2decad45f6b..b67a139ebf3 100644 --- a/compiler/testData/diagnostics/tests/scopes/kt900-2.fir.kt +++ b/compiler/testData/diagnostics/tests/scopes/kt900-2.fir.kt @@ -2,7 +2,7 @@ package d //import from objects before properties resolve -import d.A.* +import d.A.* import d.M.R import d.M.R.bar import d.M.T @@ -14,7 +14,7 @@ val y: T = Y fun f() { bar() R.bar() - B.foo() + B.foo() } object M { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 8fa50ac82cf..7088cd20849 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -2573,6 +2573,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON) { firDiagnostic -> + CannotAllUnderImportFromSingletonImpl( + firDiagnostic.a, + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } add(FirJvmErrors.CONFLICTING_JVM_DECLARATIONS) { firDiagnostic -> ConflictingJvmDeclarationsImpl( firDiagnostic as FirPsiDiagnostic<*>, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 33ca69854f1..b11eabea4ef 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -1805,6 +1805,11 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val symbol: KtSymbol } + abstract class CannotAllUnderImportFromSingleton : KtFirDiagnostic() { + override val diagnosticClass get() = CannotAllUnderImportFromSingleton::class + abstract val objectName: Name + } + abstract class ConflictingJvmDeclarations : KtFirDiagnostic() { override val diagnosticClass get() = ConflictingJvmDeclarations::class } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 8e7d76355d9..925d8eb93cc 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -2928,6 +2928,14 @@ internal class SuperCallFromPublicInlineImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } +internal class CannotAllUnderImportFromSingletonImpl( + override val objectName: Name, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.CannotAllUnderImportFromSingleton(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + internal class ConflictingJvmDeclarationsImpl( firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken,