[FIR] Don't report UNINITIALIZED_VARIABLE on lateinit local variable

This commit is contained in:
Mikhail Glukhikh
2020-08-05 16:33:21 +03:00
parent 54d96a2dd7
commit 5f80bfd5d4
3 changed files with 3 additions and 24 deletions
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.contracts.description.isDefinitelyVisited import org.jetbrains.kotlin.contracts.description.isDefinitelyVisited
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.isLateInit
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNode import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNode
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph
@@ -38,6 +39,7 @@ object FirPropertyInitializationAnalyzer : AbstractFirPropertyInitializationChec
val reference = node.fir.calleeReference as? FirResolvedNamedReference ?: return val reference = node.fir.calleeReference as? FirResolvedNamedReference ?: return
val symbol = reference.resolvedSymbol as? FirPropertySymbol ?: return val symbol = reference.resolvedSymbol as? FirPropertySymbol ?: return
if (symbol !in localProperties) return if (symbol !in localProperties) return
if (symbol.fir.isLateInit) return
val kind = data.getValue(node)[symbol] ?: EventOccurrencesRange.ZERO val kind = data.getValue(node)[symbol] ?: EventOccurrencesRange.ZERO
if (!kind.isDefinitelyVisited()) { if (!kind.isDefinitelyVisited()) {
node.fir.source?.let { node.fir.source?.let {
@@ -1,24 +0,0 @@
// !LANGUAGE: +LateinitLocalVariables
fun test1() {
lateinit var s: String
<!UNINITIALIZED_VARIABLE!>s<!>.length
}
fun test2() {
lateinit var s: String
run {
s = ""
}
s.length
}
fun almostAlwaysTrue(): Boolean = true
fun test3() {
lateinit var s: String
if (almostAlwaysTrue()) {
s = ""
}
<!UNINITIALIZED_VARIABLE!>s<!>.length
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +LateinitLocalVariables // !LANGUAGE: +LateinitLocalVariables
fun test1() { fun test1() {