From af9e786d2823935aa91a8ce888704fd55bce01ae Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 5 Aug 2013 09:46:06 +0200 Subject: [PATCH] IDEA-111537 (False negatives for "Auto-unboxing" inspection) --- .../siyeh/ig/psiutils/ExpectedTypeUtils.java | 36 +++++++++++++++++-- .../jdk/auto_unboxing/AutoUnboxing.java | 13 +++++++ .../igtest/jdk/auto_unboxing/expected.xml | 15 +++++++- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpectedTypeUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpectedTypeUtils.java index 788e43356a4b..87ec266694b2 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpectedTypeUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpectedTypeUtils.java @@ -90,11 +90,11 @@ public class ExpectedTypeUtils { operatorAssignmentOps.add(JavaTokenType.GTGTGTEQ); } - private final PsiExpression wrappedExpression; + @NotNull private final PsiExpression wrappedExpression; private final boolean calculateTypeForComplexReferences; private PsiType expectedType = null; - ExpectedTypeVisitor(PsiExpression wrappedExpression, boolean calculateTypeForComplexReferences) { + ExpectedTypeVisitor(@NotNull PsiExpression wrappedExpression, boolean calculateTypeForComplexReferences) { this.wrappedExpression = wrappedExpression; this.calculateTypeForComplexReferences = calculateTypeForComplexReferences; } @@ -116,6 +116,17 @@ public class ExpectedTypeUtils { expectedType = variable.getType(); } + @Override + public void visitAssertStatement(PsiAssertStatement statement) { + final PsiExpression condition = statement.getAssertCondition(); + if (wrappedExpression == condition) { + expectedType = PsiType.BOOLEAN; + } + else { + expectedType = TypeUtils.getStringType(statement); + } + } + @Override public void visitArrayInitializerExpression(PsiArrayInitializerExpression initializer) { final PsiType type = initializer.getType(); @@ -268,6 +279,22 @@ public class ExpectedTypeUtils { } } + @Override + public void visitSwitchStatement(PsiSwitchStatement statement) { + final PsiExpression expression = statement.getExpression(); + if (expression == null) { + return; + } + final PsiType type = expression.getType(); + final PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type); + if (unboxedType != null) { + expectedType = unboxedType; + } + else { + expectedType = type; + } + } + @Override public void visitWhileStatement(@NotNull PsiWhileStatement whileStatement) { expectedType = PsiType.BOOLEAN; @@ -376,6 +403,11 @@ public class ExpectedTypeUtils { } } + @Override + public void visitInstanceOfExpression(PsiInstanceOfExpression expression) { + expectedType = TypeUtils.getObjectType(expression); + } + @Override public void visitDeclarationStatement(PsiDeclarationStatement declaration) { final PsiElement[] declaredElements = declaration.getDeclaredElements(); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java index e68c7989aaee..457f01e7d329 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java @@ -40,4 +40,17 @@ public class AutoUnboxing { private boolean noWarn(Integer i1, Integer i2) { return i1 == i2; } + + void m(Boolean b) { + assert b; + } + + void n(Integer i) { + switch(i) { + case 1: break; + case 2: break; + case 3: break; + default: + } + } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/expected.xml index ef9303806410..6723165f616c 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/expected.xml +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/expected.xml @@ -64,7 +64,6 @@ Auto-unboxing <code>Boolean.TRUE</code> #loc - AutoUnboxing.java 37 @@ -72,4 +71,18 @@ Auto-unboxing <code>Integer.valueOf(2)</code> #loc + + AutoUnboxing.java + 45 + Auto-unboxing + Auto-unboxing <code>b</code> #loc + + + + AutoUnboxing.java + 49 + Auto-unboxing + Auto-unboxing <code>i</code> #loc + + \ No newline at end of file