[FIR] Don't forget about annotations when resolving qualifiers
This commit is contained in:
committed by
Space Team
parent
1c2eab39d2
commit
389632ed53
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
Generated
+6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user