From 6e4c7ec6c5d2525512fd3bfb15ea7ac6184de0d2 Mon Sep 17 00:00:00 2001 From: "Andrey.Cherkasov" Date: Tue, 25 Jan 2022 17:16:05 +0300 Subject: [PATCH] [java-inspections] Support magic constants in case labels of switch statements and expressions (IDEA-275706) GitOrigin-RevId: e24c4410de35d120beeb2a8d5974dc3912b4ff9d --- .../MagicConstantInspection.java | 21 ++++++- .../inspection/magic/SwitchBlock.java | 61 +++++++++++++++++++ .../MagicConstantInspectionTest.java | 17 +----- 3 files changed, 83 insertions(+), 16 deletions(-) create mode 100644 java/java-tests/testData/inspection/magic/SwitchBlock.java diff --git a/java/java-impl/src/com/intellij/codeInspection/magicConstant/MagicConstantInspection.java b/java/java-impl/src/com/intellij/codeInspection/magicConstant/MagicConstantInspection.java index 4a330c9ac742..2db412b5fabe 100644 --- a/java/java-impl/src/com/intellij/codeInspection/magicConstant/MagicConstantInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/magicConstant/MagicConstantInspection.java @@ -1,4 +1,4 @@ -// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInspection.magicConstant; import com.intellij.analysis.AnalysisScope; @@ -135,6 +135,25 @@ public final class MagicConstantInspection extends AbstractBaseJavaLocalInspecti checkBinary(r, l); } + @Override + public void visitCaseLabelElementList(PsiCaseLabelElementList list) { + PsiSwitchBlock switchBlock = PsiTreeUtil.getParentOfType(list, PsiSwitchBlock.class); + if (switchBlock == null) return; + PsiExpression selector = switchBlock.getExpression(); + PsiElement resolved = null; + if (selector instanceof PsiReference) { + resolved = ((PsiReference)selector).resolve(); + } + else if (selector instanceof PsiMethodCallExpression) { + resolved = ((PsiCallExpression)selector).resolveMethod(); + } + if (!(resolved instanceof PsiModifierListOwner)) return; + for (PsiCaseLabelElement element : list.getElements()) { + if (!(element instanceof PsiExpression)) continue; + checkExpression((PsiExpression)element, (PsiModifierListOwner)resolved, getType((PsiModifierListOwner)resolved), holder); + } + } + private void checkBinary(@NotNull PsiExpression l, @NotNull PsiExpression r) { if (l instanceof PsiReference) { PsiElement resolved = ((PsiReference)l).resolve(); diff --git a/java/java-tests/testData/inspection/magic/SwitchBlock.java b/java/java-tests/testData/inspection/magic/SwitchBlock.java new file mode 100644 index 000000000000..61d03918c79f --- /dev/null +++ b/java/java-tests/testData/inspection/magic/SwitchBlock.java @@ -0,0 +1,61 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.intellij.lang.annotations.MagicConstant; + +class Const1 { + public static final int X = 1; +} + +class Const2 { + public static final int I = 4; +} + +class X { + @MagicConstant(valuesFromClass = Const1.class, intValues = {Const2.I}) + int foo() { + return Math.random() > 0.5 ? Const1.X : Const2.I; + } + + void f(@MagicConstant(intValues = {Const1.X, Const2.I}) int x) { + /////////// BAD + switch (x) { + case 0: + break; + case 1: + break; + case Const1.X | Const2.I: + break; + } + + switch (foo()) { + case 0: + break; + case 1: + break; + case Const1.X | Const2.I: + break; + } + + /////////// GOOD + switch (x) { + case Const1.X: + break; + case Const2.I: + break; + } + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/MagicConstantInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/MagicConstantInspectionTest.java index 77fc37f9ddbc..0f38bcc1dad9 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/MagicConstantInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/MagicConstantInspectionTest.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.java.codeInspection; @@ -47,6 +33,7 @@ public class MagicConstantInspectionTest extends LightJavaCodeInsightFixtureTest public void testSpecialCases() { doTest(); } public void testVarargMethodCall() { doTest(); } public void testEnumConstructor() { doTest(); } + public void testSwitchBlock() { doTest(); } private void doTest() { myFixture.configureByFile(getTestName(false) + ".java");