From f1b6bf7817af999f6cb65a56f7c3baed5f1c64ef Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Tue, 1 Mar 2016 13:09:28 +0300 Subject: [PATCH] J2K: convert comments inside qualified expression correctly --- Changelog.md | 1 + .../kotlin/j2k/ExpressionConverter.kt | 11 +++++++++-- .../comments/commentInsideCall.java | 19 +++++++++++++++++++ .../comments/commentInsideCall.kt | 14 ++++++++++++++ ...otlinConverterForWebDemoTestGenerated.java | 6 ++++++ ...otlinConverterSingleFileTestGenerated.java | 6 ++++++ 6 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 j2k/testData/fileOrElement/comments/commentInsideCall.java create mode 100644 j2k/testData/fileOrElement/comments/commentInsideCall.kt diff --git a/Changelog.md b/Changelog.md index 696957da3f5..6c82d3c4c64 100644 --- a/Changelog.md +++ b/Changelog.md @@ -10,3 +10,4 @@ ### Tools. J2K - Protected members used outside of inheritors are converted as public - Support conversion for annotation constructor calls +- Place comments from the middle of the call to the end \ No newline at end of file diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt index ec8a0f11c7f..10464ac6360 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt @@ -413,10 +413,17 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { } } - result = MethodCallExpression(codeConverter.convertExpression(methodExpr), + /* We move prototypes from methodExpression to full expression because + * it could contains comments inside, and then we paste them at the end of expression + * In the case of call, we should paste them after parenthesis + * ex. Foo./*comment*/bar() -> Foo.bar() /*comment*/ + */ + val methodExpression = codeConverter.convertExpression(methodExpr) + result = MethodCallExpression(methodExpression, convertArguments(expression), typeArguments, - isNullable) + isNullable).assignPrototypesFrom(methodExpression) + methodExpression.assignNoPrototype() } private fun KtLightMethod.isKotlinExtensionFunction(): Boolean { diff --git a/j2k/testData/fileOrElement/comments/commentInsideCall.java b/j2k/testData/fileOrElement/comments/commentInsideCall.java new file mode 100644 index 00000000000..6292d9f1695 --- /dev/null +++ b/j2k/testData/fileOrElement/comments/commentInsideCall.java @@ -0,0 +1,19 @@ +package test; + +public class Test { + public static void main(String[] args) { + System.out + // Comment + .println(); + + Test + // Comment1 + .foo() + // Comment2 + .indexOf("s") + } + + public static String foo() { + return ""; + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/comments/commentInsideCall.kt b/j2k/testData/fileOrElement/comments/commentInsideCall.kt new file mode 100644 index 00000000000..e48cd039745 --- /dev/null +++ b/j2k/testData/fileOrElement/comments/commentInsideCall.kt @@ -0,0 +1,14 @@ +package test + +object Test { + @JvmStatic fun main(args: Array) { + println()// Comment + + Test.foo()// Comment1 + .indexOf("s")// Comment2 + } + + fun foo(): String { + return "" + } +} \ 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 c658f89efa8..8f942414d4d 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -973,6 +973,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/comments"), Pattern.compile("^(.+)\\.java$"), true); } + @TestMetadata("commentInsideCall.java") + public void testCommentInsideCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/comments/commentInsideCall.java"); + doTest(fileName); + } + @TestMetadata("comments.java") public void testComments() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/comments/comments.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index e2927afc8fa..5cdd2f360d2 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -973,6 +973,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/comments"), Pattern.compile("^(.+)\\.java$"), true); } + @TestMetadata("commentInsideCall.java") + public void testCommentInsideCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/comments/commentInsideCall.java"); + doTest(fileName); + } + @TestMetadata("comments.java") public void testComments() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/comments/comments.java");