From 04e2d3da584e91de7f80f61b1be9940e741a2281 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 23 Jun 2014 19:03:49 +0400 Subject: [PATCH] Java to Kotlin converter: no explicit type for private and internal fields when possible --- j2k/src/org/jetbrains/jet/j2k/Converter.kt | 18 ++++++--- .../jetbrains/jet/j2k/ConverterSettings.kt | 7 ++-- .../org/jetbrains/jet/j2k/TypeConverter.kt | 37 +++++++++++++++---- .../org/jetbrains/jet/j2k/ast/EnumConstant.kt | 12 +++--- j2k/src/org/jetbrains/jet/j2k/ast/Field.kt | 9 +++-- j2k/src/org/jetbrains/jet/j2k/ast/Modifier.kt | 5 +++ j2k/src/org/jetbrains/jet/j2k/ast/Types.kt | 16 +++++++- .../jetbrains/jet/j2k/visitors/TypeVisitor.kt | 3 ++ .../test/AbstractJavaToKotlinConverterTest.kt | 1 + .../JavaToKotlinConverterTestGenerated.java | 10 +++++ .../ast/annotations/annotationUsages.kt | 8 ++-- .../ast/annotations/jetbrainsNotNull.kt | 2 +- .../testData/ast/class/classWithFields.kt | 4 +- .../ast/class/classWithMultiplyFields.kt | 2 +- .../ast/class/oneStaticFieldOneNonStatic.kt | 2 +- j2k/tests/testData/ast/comments/comments2.kt | 2 +- .../ast/comments/fieldWithEndOfLineComment.kt | 2 +- .../ast/constructors/genericIdentifier.kt | 2 +- .../testData/ast/constructors/identifier.kt | 2 +- j2k/tests/testData/ast/field/specifyType.java | 28 ++++++++++++++ j2k/tests/testData/ast/field/specifyType.kt | 29 +++++++++++++++ j2k/tests/testData/ast/field/valWithInit.kt | 2 +- j2k/tests/testData/ast/field/varWithInit.kt | 2 +- .../ast/formatting/nonStaticMembers.kt | 2 +- .../nonStaticMembersWithComments.kt | 2 +- .../staticAndNonStaticMembersWithComments.kt | 2 +- .../formatting/staticMembersWithComments.kt | 2 +- j2k/tests/testData/ast/issues/kt-638.kt | 2 +- .../testData/ast/issues/kt-809-string.kt | 4 +- j2k/tests/testData/ast/issues/kt-809.kt | 4 +- j2k/tests/testData/ast/issues/kt-820-field.kt | 4 +- j2k/tests/testData/ast/issues/kt-820.kt | 4 +- j2k/tests/testData/ast/issues/kt-824.kt | 4 +- j2k/tests/testData/ast/issues/kt-837.kt | 2 +- j2k/tests/testData/ast/issues/kt-963.kt | 2 +- .../MethodResultInitializesNullableField.kt | 2 +- .../settings/specifyFieldTypeByDefault.java | 17 +++++++++ .../ast/settings/specifyFieldTypeByDefault.kt | 16 ++++++++ .../ast/staticMembers/PrivateStaticMembers.kt | 2 +- 39 files changed, 214 insertions(+), 62 deletions(-) create mode 100644 j2k/tests/testData/ast/field/specifyType.java create mode 100644 j2k/tests/testData/ast/field/specifyType.kt create mode 100644 j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.java create mode 100644 j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.kt b/j2k/src/org/jetbrains/jet/j2k/Converter.kt index 05375a6ddbf..2005a5fd671 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.kt @@ -271,7 +271,7 @@ public class Converter private(val project: Project, val settings: ConverterSett return Initializer(convertBlock(initializer.getBody()), convertModifiers(initializer)).assignPrototype(initializer) } - private fun convertField(field: PsiField): Field { + private fun convertField(field: PsiField): Member { val annotations = convertAnnotations(field) val modifiers = convertModifiers(field) val name = field.declarationIdentifier() @@ -283,12 +283,20 @@ public class Converter private(val project: Project, val settings: ConverterSett convertElement(field.getArgumentList())) } else { + val initializer = field.getInitializer() + val convertedType = typeConverter.convertVariableType(field) + val isVal = field.hasModifierProperty(PsiModifier.FINAL) + val omitType = !settings.specifyFieldTypeByDefault && + initializer != null && + (modifiers.isPrivate && (isVal || convertedType == typeConverter.convertExpressionType(initializer)) || + modifiers.isInternal && convertedType == typeConverter.convertExpressionType(initializer)) Field(name, annotations, modifiers, - typeConverter.convertVariableType(field), - convertExpression(field.getInitializer(), field.getType()), - field.hasModifierProperty(PsiModifier.FINAL), + convertedType, + convertExpression(initializer, field.getType()), + isVal, + !omitType, field.hasWriteAccesses(field.getContainingClass())) } return converted.assignPrototype(field) @@ -324,7 +332,7 @@ public class Converter private(val project: Project, val settings: ConverterSett if (settings.openByDefault) { val isEffectivelyFinal = method.hasModifierProperty(PsiModifier.FINAL) || containingClass != null && (containingClass.hasModifierProperty(PsiModifier.FINAL) || containingClass.isEnum()) - if (!isEffectivelyFinal && !modifiers.contains(Modifier.ABSTRACT) && !modifiers.contains(Modifier.PRIVATE)) { + if (!isEffectivelyFinal && !modifiers.contains(Modifier.ABSTRACT) && !modifiers.isPrivate) { modifiers = modifiers.with(Modifier.OPEN) } } diff --git a/j2k/src/org/jetbrains/jet/j2k/ConverterSettings.kt b/j2k/src/org/jetbrains/jet/j2k/ConverterSettings.kt index 736163d24bd..0b54d5e48f3 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ConverterSettings.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ConverterSettings.kt @@ -16,20 +16,19 @@ package org.jetbrains.jet.j2k -public class ConverterSettings( +public data class ConverterSettings( var forceNotNullTypes: Boolean, var forceLocalVariableImmutability: Boolean, var specifyLocalVariableTypeByDefault: Boolean, + var specifyFieldTypeByDefault: Boolean, var openByDefault: Boolean) { - public fun copy(): ConverterSettings - = ConverterSettings(forceNotNullTypes, forceLocalVariableImmutability, specifyLocalVariableTypeByDefault, openByDefault) - class object { public val defaultSettings: ConverterSettings = ConverterSettings( forceNotNullTypes = true, forceLocalVariableImmutability = true, specifyLocalVariableTypeByDefault = false, + specifyFieldTypeByDefault = false, openByDefault = false ) } diff --git a/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt b/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt index 0611a67d5bb..395e6f5eacf 100644 --- a/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt @@ -88,7 +88,7 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver if (nullability == Nullability.Default) { val initializer = variable.getInitializer() if (initializer != null) { - val initializerNullability = initializer.nullability() + val initializerNullability = initializer.nullability(false) if (variable.isEffectivelyFinal()) { nullability = initializerNullability } @@ -129,7 +129,7 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver for (call in findMethodCalls(method, scope)) { val args = call.getArgumentList().getExpressions() if (args.size == parameters.size) { - if (args[parameterIndex].nullability() == Nullability.Nullable) { + if (args[parameterIndex].nullability(false) == Nullability.Nullable) { nullability = Nullability.Nullable break } @@ -166,7 +166,7 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver if (nullability == Nullability.Default) { method.getBody()?.accept(object: JavaRecursiveElementVisitor() { override fun visitReturnStatement(statement: PsiReturnStatement) { - if (statement.getReturnValue()?.nullability() == Nullability.Nullable) { + if (statement.getReturnValue()?.nullability(false) == Nullability.Nullable) { nullability = Nullability.Nullable } } @@ -189,6 +189,10 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver return nullability } + public fun convertExpressionType(expression: PsiExpression): Type { + return convertType(expression.getType(), expression.nullability(true)) + } + private fun searchScope(element: PsiElement): PsiElement? { return when(element) { is PsiParameter -> element.getDeclarationScope() @@ -199,22 +203,39 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver } } - private fun PsiExpression.nullability(): Nullability { + private fun PsiExpression.nullability(useDeclarationsNullability: Boolean): Nullability { return when (this) { is PsiLiteralExpression -> if (getType() != PsiType.NULL) Nullability.NotNull else Nullability.Nullable is PsiNewExpression -> Nullability.NotNull is PsiConditionalExpression -> { - val nullability1 = getThenExpression()?.nullability() + val nullability1 = getThenExpression()?.nullability(useDeclarationsNullability) if (nullability1 == Nullability.Nullable) return Nullability.Nullable - val nullability2 = getElseExpression()?.nullability() + val nullability2 = getElseExpression()?.nullability(useDeclarationsNullability) if (nullability2 == Nullability.Nullable) return Nullability.Nullable if (nullability1 == Nullability.NotNull && nullability2 == Nullability.NotNull) return Nullability.NotNull Nullability.Default } - is PsiParenthesizedExpression -> getExpression()?.nullability() ?: Nullability.Default + is PsiParenthesizedExpression -> getExpression()?.nullability(useDeclarationsNullability) ?: Nullability.Default + + is PsiMethodCallExpression -> if (useDeclarationsNullability) { + val method = resolveMethod() + if (method != null) methodNullability(method) else Nullability.Default + } + else { + Nullability.Default + } + + is PsiReferenceExpression -> if (useDeclarationsNullability) { + val variable = resolve() as? PsiVariable + if (variable != null) variableNullability(variable) else Nullability.Default + } + else { + Nullability.Default + } + //TODO: some other cases @@ -225,7 +246,7 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver private fun isNullableFromUsage(usage: PsiExpression): Boolean { val parent = usage.getParent() ?: return false if (parent is PsiAssignmentExpression && parent.getOperationTokenType() == JavaTokenType.EQ && usage == parent.getLExpression()) { - return parent.getRExpression()?.nullability() == Nullability.Nullable + return parent.getRExpression()?.nullability(false) == Nullability.Nullable } else if (parent is PsiBinaryExpression) { val operationType = parent.getOperationTokenType() diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/EnumConstant.kt b/j2k/src/org/jetbrains/jet/j2k/ast/EnumConstant.kt index cd4417e9502..21c869e2e81 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/EnumConstant.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/EnumConstant.kt @@ -19,20 +19,20 @@ package org.jetbrains.jet.j2k.ast import org.jetbrains.jet.j2k.* class EnumConstant( - identifier: Identifier, + val identifier: Identifier, annotations: Annotations, modifiers: Modifiers, - `type`: Type, - params: Element -) : Field(identifier, annotations, modifiers, `type`.toNotNullType(), params, true, false) { + val `type`: Type, + val params: Element +) : Member(annotations, modifiers) { override fun generateCode(builder: CodeBuilder) { - if (initializer.isEmpty) { + if (params.isEmpty) { builder append annotations append identifier return } - builder append annotations append identifier append " : " append `type` append "(" append initializer append ")" + builder append annotations append identifier append " : " append `type` append "(" append params append ")" } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt index 9170924b60a..d0aaa657411 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt @@ -18,13 +18,14 @@ package org.jetbrains.jet.j2k.ast import org.jetbrains.jet.j2k.* -open class Field( +class Field( val identifier: Identifier, annotations: Annotations, modifiers: Modifiers, val `type`: Type, val initializer: Element, val isVal: Boolean, + val explicitType: Boolean, private val hasWriteAccesses: Boolean ) : Member(annotations, modifiers) { @@ -33,8 +34,10 @@ open class Field( .appendWithSpaceAfter(modifiers) .append(if (isVal) "val " else "var ") .append(identifier) - .append(" : ") - .append(`type`) + + if (explicitType) { + builder append ":" append `type` + } var initializerToUse = initializer if (initializerToUse.isEmpty && !(isVal && hasWriteAccesses)) { diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Modifier.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Modifier.kt index 405c4079e8d..6335d18c1bc 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Modifier.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Modifier.kt @@ -55,6 +55,11 @@ class Modifiers(val modifiers: Collection) : Element() { fun contains(modifier: Modifier): Boolean = modifiers.contains(modifier) + val isPublic: Boolean get() = contains(Modifier.PUBLIC) + val isPrivate: Boolean get() = contains(Modifier.PRIVATE) + val isProtected: Boolean get() = contains(Modifier.PROTECTED) + val isInternal: Boolean get() = !isPublic && !isPrivate && !isProtected + class object { val Empty = Modifiers(listOf()) } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Types.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Types.kt index 6acfa64caf2..52a9a9698d7 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Types.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Types.kt @@ -48,12 +48,16 @@ abstract class Type() : Element() { abstract val isNullable: Boolean open fun toNotNullType(): Type { - if (isNullable) throw UnsupportedOperationException("toNotNullType must be defined") + if (isNullable) { + throw UnsupportedOperationException("toNotNullType must be defined") + } return this } open fun toNullableType(): Type { - if (!isNullable) throw UnsupportedOperationException("toNullableType must be defined") + if (!isNullable) { + throw UnsupportedOperationException("toNullableType must be defined") + } return this } @@ -69,6 +73,14 @@ abstract class Type() : Element() { } } + object Null: Type() { + override val isNullable: Boolean = true + + override fun generateCode(builder: CodeBuilder) { + builder.append("???") + } + } + override fun equals(other: Any?): Boolean = other is Type && other.canonicalCode() == this.canonicalCode() override fun hashCode(): Int = canonicalCode().hashCode() diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.kt index 5d9ceb111d9..718835039df 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.kt @@ -36,6 +36,9 @@ class TypeVisitor(private val converter: TypeConverter, private val importNames: else if (PRIMITIVE_TYPES_NAMES.contains(name)) { PrimitiveType(Identifier(StringUtil.capitalize(name))) } + else if (name == "null") { + Type.Null + } else { PrimitiveType(Identifier(name)) } diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterTest.kt b/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterTest.kt index 2c183fbc49b..fee8ec96f9b 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterTest.kt +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterTest.kt @@ -77,6 +77,7 @@ abstract class AbstractJavaToKotlinConverterTest() : LightIdeaTestCase() { "forceNotNullTypes" -> settings.forceNotNullTypes = parseBoolean(value) "forceLocalVariableImmutability" -> settings.forceLocalVariableImmutability = parseBoolean(value) "specifyLocalVariableTypeByDefault" -> settings.specifyLocalVariableTypeByDefault = parseBoolean(value) + "specifyFieldTypeByDefault" -> settings.specifyFieldTypeByDefault = parseBoolean(value) "openByDefault" -> settings.openByDefault = parseBoolean(value) else -> throw IllegalArgumentException("Unknown option: $name") } 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 542b632ad73..0b7c2c6a32a 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -1094,6 +1094,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/field/publicField.java"); } + @TestMetadata("specifyType.java") + public void testSpecifyType() throws Exception { + doTest("j2k/tests/testData/ast/field/specifyType.java"); + } + @TestMetadata("valWithInit.java") public void testValWithInit() throws Exception { doTest("j2k/tests/testData/ast/field/valWithInit.java"); @@ -2354,6 +2359,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/settings/openByDefault.java"); } + @TestMetadata("specifyFieldTypeByDefault.java") + public void testSpecifyFieldTypeByDefault() throws Exception { + doTest("j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.java"); + } + @TestMetadata("specifyLocalVariableTypeByDefault.java") public void testSpecifyLocalVariableTypeByDefault() throws Exception { doTest("j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefault.java"); diff --git a/j2k/tests/testData/ast/annotations/annotationUsages.kt b/j2k/tests/testData/ast/annotations/annotationUsages.kt index ced7214ba69..08497bd912a 100644 --- a/j2k/tests/testData/ast/annotations/annotationUsages.kt +++ b/j2k/tests/testData/ast/annotations/annotationUsages.kt @@ -9,15 +9,15 @@ Anon6(array("x", "y")) Anon7(javaClass(), javaClass()) Anon8(classes = *array(javaClass(), javaClass())) class C() { - Anon5(1) deprecated("") private var field1: Int = 0 + Anon5(1) deprecated("") private var field1 = 0 Anon5(1) - private var field2: Int = 0 + private var field2 = 0 - Anon5(1) var field3: Int = 0 + Anon5(1) var field3 = 0 Anon5(1) - var field4: Int = 0 + var field4 = 0 Anon6(array()) fun foo(deprecated("") p1: Int, deprecated("") Anon5(2) p2: Char) { diff --git a/j2k/tests/testData/ast/annotations/jetbrainsNotNull.kt b/j2k/tests/testData/ast/annotations/jetbrainsNotNull.kt index c17e1652311..826a768f9ba 100644 --- a/j2k/tests/testData/ast/annotations/jetbrainsNotNull.kt +++ b/j2k/tests/testData/ast/annotations/jetbrainsNotNull.kt @@ -3,7 +3,7 @@ package test public class Test(str: String) { - var myStr: String = "String2" + var myStr = "String2" public fun sout(str: String) { System.out!!.println(str) diff --git a/j2k/tests/testData/ast/class/classWithFields.kt b/j2k/tests/testData/ast/class/classWithFields.kt index 134d4d62abf..c562a60dcfa 100644 --- a/j2k/tests/testData/ast/class/classWithFields.kt +++ b/j2k/tests/testData/ast/class/classWithFields.kt @@ -1,4 +1,4 @@ class T() { - var a: String = "abc" - var b: Int = 10 + var a = "abc" + var b = 10 } \ No newline at end of file diff --git a/j2k/tests/testData/ast/class/classWithMultiplyFields.kt b/j2k/tests/testData/ast/class/classWithMultiplyFields.kt index 19cbb56f9f5..48202044e1e 100644 --- a/j2k/tests/testData/ast/class/classWithMultiplyFields.kt +++ b/j2k/tests/testData/ast/class/classWithMultiplyFields.kt @@ -1,5 +1,5 @@ class T() { var a: String = 0 var b: String = 0 - var c: String = "abc" + var c = "abc" } \ No newline at end of file diff --git a/j2k/tests/testData/ast/class/oneStaticFieldOneNonStatic.kt b/j2k/tests/testData/ast/class/oneStaticFieldOneNonStatic.kt index fa2ebfe0b04..118a135c79c 100644 --- a/j2k/tests/testData/ast/class/oneStaticFieldOneNonStatic.kt +++ b/j2k/tests/testData/ast/class/oneStaticFieldOneNonStatic.kt @@ -4,6 +4,6 @@ class S() { } class object { - var myI: Int = 10 + var myI = 10 } } \ No newline at end of file diff --git a/j2k/tests/testData/ast/comments/comments2.kt b/j2k/tests/testData/ast/comments/comments2.kt index ae870f41377..fab172ae131 100644 --- a/j2k/tests/testData/ast/comments/comments2.kt +++ b/j2k/tests/testData/ast/comments/comments2.kt @@ -11,7 +11,7 @@ class A() { /* body is empty */ } - private /*it's private*/ var field: Int = 0 + private /*it's private*/ var field = 0 public /*it's public*/ fun foo(): Char { } diff --git a/j2k/tests/testData/ast/comments/fieldWithEndOfLineComment.kt b/j2k/tests/testData/ast/comments/fieldWithEndOfLineComment.kt index ec3f0bf94e6..ea603f5e24a 100644 --- a/j2k/tests/testData/ast/comments/fieldWithEndOfLineComment.kt +++ b/j2k/tests/testData/ast/comments/fieldWithEndOfLineComment.kt @@ -1,3 +1,3 @@ class A() { - private var isOpen: Boolean = true // ideally should be atomic boolean + private var isOpen = true // ideally should be atomic boolean } \ No newline at end of file diff --git a/j2k/tests/testData/ast/constructors/genericIdentifier.kt b/j2k/tests/testData/ast/constructors/genericIdentifier.kt index bd04550571f..6669d4aaa2f 100644 --- a/j2k/tests/testData/ast/constructors/genericIdentifier.kt +++ b/j2k/tests/testData/ast/constructors/genericIdentifier.kt @@ -1,5 +1,5 @@ public class Identifier private(private val myName: T, private var myHasDollar: Boolean) { - private var myNullable: Boolean = true + private var myNullable = true public fun getName(): T { return myName diff --git a/j2k/tests/testData/ast/constructors/identifier.kt b/j2k/tests/testData/ast/constructors/identifier.kt index 065a38f2edd..ee98211f791 100644 --- a/j2k/tests/testData/ast/constructors/identifier.kt +++ b/j2k/tests/testData/ast/constructors/identifier.kt @@ -1,5 +1,5 @@ public class Identifier private(private val myName: String, private var myHasDollar: Boolean) { - private var myNullable: Boolean = true + private var myNullable = true public fun getName(): String { return myName diff --git a/j2k/tests/testData/ast/field/specifyType.java b/j2k/tests/testData/ast/field/specifyType.java new file mode 100644 index 00000000000..47d819aade2 --- /dev/null +++ b/j2k/tests/testData/ast/field/specifyType.java @@ -0,0 +1,28 @@ +//file +import org.jetbrains.annotations.Nullable; +import java.util.*; + +class A { + private final List field1 = new ArrayList(); + final List field2 = new ArrayList(); + public final int field3 = 0; + protected final int field4 = 0; + + private List field5 = new ArrayList(); + List field6 = new ArrayList(); + + private int field7 = 0; + int field8 = 0; + + @Nullable private String field9 = "a" + @Nullable private String field10 = foo(); + + String foo() { return "x"; } + + void bar() { + field7++; + field8++; + field9 = null; + field10 = null; + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/field/specifyType.kt b/j2k/tests/testData/ast/field/specifyType.kt new file mode 100644 index 00000000000..9d149164e07 --- /dev/null +++ b/j2k/tests/testData/ast/field/specifyType.kt @@ -0,0 +1,29 @@ +import java.util.* +import kotlin.List + +class A() { + private val field1 = ArrayList() + val field2: List = ArrayList() + public val field3: Int = 0 + protected val field4: Int = 0 + + private var field5: List = ArrayList() + var field6: List = ArrayList() + + private var field7 = 0 + var field8 = 0 + + private var field9: String? = "a" + private var field10: String? = foo() + + fun foo(): String { + return "x" + } + + fun bar() { + field7++ + field8++ + field9 = null + field10 = null + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/field/valWithInit.kt b/j2k/tests/testData/ast/field/valWithInit.kt index 2d120001aa4..beb1395d375 100644 --- a/j2k/tests/testData/ast/field/valWithInit.kt +++ b/j2k/tests/testData/ast/field/valWithInit.kt @@ -1,3 +1,3 @@ class C() { - val f: Foo = Foo(1, 2) + val f = Foo(1, 2) } \ No newline at end of file diff --git a/j2k/tests/testData/ast/field/varWithInit.kt b/j2k/tests/testData/ast/field/varWithInit.kt index 9238f03f782..ffed0dcc3a5 100644 --- a/j2k/tests/testData/ast/field/varWithInit.kt +++ b/j2k/tests/testData/ast/field/varWithInit.kt @@ -1,3 +1,3 @@ class C() { - var f: Foo = Foo(1, 2) + var f = Foo(1, 2) } \ No newline at end of file diff --git a/j2k/tests/testData/ast/formatting/nonStaticMembers.kt b/j2k/tests/testData/ast/formatting/nonStaticMembers.kt index 72079e2c1e7..33f676dfcd5 100644 --- a/j2k/tests/testData/ast/formatting/nonStaticMembers.kt +++ b/j2k/tests/testData/ast/formatting/nonStaticMembers.kt @@ -5,7 +5,7 @@ class F() { fun f2() { } - var i: Int = 0 + var i = 0 fun f3() { } diff --git a/j2k/tests/testData/ast/formatting/nonStaticMembersWithComments.kt b/j2k/tests/testData/ast/formatting/nonStaticMembersWithComments.kt index 61be9023894..ef0256981a4 100644 --- a/j2k/tests/testData/ast/formatting/nonStaticMembersWithComments.kt +++ b/j2k/tests/testData/ast/formatting/nonStaticMembersWithComments.kt @@ -16,7 +16,7 @@ class F() { fun f2() { } - var i: Int = 0 + var i = 0 fun f3() { } diff --git a/j2k/tests/testData/ast/formatting/staticAndNonStaticMembersWithComments.kt b/j2k/tests/testData/ast/formatting/staticAndNonStaticMembersWithComments.kt index 482f5783f08..71b50c0348e 100644 --- a/j2k/tests/testData/ast/formatting/staticAndNonStaticMembersWithComments.kt +++ b/j2k/tests/testData/ast/formatting/staticAndNonStaticMembersWithComments.kt @@ -24,7 +24,7 @@ class F() { fun f1() { } - var i: Int = 0 + var i = 0 //c5 diff --git a/j2k/tests/testData/ast/formatting/staticMembersWithComments.kt b/j2k/tests/testData/ast/formatting/staticMembersWithComments.kt index 51c1ee14d3c..2dc176320f2 100644 --- a/j2k/tests/testData/ast/formatting/staticMembersWithComments.kt +++ b/j2k/tests/testData/ast/formatting/staticMembersWithComments.kt @@ -17,7 +17,7 @@ class F() { fun f2() { } - var i: Int = 0 + var i = 0 fun f3() { } diff --git a/j2k/tests/testData/ast/issues/kt-638.kt b/j2k/tests/testData/ast/issues/kt-638.kt index 211646d6498..cd59e50c894 100644 --- a/j2k/tests/testData/ast/issues/kt-638.kt +++ b/j2k/tests/testData/ast/issues/kt-638.kt @@ -1,5 +1,5 @@ public class Identifier private(private val myName: T, private var myHasDollar: Boolean) { - private var myNullable: Boolean = true + private var myNullable = true public fun getName(): T { return myName diff --git a/j2k/tests/testData/ast/issues/kt-809-string.kt b/j2k/tests/testData/ast/issues/kt-809-string.kt index 5a4bed58e1f..b6e142a9f62 100644 --- a/j2k/tests/testData/ast/issues/kt-809-string.kt +++ b/j2k/tests/testData/ast/issues/kt-809-string.kt @@ -1,12 +1,12 @@ package demo class Container() { - var myString: String = "1" + var myString = "1" } class One() { class object { - var myContainer: Container = Container() + var myContainer = Container() } } diff --git a/j2k/tests/testData/ast/issues/kt-809.kt b/j2k/tests/testData/ast/issues/kt-809.kt index 07d1c14aad1..c5f8865c31c 100644 --- a/j2k/tests/testData/ast/issues/kt-809.kt +++ b/j2k/tests/testData/ast/issues/kt-809.kt @@ -1,12 +1,12 @@ package demo class Container() { - var myInt: Int = 1 + var myInt = 1 } class One() { class object { - var myContainer: Container = Container() + var myContainer = Container() } } diff --git a/j2k/tests/testData/ast/issues/kt-820-field.kt b/j2k/tests/testData/ast/issues/kt-820-field.kt index 83bc0ee2951..897f1a2ce91 100644 --- a/j2k/tests/testData/ast/issues/kt-820-field.kt +++ b/j2k/tests/testData/ast/issues/kt-820-field.kt @@ -1,12 +1,12 @@ package demo class Container() { - var myInt: Int = 1 + var myInt = 1 } class One() { class object { - var myContainer: Container = Container() + var myContainer = Container() } } diff --git a/j2k/tests/testData/ast/issues/kt-820.kt b/j2k/tests/testData/ast/issues/kt-820.kt index e654ea3b795..fc630979d15 100644 --- a/j2k/tests/testData/ast/issues/kt-820.kt +++ b/j2k/tests/testData/ast/issues/kt-820.kt @@ -1,12 +1,12 @@ package demo class Container() { - var myInt: Int = 1 + var myInt = 1 } class One() { class object { - var myContainer: Container = Container() + var myContainer = Container() } } diff --git a/j2k/tests/testData/ast/issues/kt-824.kt b/j2k/tests/testData/ast/issues/kt-824.kt index 564d50a4afd..d7d016b07b8 100644 --- a/j2k/tests/testData/ast/issues/kt-824.kt +++ b/j2k/tests/testData/ast/issues/kt-824.kt @@ -1,12 +1,12 @@ package demo class Container() { - var myBoolean: Boolean = true + var myBoolean = true } class One() { class object { - var myContainer: Container = Container() + var myContainer = Container() } } diff --git a/j2k/tests/testData/ast/issues/kt-837.kt b/j2k/tests/testData/ast/issues/kt-837.kt index 0a85e5bb9cc..b6b3bef0653 100644 --- a/j2k/tests/testData/ast/issues/kt-837.kt +++ b/j2k/tests/testData/ast/issues/kt-837.kt @@ -11,6 +11,6 @@ public class Language(protected var code: String) : Serializable { class object { public var ENGLISH: Language = Language("en") public var SWEDISH: Language = Language("sv") - private val serialVersionUID: Long = -2442762969929206780 + private val serialVersionUID = -2442762969929206780 } } \ No newline at end of file diff --git a/j2k/tests/testData/ast/issues/kt-963.kt b/j2k/tests/testData/ast/issues/kt-963.kt index b3a33d854cd..e2ec0dd01ab 100644 --- a/j2k/tests/testData/ast/issues/kt-963.kt +++ b/j2k/tests/testData/ast/issues/kt-963.kt @@ -1,7 +1,7 @@ package demo class C(a: Int) { - var abc: Int = 0 + var abc = 0 { abc = a * 2 diff --git a/j2k/tests/testData/ast/nullability/MethodResultInitializesNullableField.kt b/j2k/tests/testData/ast/nullability/MethodResultInitializesNullableField.kt index 3bde9e28c4b..de5326c20b9 100644 --- a/j2k/tests/testData/ast/nullability/MethodResultInitializesNullableField.kt +++ b/j2k/tests/testData/ast/nullability/MethodResultInitializesNullableField.kt @@ -1,5 +1,5 @@ class C() { - private val string: String? = getString() + private val string = getString() class object { diff --git a/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.java b/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.java new file mode 100644 index 00000000000..bb34adba462 --- /dev/null +++ b/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.java @@ -0,0 +1,17 @@ +//file +// !specifyFieldTypeByDefault: true +import org.jetbrains.annotations.Nullable; +import java.util.*; + +class A { + private final List field1 = new ArrayList(); + final List field2 = new ArrayList(); + public final int field3 = 0; + protected final int field4 = 0; + + private List field5 = new ArrayList(); + List field6 = new ArrayList(); + + private int field7 = 0; + int field8 = 0; +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.kt b/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.kt new file mode 100644 index 00000000000..fa48c065aa7 --- /dev/null +++ b/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.kt @@ -0,0 +1,16 @@ +// !specifyFieldTypeByDefault: true +import java.util.* +import kotlin.List + +class A() { + private val field1: List = ArrayList() + val field2: List = ArrayList() + public val field3: Int = 0 + protected val field4: Int = 0 + + private var field5: List = ArrayList() + var field6: List = ArrayList() + + private var field7: Int = 0 + var field8: Int = 0 +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.kt b/j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.kt index d02168a612e..b44c55a1b3e 100644 --- a/j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.kt +++ b/j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.kt @@ -6,7 +6,7 @@ class A() { } class object { - private val s: String = "abc" + private val s = "abc" private fun privateStatic1() { }