don't generate nullable type for val with not-null initializer

This commit is contained in:
Dmitry Jemerov
2012-06-01 18:56:03 +02:00
committed by Pavel V. Talanov
parent 58cf1d47be
commit 47293918fc
5 changed files with 23 additions and 7 deletions
+12 -1
View File
@@ -224,10 +224,15 @@ public open class Converter() {
elementToElement(field.getArgumentList())) elementToElement(field.getArgumentList()))
} }
var kType = typeToType(field.getType())
if (field.hasModifierProperty(PsiModifier.FINAL) && isDefinitelyNotNull(field.getInitializer())) {
kType = kType.convertedToNotNull();
}
return Field(Identifier(field.getName()!!), return Field(Identifier(field.getName()!!),
docComments, docComments,
modifiers, modifiers,
typeToType(field.getType()), kType,
expressionToExpression(field.getInitializer(), field.getType()), expressionToExpression(field.getInitializer(), field.getType()),
countWritingAccesses(field, psiClass)) countWritingAccesses(field, psiClass))
} }
@@ -834,3 +839,9 @@ public open fun isAnnotatedAsNotNull(modifierList: PsiModifierList?): Boolean {
} }
return false return false
} }
public fun isDefinitelyNotNull(element: PsiElement?): Boolean = when(element) {
is PsiLiteralExpression -> element.getValue() != null
is PsiNewExpression -> true
else -> false
}
@@ -6,6 +6,7 @@ import org.jetbrains.jet.j2k.ast.*
import org.jetbrains.jet.j2k.ast.types.Type import org.jetbrains.jet.j2k.ast.types.Type
import java.util.List import java.util.List
import org.jetbrains.jet.j2k.isAnnotatedAsNotNull import org.jetbrains.jet.j2k.isAnnotatedAsNotNull
import org.jetbrains.jet.j2k.isDefinitelyNotNull
public open class ElementVisitor(val myConverter : Converter) : JavaElementVisitor() { public open class ElementVisitor(val myConverter : Converter) : JavaElementVisitor() {
protected var myResult : Element = Element.EMPTY_ELEMENT 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 { public override fun visitLocalVariable(variable : PsiLocalVariable?) : Unit {
val theVariable = variable!! 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()!!), myResult = LocalVariable(Identifier(theVariable.getName()!!),
Converter.modifiersListToModifiersSet(theVariable.getModifierList()), Converter.modifiersListToModifiersSet(theVariable.getModifierList()),
myConverter.typeToType(theVariable.getType(), isAnnotatedAsNotNull(theVariable.getModifierList())), kType,
myConverter.expressionToExpression(theVariable.getInitializer(), theVariable.getType())) myConverter.expressionToExpression(theVariable.getInitializer(), theVariable.getType()))
} }
+1 -1
View File
@@ -1,3 +1,3 @@
open class C() { open class C() {
val f : Foo? = Foo(1, 2) val f : Foo = Foo(1, 2)
} }
@@ -1,7 +1,7 @@
trait INode { trait INode {
class object { class object {
val IN : String? = "in" val IN : String = "in"
val AT : String? = "@" val AT : String = "@"
val COMMA_WITH_SPACE : String? = COMMA + SPACE val COMMA_WITH_SPACE : String? = COMMA + SPACE
} }
} }
@@ -1,7 +1,7 @@
public trait INode { public trait INode {
class object { class object {
public val IN : String? = "in" public val IN : String = "in"
public val AT : String? = "@" public val AT : String = "@"
public val COMMA_WITH_SPACE : String? = COMMA + SPACE public val COMMA_WITH_SPACE : String? = COMMA + SPACE
} }
} }