[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");
|
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 {
|
||||||
|
|||||||
+6
@@ -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 {
|
||||||
|
|||||||
+6
@@ -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 {
|
||||||
|
|||||||
+6
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user