From 514c7b553fe22b408b9814d579a56e3933527386 Mon Sep 17 00:00:00 2001 From: Andrey Ponomarev Date: Thu, 21 Feb 2013 00:46:53 +0100 Subject: [PATCH 1/3] J2K: Detect @NotNull fields --- j2k/src/org/jetbrains/jet/j2k/Converter.java | 2 +- j2k/tests/testData/ast/annotations/file/jetbrainsNotNull.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.java b/j2k/src/org/jetbrains/jet/j2k/Converter.java index dd31c97b8f4..8208cde69c4 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.java +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.java @@ -361,7 +361,7 @@ public class Converter { return new Field( new IdentifierImpl(field.getName()), // TODO modifiers, - typeToType(field.getType()), + typeToType(field.getType(), ConverterUtil.isAnnotatedAsNotNull(field.getModifierList())), createSureCallOnlyForChain(field.getInitializer(), field.getType()), // TODO: add modifiers countWritingAccesses(field, psiClass) ); diff --git a/j2k/tests/testData/ast/annotations/file/jetbrainsNotNull.kt b/j2k/tests/testData/ast/annotations/file/jetbrainsNotNull.kt index 376befca75c..1639842a602 100644 --- a/j2k/tests/testData/ast/annotations/file/jetbrainsNotNull.kt +++ b/j2k/tests/testData/ast/annotations/file/jetbrainsNotNull.kt @@ -1,6 +1,6 @@ package test public open class Test(str : String) { -var myStr : String? = "String2" +var myStr : String = "String2" public open fun sout(str : String) : Unit { System.out?.println(str) } From e4df4059d19f8bd3c3ee6f9e34a5c00d97044775 Mon Sep 17 00:00:00 2001 From: Andrey Ponomarev Date: Thu, 21 Feb 2013 01:46:09 +0100 Subject: [PATCH 2/3] J2K: Detect @NotNull references in call chains --- .../jet/j2k/ast/CallChainExpression.java | 2 +- .../jet/j2k/visitors/ExpressionVisitor.java | 12 +++++++++- .../file/jetbrainsNotNullChainExpr.jav | 22 +++++++++++++++++++ .../file/jetbrainsNotNullChainExpr.kt | 17 ++++++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 j2k/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.jav create mode 100644 j2k/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java index 48170f069b1..fa51f44691d 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java +++ b/j2k/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java @@ -39,7 +39,7 @@ public class CallChainExpression extends Expression { @Override public boolean isNullable() { - return myIdentifier.isNullable(); + return myExpression.isNullable() || myIdentifier.isNullable(); } @NotNull diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 6c540134b58..7fefb7220e0 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -21,6 +21,7 @@ import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.Converter; +import org.jetbrains.jet.j2k.ConverterUtil; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.lang.types.expressions.OperatorConventions; @@ -345,7 +346,8 @@ public class ExpressionVisitor extends StatementVisitor { final boolean insideSecondaryConstructor = isInsideSecondaryConstructor(expression); final boolean hasReceiver = isFieldReference && insideSecondaryConstructor; final boolean isThis = isThisExpression(expression); - final boolean isNullable = getConverter().typeToType(expression.getType()).isNullable(); + final boolean notNull = isResolvedToNotNull(expression); + final boolean isNullable = getConverter().typeToType(expression.getType(), notNull).isNullable(); final String className = getClassNameWithConstructor(expression); Expression identifier = new IdentifierImpl(expression.getReferenceName(), isNullable); @@ -364,6 +366,14 @@ public class ExpressionVisitor extends StatementVisitor { ); } + private static boolean isResolvedToNotNull(PsiReference expression) { + PsiElement target = expression.resolve(); + if (target instanceof PsiModifierListOwner) { + return ConverterUtil.isAnnotatedAsNotNull(((PsiModifierListOwner) target).getModifierList()); + } + return false; + } + @NotNull private static String getClassNameWithConstructor(@NotNull PsiReferenceExpression expression) { PsiElement context = expression.getContext(); diff --git a/j2k/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.jav b/j2k/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.jav new file mode 100644 index 00000000000..c8d50704ff8 --- /dev/null +++ b/j2k/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/j2k/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.kt b/j2k/tests/testData/ast/annotations/file/jetbrainsNotNullChainExpr.kt new file mode 100644 index 00000000000..8f43666f096 --- /dev/null +++ b/j2k/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 From 34c227b8ed2f464a8ad64fb63014041e464d7540 Mon Sep 17 00:00:00 2001 From: Andrey Ponomarev Date: Thu, 21 Feb 2013 10:56:52 +0100 Subject: [PATCH 3/3] J2K: enum constants are non-nullable --- .../org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java | 3 +++ .../testData/ast/enum/class/enumConstantIsNotNull.jav | 7 +++++++ .../testData/ast/enum/class/enumConstantIsNotNull.kt | 8 ++++++++ 3 files changed, 18 insertions(+) create mode 100644 j2k/tests/testData/ast/enum/class/enumConstantIsNotNull.jav create mode 100644 j2k/tests/testData/ast/enum/class/enumConstantIsNotNull.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 7fefb7220e0..e922e22f32e 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -368,6 +368,9 @@ public class ExpressionVisitor extends StatementVisitor { private static boolean isResolvedToNotNull(PsiReference expression) { PsiElement target = expression.resolve(); + if (target instanceof PsiEnumConstant) { + return true; + } if (target instanceof PsiModifierListOwner) { return ConverterUtil.isAnnotatedAsNotNull(((PsiModifierListOwner) target).getModifierList()); } diff --git a/j2k/tests/testData/ast/enum/class/enumConstantIsNotNull.jav b/j2k/tests/testData/ast/enum/class/enumConstantIsNotNull.jav new file mode 100644 index 00000000000..b6dbf7edc50 --- /dev/null +++ b/j2k/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/j2k/tests/testData/ast/enum/class/enumConstantIsNotNull.kt b/j2k/tests/testData/ast/enum/class/enumConstantIsNotNull.kt new file mode 100644 index 00000000000..01b17c5fc9b --- /dev/null +++ b/j2k/tests/testData/ast/enum/class/enumConstantIsNotNull.kt @@ -0,0 +1,8 @@ +enum class E { +FOO +fun foo() : Unit { +FOO.toString() +} +public fun name() : String { return "" } +public fun order() : Int { return 0 } +} \ No newline at end of file