[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");
}
@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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 }
}
}
@@ -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<FirTypeProjection>,
qualifiedAccess: FirQualifiedAccessExpression,
nonFatalDiagnosticsFromExpression: List<ConeDiagnostic>?,
): 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<FirTypeProjection>,
qualifiedAccess: FirQualifiedAccessExpression,
nonFatalDiagnosticsFromExpression: List<ConeDiagnostic>?,
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<FirTypeProjection>,
qualifiedAccess: FirQualifiedAccessExpression,
nonFatalDiagnosticsFromExpression: List<ConeDiagnostic>?,
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)
}
+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");
}
@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 {