From 514f11695f640f9b969ad6feb2a9ed1597bb66d2 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 9 Jul 2014 15:54:35 +0400 Subject: [PATCH] Java to Kotlin converter: explicit locals type option is used for for variable too --- j2k/src/org/jetbrains/jet/j2k/ast/Statements.kt | 8 ++++++-- .../org/jetbrains/jet/j2k/visitors/StatementVisitor.kt | 7 +++++-- .../j2k/test/JavaToKotlinConverterTestGenerated.java | 5 +++++ .../specifyLocalVariableTypeByDefaultInFor.java | 10 ++++++++++ .../settings/specifyLocalVariableTypeByDefaultInFor.kt | 9 +++++++++ 5 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefaultInFor.java create mode 100644 j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefaultInFor.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Statements.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Statements.kt index 609a2c60a20..ce4542556d1 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Statements.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Statements.kt @@ -88,9 +88,9 @@ class DoWhileStatement(val condition: Expression, val body: Element, singleLine: } } -//TODO: explicit type (if option) class ForeachStatement( val variableName: Identifier, + val explicitVariableType: Type?, val collection: Expression, val body: Element, singleLine: Boolean @@ -99,7 +99,11 @@ class ForeachStatement( private val br = if (singleLine) " " else "\n" override fun generateCode(builder: CodeBuilder) { - builder append "for (" append variableName append " in " append collection append ")" append br append body + builder append "for (" append variableName + if (explicitVariableType != null) { + builder append ":" append explicitVariableType + } + builder append " in " append collection append ")" append br append body } } diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt index 883fdde8dd6..4e92df51a20 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt @@ -122,7 +122,8 @@ open class StatementVisitor(public val converter: Converter) : JavaElementVisito && update.getChildren().size == 1 && update.getChildren().single().isPlusPlusExpression()) { val range = forIterationRange(start, upperBound, operationTokenType).assignNoPrototype() - result = ForeachStatement(loopVar.declarationIdentifier(), range, convertStatementOrBlock(body), statement.isInSingleLine()) + val explicitType = if (converter.settings.specifyLocalVariableTypeByDefault) PrimitiveType(Identifier("Int").assignNoPrototype()).assignNoPrototype() else null + result = ForeachStatement(loopVar.declarationIdentifier(), explicitType, range, convertStatementOrBlock(body), statement.isInSingleLine()) return } } @@ -212,7 +213,9 @@ open class StatementVisitor(public val converter: Converter) : JavaElementVisito override fun visitForeachStatement(statement: PsiForeachStatement) { val iteratorExpr = converter.convertExpression(statement.getIteratedValue()) val iterator = if (iteratorExpr.isNullable) BangBangExpression(iteratorExpr).assignNoPrototype() else iteratorExpr - result = ForeachStatement(statement.getIterationParameter().declarationIdentifier(), + val iterationParameter = statement.getIterationParameter() + result = ForeachStatement(iterationParameter.declarationIdentifier(), + if (converter.settings.specifyLocalVariableTypeByDefault) converter.typeConverter.convertVariableType(iterationParameter) else null, iterator, convertStatementOrBlock(statement.getBody()), statement.isInSingleLine()) diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java index ead5ccd8f0c..6ab3362124c 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -2564,6 +2564,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefault.java"); } + @TestMetadata("specifyLocalVariableTypeByDefaultInFor.java") + public void testSpecifyLocalVariableTypeByDefaultInFor() throws Exception { + doTest("j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefaultInFor.java"); + } + } @TestMetadata("j2k/tests/testData/ast/starProjectionType") diff --git a/j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefaultInFor.java b/j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefaultInFor.java new file mode 100644 index 00000000000..1594a19cb04 --- /dev/null +++ b/j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefaultInFor.java @@ -0,0 +1,10 @@ +//method +// !specifyLocalVariableTypeByDefault: true +public void foo(List list) { + int[] array = new int[10]; + for (int i = 0; i < 10; i++){ + array[i] = i; + } + + for(String s : list) System.out.print(s); +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefaultInFor.kt b/j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefaultInFor.kt new file mode 100644 index 00000000000..8cc63a2d15b --- /dev/null +++ b/j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefaultInFor.kt @@ -0,0 +1,9 @@ +// !specifyLocalVariableTypeByDefault: true +public fun foo(list: List) { + val array: IntArray = IntArray(10) + for (i: Int in 0..10 - 1) { + array[i] = i + } + + for (s: String in list) System.out.print(s) +} \ No newline at end of file