From 65d1c8ce7e7c827eec80d2cd5897c8a548acdf90 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Fri, 6 Oct 2023 14:46:02 +0200 Subject: [PATCH] K2 Scripting: do not report import resolution errors on implicit imports since implicit imports are used in the gradle scripts, where it seems difficult to precisely control list of import to avoid unresolved names. And we can relatively safely ignore unresolved imports there #KT-62404 fixed --- .../checkers/declaration/FirImportsChecker.kt | 2 ++ .../transformers/FirImportResolveTransformer.kt | 14 ++++++++++---- .../src/org/jetbrains/kotlin/KtSourceElement.kt | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) 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 index 176aca61b3e..6448fa24f3f 100644 --- 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 @@ -43,6 +43,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.filterIsInstanceWithChecker object FirImportsChecker : FirFileChecker() { override fun check(declaration: FirFile, context: CheckerContext, reporter: DiagnosticReporter) { declaration.imports.forEach { import -> + if (import.source?.kind?.shouldSkipErrorTypeReporting == true) return@forEach if (import is FirErrorImport) return@forEach if (import.isAllUnder) { if (import is FirResolvedImport) { @@ -191,6 +192,7 @@ object FirImportsChecker : FirFileChecker() { val interestingImports = imports .filterIsInstanceWithChecker { import -> !import.isAllUnder && + import.source?.kind?.shouldSkipErrorTypeReporting != true && import.importedName?.identifierOrNullIfSpecial?.isNotEmpty() == true && import.resolvesToClass(context) }.filterNot { (it.source as? KtFakeSourceElement)?.kind == KtFakeSourceElementKind.ImplicitImport } 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 9af37a9c439..62d8ec30833 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,6 +5,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers +import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirFile @@ -76,10 +77,15 @@ open class FirImportResolveTransformer protected constructor( private fun transformImportForFqName(fqName: FqName, delegate: FirImport): FirImport { val (packageFqName, relativeClassFqName, classSymbol) = when (val result = resolveToPackageOrClass(symbolProvider, fqName)) { - is PackageResolutionResult.Error -> return buildErrorImport { - this.delegate = delegate - this.diagnostic = result.diagnostic - } + is PackageResolutionResult.Error -> + return if (delegate.source?.kind == KtFakeSourceElementKind.ImplicitImport) { + delegate + } else { + buildErrorImport { + this.delegate = delegate + this.diagnostic = result.diagnostic + } + } is PackageResolutionResult.PackageOrClass -> result } val firClass = classSymbol?.fir as? FirRegularClass diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt index f3c6af9ca77..3c727cd23bc 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt @@ -284,7 +284,7 @@ sealed class KtFakeSourceElementKind(final override val shouldSkipErrorTypeRepor object PropertyTypeFromGetterReturnType : KtFakeSourceElementKind() // Scripts get implicit imports from their configurations - object ImplicitImport : KtFakeSourceElementKind() + object ImplicitImport : KtFakeSourceElementKind(shouldSkipErrorTypeReporting = true) // For provided parameters inside a script object ScriptParameter : KtFakeSourceElementKind()