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
This commit is contained in:
Ilya Chernikov
2023-10-06 14:46:02 +02:00
committed by Space Team
parent 02dc3c4ddb
commit 65d1c8ce7e
3 changed files with 13 additions and 5 deletions
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.filterIsInstanceWithChecker
object FirImportsChecker : FirFileChecker() { object FirImportsChecker : FirFileChecker() {
override fun check(declaration: FirFile, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirFile, context: CheckerContext, reporter: DiagnosticReporter) {
declaration.imports.forEach { import -> declaration.imports.forEach { import ->
if (import.source?.kind?.shouldSkipErrorTypeReporting == true) return@forEach
if (import is FirErrorImport) return@forEach if (import is FirErrorImport) return@forEach
if (import.isAllUnder) { if (import.isAllUnder) {
if (import is FirResolvedImport) { if (import is FirResolvedImport) {
@@ -191,6 +192,7 @@ object FirImportsChecker : FirFileChecker() {
val interestingImports = imports val interestingImports = imports
.filterIsInstanceWithChecker<FirResolvedImport> { import -> .filterIsInstanceWithChecker<FirResolvedImport> { import ->
!import.isAllUnder && !import.isAllUnder &&
import.source?.kind?.shouldSkipErrorTypeReporting != true &&
import.importedName?.identifierOrNullIfSpecial?.isNotEmpty() == true && import.importedName?.identifierOrNullIfSpecial?.isNotEmpty() == true &&
import.resolvesToClass(context) import.resolvesToClass(context)
}.filterNot { (it.source as? KtFakeSourceElement)?.kind == KtFakeSourceElementKind.ImplicitImport } }.filterNot { (it.source as? KtFakeSourceElement)?.kind == KtFakeSourceElementKind.ImplicitImport }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.resolve.transformers package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
@@ -76,10 +77,15 @@ open class FirImportResolveTransformer protected constructor(
private fun transformImportForFqName(fqName: FqName, delegate: FirImport): FirImport { private fun transformImportForFqName(fqName: FqName, delegate: FirImport): FirImport {
val (packageFqName, relativeClassFqName, classSymbol) = when (val result = resolveToPackageOrClass(symbolProvider, fqName)) { val (packageFqName, relativeClassFqName, classSymbol) = when (val result = resolveToPackageOrClass(symbolProvider, fqName)) {
is PackageResolutionResult.Error -> return buildErrorImport { is PackageResolutionResult.Error ->
this.delegate = delegate return if (delegate.source?.kind == KtFakeSourceElementKind.ImplicitImport) {
this.diagnostic = result.diagnostic delegate
} } else {
buildErrorImport {
this.delegate = delegate
this.diagnostic = result.diagnostic
}
}
is PackageResolutionResult.PackageOrClass -> result is PackageResolutionResult.PackageOrClass -> result
} }
val firClass = classSymbol?.fir as? FirRegularClass val firClass = classSymbol?.fir as? FirRegularClass
@@ -284,7 +284,7 @@ sealed class KtFakeSourceElementKind(final override val shouldSkipErrorTypeRepor
object PropertyTypeFromGetterReturnType : KtFakeSourceElementKind() object PropertyTypeFromGetterReturnType : KtFakeSourceElementKind()
// Scripts get implicit imports from their configurations // Scripts get implicit imports from their configurations
object ImplicitImport : KtFakeSourceElementKind() object ImplicitImport : KtFakeSourceElementKind(shouldSkipErrorTypeReporting = true)
// For provided parameters inside a script // For provided parameters inside a script
object ScriptParameter : KtFakeSourceElementKind() object ScriptParameter : KtFakeSourceElementKind()