diff --git a/java/codeserver/core/src/com/intellij/java/codeserver/core/JavaPsiExpressionUtil.java b/java/codeserver/core/src/com/intellij/java/codeserver/core/JavaPsiExpressionUtil.java deleted file mode 100644 index 658836b02b08..000000000000 --- a/java/codeserver/core/src/com/intellij/java/codeserver/core/JavaPsiExpressionUtil.java +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.intellij.java.codeserver.core; - -import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiLiteralExpression; -import com.intellij.psi.util.PsiUtil; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.Nullable; - -/** - * Utilities related to Java expressions - */ -public final class JavaPsiExpressionUtil { - /** - * @param expression expression to check - * @return true if the expression is a null literal (possibly parenthesized or cast) - */ - @Contract("null -> false") - public static boolean isNullLiteral(@Nullable PsiExpression expression) { - return PsiUtil.deparenthesizeExpression(expression) instanceof PsiLiteralExpression literal && literal.getValue() == null; - } -} diff --git a/java/codeserver/core/src/com/intellij/java/codeserver/core/JavaPsiSwitchUtil.java b/java/codeserver/core/src/com/intellij/java/codeserver/core/JavaPsiSwitchUtil.java index 2e013966d11e..13022f69c2da 100644 --- a/java/codeserver/core/src/com/intellij/java/codeserver/core/JavaPsiSwitchUtil.java +++ b/java/codeserver/core/src/com/intellij/java/codeserver/core/JavaPsiSwitchUtil.java @@ -174,7 +174,7 @@ public final class JavaPsiSwitchUtil { @NotNull PsiType selectorType) { boolean isOverWhomUnconditionalForSelector = JavaPsiPatternUtil.isUnconditionalForType(overWhom, selectorType); if (!isOverWhomUnconditionalForSelector && - ((!(overWhom instanceof PsiExpression expression) || JavaPsiExpressionUtil.isNullLiteral(expression)) && + ((!(overWhom instanceof PsiExpression expression) || ExpressionUtil.isNullLiteral(expression)) && who instanceof PsiKeyword && PsiKeyword.DEFAULT.equals(who.getText()) || isInCaseNullDefaultLabel(who))) { // JEP 440-441 @@ -205,8 +205,7 @@ public final class JavaPsiSwitchUtil { PsiCaseLabelElementList list = ObjectUtils.tryCast(element.getParent(), PsiCaseLabelElementList.class); if (list == null || list.getElementCount() != 2) return false; PsiCaseLabelElement[] elements = list.getElements(); - return elements[0] instanceof PsiExpression expr && - JavaPsiExpressionUtil.isNullLiteral(expr) && + return elements[0] instanceof PsiExpression expr && ExpressionUtil.isNullLiteral(expr) && elements[1] instanceof PsiDefaultCaseLabelElement; } @@ -264,7 +263,7 @@ public final class JavaPsiSwitchUtil { private static boolean shouldConsiderForDominance(@NotNull PsiCaseLabelElement labelElement) { if (labelElement instanceof PsiPattern) return true; if (labelElement instanceof PsiExpression) { - boolean isNullType = ExpressionUtil.isNullType(labelElement); + boolean isNullType = ExpressionUtil.isNullLiteral(labelElement); if (isNullType && isInCaseNullDefaultLabel(labelElement)) { // JEP 432 // A 'case null, default' label dominates all other switch labels. diff --git a/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/SwitchChecker.java b/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/SwitchChecker.java index f76bebd67999..9c696e4a4e12 100644 --- a/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/SwitchChecker.java +++ b/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/SwitchChecker.java @@ -3,7 +3,6 @@ package com.intellij.java.codeserver.highlighting; import com.intellij.codeInsight.ExpressionUtil; import com.intellij.core.JavaPsiBundle; -import com.intellij.java.codeserver.core.JavaPsiExpressionUtil; import com.intellij.java.codeserver.core.JavaPsiSwitchUtil; import com.intellij.java.codeserver.highlighting.errors.JavaErrorKinds; import com.intellij.java.codeserver.highlighting.errors.JavaIncompatibleTypeErrorContext; @@ -295,9 +294,9 @@ final class SwitchChecker { PsiCaseLabelElementList labelElementList = labelStatement.getCaseLabelElementList(); if (labelElementList == null) continue; for (PsiCaseLabelElement label : labelElementList.getElements()) { - if (!(label instanceof PsiParenthesizedExpression) && ExpressionUtil.isNullType(label)) { + if (!(label instanceof PsiParenthesizedExpression) && ExpressionUtil.isNullLiteral(label)) { if (selectorType instanceof PsiPrimitiveType) { - if (!ExpressionUtil.isNullType(selector)) { + if (!PsiTypes.nullType().equals(selectorType)) { myVisitor.report(JavaErrorKinds.SWITCH_NULL_TYPE_INCOMPATIBLE.create(label, selectorType)); return; } @@ -520,13 +519,11 @@ final class SwitchChecker { } if (elements.length == 2) { if (firstElement instanceof PsiDefaultCaseLabelElement defaultLabel && - elements[1] instanceof PsiExpression expr && - JavaPsiExpressionUtil.isNullLiteral(expr)) { + elements[1] instanceof PsiExpression expr && ExpressionUtil.isNullLiteral(expr)) { myVisitor.report(JavaErrorKinds.SWITCH_DEFAULT_NULL_ORDER.create(defaultLabel, labelElementList)); return true; } - if (firstElement instanceof PsiExpression expr && - JavaPsiExpressionUtil.isNullLiteral(expr) && + if (firstElement instanceof PsiExpression expr && ExpressionUtil.isNullLiteral(expr) && elements[1] instanceof PsiDefaultCaseLabelElement) { return false; } @@ -539,7 +536,7 @@ final class SwitchChecker { myVisitor.report(JavaErrorKinds.SWITCH_DEFAULT_LABEL_NOT_ALLOWED.create(defaultLabel)); reported = true; } - else if (element instanceof PsiExpression expr && JavaPsiExpressionUtil.isNullLiteral(expr)) { + else if (element instanceof PsiExpression expr && ExpressionUtil.isNullLiteral(expr)) { myVisitor.report(JavaErrorKinds.SWITCH_NULL_LABEL_NOT_ALLOWED.create(expr)); reported = true; } diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/ExpressionUtil.java b/java/java-psi-impl/src/com/intellij/codeInsight/ExpressionUtil.java index a747c2793288..cbf662d5dc4a 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/ExpressionUtil.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/ExpressionUtil.java @@ -6,7 +6,9 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public final class ExpressionUtil { /** @@ -51,7 +53,7 @@ public final class ExpressionUtil { PsiCaseLabelElement[] elements = elementList.getElements(); for (PsiCaseLabelElement caseLabelElement : elements) { if (caseLabelElement != null) { - if (caseLabelElement instanceof PsiPattern || isNullType(caseLabelElement)) return true; + if (caseLabelElement instanceof PsiPattern || isNullLiteral(caseLabelElement)) return true; } } } @@ -60,11 +62,14 @@ public final class ExpressionUtil { } /** - * @param element element to check - * @return true if the element is an expression whose type is {@link PsiTypes#nullType()}. + * @param element expression to check + * @return true if the expression is a null literal (possibly parenthesized or cast) */ - public static boolean isNullType(@NotNull PsiElement element) { - return element instanceof PsiExpression && TypeConversionUtil.isNullType(((PsiExpression)element).getType()); + @Contract("null -> false") + public static boolean isNullLiteral(@Nullable PsiElement element) { + if (!(element instanceof PsiExpression)) return false; + PsiExpression deparenthesized = PsiUtil.deparenthesizeExpression((PsiExpression)element); + return deparenthesized instanceof PsiLiteralExpression && ((PsiLiteralExpression)deparenthesized).getValue() == null; } /**