Supported initialization with assignment instead of declaration

This commit is contained in:
Valentin Kipyatkov
2016-04-06 14:59:26 +03:00
parent 1fe84b8a25
commit ac46684592
3 changed files with 30 additions and 4 deletions
@@ -240,12 +240,20 @@ data class VariableInitialization(
val initializationStatement: KtExpression,
val initializer: KtExpression)
//TODO: we need more correctness checks (if variable is non-local or is local but can be changed by some local functions)
fun KtExpression.detectInitializationBeforeLoop(loop: KtForExpression): VariableInitialization? {
if (this !is KtNameReferenceExpression) return null
if (getQualifiedExpressionForSelector() != null) return null
val variable = this.mainReference.resolve() as? KtProperty ?: return null
if (variable != loop.previousStatement()) return null //TODO: support initializer not right before the loop
//TODO: support assignment instead of initializer
val initializer = variable.initializer ?: return null
return VariableInitialization(variable, variable, initializer)
val statementBeforeLoop = loop.previousStatement() //TODO: support initialization not right before the loop
if (statementBeforeLoop == variable) {
val initializer = variable.initializer ?: return null
return VariableInitialization(variable, variable, initializer)
}
val assignment = statementBeforeLoop?.asAssignment() ?: return null
if (!assignment.left.isVariableReference(variable)) return null
val initializer = assignment.right ?: return null
return VariableInitialization(variable, assignment, initializer)
}
@@ -0,0 +1,12 @@
// WITH_RUNTIME
fun foo(list: List<String>) {
var result: String? = ""
result = null
<caret>for (s in list) {
if (s.length > 0) {
result = s
break
}
}
}
@@ -0,0 +1,6 @@
// WITH_RUNTIME
fun foo(list: List<String>) {
var result: String? = ""
<caret>result = list.firstOrNull { it.length > 0 }
}