Fix for KT-10885

Assignment as expression conversion: e.g int i = j = 0
This commit is contained in:
Simon Ogorodnik
2016-10-13 17:49:53 +03:00
parent d731f97c7d
commit e14a043b0a
18 changed files with 71 additions and 19 deletions
@@ -31,10 +31,21 @@ class ArrayAccessExpression(val expression: Expression, val index: Expression, v
}
}
class AssignmentExpression(val left: Expression, val right: Expression, val op: Operator) : Expression() {
override fun generateCode(builder: CodeBuilder) {
open class AssignmentExpression(val left: Expression, val right: Expression, val op: Operator) : Expression() {
fun appendAssignment(builder: CodeBuilder, left: Expression, right: Expression) {
builder.appendOperand(this, left).append(" ").append(op).append(" ").appendOperand(this, right)
}
override fun generateCode(builder: CodeBuilder) {
if (right !is AssignmentExpression)
appendAssignment(builder, left, right)
else {
right.generateCode(builder)
builder.append("\n")
appendAssignment(builder, left, right.left)
}
}
}
class BangBangExpression(val expr: Expression) : Expression() {
@@ -28,12 +28,18 @@ class LocalVariable(
) : Element() {
override fun generateCode(builder: CodeBuilder) {
if(initializer is AssignmentExpression)
builder append initializer append "\n"
builder append annotations append (if (isVal) "val " else "var ") append identifier
if (explicitType != null) {
builder append ":" append explicitType
}
if (!initializer.isEmpty) {
builder append " = " append initializer
builder append " = "
if(initializer is AssignmentExpression)
builder append initializer.left
else
builder append initializer
}
}
}
+1 -1
View File
@@ -1,2 +1,2 @@
//expression
//statement
x &= 2
@@ -1,2 +1,2 @@
//expression
//statement
x = 2
@@ -0,0 +1,11 @@
public class AssignmentAsExpression {
private int field;
private int field2;
public void assign(int value) {
int v = field = value;
field = field2 = value;
int j;
int i = j = 0;
}
}
@@ -0,0 +1,14 @@
class AssignmentAsExpression {
private var field: Int = 0
private var field2: Int = 0
fun assign(value: Int) {
field = value
val v = field
field2 = value
field = field2
val j: Int
j = 0
val i = j
}
}
@@ -1,2 +1,2 @@
//expression
//statement
x /= 2
@@ -1,2 +1,2 @@
//expression
//statement
x -= 2
@@ -1,2 +1,2 @@
//expression
//statement
x *= 2
+1 -1
View File
@@ -1,2 +1,2 @@
//expression
//statement
x |= 2
@@ -1,2 +1,2 @@
//expression
//statement
x += 2
@@ -1,2 +1,2 @@
//expression
//statement
x %= 2
@@ -1,2 +1,2 @@
//expression
//statement
x <<= 2
@@ -1,2 +1,2 @@
//expression
//statement
x >>= 2
@@ -1,2 +1,2 @@
//expression
//statement
x >>>= 2
+1 -1
View File
@@ -1,2 +1,2 @@
//expression
//statement
x ^= 2
@@ -412,6 +412,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
doTest(fileName);
}
@TestMetadata("assignmentAsExpression.java")
public void testAssignmentAsExpression() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/assignmentExpression/assignmentAsExpression.java");
doTest(fileName);
}
@TestMetadata("divideAssign.java")
public void testDivideAssign() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/assignmentExpression/divideAssign.java");
@@ -1743,8 +1749,7 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
@TestMetadata("escapedCharactersInCodeQuote.java")
public void testEscapedCharactersInCodeQuote() throws Exception {
String fileName =
KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/docComments/escapedCharactersInCodeQuote.java");
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/docComments/escapedCharactersInCodeQuote.java");
doTest(fileName);
}
@@ -412,6 +412,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
doTest(fileName);
}
@TestMetadata("assignmentAsExpression.java")
public void testAssignmentAsExpression() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/assignmentExpression/assignmentAsExpression.java");
doTest(fileName);
}
@TestMetadata("divideAssign.java")
public void testDivideAssign() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/assignmentExpression/divideAssign.java");
@@ -1743,8 +1749,7 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
@TestMetadata("escapedCharactersInCodeQuote.java")
public void testEscapedCharactersInCodeQuote() throws Exception {
String fileName =
KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/docComments/escapedCharactersInCodeQuote.java");
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/docComments/escapedCharactersInCodeQuote.java");
doTest(fileName);
}