Skip to content

Commit b618ee4

Browse files
demiurg906Space Team
authored and
Space Team
committed
[FIR] Prohibit referencing java field in case of conflict with property..
..from companion object of the derived class ^KT-68056 Fixed
1 parent b239239 commit b618ee4

File tree

9 files changed

+130
-7
lines changed

9 files changed

+130
-7
lines changed

analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirFieldAccessShadowedByInvisibleKotlinProperty.kt

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,23 @@ import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
1212
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
1313
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirCallableReferenceAccessChecker
1414
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirPropertyAccessExpressionChecker
15+
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
1516
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JAVA_FIELD_SHADOWED_BY_KOTLIN_PROPERTY
17+
import org.jetbrains.kotlin.fir.declarations.FirFile
1618
import org.jetbrains.kotlin.fir.declarations.isJavaOrEnhancement
1719
import org.jetbrains.kotlin.fir.declarations.utils.hasBackingField
18-
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
19-
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
20-
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
21-
import org.jetbrains.kotlin.fir.expressions.toResolvedCallableSymbol
20+
import org.jetbrains.kotlin.fir.expressions.*
2221
import org.jetbrains.kotlin.fir.isVisible
2322
import org.jetbrains.kotlin.fir.resolve.scope
2423
import org.jetbrains.kotlin.fir.scopes.CallableCopyTypeCalculator
2524
import org.jetbrains.kotlin.fir.scopes.getProperties
25+
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
2626
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
2727
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
28+
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
2829
import org.jetbrains.kotlin.fir.types.resolvedType
30+
import org.jetbrains.kotlin.fir.types.toClassSymbol
31+
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
2932
import org.jetbrains.kotlin.fir.visibilityChecker
3033

3134
object FirFieldAccessShadowedByInvisibleKotlinProperty : FirPropertyAccessExpressionChecker(MppCheckerKind.Platform) {
@@ -51,14 +54,25 @@ private fun checkFieldAccess(
5154

5255
val containingFile = context.containingFile ?: return
5356
val dispatchReceiver = expression.dispatchReceiver ?: return
54-
val dispatchReceiverScope = dispatchReceiver.resolvedType.scope(
57+
checkClashWithInvisibleProperty(context, fieldSymbol, containingFile, dispatchReceiver, reporter, expression)
58+
checkClashWithCompanionProperty(context, fieldSymbol, reporter, expression)
59+
}
60+
61+
private fun checkClashWithInvisibleProperty(
62+
context: CheckerContext,
63+
fieldSymbol: FirFieldSymbol,
64+
containingFile: FirFile,
65+
dispatchReceiver: FirExpression,
66+
reporter: DiagnosticReporter,
67+
expression: FirQualifiedAccessExpression,
68+
) {
69+
val scope = dispatchReceiver.resolvedType.scope(
5570
context.session,
5671
context.scopeSession,
5772
CallableCopyTypeCalculator.Forced,
5873
requiredMembersPhase = null
5974
) ?: return
60-
61-
val properties = dispatchReceiverScope.getProperties(fieldSymbol.name)
75+
val properties = scope.getProperties(fieldSymbol.name)
6276
for (property in properties) {
6377
if (property !is FirPropertySymbol) continue
6478
if (!property.hasBackingField) continue
@@ -75,3 +89,22 @@ private fun checkFieldAccess(
7589
}
7690
}
7791
}
92+
93+
private fun checkClashWithCompanionProperty(
94+
context: CheckerContext,
95+
fieldSymbol: FirFieldSymbol,
96+
reporter: DiagnosticReporter,
97+
expression: FirQualifiedAccessExpression,
98+
) {
99+
val dispatchReceiverClass = expression.dispatchReceiver?.resolvedType?.toRegularClassSymbol(context.session) ?: return
100+
val companionClass = dispatchReceiverClass.companionObjectSymbol ?: return
101+
val companionScope = companionClass.unsubstitutedScope(context)
102+
val properties = companionScope.getProperties(fieldSymbol.name)
103+
for (property in properties) {
104+
if (property !is FirPropertySymbol) continue
105+
if (property.hasBackingField) {
106+
reporter.reportOn(expression.source, JAVA_FIELD_SHADOWED_BY_KOTLIN_PROPERTY, property, context)
107+
break
108+
}
109+
}
110+
}

compiler/testData/codegen/box/javaFieldAndKotlinProperty/javaFieldAndCompanionProperty.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// TARGET_BACKEND: JVM_IR
22
// IGNORE_BACKEND_K1: JVM_IR
3+
// IGNORE_BACKEND_K2: JVM_IR
4+
// COMMENTED[LANGUAGE: +ProperFieldAccessGenerationForFieldAccessShadowedByKotlinProperty] uncomment when KT-52338 is fixed
35

46
// FILE: Base.java
57
public class Base {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// LANGUAGE: -ProperFieldAccessGenerationForFieldAccessShadowedByKotlinProperty
2+
// ISSUE: KT-52338
3+
4+
// FILE: Base.java
5+
public class Base {
6+
protected String TAG = "OK";
7+
8+
public String foo() {
9+
return TAG;
10+
}
11+
}
12+
13+
// FILE: Sub.kt
14+
15+
class Sub : Base() {
16+
companion object {
17+
val TAG = "FAIL"
18+
}
19+
20+
fun log() = <!JAVA_FIELD_SHADOWED_BY_KOTLIN_PROPERTY!>TAG<!>
21+
22+
fun logReference() = this::<!JAVA_FIELD_SHADOWED_BY_KOTLIN_PROPERTY!>TAG<!>.get()
23+
24+
fun logAssignment(): String {
25+
<!JAVA_FIELD_SHADOWED_BY_KOTLIN_PROPERTY!>TAG<!> = "12"
26+
if (foo() != "12") return "Error writing: ${foo()}"
27+
return "OK"
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// LANGUAGE: -ProperFieldAccessGenerationForFieldAccessShadowedByKotlinProperty
2+
// ISSUE: KT-52338
3+
4+
// FILE: Base.java
5+
public class Base {
6+
protected String TAG = "OK";
7+
8+
public String foo() {
9+
return TAG;
10+
}
11+
}
12+
13+
// FILE: Sub.kt
14+
15+
class Sub : Base() {
16+
companion object {
17+
val TAG = "FAIL"
18+
}
19+
20+
fun log() = TAG
21+
22+
fun logReference() = this::TAG.get()
23+
24+
fun logAssignment(): String {
25+
TAG = "12"
26+
if (foo() != "12") return "Error writing: ${foo()}"
27+
return "OK"
28+
}
29+
}

compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)