diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/Expressions.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/Expressions.kt index cee0eda7e25..9649f63ccd3 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/Expressions.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/Expressions.kt @@ -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() { diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/LocalVariable.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/LocalVariable.kt index 9c1d0266fb5..e63c845e0ca 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/LocalVariable.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/LocalVariable.kt @@ -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 } } } diff --git a/j2k/testData/fileOrElement/assignmentExpression/and.java b/j2k/testData/fileOrElement/assignmentExpression/and.java index a7ddbe20ebb..87343d1f4b3 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/and.java +++ b/j2k/testData/fileOrElement/assignmentExpression/and.java @@ -1,2 +1,2 @@ -//expression +//statement x &= 2 \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/assignment.java b/j2k/testData/fileOrElement/assignmentExpression/assignment.java index 28407cb5d7a..09f664d247f 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/assignment.java +++ b/j2k/testData/fileOrElement/assignmentExpression/assignment.java @@ -1,2 +1,2 @@ -//expression +//statement x = 2 \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/assignmentAsExpression.java b/j2k/testData/fileOrElement/assignmentExpression/assignmentAsExpression.java new file mode 100644 index 00000000000..e8483df65ea --- /dev/null +++ b/j2k/testData/fileOrElement/assignmentExpression/assignmentAsExpression.java @@ -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; + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/assignmentAsExpression.kt b/j2k/testData/fileOrElement/assignmentExpression/assignmentAsExpression.kt new file mode 100644 index 00000000000..5d76a31ab4e --- /dev/null +++ b/j2k/testData/fileOrElement/assignmentExpression/assignmentAsExpression.kt @@ -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 + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/divideAssign.java b/j2k/testData/fileOrElement/assignmentExpression/divideAssign.java index c9d7d70673e..140ad97caf7 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/divideAssign.java +++ b/j2k/testData/fileOrElement/assignmentExpression/divideAssign.java @@ -1,2 +1,2 @@ -//expression +//statement x /= 2 \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/minusAssign.java b/j2k/testData/fileOrElement/assignmentExpression/minusAssign.java index 0e82db5caca..23b025862a3 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/minusAssign.java +++ b/j2k/testData/fileOrElement/assignmentExpression/minusAssign.java @@ -1,2 +1,2 @@ -//expression +//statement x -= 2 \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/multiplyAssign.java b/j2k/testData/fileOrElement/assignmentExpression/multiplyAssign.java index 4cf5ebe6838..eaa9c1710bc 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/multiplyAssign.java +++ b/j2k/testData/fileOrElement/assignmentExpression/multiplyAssign.java @@ -1,2 +1,2 @@ -//expression +//statement x *= 2 \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/or.java b/j2k/testData/fileOrElement/assignmentExpression/or.java index ba6b41fe667..23b460585e4 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/or.java +++ b/j2k/testData/fileOrElement/assignmentExpression/or.java @@ -1,2 +1,2 @@ -//expression +//statement x |= 2 \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/plusAssign.java b/j2k/testData/fileOrElement/assignmentExpression/plusAssign.java index b7ba717778c..dfeca626bcb 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/plusAssign.java +++ b/j2k/testData/fileOrElement/assignmentExpression/plusAssign.java @@ -1,2 +1,2 @@ -//expression +//statement x += 2 \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/reminder.java b/j2k/testData/fileOrElement/assignmentExpression/reminder.java index 6a10a37e2de..2b25a87a7c5 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/reminder.java +++ b/j2k/testData/fileOrElement/assignmentExpression/reminder.java @@ -1,2 +1,2 @@ -//expression +//statement x %= 2 \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/shiftLeft.java b/j2k/testData/fileOrElement/assignmentExpression/shiftLeft.java index bcfd8a6e6ff..03fa9731b1d 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/shiftLeft.java +++ b/j2k/testData/fileOrElement/assignmentExpression/shiftLeft.java @@ -1,2 +1,2 @@ -//expression +//statement x <<= 2 \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/shiftRight.java b/j2k/testData/fileOrElement/assignmentExpression/shiftRight.java index 782317cce05..4f5d7b82a9e 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/shiftRight.java +++ b/j2k/testData/fileOrElement/assignmentExpression/shiftRight.java @@ -1,2 +1,2 @@ -//expression +//statement x >>= 2 \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/unsignedRightShift.java b/j2k/testData/fileOrElement/assignmentExpression/unsignedRightShift.java index 192a8b06bdf..4176ef9f7c9 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/unsignedRightShift.java +++ b/j2k/testData/fileOrElement/assignmentExpression/unsignedRightShift.java @@ -1,2 +1,2 @@ -//expression +//statement x >>>= 2 \ No newline at end of file diff --git a/j2k/testData/fileOrElement/assignmentExpression/xor.java b/j2k/testData/fileOrElement/assignmentExpression/xor.java index ec210cb9f6f..30b5fb03944 100644 --- a/j2k/testData/fileOrElement/assignmentExpression/xor.java +++ b/j2k/testData/fileOrElement/assignmentExpression/xor.java @@ -1,2 +1,2 @@ -//expression +//statement x ^= 2 \ No newline at end of file diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index 7c65621dc9c..67a95d2be19 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -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); } diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index e3794beb98f..97a2bdeda73 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -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); }