diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.kt b/j2k/src/org/jetbrains/jet/j2k/Converter.kt index db1a1a60199..05e91822095 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.kt @@ -286,25 +286,32 @@ 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 = isVal(field) - val omitType = !settings.specifyFieldTypeByDefault && - initializer != null && - (modifiers.isPrivate && (isVal || convertedType == typeConverter.convertExpressionType(initializer)) || - modifiers.isInternal && convertedType == typeConverter.convertExpressionType(initializer)) Field(name, annotations, modifiers, convertedType, - convertExpression(initializer, field.getType()), + convertExpression(field.getInitializer(), field.getType()), isVal, - !omitType, + shouldDeclareType(field, isVal, convertedType), field.hasWriteAccesses(field.getContainingClass())) } return converted.assignPrototype(field) } + private fun shouldDeclareType(field: PsiField, isVal: Boolean, convertedType: Type): Boolean { + if (settings.specifyFieldTypeByDefault) return true + val initializer = field.getInitializer() ?: return true + fun typeMatches() = convertedType == typeConverter.convertExpressionType(initializer) + return if (field.hasModifierProperty(PsiModifier.PRIVATE)) + !isVal && !typeMatches() + else if (field.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) + !typeMatches() + else + true + } + private fun isVal(field: PsiField): Boolean { if (field.hasModifierProperty(PsiModifier.FINAL)) return true if (!field.hasModifierProperty(PsiModifier.PRIVATE)) return false