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"); 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 @Test
@TestMetadata("javaEnumEntriesAmbiguity.kt") @TestMetadata("javaEnumEntriesAmbiguity.kt")
public void testJavaEnumEntriesAmbiguity() throws Exception { public void testJavaEnumEntriesAmbiguity() throws Exception {
@@ -11617,6 +11623,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesPrioritized.kt"); 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 @Test
@TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt") @TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt")
public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception { public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception {
@@ -11628,6 +11640,18 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception { public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/redeclarationOfEnumEntriesNameWithIntrinsicOn.kt"); 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 @Nested
@@ -11581,6 +11581,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClashOn.kt"); 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 @Test
@TestMetadata("javaEnumEntriesAmbiguity.kt") @TestMetadata("javaEnumEntriesAmbiguity.kt")
public void testJavaEnumEntriesAmbiguity() throws Exception { public void testJavaEnumEntriesAmbiguity() throws Exception {
@@ -11617,6 +11623,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesPrioritized.kt"); 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 @Test
@TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt") @TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt")
public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception { public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception {
@@ -11628,6 +11640,18 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception { public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/redeclarationOfEnumEntriesNameWithIntrinsicOn.kt"); 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 @Nested
@@ -11581,6 +11581,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClashOn.kt"); 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 @Test
@TestMetadata("javaEnumEntriesAmbiguity.kt") @TestMetadata("javaEnumEntriesAmbiguity.kt")
public void testJavaEnumEntriesAmbiguity() throws Exception { public void testJavaEnumEntriesAmbiguity() throws Exception {
@@ -11617,6 +11623,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesPrioritized.kt"); 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 @Test
@TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt") @TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt")
public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception { public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception {
@@ -11628,6 +11640,18 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception { public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/redeclarationOfEnumEntriesNameWithIntrinsicOn.kt"); 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 @Nested
@@ -11587,6 +11587,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClashOn.kt"); 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 @Test
@TestMetadata("javaEnumEntriesAmbiguity.kt") @TestMetadata("javaEnumEntriesAmbiguity.kt")
public void testJavaEnumEntriesAmbiguity() throws Exception { public void testJavaEnumEntriesAmbiguity() throws Exception {
@@ -11623,6 +11629,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesPrioritized.kt"); 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 @Test
@TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt") @TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt")
public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception { public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception {
@@ -11634,6 +11646,18 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception { public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/redeclarationOfEnumEntriesNameWithIntrinsicOn.kt"); 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 @Nested
@@ -1703,7 +1703,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val ENUM_ENTRIES_DEPRECATIONS by object : DiagnosticGroup("Enum.entries resolve deprecations") { 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_ENUM_ENTRY_COMPANION_PROPERTY by warning<PsiElement>()
val DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM 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>() val DEPRECATED_DECLARATION_OF_ENUM_ENTRY by warning<KtEnumEntry>()
} }
} }
@@ -848,7 +848,7 @@ object FirErrors {
// Enum.entries resolve deprecations // Enum.entries resolve deprecations
val DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY by warning0<PsiElement>() 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_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>() val DEPRECATED_DECLARATION_OF_ENUM_ENTRY by warning0<KtEnumEntry>()
init { init {
@@ -78,6 +78,7 @@ object CommonExpressionCheckers : ExpressionCheckers() {
override val propertyAccessExpressionCheckers: Set<FirPropertyAccessExpressionChecker> override val propertyAccessExpressionCheckers: Set<FirPropertyAccessExpressionChecker>
get() = setOf( get() = setOf(
FirPropertyAccessTypeArgumentsChecker, FirPropertyAccessTypeArgumentsChecker,
FirCustomEnumEntriesMigrationAccessChecker,
) )
override val tryExpressionCheckers: Set<FirTryExpressionChecker> override val tryExpressionCheckers: Set<FirTryExpressionChecker>
@@ -161,6 +162,7 @@ object CommonExpressionCheckers : ExpressionCheckers() {
FirDeprecatedQualifierChecker, FirDeprecatedQualifierChecker,
FirVisibilityQualifierChecker, FirVisibilityQualifierChecker,
FirInlineBodyResolvedQualifierChecker, FirInlineBodyResolvedQualifierChecker,
FirCustomEnumEntriesMigrationQualifierChecker,
) )
override val equalityOperatorCallCheckers: Set<FirEqualityOperatorCallChecker> override val equalityOperatorCallCheckers: Set<FirEqualityOperatorCallChecker>
@@ -181,5 +183,6 @@ object CommonExpressionCheckers : ExpressionCheckers() {
override val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker> override val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker>
get() = setOf( get() = setOf(
FirTypeArgumentsOfQualifierOfCallableReferenceChecker, 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.FirAbstractBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirExpressionsResolveTransformer 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.body.resolve.resultType
import org.jetbrains.kotlin.fir.resolve.transformers.doesResolutionResultOverrideOtherToPreserveCompatibility
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
@@ -327,6 +328,15 @@ class FirCallResolver(
when { when {
referencedSymbol is FirClassLikeSymbol<*> -> { 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( return components.buildResolvedQualifierForClass(
referencedSymbol, referencedSymbol,
qualifiedAccess.source, qualifiedAccess.source,
@@ -336,7 +346,7 @@ class FirCallResolver(
nameReference.source, nameReference.source,
qualifiedAccess.explicitReceiver, qualifiedAccess.explicitReceiver,
referencedSymbol, referencedSymbol,
nonFatalDiagnosticFromExpression, nonFatalDiagnosticFromExpressionWithExtra,
session session
), ),
annotations = qualifiedAccess.annotations annotations = qualifiedAccess.annotations
@@ -817,7 +827,8 @@ class FirCallResolver(
createResolvedReferenceWithoutCandidateForLocalVariables && createResolvedReferenceWithoutCandidateForLocalVariables &&
explicitReceiver?.coneTypeSafe<ConeIntegerLiteralType>() == null && explicitReceiver?.coneTypeSafe<ConeIntegerLiteralType>() == null &&
coneSymbol is FirVariableSymbol && 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 { return buildResolvedNamedReference {
this.source = source this.source = source
@@ -41,6 +41,12 @@ open class CandidateCollector(
candidates.clear() candidates.clear()
} }
if (currentApplicability == CandidateApplicability.RESOLVED_NEED_PRESERVE_COMPATIBILITY &&
applicability > currentApplicability
) {
candidate.addDiagnostic(ResolutionResultOverridesOtherToPreserveCompatibility)
}
currentApplicability = applicability currentApplicability = applicability
bestGroup = group bestGroup = group
} }
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin 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.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.builder.buildErrorFunction import org.jetbrains.kotlin.fir.declarations.builder.buildErrorFunction
import org.jetbrains.kotlin.fir.declarations.builder.buildErrorProperty 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.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.classId 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.fir.types.resolvedType
import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzerContext import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzerContext
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.fir.resolve.transformers package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isInline 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.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.Candidate 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.FirErrorReferenceWithCandidate
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
import org.jetbrains.kotlin.fir.resolve.dfa.FirDataFlowAnalyzer import org.jetbrains.kotlin.fir.resolve.dfa.FirDataFlowAnalyzer
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeConstraintSystemHasContradiction import org.jetbrains.kotlin.fir.resolve.diagnostics.*
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.inference.ResolvedLambdaAtom import org.jetbrains.kotlin.fir.resolve.inference.ResolvedLambdaAtom
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.* import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.*
@@ -180,6 +177,9 @@ class FirCallCompletionResultsWriterTransformer(
result.transformExplicitReceiver(typeUpdater, null) result.transformExplicitReceiver(typeUpdater, null)
} }
if (calleeReference.candidate.doesResolutionResultOverrideOtherToPreserveCompatibility()) {
result.addNonFatalDiagnostic(ConeResolutionResultOverridesOtherToPreserveCompatibility)
}
return result return result
} }
@@ -235,6 +235,9 @@ class FirCallCompletionResultsWriterTransformer(
return arrayOfCallTransformer.transformFunctionCall(result, session) return arrayOfCallTransformer.transformFunctionCall(result, session)
} }
if (calleeReference.candidate.doesResolutionResultOverrideOtherToPreserveCompatibility()) {
result.addNonFatalDiagnostic(ConeResolutionResultOverridesOtherToPreserveCompatibility)
}
return result return result
} }
@@ -378,6 +381,9 @@ class FirCallCompletionResultsWriterTransformer(
replaceCalleeReference(resolvedReference) replaceCalleeReference(resolvedReference)
replaceDispatchReceiver(subCandidate.dispatchReceiverExpression()) replaceDispatchReceiver(subCandidate.dispatchReceiverExpression())
replaceExtensionReceiver(subCandidate.chosenExtensionReceiverExpression()) 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) 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( class AmbiguousValuesForContextReceiverParameter(
val expectedContextReceiverType: ConeKotlinType, val expectedContextReceiverType: ConeKotlinType,
) : ResolutionDiagnostic(INAPPLICABLE) ) : ResolutionDiagnostic(INAPPLICABLE)
object ResolutionResultOverridesOtherToPreserveCompatibility : ResolutionDiagnostic(RESOLVED)
@@ -366,3 +366,9 @@ class ConeAmbiguouslyResolvedAnnotationArgument(
- compiler arguments stage: $symbolFromAnnotationArgumentsPhase - 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.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement 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.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -28,6 +29,7 @@ abstract class FirCallableReferenceAccess : FirQualifiedAccessExpression() {
abstract override val dispatchReceiver: FirExpression abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement? abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val calleeReference: FirNamedReference abstract override val calleeReference: FirNamedReference
abstract val hasQuestionMarkAtLHS: Boolean abstract val hasQuestionMarkAtLHS: Boolean
@@ -54,6 +56,8 @@ abstract class FirCallableReferenceAccess : FirQualifiedAccessExpression() {
@FirImplementationDetail @FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?) abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract fun replaceCalleeReference(newCalleeReference: FirNamedReference) abstract fun replaceCalleeReference(newCalleeReference: FirNamedReference)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference) 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.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement 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.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -27,6 +28,7 @@ abstract class FirComponentCall : FirFunctionCall() {
abstract override val dispatchReceiver: FirExpression abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement? abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val argumentList: FirArgumentList abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference abstract override val calleeReference: FirNamedReference
abstract override val origin: FirFunctionCallOrigin abstract override val origin: FirFunctionCallOrigin
@@ -54,6 +56,8 @@ abstract class FirComponentCall : FirFunctionCall() {
@FirImplementationDetail @FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?) abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList) abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract override fun replaceCalleeReference(newCalleeReference: FirNamedReference) 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.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement 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.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -28,6 +29,7 @@ abstract class FirFunctionCall : FirQualifiedAccessExpression(), FirCall {
abstract override val dispatchReceiver: FirExpression abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement? abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val argumentList: FirArgumentList abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference abstract override val calleeReference: FirNamedReference
abstract val origin: FirFunctionCallOrigin abstract val origin: FirFunctionCallOrigin
@@ -55,6 +57,8 @@ abstract class FirFunctionCall : FirQualifiedAccessExpression(), FirCall {
@FirImplementationDetail @FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?) abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList) abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract fun replaceCalleeReference(newCalleeReference: FirNamedReference) abstract fun replaceCalleeReference(newCalleeReference: FirNamedReference)
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement 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.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -28,6 +29,7 @@ abstract class FirImplicitInvokeCall : FirFunctionCall() {
abstract override val dispatchReceiver: FirExpression abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement? abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val argumentList: FirArgumentList abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference abstract override val calleeReference: FirNamedReference
abstract override val origin: FirFunctionCallOrigin abstract override val origin: FirFunctionCallOrigin
@@ -55,6 +57,8 @@ abstract class FirImplicitInvokeCall : FirFunctionCall() {
@FirImplementationDetail @FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?) abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList) abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract override fun replaceCalleeReference(newCalleeReference: FirNamedReference) 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.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement 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.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -26,6 +27,7 @@ abstract class FirIntegerLiteralOperatorCall : FirFunctionCall() {
abstract override val typeArguments: List<FirTypeProjection> abstract override val typeArguments: List<FirTypeProjection>
abstract override val explicitReceiver: FirExpression? abstract override val explicitReceiver: FirExpression?
abstract override val source: KtSourceElement? abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val argumentList: FirArgumentList abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference abstract override val calleeReference: FirNamedReference
abstract override val origin: FirFunctionCallOrigin abstract override val origin: FirFunctionCallOrigin
@@ -51,6 +53,8 @@ abstract class FirIntegerLiteralOperatorCall : FirFunctionCall() {
@FirImplementationDetail @FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?) abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList) abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract override fun replaceCalleeReference(newCalleeReference: FirNamedReference) abstract override fun replaceCalleeReference(newCalleeReference: FirNamedReference)
@@ -29,7 +29,7 @@ abstract class FirPropertyAccessExpression : FirQualifiedAccessExpression() {
abstract override val dispatchReceiver: FirExpression abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement? 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) 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 @FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?) 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 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.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement 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.FirReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
@@ -28,6 +29,7 @@ abstract class FirQualifiedAccessExpression : FirExpression(), FirResolvable, Fi
abstract val dispatchReceiver: FirExpression abstract val dispatchReceiver: FirExpression
abstract val extensionReceiver: FirExpression abstract val extensionReceiver: FirExpression
abstract override val source: KtSourceElement? 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) 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 @FirImplementationDetail
abstract fun replaceSource(newSource: KtSourceElement?) 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> transformAnnotations(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
abstract override fun <D> transformCalleeReference(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.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement 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.FirReference
import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.references.FirThisReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -28,6 +29,7 @@ abstract class FirThisReceiverExpression : FirQualifiedAccessExpression() {
abstract override val dispatchReceiver: FirExpression abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression abstract override val extensionReceiver: FirExpression
abstract override val source: KtSourceElement? abstract override val source: KtSourceElement?
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
abstract override val calleeReference: FirThisReference abstract override val calleeReference: FirThisReference
abstract val isImplicit: Boolean abstract val isImplicit: Boolean
@@ -54,6 +56,8 @@ abstract class FirThisReceiverExpression : FirQualifiedAccessExpression() {
@FirImplementationDetail @FirImplementationDetail
abstract override fun replaceSource(newSource: KtSourceElement?) abstract override fun replaceSource(newSource: KtSourceElement?)
abstract override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>)
abstract fun replaceCalleeReference(newCalleeReference: FirThisReference) abstract fun replaceCalleeReference(newCalleeReference: FirThisReference)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference) 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.KtSourceElement
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -36,6 +37,7 @@ interface FirAbstractFunctionCallBuilder : FirQualifiedAccessExpressionBuilder,
abstract override var dispatchReceiver: FirExpression abstract override var dispatchReceiver: FirExpression
abstract override var extensionReceiver: FirExpression abstract override var extensionReceiver: FirExpression
abstract override var source: KtSourceElement? abstract override var source: KtSourceElement?
abstract override val nonFatalDiagnostics: MutableList<ConeDiagnostic>
abstract override var argumentList: FirArgumentList abstract override var argumentList: FirArgumentList
abstract var calleeReference: FirNamedReference abstract var calleeReference: FirNamedReference
abstract var origin: FirFunctionCallOrigin 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.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -41,6 +42,7 @@ class FirCallableReferenceAccessBuilder : FirQualifiedAccessExpressionBuilder, F
override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression
override var source: KtSourceElement? = null override var source: KtSourceElement? = null
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
lateinit var calleeReference: FirNamedReference lateinit var calleeReference: FirNamedReference
var hasQuestionMarkAtLHS: Boolean = false var hasQuestionMarkAtLHS: Boolean = false
@@ -54,6 +56,7 @@ class FirCallableReferenceAccessBuilder : FirQualifiedAccessExpressionBuilder, F
dispatchReceiver, dispatchReceiver,
extensionReceiver, extensionReceiver,
source, source,
nonFatalDiagnostics.toMutableOrEmpty(),
calleeReference, calleeReference,
hasQuestionMarkAtLHS, hasQuestionMarkAtLHS,
) )
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall
@@ -45,6 +46,7 @@ class FirComponentCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder, F
var dispatchReceiver: FirExpression = FirNoReceiverExpression var dispatchReceiver: FirExpression = FirNoReceiverExpression
var extensionReceiver: FirExpression = FirNoReceiverExpression var extensionReceiver: FirExpression = FirNoReceiverExpression
override var source: KtSourceElement? = null override var source: KtSourceElement? = null
val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList override var argumentList: FirArgumentList = FirEmptyArgumentList
lateinit var explicitReceiver: FirExpression lateinit var explicitReceiver: FirExpression
var componentIndex: Int by kotlin.properties.Delegates.notNull<Int>() var componentIndex: Int by kotlin.properties.Delegates.notNull<Int>()
@@ -58,6 +60,7 @@ class FirComponentCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder, F
dispatchReceiver, dispatchReceiver,
extensionReceiver, extensionReceiver,
source, source,
nonFatalDiagnostics.toMutableOrEmpty(),
argumentList, argumentList,
explicitReceiver, explicitReceiver,
componentIndex, componentIndex,
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
@@ -44,6 +45,7 @@ open class FirFunctionCallBuilder : FirAbstractFunctionCallBuilder, FirAnnotatio
override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression
override var source: KtSourceElement? = null override var source: KtSourceElement? = null
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList override var argumentList: FirArgumentList = FirEmptyArgumentList
override lateinit var calleeReference: FirNamedReference override lateinit var calleeReference: FirNamedReference
override var origin: FirFunctionCallOrigin = FirFunctionCallOrigin.Regular override var origin: FirFunctionCallOrigin = FirFunctionCallOrigin.Regular
@@ -59,6 +61,7 @@ open class FirFunctionCallBuilder : FirAbstractFunctionCallBuilder, FirAnnotatio
dispatchReceiver, dispatchReceiver,
extensionReceiver, extensionReceiver,
source, source,
nonFatalDiagnostics.toMutableOrEmpty(),
argumentList, argumentList,
calleeReference, calleeReference,
origin, origin,
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
@@ -44,6 +45,7 @@ open class FirImplicitInvokeCallBuilder : FirAbstractFunctionCallBuilder, FirAnn
override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression
override var source: KtSourceElement? = null override var source: KtSourceElement? = null
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList override var argumentList: FirArgumentList = FirEmptyArgumentList
override lateinit var calleeReference: FirNamedReference override lateinit var calleeReference: FirNamedReference
@@ -57,6 +59,7 @@ open class FirImplicitInvokeCallBuilder : FirAbstractFunctionCallBuilder, FirAnn
dispatchReceiver, dispatchReceiver,
extensionReceiver, extensionReceiver,
source, source,
nonFatalDiagnostics.toMutableOrEmpty(),
argumentList, argumentList,
calleeReference, calleeReference,
) )
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
@@ -42,6 +43,7 @@ open class FirIntegerLiteralOperatorCallBuilder : FirAbstractFunctionCallBuilder
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf() override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var explicitReceiver: FirExpression? = null override var explicitReceiver: FirExpression? = null
override var source: KtSourceElement? = null override var source: KtSourceElement? = null
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList override var argumentList: FirArgumentList = FirEmptyArgumentList
override lateinit var calleeReference: FirNamedReference override lateinit var calleeReference: FirNamedReference
override lateinit var origin: FirFunctionCallOrigin override lateinit var origin: FirFunctionCallOrigin
@@ -56,6 +58,7 @@ open class FirIntegerLiteralOperatorCallBuilder : FirAbstractFunctionCallBuilder
typeArguments.toMutableOrEmpty(), typeArguments.toMutableOrEmpty(),
explicitReceiver, explicitReceiver,
source, source,
nonFatalDiagnostics.toMutableOrEmpty(),
argumentList, argumentList,
calleeReference, calleeReference,
origin, origin,
@@ -42,7 +42,7 @@ class FirPropertyAccessExpressionBuilder : FirQualifiedAccessExpressionBuilder,
override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression
override var source: KtSourceElement? = null override var source: KtSourceElement? = null
val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf() override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
@OptIn(FirImplementationDetail::class) @OptIn(FirImplementationDetail::class)
override fun build(): FirPropertyAccessExpression { override fun build(): FirPropertyAccessExpression {
@@ -9,6 +9,7 @@ package org.jetbrains.kotlin.fir.expressions.builder
import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl 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.FirAnnotation
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.FirQualifiedAccessExpression
@@ -31,5 +32,7 @@ interface FirQualifiedAccessExpressionBuilder {
abstract var dispatchReceiver: FirExpression abstract var dispatchReceiver: FirExpression
abstract var extensionReceiver: FirExpression abstract var extensionReceiver: FirExpression
abstract var source: KtSourceElement? abstract var source: KtSourceElement?
abstract val nonFatalDiagnostics: MutableList<ConeDiagnostic>
fun build(): FirQualifiedAccessExpression 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.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
@@ -38,6 +39,7 @@ class FirThisReceiverExpressionBuilder : FirQualifiedAccessExpressionBuilder, Fi
override val contextReceiverArguments: MutableList<FirExpression> = mutableListOf() override val contextReceiverArguments: MutableList<FirExpression> = mutableListOf()
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf() override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var source: KtSourceElement? = null override var source: KtSourceElement? = null
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
lateinit var calleeReference: FirThisReference lateinit var calleeReference: FirThisReference
var isImplicit: Boolean = false var isImplicit: Boolean = false
@@ -48,6 +50,7 @@ class FirThisReceiverExpressionBuilder : FirQualifiedAccessExpressionBuilder, Fi
contextReceiverArguments.toMutableOrEmpty(), contextReceiverArguments.toMutableOrEmpty(),
typeArguments.toMutableOrEmpty(), typeArguments.toMutableOrEmpty(),
source, source,
nonFatalDiagnostics.toMutableOrEmpty(),
calleeReference, calleeReference,
isImplicit, isImplicit,
) )
@@ -95,6 +98,7 @@ inline fun buildThisReceiverExpressionCopy(original: FirThisReceiverExpression,
copyBuilder.contextReceiverArguments.addAll(original.contextReceiverArguments) copyBuilder.contextReceiverArguments.addAll(original.contextReceiverArguments)
copyBuilder.typeArguments.addAll(original.typeArguments) copyBuilder.typeArguments.addAll(original.typeArguments)
copyBuilder.source = original.source copyBuilder.source = original.source
copyBuilder.nonFatalDiagnostics.addAll(original.nonFatalDiagnostics)
copyBuilder.calleeReference = original.calleeReference copyBuilder.calleeReference = original.calleeReference
copyBuilder.isImplicit = original.isImplicit copyBuilder.isImplicit = original.isImplicit
return copyBuilder.apply(init).build() return copyBuilder.apply(init).build()
@@ -8,6 +8,7 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -34,6 +35,7 @@ internal class FirCallableReferenceAccessImpl(
override var dispatchReceiver: FirExpression, override var dispatchReceiver: FirExpression,
override var extensionReceiver: FirExpression, override var extensionReceiver: FirExpression,
override var source: KtSourceElement?, override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var calleeReference: FirNamedReference, override var calleeReference: FirNamedReference,
override var hasQuestionMarkAtLHS: Boolean, override var hasQuestionMarkAtLHS: Boolean,
) : FirCallableReferenceAccess() { ) : FirCallableReferenceAccess() {
@@ -119,6 +121,10 @@ internal class FirCallableReferenceAccessImpl(
source = newSource source = newSource
} }
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceCalleeReference(newCalleeReference: FirNamedReference) { override fun replaceCalleeReference(newCalleeReference: FirNamedReference) {
calleeReference = newCalleeReference calleeReference = newCalleeReference
} }
@@ -9,6 +9,7 @@ package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall
@@ -38,6 +39,7 @@ internal class FirComponentCallImpl(
override var dispatchReceiver: FirExpression, override var dispatchReceiver: FirExpression,
override var extensionReceiver: FirExpression, override var extensionReceiver: FirExpression,
override var source: KtSourceElement?, override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var argumentList: FirArgumentList, override var argumentList: FirArgumentList,
override var explicitReceiver: FirExpression, override var explicitReceiver: FirExpression,
override val componentIndex: Int, override val componentIndex: Int,
@@ -125,6 +127,10 @@ internal class FirComponentCallImpl(
source = newSource source = newSource
} }
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceArgumentList(newArgumentList: FirArgumentList) { override fun replaceArgumentList(newArgumentList: FirArgumentList) {
argumentList = newArgumentList argumentList = newArgumentList
} }
@@ -9,6 +9,7 @@ package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -36,6 +37,7 @@ open class FirFunctionCallImpl @FirImplementationDetail constructor(
override var dispatchReceiver: FirExpression, override var dispatchReceiver: FirExpression,
override var extensionReceiver: FirExpression, override var extensionReceiver: FirExpression,
override var source: KtSourceElement?, override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var argumentList: FirArgumentList, override var argumentList: FirArgumentList,
override var calleeReference: FirNamedReference, override var calleeReference: FirNamedReference,
override val origin: FirFunctionCallOrigin, override val origin: FirFunctionCallOrigin,
@@ -124,6 +126,10 @@ open class FirFunctionCallImpl @FirImplementationDetail constructor(
source = newSource source = newSource
} }
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceArgumentList(newArgumentList: FirArgumentList) { override fun replaceArgumentList(newArgumentList: FirArgumentList) {
argumentList = newArgumentList argumentList = newArgumentList
} }
@@ -8,6 +8,7 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -36,6 +37,7 @@ internal class FirImplicitInvokeCallImpl(
override var dispatchReceiver: FirExpression, override var dispatchReceiver: FirExpression,
override var extensionReceiver: FirExpression, override var extensionReceiver: FirExpression,
override var source: KtSourceElement?, override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var argumentList: FirArgumentList, override var argumentList: FirArgumentList,
override var calleeReference: FirNamedReference, override var calleeReference: FirNamedReference,
) : FirImplicitInvokeCall() { ) : FirImplicitInvokeCall() {
@@ -125,6 +127,10 @@ internal class FirImplicitInvokeCallImpl(
source = newSource source = newSource
} }
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceArgumentList(newArgumentList: FirArgumentList) { override fun replaceArgumentList(newArgumentList: FirArgumentList) {
argumentList = newArgumentList argumentList = newArgumentList
} }
@@ -8,6 +8,7 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -34,6 +35,7 @@ internal class FirIntegerLiteralOperatorCallImpl(
override var typeArguments: MutableOrEmptyList<FirTypeProjection>, override var typeArguments: MutableOrEmptyList<FirTypeProjection>,
override var explicitReceiver: FirExpression?, override var explicitReceiver: FirExpression?,
override var source: KtSourceElement?, override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var argumentList: FirArgumentList, override var argumentList: FirArgumentList,
override var calleeReference: FirNamedReference, override var calleeReference: FirNamedReference,
override val origin: FirFunctionCallOrigin, override val origin: FirFunctionCallOrigin,
@@ -126,6 +128,10 @@ internal class FirIntegerLiteralOperatorCallImpl(
source = newSource source = newSource
} }
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceArgumentList(newArgumentList: FirArgumentList) { override fun replaceArgumentList(newArgumentList: FirArgumentList) {
argumentList = newArgumentList argumentList = newArgumentList
} }
@@ -8,6 +8,7 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement 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.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
@@ -32,6 +33,7 @@ internal class FirThisReceiverExpressionImpl(
override var contextReceiverArguments: MutableOrEmptyList<FirExpression>, override var contextReceiverArguments: MutableOrEmptyList<FirExpression>,
override var typeArguments: MutableOrEmptyList<FirTypeProjection>, override var typeArguments: MutableOrEmptyList<FirTypeProjection>,
override var source: KtSourceElement?, override var source: KtSourceElement?,
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var calleeReference: FirThisReference, override var calleeReference: FirThisReference,
override val isImplicit: Boolean, override val isImplicit: Boolean,
) : FirThisReceiverExpression() { ) : FirThisReceiverExpression() {
@@ -121,6 +123,10 @@ internal class FirThisReceiverExpressionImpl(
source = newSource source = newSource
} }
override fun replaceNonFatalDiagnostics(newNonFatalDiagnostics: List<ConeDiagnostic>) {
nonFatalDiagnostics = newNonFatalDiagnostics.toMutableOrEmpty()
}
override fun replaceCalleeReference(newCalleeReference: FirThisReference) { override fun replaceCalleeReference(newCalleeReference: FirThisReference) {
calleeReference = newCalleeReference calleeReference = newCalleeReference
} }
@@ -213,9 +213,6 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+typeArguments.withTransform() +typeArguments.withTransform()
+receivers +receivers
+field("source", sourceElementType, nullable = true, withReplace = true) +field("source", sourceElementType, nullable = true, withReplace = true)
}
propertyAccessExpression.configure {
+fieldList("nonFatalDiagnostics", coneDiagnosticType, useMutableOrEmpty = true, withReplace = true) +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 // !LANGUAGE: -EnumEntries
// WITH_STDLIB // 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>| { public final enum class E : R|kotlin/Enum<E>| {
private constructor(): R|E| { private constructor(): R|E| {
super<R|kotlin/Enum<E>|>() super<R|kotlin/Enum<E>|>()
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries // !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB // WITH_STDLIB
// FIR_DUMP // FIR_DUMP
@@ -12,7 +12,7 @@ enum class A {
val A.Companion.entries: Int get() = 0 val A.Companion.entries: Int get() = 0
fun test() { fun test() {
A.entries <!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries A.Companion.entries
with(A) { with(A) {
@@ -13,7 +13,7 @@ enum class A {
val A.Companion.entries: Int get() = 0 val A.Companion.entries: Int get() = 0
fun test() { fun test() {
A.entries <!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries A.Companion.entries
with(A) { with(A) {
@@ -14,7 +14,7 @@ enum class A {
} }
fun test() { fun test() {
A.entries <!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) { with(A) {
entries entries
@@ -15,7 +15,7 @@ enum class A {
} }
fun test() { fun test() {
A.entries <!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) { with(A) {
entries entries
@@ -10,7 +10,7 @@ enum class A {
} }
fun test() { fun test() {
A.entries <!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries A.Companion.entries
with(A) { with(A) {
@@ -11,7 +11,7 @@ enum class A {
} }
fun test() { fun test() {
A.entries <!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries A.Companion.entries
with(A) { with(A) {
@@ -11,7 +11,7 @@ enum class A {
} }
fun test() { fun test() {
A.entries <!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) { with(A) {
entries entries
@@ -12,7 +12,7 @@ enum class A {
} }
fun test() { fun test() {
A.entries <!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) { with(A) {
entries entries
@@ -12,6 +12,6 @@ enum class A {
val <T> T.entries: Int get() = 0 val <T> T.entries: Int get() = 0
fun test() { fun test() {
A.entries <!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries A.Companion.entries
} }
@@ -13,6 +13,6 @@ enum class A {
val <T> T.entries: Int get() = 0 val <T> T.entries: Int get() = 0
fun test() { fun test() {
A.entries <!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.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 // !LANGUAGE: -EnumEntries
// WITH_STDLIB // 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 // !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB // WITH_STDLIB
// FIR_DUMP // FIR_DUMP
@@ -9,7 +9,7 @@ enum class E {
; ;
fun foo() { fun foo() {
entries <!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>
pckg.entries pckg.entries
} }
} }
@@ -20,7 +20,7 @@ class A {
class B { class B {
fun foo() { fun foo() {
entries <!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>
pckg.entries pckg.entries
} }
} }
@@ -10,7 +10,7 @@ enum class E {
; ;
fun foo() { fun foo() {
entries.length <!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>.length
pckg.entries.length pckg.entries.length
} }
} }
@@ -21,7 +21,7 @@ class A {
class B { class B {
fun foo() { fun foo() {
entries.length <!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>.length
pckg.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"); 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 @Test
@TestMetadata("javaEnumEntriesAmbiguity.kt") @TestMetadata("javaEnumEntriesAmbiguity.kt")
public void testJavaEnumEntriesAmbiguity() throws Exception { public void testJavaEnumEntriesAmbiguity() throws Exception {
@@ -11623,6 +11629,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesPrioritized.kt"); 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 @Test
@TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt") @TestMetadata("redeclarationOfEnumEntriesNameWithIntrinsic.kt")
public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception { public void testRedeclarationOfEnumEntriesNameWithIntrinsic() throws Exception {
@@ -11634,6 +11646,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception { public void testRedeclarationOfEnumEntriesNameWithIntrinsicOn() throws Exception {
runTest("compiler/testData/diagnostics/tests/enum/entries/redeclarationOfEnumEntriesNameWithIntrinsicOn.kt"); 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 @Nested