[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
+}