From 2159d803f8499eb504661674271768575e9f928d Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 17 Mar 2017 16:22:00 +0100 Subject: [PATCH] add javac quirks case for object-primitive comparison (IDEA-168944) --- .../JavacQuirksInspectionVisitor.java | 19 +++++++++++++++++++ .../advHighlighting7/IDEA111450.java | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java b/java/java-analysis-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java index 8a04b9e96a0c..7930f7a621c3 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java @@ -145,6 +145,25 @@ public class JavacQuirksInspectionVisitor extends JavaElementVisitor { } } + @Override + public void visitBinaryExpression(PsiBinaryExpression expression) { + super.visitBinaryExpression(expression); + if (myLanguageLevel.isAtLeast(LanguageLevel.JDK_1_7) && !myLanguageLevel.isAtLeast(LanguageLevel.JDK_1_8)) { + PsiType ltype = expression.getLOperand().getType(); + PsiExpression rOperand = expression.getROperand(); + if (rOperand != null) { + PsiType rtype = rOperand.getType(); + if (ltype != null && rtype != null && + (ltype.equalsToText(CommonClassNames.JAVA_LANG_OBJECT) ^ rtype.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) && + (TypeConversionUtil.isPrimitiveAndNotNull(ltype) ^ TypeConversionUtil.isPrimitiveAndNotNull(rtype)) && + TypeConversionUtil.isBinaryOperatorApplicable(expression.getOperationTokenType(), ltype, rtype, false) && + TypeConversionUtil.areTypesConvertible(rtype, ltype)) { + myHolder.registerProblem(expression.getOperationSign(), "Comparision between Object and primitive is illegal and is accepted in java 7 only", ProblemHighlightType.GENERIC_ERROR_OR_WARNING); + } + } + } + } + private static class ReplaceAssignmentOperatorWithAssignmentFix implements LocalQuickFix { private final String myOperationSign; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/IDEA111450.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/IDEA111450.java index 9579bf032607..d16f8ffad6fd 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/IDEA111450.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/IDEA111450.java @@ -32,7 +32,7 @@ class Test { System.out.println((char) c1 == (char) o); // Although a reference comparison, the cast on the wrapper has a side effect; not redundant. - System.out.println(o == (char) c1); - System.out.println((char) c1 == o); + System.out.println(o == (char) c1); + System.out.println((char) c1 == o); } } \ No newline at end of file