[FIR] Don't forget to report DATA_CLASS_INVISIBLE_COPY_USAGE_WARNING on references
^KT-68525 Fixed
Review: https://jetbrains.team/p/kt/reviews/16214/files
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt
index 577803b..c595ef3 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt
@@ -38,6 +38,7 @@
FirAbstractSuperCallChecker,
FirQualifiedSupertypeExtendedByOtherSupertypeChecker,
FirProjectionsOnNonClassTypeArgumentChecker,
+ FirDataClassCopyUsageWillBecomeInaccessibleChecker,
FirIncompatibleProjectionsOnTypeArgumentChecker,
FirUpperBoundViolatedExpressionChecker,
FirTypeArgumentsNotAllowedExpressionChecker,
@@ -67,7 +68,6 @@
FirConventionFunctionCallChecker,
FirDivisionByZeroChecker,
FirConstructorCallChecker,
- FirDataClassCopyUsageWillBecomeInaccessibleChecker,
FirSpreadOfNullableChecker,
FirAssignmentOperatorCallChecker,
FirNamedVarargChecker,
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDataClassCopyUsageWillBecomeInaccessibleChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDataClassCopyUsageWillBecomeInaccessibleChecker.kt
index dfc001b..8e00a0d 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDataClassCopyUsageWillBecomeInaccessibleChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDataClassCopyUsageWillBecomeInaccessibleChecker.kt
@@ -12,23 +12,24 @@
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.primaryConstructorSymbol
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
-import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.utils.isData
+import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
+import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.references.symbol
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
-import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
import org.jetbrains.kotlin.fir.unwrapSubstitutionOverrides
import org.jetbrains.kotlin.fir.visibilityChecker
import org.jetbrains.kotlin.resolve.DataClassResolver
-object FirDataClassCopyUsageWillBecomeInaccessibleChecker : FirFunctionCallChecker(MppCheckerKind.Common) {
- override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) {
+object FirDataClassCopyUsageWillBecomeInaccessibleChecker : FirQualifiedAccessExpressionChecker(MppCheckerKind.Common) {
+ override fun check(expression: FirQualifiedAccessExpression, context: CheckerContext, reporter: DiagnosticReporter) {
+ if (expression !is FirFunctionCall && expression !is FirCallableReferenceAccess) return
val copyFunction = (expression.calleeReference.symbol as? FirCallableSymbol)?.unwrapSubstitutionOverrides() ?: return
val dataClass = copyFunction.dispatchReceiverType?.toRegularClassSymbol(context.session) ?: return
if (copyFunction.isDataClassCopy(dataClass, context.session)) {
diff --git a/compiler/testData/diagnostics/tests/dataClassNonPublicConstructor/deprecationPhase1_warning.fir.kt b/compiler/testData/diagnostics/tests/dataClassNonPublicConstructor/deprecationPhase1_warning.fir.kt
index 6ae27a0..47ecbbb 100644
--- a/compiler/testData/diagnostics/tests/dataClassNonPublicConstructor/deprecationPhase1_warning.fir.kt
+++ b/compiler/testData/diagnostics/tests/dataClassNonPublicConstructor/deprecationPhase1_warning.fir.kt
@@ -40,3 +40,25 @@
data.<!DATA_CLASS_INVISIBLE_COPY_USAGE_WARNING!>copy<!>()
data.copy("", 1) // fake copy
}
+
+data class GenericDataForRef<A> <!DATA_CLASS_COPY_VISIBILITY_WILL_BE_CHANGED_WARNING!>private<!> constructor(val a: A) {
+ fun member() {
+ copy()
+ this.copy()
+ ::copy
+ this::copy
+ GenericDataForRef<Int>::copy
+ GenericDataForRef<*>::copy
+ GenericDataForRef<in Int>::copy
+ GenericDataForRef<out Int>::copy
+ }
+}
+
+fun topLevel(data: GenericDataForRef<Int>) {
+ data.<!DATA_CLASS_INVISIBLE_COPY_USAGE_WARNING!>copy<!>()
+ data::<!DATA_CLASS_INVISIBLE_COPY_USAGE_WARNING!>copy<!>
+ GenericDataForRef<Int>::<!DATA_CLASS_INVISIBLE_COPY_USAGE_WARNING!>copy<!>
+ GenericDataForRef<*>::<!DATA_CLASS_INVISIBLE_COPY_USAGE_WARNING!>copy<!>
+ GenericDataForRef<in Int>::<!DATA_CLASS_INVISIBLE_COPY_USAGE_WARNING!>copy<!>
+ GenericDataForRef<out Int>::<!DATA_CLASS_INVISIBLE_COPY_USAGE_WARNING!>copy<!>
+}
diff --git a/compiler/testData/diagnostics/tests/dataClassNonPublicConstructor/deprecationPhase1_warning.kt b/compiler/testData/diagnostics/tests/dataClassNonPublicConstructor/deprecationPhase1_warning.kt
index ce8eeb6..d3f6eb6 100644
--- a/compiler/testData/diagnostics/tests/dataClassNonPublicConstructor/deprecationPhase1_warning.kt
+++ b/compiler/testData/diagnostics/tests/dataClassNonPublicConstructor/deprecationPhase1_warning.kt
@@ -40,3 +40,25 @@
data.copy()
data.copy("", 1) // fake copy
}
+
+data class GenericDataForRef<A> private constructor(val a: A) {
+ fun member() {
+ copy()
+ this.copy()
+ ::copy
+ this::copy
+ GenericDataForRef<Int>::copy
+ GenericDataForRef<*>::copy
+ GenericDataForRef<in Int>::copy
+ GenericDataForRef<out Int>::copy
+ }
+}
+
+fun topLevel(data: GenericDataForRef<Int>) {
+ data.copy()
+ data::copy
+ GenericDataForRef<Int>::copy
+ GenericDataForRef<*>::copy
+ GenericDataForRef<in Int>::copy
+ GenericDataForRef<out Int>::copy
+}