K2: introduce custom Enum.entries migration checkers

Related to KT-56623, KT-56587
#KT-59344 Fixed
This commit is contained in:
Mikhail Glukhikh
2023-08-24 09:46:51 +02:00
committed by Space Team
parent e0d68fc93e
commit 3ff2c7d6f7
70 changed files with 658 additions and 132 deletions
@@ -11581,6 +11581,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClashOn.kt");
}
@Test
@TestMetadata("javaEnumAdditionalCases.kt")
public void testJavaEnumAdditionalCases() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/javaEnumAdditionalCases.kt");
}
@Test
@TestMetadata("javaEnumEntriesAmbiguity.kt")
public void testJavaEnumEntriesAmbiguity() throws Exception {
@@ -11617,6 +11623,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesPrioritized.kt");
}
@Test
@TestMetadata("primitiveReference.kt")
public void testPrimitiveReference() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/primitiveReference.kt");
}
@Test
@TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt")
public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception {
@@ -11628,6 +11640,18 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/redeclarationOfEnumEntriesNameWithIntrinsicOn.kt");
}
@Test
@TestMetadata("toBeShadowed.kt")
public void testToBeShadowed() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/toBeShadowed.kt");
}
@Test
@TestMetadata("toBeShadowedPrioritized.kt")
public void testToBeShadowedPrioritized() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/toBeShadowedPrioritized.kt");
}
}
@Nested
@@ -11581,6 +11581,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClashOn.kt");
}
@Test
@TestMetadata("javaEnumAdditionalCases.kt")
public void testJavaEnumAdditionalCases() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/javaEnumAdditionalCases.kt");
}
@Test
@TestMetadata("javaEnumEntriesAmbiguity.kt")
public void testJavaEnumEntriesAmbiguity() throws Exception {
@@ -11617,6 +11623,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesPrioritized.kt");
}
@Test
@TestMetadata("primitiveReference.kt")
public void testPrimitiveReference() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/primitiveReference.kt");
}
@Test
@TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt")
public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception {
@@ -11628,6 +11640,18 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/redeclarationOfEnumEntriesNameWithIntrinsicOn.kt");
}
@Test
@TestMetadata("toBeShadowed.kt")
public void testToBeShadowed() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/toBeShadowed.kt");
}
@Test
@TestMetadata("toBeShadowedPrioritized.kt")
public void testToBeShadowedPrioritized() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/toBeShadowedPrioritized.kt");
}
}
@Nested
@@ -11581,6 +11581,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClashOn.kt");
}
@Test
@TestMetadata("javaEnumAdditionalCases.kt")
public void testJavaEnumAdditionalCases() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/javaEnumAdditionalCases.kt");
}
@Test
@TestMetadata("javaEnumEntriesAmbiguity.kt")
public void testJavaEnumEntriesAmbiguity() throws Exception {
@@ -11617,6 +11623,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesPrioritized.kt");
}
@Test
@TestMetadata("primitiveReference.kt")
public void testPrimitiveReference() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/primitiveReference.kt");
}
@Test
@TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt")
public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception {
@@ -11628,6 +11640,18 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/redeclarationOfEnumEntriesNameWithIntrinsicOn.kt");
}
@Test
@TestMetadata("toBeShadowed.kt")
public void testToBeShadowed() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/toBeShadowed.kt");
}
@Test
@TestMetadata("toBeShadowedPrioritized.kt")
public void testToBeShadowedPrioritized() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/toBeShadowedPrioritized.kt");
}
}
@Nested
@@ -11587,6 +11587,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClashOn.kt");
}
@Test
@TestMetadata("javaEnumAdditionalCases.kt")
public void testJavaEnumAdditionalCases() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/javaEnumAdditionalCases.kt");
}
@Test
@TestMetadata("javaEnumEntriesAmbiguity.kt")
public void testJavaEnumEntriesAmbiguity() throws Exception {
@@ -11623,6 +11629,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesPrioritized.kt");
}
@Test
@TestMetadata("primitiveReference.kt")
public void testPrimitiveReference() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/primitiveReference.kt");
}
@Test
@TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt")
public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception {
@@ -11634,6 +11646,18 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/redeclarationOfEnumEntriesNameWithIntrinsicOn.kt");
}
@Test
@TestMetadata("toBeShadowed.kt")
public void testToBeShadowed() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/toBeShadowed.kt");
}
@Test
@TestMetadata("toBeShadowedPrioritized.kt")
public void testToBeShadowedPrioritized() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/toBeShadowedPrioritized.kt");
}
}
@Nested
@@ -1703,7 +1703,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val ENUM_ENTRIES_DEPRECATIONS by object : DiagnosticGroup("Enum.entries resolve deprecations") {
val DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY by warning<PsiElement>()
val DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM by warning<PsiElement>()
val DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE by warning<PsiElement>()
val DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE by warning<PsiElement>(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED)
val DEPRECATED_DECLARATION_OF_ENUM_ENTRY by warning<KtEnumEntry>()
}
}
@@ -848,7 +848,7 @@ object FirErrors {
// Enum.entries resolve deprecations
val DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY by warning0<PsiElement>()
val DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM by warning0<PsiElement>()
val DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE by warning0<PsiElement>()
val DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE by warning0<PsiElement>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
val DEPRECATED_DECLARATION_OF_ENUM_ENTRY by warning0<KtEnumEntry>()
init {
@@ -78,6 +78,7 @@ object CommonExpressionCheckers : ExpressionCheckers() {
override val propertyAccessExpressionCheckers: Set<FirPropertyAccessExpressionChecker>
get() = setOf(
FirPropertyAccessTypeArgumentsChecker,
FirCustomEnumEntriesMigrationAccessChecker,
)
override val tryExpressionCheckers: Set<FirTryExpressionChecker>
@@ -161,6 +162,7 @@ object CommonExpressionCheckers : ExpressionCheckers() {
FirDeprecatedQualifierChecker,
FirVisibilityQualifierChecker,
FirInlineBodyResolvedQualifierChecker,
FirCustomEnumEntriesMigrationQualifierChecker,
)
override val equalityOperatorCallCheckers: Set<FirEqualityOperatorCallChecker>
@@ -181,5 +183,6 @@ object CommonExpressionCheckers : ExpressionCheckers() {
override val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker>
get() = setOf(
FirTypeArgumentsOfQualifierOfCallableReferenceChecker,
FirCustomEnumEntriesMigrationReferenceChecker,
)
}
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.analysis.checkers.expression
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.references.toResolvedPropertySymbol
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeResolutionResultOverridesOtherToPreserveCompatibility
object FirCustomEnumEntriesMigrationAccessChecker : FirPropertyAccessExpressionChecker() {
override fun check(expression: FirPropertyAccessExpression, context: CheckerContext, reporter: DiagnosticReporter) {
if (context.languageVersionSettings.supportsFeature(LanguageFeature.PrioritizedEnumEntries)) return
val referencedSymbol = expression.calleeReference.toResolvedPropertySymbol() ?: return
if (referencedSymbol.name != StandardNames.ENUM_ENTRIES) return
if (expression.nonFatalDiagnostics.none { it is ConeResolutionResultOverridesOtherToPreserveCompatibility }) return
// This 'if' is needed just to choose one of two diagnostics
if (expression.dispatchReceiver is FirResolvedQualifier || expression.extensionReceiver is FirResolvedQualifier) {
reporter.reportOn(expression.source, FirErrors.DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY, context)
} else {
reporter.reportOn(expression.source, FirErrors.DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM, context)
}
}
}
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.analysis.checkers.expression
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeResolutionResultOverridesOtherToPreserveCompatibility
object FirCustomEnumEntriesMigrationQualifierChecker : FirResolvedQualifierChecker() {
override fun check(expression: FirResolvedQualifier, context: CheckerContext, reporter: DiagnosticReporter) {
if (context.languageVersionSettings.supportsFeature(LanguageFeature.PrioritizedEnumEntries)) return
if (expression.symbol?.name != StandardNames.ENUM_ENTRIES) return
if (expression.nonFatalDiagnostics.none { it is ConeResolutionResultOverridesOtherToPreserveCompatibility }) return
reporter.reportOn(expression.source, FirErrors.DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM, context)
}
}
@@ -0,0 +1,26 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.analysis.checkers.expression
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeResolutionResultOverridesOtherToPreserveCompatibility
object FirCustomEnumEntriesMigrationReferenceChecker : FirCallableReferenceAccessChecker() {
override fun check(expression: FirCallableReferenceAccess, context: CheckerContext, reporter: DiagnosticReporter) {
if (context.languageVersionSettings.supportsFeature(LanguageFeature.PrioritizedEnumEntries)) return
if (expression.calleeReference.name == StandardNames.ENUM_ENTRIES &&
expression.nonFatalDiagnostics.any { it is ConeResolutionResultOverridesOtherToPreserveCompatibility }
) {
reporter.reportOn(expression.source, FirErrors.DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE, context)
}
}
}
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirExpressionsResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
import org.jetbrains.kotlin.fir.resolve.transformers.doesResolutionResultOverrideOtherToPreserveCompatibility
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
@@ -327,6 +328,15 @@ class FirCallResolver(
when {
referencedSymbol is FirClassLikeSymbol<*> -> {
val extraDiagnostic =
runIf(reducedCandidates.singleOrNull()?.doesResolutionResultOverrideOtherToPreserveCompatibility() == true) {
ConeResolutionResultOverridesOtherToPreserveCompatibility
}
val nonFatalDiagnosticFromExpressionWithExtra = when {
nonFatalDiagnosticFromExpression != null -> nonFatalDiagnosticFromExpression + listOfNotNull(extraDiagnostic)
extraDiagnostic == null -> null
else -> listOf(extraDiagnostic)
}
return components.buildResolvedQualifierForClass(
referencedSymbol,
qualifiedAccess.source,
@@ -336,7 +346,7 @@ class FirCallResolver(
nameReference.source,
qualifiedAccess.explicitReceiver,
referencedSymbol,
nonFatalDiagnosticFromExpression,
nonFatalDiagnosticFromExpressionWithExtra,
session
),
annotations = qualifiedAccess.annotations
@@ -817,7 +827,8 @@ class FirCallResolver(
createResolvedReferenceWithoutCandidateForLocalVariables &&
explicitReceiver?.coneTypeSafe<ConeIntegerLiteralType>() == null &&
coneSymbol is FirVariableSymbol &&
(coneSymbol !is FirPropertySymbol || (coneSymbol.fir as FirMemberDeclaration).typeParameters.isEmpty())
(coneSymbol !is FirPropertySymbol || (coneSymbol.fir as FirMemberDeclaration).typeParameters.isEmpty()) &&
!candidate.doesResolutionResultOverrideOtherToPreserveCompatibility()
) {
return buildResolvedNamedReference {
this.source = source
@@ -41,6 +41,12 @@ open class CandidateCollector(
candidates.clear()
}
if (currentApplicability == CandidateApplicability.RESOLVED_NEED_PRESERVE_COMPATIBILITY &&
applicability > currentApplicability
) {
candidate.addDiagnostic(ResolutionResultOverridesOtherToPreserveCompatibility)
}
currentApplicability = applicability
bestGroup = group
}
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.builder.buildErrorFunction
import org.jetbrains.kotlin.fir.declarations.builder.buildErrorProperty
@@ -23,7 +22,6 @@ import org.jetbrains.kotlin.fir.scopes.impl.originalForWrappedIntegerOperator
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.resolvedType
import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzerContext
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isInline
@@ -19,13 +18,11 @@ import org.jetbrains.kotlin.fir.references.builder.buildResolvedCallableReferenc
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.Candidate
import org.jetbrains.kotlin.fir.resolve.calls.ResolutionResultOverridesOtherToPreserveCompatibility
import org.jetbrains.kotlin.fir.resolve.calls.FirErrorReferenceWithCandidate
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
import org.jetbrains.kotlin.fir.resolve.dfa.FirDataFlowAnalyzer
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeConstraintSystemHasContradiction
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeInapplicableCandidateError
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConePropertyAsOperator
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeTypeParameterInQualifiedAccess
import org.jetbrains.kotlin.fir.resolve.diagnostics.*
import org.jetbrains.kotlin.fir.resolve.inference.ResolvedLambdaAtom
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.*
@@ -180,6 +177,9 @@ class FirCallCompletionResultsWriterTransformer(
result.transformExplicitReceiver(typeUpdater, null)
}
if (calleeReference.candidate.doesResolutionResultOverrideOtherToPreserveCompatibility()) {
result.addNonFatalDiagnostic(ConeResolutionResultOverridesOtherToPreserveCompatibility)
}
return result
}
@@ -235,6 +235,9 @@ class FirCallCompletionResultsWriterTransformer(
return arrayOfCallTransformer.transformFunctionCall(result, session)
}
if (calleeReference.candidate.doesResolutionResultOverrideOtherToPreserveCompatibility()) {
result.addNonFatalDiagnostic(ConeResolutionResultOverridesOtherToPreserveCompatibility)
}
return result
}
@@ -378,6 +381,9 @@ class FirCallCompletionResultsWriterTransformer(
replaceCalleeReference(resolvedReference)
replaceDispatchReceiver(subCandidate.dispatchReceiverExpression())
replaceExtensionReceiver(subCandidate.chosenExtensionReceiverExpression())
if (calleeReference.candidate.doesResolutionResultOverrideOtherToPreserveCompatibility()) {
addNonFatalDiagnostic(ConeResolutionResultOverridesOtherToPreserveCompatibility)
}
}
}
@@ -815,3 +821,10 @@ private fun ExpectedArgumentType.getExpectedType(argument: FirElement): ConeKotl
}
fun ConeKotlinType.toExpectedType(): ExpectedArgumentType = ExpectedArgumentType.ExpectedType(this)
internal fun Candidate.doesResolutionResultOverrideOtherToPreserveCompatibility(): Boolean =
ResolutionResultOverridesOtherToPreserveCompatibility in diagnostics
internal fun FirQualifiedAccessExpression.addNonFatalDiagnostic(diagnostic: ConeDiagnostic) {
replaceNonFatalDiagnostics(nonFatalDiagnostics + listOf(diagnostic))
}
@@ -142,3 +142,5 @@ object UnsupportedContextualDeclarationCall : ResolutionDiagnostic(INAPPLICABLE)
class AmbiguousValuesForContextReceiverParameter(
val expectedContextReceiverType: ConeKotlinType,
) : ResolutionDiagnostic(INAPPLICABLE)
object ResolutionResultOverridesOtherToPreserveCompatibility : ResolutionDiagnostic(RESOLVED)
@@ -366,3 +366,9 @@ class ConeAmbiguouslyResolvedAnnotationArgument(
- compiler arguments stage: $symbolFromAnnotationArgumentsPhase
"""
}
object ConeResolutionResultOverridesOtherToPreserveCompatibility : ConeDiagnostic {
override val reason: String
get() = "Resolution result overrides another result to preserve compatibility, result maybe changed in future versions"
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -28,6 +29,7 @@ abstract class FirCallableReferenceAccess : FirQualifiedAccessExpression() {
abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val calleeReference: FirNamedReference
abstract val hasQuestionMarkAtLHS: Boolean
@@ -54,6 +56,8 @@ abstract class FirCallableReferenceAccess : FirQualifiedAccessExpression() {
@FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract fun replaceCalleeReference(newCalleeReference: FirNamedReference)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -27,6 +28,7 @@ abstract class FirComponentCall : FirFunctionCall() {
abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference
abstract override val origin: FirFunctionCallOrigin
@@ -54,6 +56,8 @@ abstract class FirComponentCall : FirFunctionCall() {
@FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract override fun replaceCalleeReference(newCalleeReference: FirNamedReference)
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -28,6 +29,7 @@ abstract class FirFunctionCall : FirQualifiedAccessExpression(), FirCall {
abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference
abstract val origin: FirFunctionCallOrigin
@@ -55,6 +57,8 @@ abstract class FirFunctionCall : FirQualifiedAccessExpression(), FirCall {
@FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract fun replaceCalleeReference(newCalleeReference: FirNamedReference)
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -28,6 +29,7 @@ abstract class FirImplicitInvokeCall : FirFunctionCall() {
abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference
abstract override val origin: FirFunctionCallOrigin
@@ -55,6 +57,8 @@ abstract class FirImplicitInvokeCall : FirFunctionCall() {
@FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract override fun replaceCalleeReference(newCalleeReference: FirNamedReference)
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -26,6 +27,7 @@ abstract class FirIntegerLiteralOperatorCall : FirFunctionCall() {
abstract override val typeArguments: List<FirTypeProjection>
abstract override val explicitReceiver: FirExpression?
abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference
abstract override val origin: FirFunctionCallOrigin
@@ -51,6 +53,8 @@ abstract class FirIntegerLiteralOperatorCall : FirFunctionCall() {
@FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract override fun replaceCalleeReference(newCalleeReference: FirNamedReference)
@@ -29,7 +29,7 @@ abstract class FirPropertyAccessExpression : FirQualifiedAccessExpression() {
abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement?
abstract val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitPropertyAccessExpression(this, data)
@@ -56,7 +56,7 @@ abstract class FirPropertyAccessExpression : FirQualifiedAccessExpression() {
@FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?)
abstract fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirPropertyAccessExpression
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeProjection
@@ -28,6 +29,7 @@ abstract class FirQualifiedAccessExpression : FirExpression(), FirResolvable, Fi
abstract val dispatchReceiver: FirExpression
abstract val extensionReceiver: FirExpression
abstract override val source: KtSourceElement?
abstract val nonFatalDiagnostics: List<ConeDiagnostic>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitQualifiedAccessExpression(this, data)
@@ -54,6 +56,8 @@ abstract class FirQualifiedAccessExpression : FirExpression(), FirResolvable, Fi
@FirImplementationDetail
abstract fun replaceSource(newSource: KtSourceElement?)
abstract fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.references.FirThisReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -28,6 +29,7 @@ abstract class FirThisReceiverExpression : FirQualifiedAccessExpression() {
abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val calleeReference: FirThisReference
abstract val isImplicit: Boolean
@@ -54,6 +56,8 @@ abstract class FirThisReceiverExpression : FirQualifiedAccessExpression() {
@FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract fun replaceCalleeReference(newCalleeReference: FirThisReference)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
@@ -9,6 +9,7 @@ package org.jetbrains.kotlin.fir.expressions.builder
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -36,6 +37,7 @@ interface FirAbstractFunctionCallBuilder : FirQualifiedAccessExpressionBuilder,
abstract override var dispatchReceiver: FirExpression
abstract override var extensionReceiver: FirExpression
abstract override var source: KtSourceElement?
abstract override val nonFatalDiagnostics: MutableList<ConeDiagnostic>
abstract override var argumentList: FirArgumentList
abstract var calleeReference: FirNamedReference
abstract var origin: FirFunctionCallOrigin
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -41,6 +42,7 @@ class FirCallableReferenceAccessBuilder : FirQualifiedAccessExpressionBuilder, F
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression
override var source: KtSourceElement? = null
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
lateinit var calleeReference: FirNamedReference
var hasQuestionMarkAtLHS: Boolean = false
@@ -54,6 +56,7 @@ class FirCallableReferenceAccessBuilder : FirQualifiedAccessExpressionBuilder, F
dispatchReceiver,
extensionReceiver,
source,
nonFatalDiagnostics.toMutableOrEmpty(),
calleeReference,
hasQuestionMarkAtLHS,
)
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
@@ -45,6 +46,7 @@ class FirComponentCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder, F
var dispatchReceiver: FirExpression = FirNoReceiverExpression
var extensionReceiver: FirExpression = FirNoReceiverExpression
override var source: KtSourceElement? = null
val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList
lateinit var explicitReceiver: FirExpression
var componentIndex: Int by kotlin.properties.Delegates.notNull<Int>()
@@ -58,6 +60,7 @@ class FirComponentCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder, F
dispatchReceiver,
extensionReceiver,
source,
nonFatalDiagnostics.toMutableOrEmpty(),
argumentList,
explicitReceiver,
componentIndex,
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
@@ -44,6 +45,7 @@ open class FirFunctionCallBuilder : FirAbstractFunctionCallBuilder, FirAnnotatio
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression
override var source: KtSourceElement? = null
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList
override lateinit var calleeReference: FirNamedReference
override var origin: FirFunctionCallOrigin = FirFunctionCallOrigin.Regular
@@ -59,6 +61,7 @@ open class FirFunctionCallBuilder : FirAbstractFunctionCallBuilder, FirAnnotatio
dispatchReceiver,
extensionReceiver,
source,
nonFatalDiagnostics.toMutableOrEmpty(),
argumentList,
calleeReference,
origin,
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
@@ -44,6 +45,7 @@ open class FirImplicitInvokeCallBuilder : FirAbstractFunctionCallBuilder, FirAnn
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression
override var source: KtSourceElement? = null
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList
override lateinit var calleeReference: FirNamedReference
@@ -57,6 +59,7 @@ open class FirImplicitInvokeCallBuilder : FirAbstractFunctionCallBuilder, FirAnn
dispatchReceiver,
extensionReceiver,
source,
nonFatalDiagnostics.toMutableOrEmpty(),
argumentList,
calleeReference,
)
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
@@ -42,6 +43,7 @@ open class FirIntegerLiteralOperatorCallBuilder : FirAbstractFunctionCallBuilder
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var explicitReceiver: FirExpression? = null
override var source: KtSourceElement? = null
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList
override lateinit var calleeReference: FirNamedReference
override lateinit var origin: FirFunctionCallOrigin
@@ -56,6 +58,7 @@ open class FirIntegerLiteralOperatorCallBuilder : FirAbstractFunctionCallBuilder
typeArguments.toMutableOrEmpty(),
explicitReceiver,
source,
nonFatalDiagnostics.toMutableOrEmpty(),
argumentList,
calleeReference,
origin,
@@ -42,7 +42,7 @@ class FirPropertyAccessExpressionBuilder : FirQualifiedAccessExpressionBuilder,
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression
override var source: KtSourceElement? = null
val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
@OptIn(FirImplementationDetail::class)
override fun build(): FirPropertyAccessExpression {
@@ -9,6 +9,7 @@ package org.jetbrains.kotlin.fir.expressions.builder
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
@@ -31,5 +32,7 @@ interface FirQualifiedAccessExpressionBuilder {
abstract var dispatchReceiver: FirExpression
abstract var extensionReceiver: FirExpression
abstract var source: KtSourceElement?
abstract val nonFatalDiagnostics: MutableList<ConeDiagnostic>
fun build(): FirQualifiedAccessExpression
}
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
@@ -38,6 +39,7 @@ class FirThisReceiverExpressionBuilder : FirQualifiedAccessExpressionBuilder, Fi
override val contextReceiverArguments: MutableList<FirExpression> = mutableListOf()
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var source: KtSourceElement? = null
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
lateinit var calleeReference: FirThisReference
var isImplicit: Boolean = false
@@ -48,6 +50,7 @@ class FirThisReceiverExpressionBuilder : FirQualifiedAccessExpressionBuilder, Fi
contextReceiverArguments.toMutableOrEmpty(),
typeArguments.toMutableOrEmpty(),
source,
nonFatalDiagnostics.toMutableOrEmpty(),
calleeReference,
isImplicit,
)
@@ -95,6 +98,7 @@ inline fun buildThisReceiverExpressionCopy(original: FirThisReceiverExpression,
copyBuilder.contextReceiverArguments.addAll(original.contextReceiverArguments)
copyBuilder.typeArguments.addAll(original.typeArguments)
copyBuilder.source = original.source
copyBuilder.nonFatalDiagnostics.addAll(original.nonFatalDiagnostics)
copyBuilder.calleeReference = original.calleeReference
copyBuilder.isImplicit = original.isImplicit
return copyBuilder.apply(init).build()
@@ -8,6 +8,7 @@
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -34,6 +35,7 @@ internal class FirCallableReferenceAccessImpl(
override var dispatchReceiver: FirExpression,
override var extensionReceiver: FirExpression,
override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var calleeReference: FirNamedReference,
override var hasQuestionMarkAtLHS: Boolean,
) : FirCallableReferenceAccess() {
@@ -119,6 +121,10 @@ internal class FirCallableReferenceAccessImpl(
source = newSource
}
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceCalleeReference(newCalleeReference: FirNamedReference) {
calleeReference = newCalleeReference
}
@@ -9,6 +9,7 @@ package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
@@ -38,6 +39,7 @@ internal class FirComponentCallImpl(
override var dispatchReceiver: FirExpression,
override var extensionReceiver: FirExpression,
override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var argumentList: FirArgumentList,
override var explicitReceiver: FirExpression,
override val componentIndex: Int,
@@ -125,6 +127,10 @@ internal class FirComponentCallImpl(
source = newSource
}
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceArgumentList(newArgumentList: FirArgumentList) {
argumentList = newArgumentList
}
@@ -9,6 +9,7 @@ package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -36,6 +37,7 @@ open class FirFunctionCallImpl @FirImplementationDetail constructor(
override var dispatchReceiver: FirExpression,
override var extensionReceiver: FirExpression,
override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var argumentList: FirArgumentList,
override var calleeReference: FirNamedReference,
override val origin: FirFunctionCallOrigin,
@@ -124,6 +126,10 @@ open class FirFunctionCallImpl @FirImplementationDetail constructor(
source = newSource
}
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceArgumentList(newArgumentList: FirArgumentList) {
argumentList = newArgumentList
}
@@ -8,6 +8,7 @@
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -36,6 +37,7 @@ internal class FirImplicitInvokeCallImpl(
override var dispatchReceiver: FirExpression,
override var extensionReceiver: FirExpression,
override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var argumentList: FirArgumentList,
override var calleeReference: FirNamedReference,
) : FirImplicitInvokeCall() {
@@ -125,6 +127,10 @@ internal class FirImplicitInvokeCallImpl(
source = newSource
}
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceArgumentList(newArgumentList: FirArgumentList) {
argumentList = newArgumentList
}
@@ -8,6 +8,7 @@
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -34,6 +35,7 @@ internal class FirIntegerLiteralOperatorCallImpl(
override var typeArguments: MutableOrEmptyList<FirTypeProjection>,
override var explicitReceiver: FirExpression?,
override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var argumentList: FirArgumentList,
override var calleeReference: FirNamedReference,
override val origin: FirFunctionCallOrigin,
@@ -126,6 +128,10 @@ internal class FirIntegerLiteralOperatorCallImpl(
source = newSource
}
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceArgumentList(newArgumentList: FirArgumentList) {
argumentList = newArgumentList
}
@@ -8,6 +8,7 @@
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
@@ -32,6 +33,7 @@ internal class FirThisReceiverExpressionImpl(
override var contextReceiverArguments: MutableOrEmptyList<FirExpression>,
override var typeArguments: MutableOrEmptyList<FirTypeProjection>,
override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var calleeReference: FirThisReference,
override val isImplicit: Boolean,
) : FirThisReceiverExpression() {
@@ -121,6 +123,10 @@ internal class FirThisReceiverExpressionImpl(
source = newSource
}
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceCalleeReference(newCalleeReference: FirThisReference) {
calleeReference = newCalleeReference
}
@@ -213,9 +213,6 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+typeArguments.withTransform()
+receivers
+field("source", sourceElementType, nullable = true, withReplace = true)
}
propertyAccessExpression.configure {
+fieldList("nonFatalDiagnostics", coneDiagnosticType, useMutableOrEmpty = true, withReplace = true)
}
@@ -1,15 +0,0 @@
// !LANGUAGE: -EnumEntries
// WITH_STDLIB
enum class E {
;
val entries: Int = 0
}
fun test() {
E::entries
val ref = E::entries
val refType: (E) -> Int = E::entries
val refTypeWithAnyExpectedType: Any = E::entries
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: -EnumEntries
// WITH_STDLIB
@@ -1,16 +0,0 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
enum class E {
;
val entries: Int = 0
}
fun test() {
E::entries
val ref = E::entries
val refType: (E) -> Int = E::entries
val refTypeWithAnyExpectedType: Any = E::entries
}
@@ -1,4 +1,4 @@
FILE: conflictingPropertyEntriesAndReferenceOn.fir.kt
FILE: conflictingPropertyEntriesAndReferenceOn.kt
public final enum class E : R|kotlin/Enum<E>| {
private constructor(): R|E| {
super<R|kotlin/Enum<E>|>()
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
@@ -12,7 +12,7 @@ enum class A {
val A.Companion.entries: Int get() = 0
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
with(A) {
@@ -13,7 +13,7 @@ enum class A {
val A.Companion.entries: Int get() = 0
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
with(A) {
@@ -14,7 +14,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) {
entries
@@ -15,7 +15,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) {
entries
@@ -10,7 +10,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
with(A) {
@@ -11,7 +11,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
with(A) {
@@ -11,7 +11,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) {
entries
@@ -12,7 +12,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) {
entries
@@ -12,6 +12,6 @@ enum class A {
val <T> T.entries: Int get() = 0
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
}
@@ -13,6 +13,6 @@ enum class A {
val <T> T.entries: Int get() = 0
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
}
@@ -0,0 +1,5 @@
FILE: Main.kt
public final fun main(): R|kotlin/Unit| {
R|kotlin/io/println|(Q|JavaEnum|.R|/JavaEnum.entries*s|)
R|kotlin/io/println|(Q|JavaEnum01|.R|/JavaEnum01.entries*s|)
}
@@ -0,0 +1,25 @@
// FIR_IDENTICAL
// !LANGUAGE: +EnumEntries +PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
// ISSUE: KT-56623
// FILE: JavaEnum.java
public enum JavaEnum {
public static String entries = "entries";
}
// FILE: JavaEnum01.java
interface I01 {
String entries = "entries";
}
public enum JavaEnum01 implements I01 {
}
// FILE: Main.kt
fun main() {
println(JavaEnum.entries)
println(JavaEnum01.entries)
}
@@ -1,33 +0,0 @@
// !LANGUAGE: -EnumEntries
// WITH_STDLIB
// FILE: JEnumEntry.java
public enum JEnumEntry {
entries;
}
// FILE: JEnumStaticField.java
public enum JEnumStaticField {
;
public static final int entries = 0;
}
// FILE: JEnumField.java
public enum JEnumField {
;
public final int entries = 0;
}
// FILE: test.kt
fun test() {
JEnumEntry.entries
JEnumStaticField.entries
JEnumField::entries
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: -EnumEntries
// WITH_STDLIB
@@ -1,36 +0,0 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
// FILE: JEnumEntry.java
public enum JEnumEntry {
entries;
}
// FILE: JEnumStaticField.java
public enum JEnumStaticField {
;
public static final int entries = 0;
}
// FILE: JEnumField.java
public enum JEnumField {
;
public final int entries = 0;
}
// FILE: test.kt
fun test(): String {
val first = JEnumEntry.entries
val second = JEnumStaticField.entries
val third = JEnumField::entries
return "$first$second$third"
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
@@ -9,7 +9,7 @@ enum class E {
;
fun foo() {
entries
<!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>
pckg.entries
}
}
@@ -20,7 +20,7 @@ class A {
class B {
fun foo() {
entries
<!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>
pckg.entries
}
}
@@ -10,7 +10,7 @@ enum class E {
;
fun foo() {
entries.length
<!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>.length
pckg.entries.length
}
}
@@ -21,7 +21,7 @@ class A {
class B {
fun foo() {
entries.length
<!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>.length
pckg.entries.length
}
}
@@ -0,0 +1,6 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
enum class Some {}
val x = Some::entries
@@ -0,0 +1,6 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
enum class Some {}
val x = Some::<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE!>entries<!>
@@ -0,0 +1,46 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// ISSUE: KT-56587
enum class E05 {
;
object entries
}
fun test05() {
println(<!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>E05.entries<!>)
}
enum class E07(val entries: String) {
;
fun test() {
println(entries)
}
}
enum class E071 {
;
constructor(entries: String) {
println(entries)
}
}
enum class E09 {
;
val entries: String = "entries"
fun test() {
println(entries)
}
}
interface I01 {
val entries: String
get() = "entries"
}
enum class E10 : I01 {
;
fun test() {
println(entries)
}
}
@@ -0,0 +1,46 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// ISSUE: KT-56587
enum class E05 {
;
object entries
}
fun test05() {
println(E05.entries)
}
enum class E07(val entries: String) {
;
fun test() {
println(entries)
}
}
enum class E071 {
;
constructor(entries: String) {
println(entries)
}
}
enum class E09 {
;
val entries: String = "entries"
fun test() {
println(entries)
}
}
interface I01 {
val entries: String
get() = "entries"
}
enum class E10 : I01 {
;
fun test() {
println(entries)
}
}
@@ -0,0 +1,112 @@
FILE: toBeShadowedPrioritized.kt
public final enum class E05 : R|kotlin/Enum<E05>| {
private constructor(): R|E05| {
super<R|kotlin/Enum<E05>|>()
}
public final object entries : R|kotlin/Any| {
private constructor(): R|E05.entries| {
super<R|kotlin/Any|>()
}
}
public final static fun values(): R|kotlin/Array<E05>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|E05| {
}
public final static val entries: R|kotlin/enums/EnumEntries<E05>|
public get(): R|kotlin/enums/EnumEntries<E05>|
}
public final fun test05(): R|kotlin/Unit| {
R|kotlin/io/println|(Q|E05|.R|/E05.entries*s|)
}
public final enum class E07 : R|kotlin/Enum<E07>| {
private constructor(entries: R|kotlin/String|): R|E07| {
super<R|kotlin/Enum<E07>|>()
}
public final val entries: R|kotlin/String| = R|<local>/entries|
public get(): R|kotlin/String|
public final fun test(): R|kotlin/Unit| {
R|kotlin/io/println|(this@R|/E07|.R|/E07.entries|)
}
public final static fun values(): R|kotlin/Array<E07>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|E07| {
}
public final static val entries: R|kotlin/enums/EnumEntries<E07>|
public get(): R|kotlin/enums/EnumEntries<E07>|
}
public final enum class E071 : R|kotlin/Enum<E071>| {
private constructor(entries: R|kotlin/String|): R|E071| {
super<R|kotlin/Enum<E071>|>()
R|kotlin/io/println|(R|<local>/entries|)
}
public final static fun values(): R|kotlin/Array<E071>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|E071| {
}
public final static val entries: R|kotlin/enums/EnumEntries<E071>|
public get(): R|kotlin/enums/EnumEntries<E071>|
}
public final enum class E09 : R|kotlin/Enum<E09>| {
private constructor(): R|E09| {
super<R|kotlin/Enum<E09>|>()
}
public final val entries: R|kotlin/String| = String(entries)
public get(): R|kotlin/String|
public final fun test(): R|kotlin/Unit| {
R|kotlin/io/println|(this@R|/E09|.R|/E09.entries|)
}
public final static fun values(): R|kotlin/Array<E09>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|E09| {
}
public final static val entries: R|kotlin/enums/EnumEntries<E09>|
public get(): R|kotlin/enums/EnumEntries<E09>|
}
public abstract interface I01 : R|kotlin/Any| {
public open val entries: R|kotlin/String|
public get(): R|kotlin/String| {
^ String(entries)
}
}
public final enum class E10 : R|I01|, R|kotlin/Enum<E10>| {
private constructor(): R|E10| {
super<R|kotlin/Enum<E10>|>()
}
public final fun test(): R|kotlin/Unit| {
R|kotlin/io/println|(this@R|/E10|.R|/I01.entries|)
}
public final static fun values(): R|kotlin/Array<E10>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|E10| {
}
public final static val entries: R|kotlin/enums/EnumEntries<E10>|
public get(): R|kotlin/enums/EnumEntries<E10>|
}
@@ -0,0 +1,48 @@
// FIR_IDENTICAL
// !LANGUAGE: +EnumEntries +PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
// ISSUE: KT-56587
enum class E05 {
;
object entries
}
fun test05() {
println(E05.entries)
}
enum class E07(val entries: String) {
;
fun test() {
println(entries)
}
}
enum class E071 {
;
constructor(entries: String) {
println(entries)
}
}
enum class E09 {
;
val entries: String = "entries"
fun test() {
println(entries)
}
}
interface I01 {
val entries: String
get() = "entries"
}
enum class E10 : I01 {
;
fun test() {
println(entries)
}
}
@@ -11587,6 +11587,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClashOn.kt");
}
@Test
@TestMetadata("javaEnumAdditionalCases.kt")
public void testJavaEnumAdditionalCases() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/javaEnumAdditionalCases.kt");
}
@Test
@TestMetadata("javaEnumEntriesAmbiguity.kt")
public void testJavaEnumEntriesAmbiguity() throws Exception {
@@ -11623,6 +11629,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesPrioritized.kt");
}
@Test
@TestMetadata("primitiveReference.kt")
public void testPrimitiveReference() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/primitiveReference.kt");
}
@Test
@TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt")
public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception {
@@ -11634,6 +11646,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/redeclarationOfEnumEntriesNameWithIntrinsicOn.kt");
}
@Test
@TestMetadata("toBeShadowed.kt")
public void testToBeShadowed() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/toBeShadowed.kt");
}
@Test
@TestMetadata("toBeShadowedPrioritized.kt")
public void testToBeShadowedPrioritized() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/toBeShadowedPrioritized.kt");
}
}
@Nested