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() {
|
open class AssignmentExpression(val left: Expression, val right: Expression, val op: Operator) : Expression() {
|
||||||
override fun generateCode(builder: CodeBuilder) {
|
|
||||||
|
fun appendAssignment(builder: CodeBuilder, left: Expression, right: Expression) {
|
||||||
builder.appendOperand(this, left).append(" ").append(op).append(" ").appendOperand(this, right)
|
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() {
|
class BangBangExpression(val expr: Expression) : Expression() {
|
||||||
|
|||||||
@@ -28,12 +28,18 @@ class LocalVariable(
|
|||||||
) : Element() {
|
) : Element() {
|
||||||
|
|
||||||
override fun generateCode(builder: CodeBuilder) {
|
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
|
builder append annotations append (if (isVal) "val " else "var ") append identifier
|
||||||
if (explicitType != null) {
|
if (explicitType != null) {
|
||||||
builder append ":" append explicitType
|
builder append ":" append explicitType
|
||||||
}
|
}
|
||||||
if (!initializer.isEmpty) {
|
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
|
x &= 2
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
//expression
|
//statement
|
||||||
x = 2
|
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
|
x /= 2
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
//expression
|
//statement
|
||||||
x -= 2
|
x -= 2
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
//expression
|
//statement
|
||||||
x *= 2
|
x *= 2
|
||||||
+1
-1
@@ -1,2 +1,2 @@
|
|||||||
//expression
|
//statement
|
||||||
x |= 2
|
x |= 2
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
//expression
|
//statement
|
||||||
x += 2
|
x += 2
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
//expression
|
//statement
|
||||||
x %= 2
|
x %= 2
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
//expression
|
//statement
|
||||||
x <<= 2
|
x <<= 2
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
//expression
|
//statement
|
||||||
x >>= 2
|
x >>= 2
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
//expression
|
//statement
|
||||||
x >>>= 2
|
x >>>= 2
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
//expression
|
//statement
|
||||||
x ^= 2
|
x ^= 2
|
||||||
+7
-2
@@ -412,6 +412,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("divideAssign.java")
|
||||||
public void testDivideAssign() throws Exception {
|
public void testDivideAssign() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/assignmentExpression/divideAssign.java");
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/assignmentExpression/divideAssign.java");
|
||||||
@@ -1743,8 +1749,7 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
|
|||||||
|
|
||||||
@TestMetadata("escapedCharactersInCodeQuote.java")
|
@TestMetadata("escapedCharactersInCodeQuote.java")
|
||||||
public void testEscapedCharactersInCodeQuote() throws Exception {
|
public void testEscapedCharactersInCodeQuote() throws Exception {
|
||||||
String fileName =
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/docComments/escapedCharactersInCodeQuote.java");
|
||||||
KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/docComments/escapedCharactersInCodeQuote.java");
|
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+7
-2
@@ -412,6 +412,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("divideAssign.java")
|
||||||
public void testDivideAssign() throws Exception {
|
public void testDivideAssign() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/assignmentExpression/divideAssign.java");
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/assignmentExpression/divideAssign.java");
|
||||||
@@ -1743,8 +1749,7 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
|
|||||||
|
|
||||||
@TestMetadata("escapedCharactersInCodeQuote.java")
|
@TestMetadata("escapedCharactersInCodeQuote.java")
|
||||||
public void testEscapedCharactersInCodeQuote() throws Exception {
|
public void testEscapedCharactersInCodeQuote() throws Exception {
|
||||||
String fileName =
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/docComments/escapedCharactersInCodeQuote.java");
|
||||||
KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/docComments/escapedCharactersInCodeQuote.java");
|
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user