[FIR] Don't forget about annotations when resolving qualifiers

This commit is contained in:
Nikolay Lunyak
2023-08-11 16:10:24 +03:00
committed by Space Team
parent 1c2eab39d2
commit 389632ed53
8 changed files with 76 additions and 29 deletions
@@ -1131,6 +1131,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt"); runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt");
} }
@Test
@TestMetadata("suppressInWhen.kt")
public void testSuppressInWhen() throws Exception {
runTest("compiler/testData/diagnostics/tests/suppressInWhen.kt");
}
@Test @Test
@TestMetadata("SyntaxErrorInTestHighlighting.kt") @TestMetadata("SyntaxErrorInTestHighlighting.kt")
public void testSyntaxErrorInTestHighlighting() throws Exception { public void testSyntaxErrorInTestHighlighting() throws Exception {
@@ -1131,6 +1131,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt"); runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt");
} }
@Test
@TestMetadata("suppressInWhen.kt")
public void testSuppressInWhen() throws Exception {
runTest("compiler/testData/diagnostics/tests/suppressInWhen.kt");
}
@Test @Test
@TestMetadata("SyntaxErrorInTestHighlighting.kt") @TestMetadata("SyntaxErrorInTestHighlighting.kt")
public void testSyntaxErrorInTestHighlighting() throws Exception { public void testSyntaxErrorInTestHighlighting() throws Exception {
@@ -1131,6 +1131,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt"); runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt");
} }
@Test
@TestMetadata("suppressInWhen.kt")
public void testSuppressInWhen() throws Exception {
runTest("compiler/testData/diagnostics/tests/suppressInWhen.kt");
}
@Test @Test
@TestMetadata("SyntaxErrorInTestHighlighting.kt") @TestMetadata("SyntaxErrorInTestHighlighting.kt")
public void testSyntaxErrorInTestHighlighting() throws Exception { public void testSyntaxErrorInTestHighlighting() throws Exception {
@@ -1131,6 +1131,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt"); runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt");
} }
@Test
@TestMetadata("suppressInWhen.kt")
public void testSuppressInWhen() throws Exception {
runTest("compiler/testData/diagnostics/tests/suppressInWhen.kt");
}
@Test @Test
@TestMetadata("SyntaxErrorInTestHighlighting.kt") @TestMetadata("SyntaxErrorInTestHighlighting.kt")
public void testSyntaxErrorInTestHighlighting() throws Exception { public void testSyntaxErrorInTestHighlighting() throws Exception {
@@ -258,8 +258,7 @@ class FirCallResolver(
(qualifiedAccess.explicitReceiver as? FirResolvedQualifier) (qualifiedAccess.explicitReceiver as? FirResolvedQualifier)
?.continueQualifier( ?.continueQualifier(
callee, callee,
qualifiedAccess.source, qualifiedAccess,
qualifiedAccess.typeArguments,
nonFatalDiagnosticFromExpression, nonFatalDiagnosticFromExpression,
session, session,
components components
@@ -283,7 +282,7 @@ class FirCallResolver(
// } // }
if (!result.applicability.isSuccess || (isUsedAsReceiver && result.candidates.all { it.symbol is FirClassLikeSymbol })) { if (!result.applicability.isSuccess || (isUsedAsReceiver && result.candidates.all { it.symbol is FirClassLikeSymbol })) {
components.resolveRootPartOfQualifier( components.resolveRootPartOfQualifier(
callee, qualifiedAccess.source, qualifiedAccess.typeArguments, nonFatalDiagnosticFromExpression, callee, qualifiedAccess, nonFatalDiagnosticFromExpression,
)?.let { return it } )?.let { return it }
} }
} }
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.fullyExpandedClass
import org.jetbrains.kotlin.fir.declarations.getDeprecationForCallSite import org.jetbrains.kotlin.fir.declarations.getDeprecationForCallSite
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirExpression 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.FirResolvedQualifier
import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference 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.transformers.body.resolve.resultType
import org.jetbrains.kotlin.fir.resolve.typeForQualifier import org.jetbrains.kotlin.fir.resolve.typeForQualifier
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol 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.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -30,16 +30,16 @@ const val ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE = "_root_ide_package_"
fun BodyResolveComponents.resolveRootPartOfQualifier( fun BodyResolveComponents.resolveRootPartOfQualifier(
namedReference: FirSimpleNamedReference, namedReference: FirSimpleNamedReference,
source: KtSourceElement?, qualifiedAccess: FirQualifiedAccessExpression,
typeArguments: List<FirTypeProjection>,
nonFatalDiagnosticsFromExpression: List<ConeDiagnostic>?, nonFatalDiagnosticsFromExpression: List<ConeDiagnostic>?,
): FirResolvedQualifier? { ): FirResolvedQualifier? {
val name = namedReference.name val name = namedReference.name
if (name.asString() == ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE) { if (name.asString() == ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE) {
return buildResolvedQualifier { return buildResolvedQualifier {
this.source = source this.source = qualifiedAccess.source
packageFqName = FqName.ROOT packageFqName = FqName.ROOT
this.nonFatalDiagnostics.addAll(nonFatalDiagnosticsFromExpression.orEmpty()) this.nonFatalDiagnostics.addAll(nonFatalDiagnosticsFromExpression.orEmpty())
annotations += qualifiedAccess.annotations
}.apply { }.apply {
resultType = typeForQualifier(this) resultType = typeForQualifier(this)
} }
@@ -61,20 +61,21 @@ fun BodyResolveComponents.resolveRootPartOfQualifier(
} }
val classId = it.classId val classId = it.classId
return buildResolvedQualifier { return buildResolvedQualifier {
this.source = source this.source = qualifiedAccess.source
packageFqName = classId.packageFqName packageFqName = classId.packageFqName
relativeClassFqName = classId.relativeClassName relativeClassFqName = classId.relativeClassName
symbol = it symbol = it
this.typeArguments.addAll(typeArguments) this.typeArguments.addAll(qualifiedAccess.typeArguments)
this.nonFatalDiagnostics.addAll( this.nonFatalDiagnostics.addAll(
extractNonFatalDiagnostics( extractNonFatalDiagnostics(
source, qualifiedAccess.source,
explicitReceiver = null, explicitReceiver = null,
it, it,
extraNotFatalDiagnostics = nonFatalDiagnosticsFromExpression, extraNotFatalDiagnostics = nonFatalDiagnosticsFromExpression,
session session
) )
) )
annotations += qualifiedAccess.annotations
}.apply { }.apply {
resultType = typeForQualifier(this) resultType = typeForQualifier(this)
} }
@@ -83,17 +84,15 @@ fun BodyResolveComponents.resolveRootPartOfQualifier(
return FqName.ROOT.continueQualifierInPackage( return FqName.ROOT.continueQualifierInPackage(
name, name,
typeArguments, qualifiedAccess,
nonFatalDiagnosticsFromExpression, nonFatalDiagnosticsFromExpression,
this, this
source
) )
} }
fun FirResolvedQualifier.continueQualifier( fun FirResolvedQualifier.continueQualifier(
namedReference: FirSimpleNamedReference, namedReference: FirSimpleNamedReference,
source: KtSourceElement?, qualifiedAccess: FirQualifiedAccessExpression,
typeArguments: List<FirTypeProjection>,
nonFatalDiagnosticsFromExpression: List<ConeDiagnostic>?, nonFatalDiagnosticsFromExpression: List<ConeDiagnostic>?,
session: FirSession, session: FirSession,
components: BodyResolveComponents, components: BodyResolveComponents,
@@ -107,19 +106,19 @@ fun FirResolvedQualifier.continueQualifier(
?.takeIf { it is FirClassLikeSymbol<*> } ?.takeIf { it is FirClassLikeSymbol<*> }
?.let { nestedClassSymbol -> ?.let { nestedClassSymbol ->
buildResolvedQualifier { buildResolvedQualifier {
this.source = source this.source = qualifiedAccess.source
packageFqName = this@continueQualifier.packageFqName packageFqName = this@continueQualifier.packageFqName
relativeClassFqName = this@continueQualifier.relativeClassFqName?.child(name) relativeClassFqName = this@continueQualifier.relativeClassFqName?.child(name)
symbol = nestedClassSymbol as FirClassLikeSymbol<*> symbol = nestedClassSymbol as FirClassLikeSymbol<*>
isFullyQualified = true isFullyQualified = true
this.typeArguments.clear() this.typeArguments.clear()
this.typeArguments.addAll(typeArguments) this.typeArguments.addAll(qualifiedAccess.typeArguments)
this.typeArguments.addAll(this@continueQualifier.typeArguments) this.typeArguments.addAll(this@continueQualifier.typeArguments)
this.nonFatalDiagnostics.addAll(nonFatalDiagnosticsFromExpression.orEmpty()) this.nonFatalDiagnostics.addAll(nonFatalDiagnosticsFromExpression.orEmpty())
this.nonFatalDiagnostics.addAll( this.nonFatalDiagnostics.addAll(
extractNonFatalDiagnostics( extractNonFatalDiagnostics(
source, qualifiedAccess.source,
explicitReceiver = null, explicitReceiver = null,
nestedClassSymbol, nestedClassSymbol,
extraNotFatalDiagnostics = this@continueQualifier.nonFatalDiagnostics, extraNotFatalDiagnostics = this@continueQualifier.nonFatalDiagnostics,
@@ -134,27 +133,26 @@ fun FirResolvedQualifier.continueQualifier(
return packageFqName.continueQualifierInPackage( return packageFqName.continueQualifierInPackage(
name, name,
typeArguments, qualifiedAccess,
nonFatalDiagnosticsFromExpression, nonFatalDiagnosticsFromExpression,
components, components
source
) )
} }
private fun FqName.continueQualifierInPackage( private fun FqName.continueQualifierInPackage(
name: Name, name: Name,
typeArguments: List<FirTypeProjection>, qualifiedAccess: FirQualifiedAccessExpression,
nonFatalDiagnosticsFromExpression: List<ConeDiagnostic>?, nonFatalDiagnosticsFromExpression: List<ConeDiagnostic>?,
components: BodyResolveComponents, components: BodyResolveComponents
source: KtSourceElement?
): FirResolvedQualifier? { ): FirResolvedQualifier? {
val childFqName = this.child(name) val childFqName = this.child(name)
if (components.symbolProvider.getPackage(childFqName) != null) { if (components.symbolProvider.getPackage(childFqName) != null) {
return buildResolvedQualifier { return buildResolvedQualifier {
this.source = source this.source = qualifiedAccess.source
packageFqName = childFqName packageFqName = childFqName
this.typeArguments.addAll(typeArguments) this.typeArguments.addAll(qualifiedAccess.typeArguments)
this.nonFatalDiagnostics.addAll(nonFatalDiagnosticsFromExpression.orEmpty()) this.nonFatalDiagnostics.addAll(nonFatalDiagnosticsFromExpression.orEmpty())
annotations += qualifiedAccess.annotations
}.apply { }.apply {
resultType = components.typeForQualifier(this) resultType = components.typeForQualifier(this)
} }
@@ -164,14 +162,14 @@ private fun FqName.continueQualifierInPackage(
val symbol = components.symbolProvider.getClassLikeSymbolByClassId(classId) ?: return null val symbol = components.symbolProvider.getClassLikeSymbolByClassId(classId) ?: return null
return buildResolvedQualifier { return buildResolvedQualifier {
this.source = source this.source = qualifiedAccess.source
packageFqName = this@continueQualifierInPackage packageFqName = this@continueQualifierInPackage
relativeClassFqName = classId.relativeClassName relativeClassFqName = classId.relativeClassName
this.symbol = symbol this.symbol = symbol
this.typeArguments.addAll(typeArguments) this.typeArguments.addAll(qualifiedAccess.typeArguments)
this.nonFatalDiagnostics.addAll( this.nonFatalDiagnostics.addAll(
extractNonFatalDiagnostics( extractNonFatalDiagnostics(
source, qualifiedAccess.source,
explicitReceiver = null, explicitReceiver = null,
symbol, symbol,
extraNotFatalDiagnostics = nonFatalDiagnosticsFromExpression, extraNotFatalDiagnostics = nonFatalDiagnosticsFromExpression,
@@ -179,6 +177,7 @@ private fun FqName.continueQualifierInPackage(
) )
) )
isFullyQualified = true isFullyQualified = true
annotations += qualifiedAccess.annotations
}.apply { }.apply {
resultType = components.typeForQualifier(this) resultType = components.typeForQualifier(this)
} }
+19
View File
@@ -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
}
@@ -1131,6 +1131,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt"); runTest("compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt");
} }
@Test
@TestMetadata("suppressInWhen.kt")
public void testSuppressInWhen() throws Exception {
runTest("compiler/testData/diagnostics/tests/suppressInWhen.kt");
}
@Test @Test
@TestMetadata("SyntaxErrorInTestHighlighting.kt") @TestMetadata("SyntaxErrorInTestHighlighting.kt")
public void testSyntaxErrorInTestHighlighting() throws Exception { public void testSyntaxErrorInTestHighlighting() throws Exception {