Fix for KT-10885
Assignment as expression conversion: e.g int i = j = 0
This commit is contained in:
@@ -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,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
@@ -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,2 +1,2 @@
|
||||
//expression
|
||||
//statement
|
||||
x ^= 2
|
||||
+7
-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);
|
||||
}
|
||||
|
||||
|
||||
+7
-2
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user