diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt index 9f287ee7ab8..dd04a84b24f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.resolve.dfa.cfg.* import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol @OptIn(SymbolInternals::class) @@ -84,7 +85,7 @@ object FirPropertyInitializationAnalyzer : AbstractFirPropertyInitializationChec return true } val kind = info[symbol] ?: EventOccurrencesRange.ZERO - if (symbol.fir.isVal && kind.canBeRevisited()) { + if (symbol.fir.isVal && (symbol is FirSyntheticPropertySymbol || kind.canBeRevisited())) { reporter.reportOn(node.fir.lValue.source, FirErrors.VAL_REASSIGNMENT, symbol, context) return true } @@ -110,7 +111,7 @@ object FirPropertyInitializationAnalyzer : AbstractFirPropertyInitializationChec node: QualifiedAccessNode ): Boolean { val kind = info[symbol] ?: EventOccurrencesRange.ZERO - if (!kind.isDefinitelyVisited()) { + if (symbol !is FirSyntheticPropertySymbol && !kind.isDefinitelyVisited()) { reporter.reportOn(node.fir.source, FirErrors.UNINITIALIZED_VARIABLE, symbol, context) return true } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/util/LocalPropertyAndCapturedWriteCollector.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/util/LocalPropertyAndCapturedWriteCollector.kt index 4224c2f0723..060490a27fa 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/util/LocalPropertyAndCapturedWriteCollector.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/util/LocalPropertyAndCapturedWriteCollector.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.referredPropertySymbol import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.resolve.dfa.cfg.* import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol class LocalPropertyAndCapturedWriteCollector private constructor() : ControlFlowGraphVisitorVoid() { companion object { @@ -53,11 +54,16 @@ class LocalPropertyAndCapturedWriteCollector private constructor() : ControlFlow } override fun visitVariableAssignmentNode(node: VariableAssignmentNode) { + val symbol = node.fir.referredPropertySymbol ?: return + if (symbol is FirSyntheticPropertySymbol) { + symbols[symbol] = true + return + } + // Check if this variable assignment is inside a lambda or a local function. if (lambdaOrLocalFunctionStack.isEmpty()) return // Check if the assigned variable doesn't belong to any lambda or local function. - val symbol = node.fir.referredPropertySymbol ?: return if (symbol !in symbols || symbols[symbol] == false) return // If all nested declarations are lambdas that are invoked in-place (according to the contract), diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/FalseSetters.fir.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/FalseSetters.fir.kt index 5d34a5a2fc5..af81cb8bc5a 100644 --- a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/FalseSetters.fir.kt +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/FalseSetters.fir.kt @@ -1,9 +1,9 @@ // FILE: KotlinFile.kt fun foo(javaClass: JavaClass) { - javaClass.something1++ - javaClass.something2++ - javaClass.something3++ - javaClass.something4++ + javaClass.something1++ + javaClass.something2++ + javaClass.something3++ + javaClass.something4++ javaClass.something5 = null } diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/Getter.fir.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/Getter.fir.kt index c10255ae997..8f31032bf6d 100644 --- a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/Getter.fir.kt +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/Getter.fir.kt @@ -6,7 +6,7 @@ class KotlinClass { fun foo(javaClass: JavaClass, kotlinClass: KotlinClass) { useInt(javaClass.getSomething()) useInt(javaClass.something) - javaClass.something = 1 + javaClass.something = 1 javaClass.Something useInt(kotlinClass.getSomething()) kotlinClass.something diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/KotlinOverridesJava2.fir.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/KotlinOverridesJava2.fir.kt index b96014575d9..e572d344c9e 100644 --- a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/KotlinOverridesJava2.fir.kt +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/KotlinOverridesJava2.fir.kt @@ -9,7 +9,7 @@ fun foo(k: KotlinClass) { if (k.something == null) return k.setSomething(1) - k.something = 1 + k.something = 1 } fun useString(i: String) {}