diff --git a/src/org/jetbrains/jet/j2k/Converter.kt b/src/org/jetbrains/jet/j2k/Converter.kt index 58b16d76d90..b9f36a8f79c 100644 --- a/src/org/jetbrains/jet/j2k/Converter.kt +++ b/src/org/jetbrains/jet/j2k/Converter.kt @@ -224,10 +224,15 @@ public open class Converter() { elementToElement(field.getArgumentList())) } + var kType = typeToType(field.getType()) + if (field.hasModifierProperty(PsiModifier.FINAL) && isDefinitelyNotNull(field.getInitializer())) { + kType = kType.convertedToNotNull(); + } + return Field(Identifier(field.getName()!!), docComments, modifiers, - typeToType(field.getType()), + kType, expressionToExpression(field.getInitializer(), field.getType()), countWritingAccesses(field, psiClass)) } @@ -834,3 +839,9 @@ public open fun isAnnotatedAsNotNull(modifierList: PsiModifierList?): Boolean { } return false } + +public fun isDefinitelyNotNull(element: PsiElement?): Boolean = when(element) { + is PsiLiteralExpression -> element.getValue() != null + is PsiNewExpression -> true + else -> false +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.kt b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.kt index 05e38b0a918..7cf3db8ccc7 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.kt +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.kt @@ -6,6 +6,7 @@ import org.jetbrains.jet.j2k.ast.* import org.jetbrains.jet.j2k.ast.types.Type import java.util.List import org.jetbrains.jet.j2k.isAnnotatedAsNotNull +import org.jetbrains.jet.j2k.isDefinitelyNotNull public open class ElementVisitor(val myConverter : Converter) : JavaElementVisitor() { protected var myResult : Element = Element.EMPTY_ELEMENT @@ -20,9 +21,13 @@ public open class ElementVisitor(val myConverter : Converter) : JavaElementVisit public override fun visitLocalVariable(variable : PsiLocalVariable?) : Unit { val theVariable = variable!! + var kType = myConverter.typeToType(theVariable.getType(), isAnnotatedAsNotNull(theVariable.getModifierList())) + if (theVariable.hasModifierProperty(PsiModifier.FINAL) && isDefinitelyNotNull(theVariable.getInitializer())) { + kType = kType.convertedToNotNull(); + } myResult = LocalVariable(Identifier(theVariable.getName()!!), Converter.modifiersListToModifiersSet(theVariable.getModifierList()), - myConverter.typeToType(theVariable.getType(), isAnnotatedAsNotNull(theVariable.getModifierList())), + kType, myConverter.expressionToExpression(theVariable.getInitializer(), theVariable.getType())) } diff --git a/tests/testData/ast/field/file/valWithInit.kt b/tests/testData/ast/field/file/valWithInit.kt index bff6b253608..32d44347025 100644 --- a/tests/testData/ast/field/file/valWithInit.kt +++ b/tests/testData/ast/field/file/valWithInit.kt @@ -1,3 +1,3 @@ open class C() { -val f : Foo? = Foo(1, 2) +val f : Foo = Foo(1, 2) } \ No newline at end of file diff --git a/tests/testData/ast/trait/class/interfaceWithFields.kt b/tests/testData/ast/trait/class/interfaceWithFields.kt index 457c9848296..22feead449c 100644 --- a/tests/testData/ast/trait/class/interfaceWithFields.kt +++ b/tests/testData/ast/trait/class/interfaceWithFields.kt @@ -1,7 +1,7 @@ trait INode { class object { -val IN : String? = "in" -val AT : String? = "@" +val IN : String = "in" +val AT : String = "@" val COMMA_WITH_SPACE : String? = COMMA + SPACE } } \ No newline at end of file diff --git a/tests/testData/ast/trait/class/interfaceWithStaticFields.kt b/tests/testData/ast/trait/class/interfaceWithStaticFields.kt index 11e87d7db5d..d991ddf2892 100644 --- a/tests/testData/ast/trait/class/interfaceWithStaticFields.kt +++ b/tests/testData/ast/trait/class/interfaceWithStaticFields.kt @@ -1,7 +1,7 @@ public trait INode { class object { -public val IN : String? = "in" -public val AT : String? = "@" +public val IN : String = "in" +public val AT : String = "@" public val COMMA_WITH_SPACE : String? = COMMA + SPACE } } \ No newline at end of file