diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt index d605f9e6316..75f4e9b22e2 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt @@ -13,6 +13,7 @@ import java.util.Collections import com.intellij.psi.CommonClassNames.* import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.jet.lang.types.lang.PrimitiveType +import org.jetbrains.jet.j2k.isAnnotatedAsNotNull public open class ExpressionVisitor(converter: Converter): StatementVisitor(converter) { { @@ -219,7 +220,8 @@ public open class ExpressionVisitor(converter: Converter): StatementVisitor(conv val insideSecondaryConstructor: Boolean = isInsideSecondaryConstructor(expression) val hasReceiver: Boolean = isFieldReference && insideSecondaryConstructor val isThis: Boolean = isThisExpression(expression) - val isNullable: Boolean = getConverter().typeToType(expression.getType()).nullable + val notNull = isResolvedToNotNull(expression) + val isNullable: Boolean = getConverter().typeToType(expression.getType(), notNull).nullable val className: String = getClassNameWithConstructor(expression) val referencedName = expression.getReferenceName()!! var identifier: Expression = Identifier(referencedName, isNullable) @@ -262,6 +264,17 @@ public open class ExpressionVisitor(converter: Converter): StatementVisitor(conv myResult = CallChainExpression(getConverter().expressionToExpression(qualifier), identifier) } + private fun isResolvedToNotNull(expression: PsiReference): Boolean { + val target = expression.resolve() + if (target is PsiEnumConstant) { + return true; + } + if (target is PsiModifierListOwner) { + return isAnnotatedAsNotNull(target.getModifierList()); + } + return false; + } + public override fun visitSuperExpression(expression: PsiSuperExpression?): Unit { val qualifier: PsiJavaCodeReferenceElement? = expression?.getQualifier() myResult = SuperExpression((if (qualifier != null) diff --git a/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.jav b/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.jav new file mode 100644 index 00000000000..c8d50704ff8 --- /dev/null +++ b/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.jav @@ -0,0 +1,22 @@ +package test; + +import org.jetbrains.annotations.NotNull; + +class Foo { + void execute() {} +} + +class Bar { + @NotNull + Foo fooNotNull = Foo(); + Foo fooNullable = null; +} + +class Test { + public void test(@NotNull Bar barNotNull, Bar barNullable) { + barNotNull.fooNotNull.execute(); + barNotNull.fooNullable.execute(); + barNullable.fooNotNull.execute(); + barNullable.fooNullable.execute(); + } +} diff --git a/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.kt b/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.kt new file mode 100644 index 00000000000..8f43666f096 --- /dev/null +++ b/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.kt @@ -0,0 +1,17 @@ +package test +open class Foo() { +open fun execute() : Unit { +} +} +open class Bar() { +var fooNotNull : Foo = Foo() +var fooNullable : Foo? = null +} +open class Test() { +public open fun test(barNotNull : Bar, barNullable : Bar?) : Unit { +barNotNull.fooNotNull.execute() +barNotNull.fooNullable?.execute() +barNullable?.fooNotNull?.execute() +barNullable?.fooNullable?.execute() +} +} \ No newline at end of file diff --git a/tests/testData/ast/enum/class/enumConstantIsNotNull.jav b/tests/testData/ast/enum/class/enumConstantIsNotNull.jav new file mode 100644 index 00000000000..b6dbf7edc50 --- /dev/null +++ b/tests/testData/ast/enum/class/enumConstantIsNotNull.jav @@ -0,0 +1,7 @@ +enum E { + FOO; + + void foo() { + FOO.toString(); + } +} \ No newline at end of file diff --git a/tests/testData/ast/enum/class/enumConstantIsNotNull.kt b/tests/testData/ast/enum/class/enumConstantIsNotNull.kt new file mode 100644 index 00000000000..62a8e2019a2 --- /dev/null +++ b/tests/testData/ast/enum/class/enumConstantIsNotNull.kt @@ -0,0 +1,6 @@ +enum class E { +FOO +fun foo() : Unit { +FOO.toString() +} +} \ No newline at end of file