diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 77be3b727a1..0889b704ee0 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -1131,6 +1131,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt"); } + @Test + @TestMetadata("suppressInWhen.kt") + public void testSuppressInWhen() throws Exception { + runTest("compiler/testData/diagnostics/tests/suppressInWhen.kt"); + } + @Test @TestMetadata("SyntaxErrorInTestHighlighting.kt") public void testSyntaxErrorInTestHighlighting() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 0f3b2917e43..b2b2e434b49 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -1131,6 +1131,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt"); } + @Test + @TestMetadata("suppressInWhen.kt") + public void testSuppressInWhen() throws Exception { + runTest("compiler/testData/diagnostics/tests/suppressInWhen.kt"); + } + @Test @TestMetadata("SyntaxErrorInTestHighlighting.kt") public void testSyntaxErrorInTestHighlighting() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index e6869544daf..135993c4223 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -1131,6 +1131,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt"); } + @Test + @TestMetadata("suppressInWhen.kt") + public void testSuppressInWhen() throws Exception { + runTest("compiler/testData/diagnostics/tests/suppressInWhen.kt"); + } + @Test @TestMetadata("SyntaxErrorInTestHighlighting.kt") public void testSyntaxErrorInTestHighlighting() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index d4f727966a2..da98cdb8ac6 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -1131,6 +1131,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt"); } + @Test + @TestMetadata("suppressInWhen.kt") + public void testSuppressInWhen() throws Exception { + runTest("compiler/testData/diagnostics/tests/suppressInWhen.kt"); + } + @Test @TestMetadata("SyntaxErrorInTestHighlighting.kt") public void testSyntaxErrorInTestHighlighting() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index ee0d418a010..6260d2001e8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -258,8 +258,7 @@ class FirCallResolver( (qualifiedAccess.explicitReceiver as? FirResolvedQualifier) ?.continueQualifier( callee, - qualifiedAccess.source, - qualifiedAccess.typeArguments, + qualifiedAccess, nonFatalDiagnosticFromExpression, session, components @@ -283,7 +282,7 @@ class FirCallResolver( // } if (!result.applicability.isSuccess || (isUsedAsReceiver && result.candidates.all { it.symbol is FirClassLikeSymbol })) { components.resolveRootPartOfQualifier( - callee, qualifiedAccess.source, qualifiedAccess.typeArguments, nonFatalDiagnosticFromExpression, + callee, qualifiedAccess, nonFatalDiagnosticFromExpression, )?.let { return it } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/QualifiedNameResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/QualifiedNameResolution.kt index 8f85094420e..8281abf28d3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/QualifiedNameResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/QualifiedNameResolution.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.fullyExpandedClass import org.jetbrains.kotlin.fir.declarations.getDeprecationForCallSite import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference @@ -21,7 +22,6 @@ import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDeprecated import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType import org.jetbrains.kotlin.fir.resolve.typeForQualifier import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol -import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -30,16 +30,16 @@ const val ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE = "_root_ide_package_" fun BodyResolveComponents.resolveRootPartOfQualifier( namedReference: FirSimpleNamedReference, - source: KtSourceElement?, - typeArguments: List, + qualifiedAccess: FirQualifiedAccessExpression, nonFatalDiagnosticsFromExpression: List?, ): FirResolvedQualifier? { val name = namedReference.name if (name.asString() == ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE) { return buildResolvedQualifier { - this.source = source + this.source = qualifiedAccess.source packageFqName = FqName.ROOT this.nonFatalDiagnostics.addAll(nonFatalDiagnosticsFromExpression.orEmpty()) + annotations += qualifiedAccess.annotations }.apply { resultType = typeForQualifier(this) } @@ -61,20 +61,21 @@ fun BodyResolveComponents.resolveRootPartOfQualifier( } val classId = it.classId return buildResolvedQualifier { - this.source = source + this.source = qualifiedAccess.source packageFqName = classId.packageFqName relativeClassFqName = classId.relativeClassName symbol = it - this.typeArguments.addAll(typeArguments) + this.typeArguments.addAll(qualifiedAccess.typeArguments) this.nonFatalDiagnostics.addAll( extractNonFatalDiagnostics( - source, + qualifiedAccess.source, explicitReceiver = null, it, extraNotFatalDiagnostics = nonFatalDiagnosticsFromExpression, session ) ) + annotations += qualifiedAccess.annotations }.apply { resultType = typeForQualifier(this) } @@ -83,17 +84,15 @@ fun BodyResolveComponents.resolveRootPartOfQualifier( return FqName.ROOT.continueQualifierInPackage( name, - typeArguments, + qualifiedAccess, nonFatalDiagnosticsFromExpression, - this, - source + this ) } fun FirResolvedQualifier.continueQualifier( namedReference: FirSimpleNamedReference, - source: KtSourceElement?, - typeArguments: List, + qualifiedAccess: FirQualifiedAccessExpression, nonFatalDiagnosticsFromExpression: List?, session: FirSession, components: BodyResolveComponents, @@ -107,19 +106,19 @@ fun FirResolvedQualifier.continueQualifier( ?.takeIf { it is FirClassLikeSymbol<*> } ?.let { nestedClassSymbol -> buildResolvedQualifier { - this.source = source + this.source = qualifiedAccess.source packageFqName = this@continueQualifier.packageFqName relativeClassFqName = this@continueQualifier.relativeClassFqName?.child(name) symbol = nestedClassSymbol as FirClassLikeSymbol<*> isFullyQualified = true this.typeArguments.clear() - this.typeArguments.addAll(typeArguments) + this.typeArguments.addAll(qualifiedAccess.typeArguments) this.typeArguments.addAll(this@continueQualifier.typeArguments) this.nonFatalDiagnostics.addAll(nonFatalDiagnosticsFromExpression.orEmpty()) this.nonFatalDiagnostics.addAll( extractNonFatalDiagnostics( - source, + qualifiedAccess.source, explicitReceiver = null, nestedClassSymbol, extraNotFatalDiagnostics = this@continueQualifier.nonFatalDiagnostics, @@ -134,27 +133,26 @@ fun FirResolvedQualifier.continueQualifier( return packageFqName.continueQualifierInPackage( name, - typeArguments, + qualifiedAccess, nonFatalDiagnosticsFromExpression, - components, - source + components ) } private fun FqName.continueQualifierInPackage( name: Name, - typeArguments: List, + qualifiedAccess: FirQualifiedAccessExpression, nonFatalDiagnosticsFromExpression: List?, - components: BodyResolveComponents, - source: KtSourceElement? + components: BodyResolveComponents ): FirResolvedQualifier? { val childFqName = this.child(name) if (components.symbolProvider.getPackage(childFqName) != null) { return buildResolvedQualifier { - this.source = source + this.source = qualifiedAccess.source packageFqName = childFqName - this.typeArguments.addAll(typeArguments) + this.typeArguments.addAll(qualifiedAccess.typeArguments) this.nonFatalDiagnostics.addAll(nonFatalDiagnosticsFromExpression.orEmpty()) + annotations += qualifiedAccess.annotations }.apply { resultType = components.typeForQualifier(this) } @@ -164,14 +162,14 @@ private fun FqName.continueQualifierInPackage( val symbol = components.symbolProvider.getClassLikeSymbolByClassId(classId) ?: return null return buildResolvedQualifier { - this.source = source + this.source = qualifiedAccess.source packageFqName = this@continueQualifierInPackage relativeClassFqName = classId.relativeClassName this.symbol = symbol - this.typeArguments.addAll(typeArguments) + this.typeArguments.addAll(qualifiedAccess.typeArguments) this.nonFatalDiagnostics.addAll( extractNonFatalDiagnostics( - source, + qualifiedAccess.source, explicitReceiver = null, symbol, extraNotFatalDiagnostics = nonFatalDiagnosticsFromExpression, @@ -179,6 +177,7 @@ private fun FqName.continueQualifierInPackage( ) ) isFullyQualified = true + annotations += qualifiedAccess.annotations }.apply { resultType = components.typeForQualifier(this) } diff --git a/compiler/testData/diagnostics/tests/suppressInWhen.kt b/compiler/testData/diagnostics/tests/suppressInWhen.kt new file mode 100644 index 00000000000..948455eccbe --- /dev/null +++ b/compiler/testData/diagnostics/tests/suppressInWhen.kt @@ -0,0 +1,19 @@ +// FIR_IDENTICAL +// ISSUE: KT-61065 +// FILE: PrivateObjekt.kt + +private object PrivateObjekt + +// FILE: Main.kt + +fun test(arg: Any?) { + when (arg) { + // K1: ok + // K2: INVISIBLE_REFERENCE + @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") PrivateObjekt -> Unit + } + + @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") PrivateObjekt + + val it = @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") PrivateObjekt +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index d64a1095c6b..4aaa9039cba 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -1131,6 +1131,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt"); } + @Test + @TestMetadata("suppressInWhen.kt") + public void testSuppressInWhen() throws Exception { + runTest("compiler/testData/diagnostics/tests/suppressInWhen.kt"); + } + @Test @TestMetadata("SyntaxErrorInTestHighlighting.kt") public void testSyntaxErrorInTestHighlighting() throws Exception {