diff --git a/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt b/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt index ede0476c014..b95a07f81ba 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt @@ -276,7 +276,7 @@ class Converter private constructor( } + otherMethods.map { method -> createParameter(convertType(method.returnType), method) } - val parameterList = ParameterList(parameters).assignNoPrototype() + val parameterList = ParameterList.withNoPrototype(parameters) val constructorSignature = if (parameterList.parameters.isNotEmpty()) PrimaryConstructorSignature(Annotations.Empty, Modifiers.Empty, parameterList).assignNoPrototype() else @@ -355,7 +355,7 @@ class Converter private constructor( val superAccess = QualifiedExpression(superExpression, propertyInfo.identifier).assignNoPrototype() val returnStatement = ReturnStatement(superAccess).assignNoPrototype() val body = Block.of(returnStatement).assignNoPrototype() - val parameterList = ParameterList(emptyList()).assignNoPrototype() + val parameterList = ParameterList.withNoPrototype(emptyList()) getter = PropertyAccessor(AccessorKind.GETTER, Annotations.Empty, Modifiers.Empty, parameterList, deferredElement { body }) getter.assignNoPrototype() } @@ -375,7 +375,7 @@ class Converter private constructor( val parameterList = if (method.body != null || !parameterAnnotations.isEmpty) { val parameter = FunctionParameter(convertedParameter.identifier, null, FunctionParameter.VarValModifier.None, parameterAnnotations, Modifiers.Empty) .assignPrototypesFrom(convertedParameter, CommentsAndSpacesInheritance.NO_SPACES) - ParameterList(listOf(parameter)).assignNoPrototype() + ParameterList.withNoPrototype(listOf(parameter)) } else { null @@ -390,7 +390,7 @@ class Converter private constructor( val assignment = AssignmentExpression(superAccess, valueIdentifier, Operator.EQ).assignNoPrototype() val body = Block.of(assignment).assignNoPrototype() val parameter = FunctionParameter(valueIdentifier, propertyType, FunctionParameter.VarValModifier.None, Annotations.Empty, Modifiers.Empty).assignNoPrototype() - val parameterList = ParameterList(listOf(parameter)).assignNoPrototype() + val parameterList = ParameterList.withNoPrototype(listOf(parameter)) setter = PropertyAccessor(AccessorKind.SETTER, Annotations.Empty, accessorModifiers, parameterList, deferredElement { body }) setter.assignNoPrototype() } diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt index 94162c1a226..a1690501353 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt @@ -692,7 +692,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { val paramName = Identifier(it.name!!).assignNoPrototype() val paramType = if (it.typeElement != null) converter.typeConverter.convertType(it.type) else null LambdaParameter(paramName, paramType).assignPrototype(it) - }).assignPrototype(parameters) + }, lPar = null, rPar = null).assignPrototype(parameters) val body = expression.body when (body) { @@ -810,7 +810,9 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { emptyList() } else { parameters.map { LambdaParameter(it.first, it.second).assignNoPrototype() } - }).assignNoPrototype() + }, + lPar = null, + rPar = null).assignNoPrototype() val lambdaExpression = LambdaExpression(lambdaParameterList, Block.of(statement).assignNoPrototype()).assignNoPrototype() diff --git a/j2k/src/org/jetbrains/kotlin/j2k/OverloadReducer.kt b/j2k/src/org/jetbrains/kotlin/j2k/OverloadReducer.kt index 3775fac7ed3..04ae189252b 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/OverloadReducer.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/OverloadReducer.kt @@ -181,13 +181,19 @@ fun Converter.convertParameterList( ): ParameterList { val parameterList = method.parameterList val params = parameterList.parameters - return ParameterList(params.indices.map { i -> - val parameter = params[i] - val defaultValue = overloadReducer?.parameterDefault(method, i) - val defaultValueConverted = if (defaultValue != null) - deferredElement { codeConverter -> codeConverter.correctCodeConverter().convertExpression(defaultValue, parameter.type) } - else - null - convertParameter(parameter, defaultValueConverted) - }).assignPrototype(parameterList) + val lParen = parameterList.node.findChildByType(JavaTokenType.LPARENTH)?.psi + val rParen = parameterList.node.findChildByType(JavaTokenType.RPARENTH)?.psi + return ParameterList( + params.indices.map { i -> + val parameter = params[i] + val defaultValue = overloadReducer?.parameterDefault(method, i) + val defaultValueConverted = if (defaultValue != null) + deferredElement { codeConverter -> codeConverter.correctCodeConverter().convertExpression(defaultValue, parameter.type) } + else + null + convertParameter(parameter, defaultValueConverted) + }, + LPar().assignPrototype(lParen, CommentsAndSpacesInheritance.LINE_BREAKS), + RPar().assignPrototype(rParen, CommentsAndSpacesInheritance.LINE_BREAKS) + ).assignPrototype(parameterList) } diff --git a/j2k/src/org/jetbrains/kotlin/j2k/StatementConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/StatementConverter.kt index 47a235621ca..289625467f0 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/StatementConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/StatementConverter.kt @@ -196,7 +196,7 @@ class DefaultStatementConverter : JavaElementVisitor(), StatementConverter { else listOf(parameterType) for (t in types) { - var convertedType = codeConverter.typeConverter.convertType(t, Nullability.NotNull) + val convertedType = codeConverter.typeConverter.convertType(t, Nullability.NotNull) val convertedParameter = FunctionParameter(parameter.declarationIdentifier(), convertedType, FunctionParameter.VarValModifier.None, @@ -216,7 +216,7 @@ class DefaultStatementConverter : JavaElementVisitor(), StatementConverter { var expression: Expression = Expression.Empty for (variable in resourceVariables.asReversed()) { val parameter = LambdaParameter(Identifier(variable.name!!).assignNoPrototype(), null).assignNoPrototype() - val parameterList = ParameterList(listOf(parameter)).assignNoPrototype() + val parameterList = ParameterList(listOf(parameter), lPar = null, rPar = null).assignNoPrototype() val lambda = LambdaExpression(parameterList, block) expression = MethodCallExpression.build(codeConverter.convertExpression(variable.initializer), "use", listOf(lambda), listOf(), false) expression.assignNoPrototype() diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/Constructors.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/Constructors.kt index c5616765ad1..85baf591cf6 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/Constructors.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/Constructors.kt @@ -75,10 +75,10 @@ class PrimaryConstructorSignature(val annotations: Annotations, private val modi } if (needConstructorKeyword) { - builder append " constructor" + builder.append(" constructor") } - builder append "(" append parameterList append ")" + builder.append(parameterList) } } @@ -93,9 +93,8 @@ class SecondaryConstructor( override fun generateCode(builder: CodeBuilder) { builder.append(annotations) .appendWithSpaceAfter(modifiers) - .append("constructor(") + .append("constructor") .append(parameterList) - .append(")") if (thisOrSuperCall != null) { builder append " : " append thisOrSuperCall diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/Function.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/Function.kt index 6ca3192ff31..620267ae838 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/Function.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/Function.kt @@ -61,9 +61,7 @@ class Function( .append("fun ") .appendWithSuffix(typeParameterList, " ") .append(name) - .append("(") .append(parameterList) - .append(")") if (!returnType.isUnit()) { builder append ":" append returnType diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/ParameterList.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/ParameterList.kt index 2c1dde63dde..8155033196e 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/ParameterList.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/ParameterList.kt @@ -19,9 +19,35 @@ package org.jetbrains.kotlin.j2k.ast import org.jetbrains.kotlin.j2k.CodeBuilder import org.jetbrains.kotlin.j2k.append -class ParameterList(val parameters: List) : Element() { +class ParameterList( + val parameters: List, + val lPar: LPar?, + val rPar: RPar? +) : Element() { override fun generateCode(builder: CodeBuilder) { + lPar?.let { builder.append(it) } + builder.append(parameters, ", ") + + rPar?.let { builder.append(it) } + } + + companion object { + fun withNoPrototype(parameters: List): ParameterList { + return ParameterList(parameters, LPar().assignNoPrototype(), RPar().assignNoPrototype()).assignNoPrototype() + } } } +// we use LPar and RPar elements to better handle comments and line breaks around them +class LPar : Element() { + override fun generateCode(builder: CodeBuilder) { + builder.append("(") + } +} + +class RPar : Element() { + override fun generateCode(builder: CodeBuilder) { + builder.append(")") + } +} diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/Property.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/Property.kt index 71261260e8d..9bac57dcf20 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/Property.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/Property.kt @@ -94,11 +94,11 @@ class PropertyAccessor( } if (parameterList != null) { - builder append "(" append parameterList append ")" + builder.append(parameterList) } if (body != null) { - builder append " " append body + builder.append(" ").append(body) } } } diff --git a/j2k/testData/fileOrElement/formatting/parameterList.java b/j2k/testData/fileOrElement/formatting/parameterList.java new file mode 100644 index 00000000000..0411c5fd409 --- /dev/null +++ b/j2k/testData/fileOrElement/formatting/parameterList.java @@ -0,0 +1,6 @@ +public interface Aaa { + void foo( + String e1, + String e2 + ); +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/formatting/parameterList.kt b/j2k/testData/fileOrElement/formatting/parameterList.kt new file mode 100644 index 00000000000..e09b4aaa005 --- /dev/null +++ b/j2k/testData/fileOrElement/formatting/parameterList.kt @@ -0,0 +1,6 @@ +interface Aaa { + fun foo( + e1: String, + e2: String + ) +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/function/lineBreaksBetweenParameters.kt b/j2k/testData/fileOrElement/function/lineBreaksBetweenParameters.kt index 38d9527b9fb..2933944a6b6 100644 --- a/j2k/testData/fileOrElement/function/lineBreaksBetweenParameters.kt +++ b/j2k/testData/fileOrElement/function/lineBreaksBetweenParameters.kt @@ -13,6 +13,7 @@ internal class C { fun foo4( p1: Int, p2: Int, - p3: Int, p4: Int) { + p3: Int, p4: Int + ) { } } diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index e1b2ec362ee..8455f79749d 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -2308,6 +2308,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("parameterList.java") + public void testParameterList() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/formatting/parameterList.java"); + doTest(fileName); + } + @TestMetadata("staticAndNonStaticMembersWithComments.java") public void testStaticAndNonStaticMembersWithComments() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/formatting/staticAndNonStaticMembersWithComments.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index d737c4fd99a..f150c2838b9 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -2308,6 +2308,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("parameterList.java") + public void testParameterList() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/formatting/parameterList.java"); + doTest(fileName); + } + @TestMetadata("staticAndNonStaticMembersWithComments.java") public void testStaticAndNonStaticMembersWithComments() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/formatting/staticAndNonStaticMembersWithComments.java");