From c3854c939cb546a8fbf9b115d74899a8f3702738 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 10 Jun 2011 19:21:39 +0400 Subject: [PATCH] Negations supported --- .../jet/lang/psi/JetPrefixExpression.java | 5 +-- .../jet/lang/psi/JetUnaryExpression.java | 2 +- .../jet/lang/types/JetTypeInferrer.java | 19 +++++++++ idea/testData/checker/Nullability.jet | 41 +++++++++++++++++++ 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetPrefixExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetPrefixExpression.java index e4c9fd15325..4d9e0986e43 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetPrefixExpression.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetPrefixExpression.java @@ -3,7 +3,7 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.JetNodeTypes; +import org.jetbrains.annotations.Nullable; /** * @author max @@ -18,13 +18,12 @@ public class JetPrefixExpression extends JetUnaryExpression { visitor.visitPrefixExpression(this); } - @NotNull + @Nullable @IfNotParsed public JetExpression getBaseExpression() { PsiElement expression = getOperationSign().getNextSibling(); while (expression != null && false == expression instanceof JetExpression) { expression = expression.getNextSibling(); } - assert expression != null; return (JetExpression) expression; } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetUnaryExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetUnaryExpression.java index 404fd88d90f..6e66ee62660 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetUnaryExpression.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetUnaryExpression.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; /** @@ -12,7 +13,6 @@ public abstract class JetUnaryExpression extends JetExpression { super(node); } - @NotNull public abstract JetExpression getBaseExpression(); @NotNull diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index e5ebe93470c..d7abc4b7f30 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -1403,6 +1403,25 @@ public class JetTypeInferrer { } } } + + @Override + public void visitUnaryExpression(JetUnaryExpression expression) { + IElementType operationTokenType = expression.getOperationSign().getReferencedNameElementType(); + if (operationTokenType == JetTokens.EXCL) { + JetExpression baseExpression = expression.getBaseExpression(); + if (baseExpression != null) { + result[0] = extractDataFlowInfoFromCondition(baseExpression, !conditionValue); + } + } + } + + @Override + public void visitParenthesizedExpression(JetParenthesizedExpression expression) { + JetExpression body = expression.getExpression(); + if (body != null) { + body.accept(this); + } + } }); return result[0]; } diff --git a/idea/testData/checker/Nullability.jet b/idea/testData/checker/Nullability.jet index 562a27f2026..5109d94f3c3 100644 --- a/idea/testData/checker/Nullability.jet +++ b/idea/testData/checker/Nullability.jet @@ -214,3 +214,44 @@ fun f6(s : String?) { } while (s == null) s.get(0) } + +fun f7(s : String?, t : String?) { + s?.get(0) + if (!(s == null)) { + s.get(0) + } + s?.get(0) + if (!(s != null)) { + s?.get(0) + } + else { + s.get(0) + } + s?.get(0) + if (!!(s != null)) { + s.get(0) + } + else { + s?.get(0) + } + s?.get(0) + t?.get(0) + if (!(s == null || t == null)) { + s.get(0) + t.get(0) + } + else { + s?.get(0) + t?.get(0) + } + s?.get(0) + t?.get(0) + if (!(s == null && s == null)) { + s.get(0) + t?.get(0) + } + else { + s?.get(0) + t?.get(0) + } +}