Supported initialization with assignment instead of declaration
This commit is contained in:
@@ -240,12 +240,20 @@ data class VariableInitialization(
|
|||||||
val initializationStatement: KtExpression,
|
val initializationStatement: KtExpression,
|
||||||
val initializer: 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? {
|
fun KtExpression.detectInitializationBeforeLoop(loop: KtForExpression): VariableInitialization? {
|
||||||
if (this !is KtNameReferenceExpression) return null
|
if (this !is KtNameReferenceExpression) return null
|
||||||
if (getQualifiedExpressionForSelector() != null) return null
|
if (getQualifiedExpressionForSelector() != null) return null
|
||||||
val variable = this.mainReference.resolve() as? KtProperty ?: 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
|
val statementBeforeLoop = loop.previousStatement() //TODO: support initialization not right before the loop
|
||||||
//TODO: support assignment instead of initializer
|
|
||||||
val initializer = variable.initializer ?: return null
|
if (statementBeforeLoop == variable) {
|
||||||
return VariableInitialization(variable, variable, initializer)
|
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)
|
||||||
}
|
}
|
||||||
|
|||||||
+12
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
fun foo(list: List<String>) {
|
||||||
|
var result: String? = ""
|
||||||
|
|
||||||
|
<caret>result = list.firstOrNull { it.length > 0 }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user