From 6ac3052a65cbb43ff26b5c0d25a08ec9d945f680 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 2 Dec 2019 14:25:45 +0700 Subject: [PATCH] CustomMethodHandlers: evaluate enum name() GitOrigin-RevId: 2172db0a3c0355359d9e0f822409483b8f3c35e7 --- .../dataFlow/CustomMethodHandlers.java | 13 +++++++++++++ .../inspection/dataFlow/fixture/EnumName.java | 13 +++++++++++++ .../java/codeInspection/DataFlowInspectionTest.java | 1 + 3 files changed, 27 insertions(+) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/EnumName.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CustomMethodHandlers.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CustomMethodHandlers.java index b0250dc15bae..5ed5c7fe1cef 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CustomMethodHandlers.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CustomMethodHandlers.java @@ -88,6 +88,8 @@ class CustomMethodHandlers { (args, memState, factory, method) -> numberAsString(args, memState, factory, 3, Long.SIZE)) .register(staticCall(JAVA_LANG_LONG, "toBinaryString").parameterCount(1), (args, memState, factory, method) -> numberAsString(args, memState, factory, 1, Long.SIZE)) + .register(instanceCall(JAVA_LANG_ENUM, "name").parameterCount(0), + (args, memState, factory, method) -> enumName(args.myQualifier, memState, factory, method.getReturnType())) .register(anyOf( staticCall(JAVA_UTIL_COLLECTIONS, "emptyList", "emptySet", "emptyMap", "singleton", "singletonList", "singletonMap"), staticCall(JAVA_UTIL_LIST, "of"), @@ -341,6 +343,17 @@ class CustomMethodHandlers { return factory.getFactFactory().createValue(map); } + private static DfaValue enumName(DfaValue qualifier, DfaMemoryState state, DfaValueFactory factory, PsiType type) { + DfaConstValue constant = state.getConstantValue(qualifier); + if (constant != null) { + Object value = constant.getValue(); + if (value instanceof PsiEnumConstant) { + return factory.getConstFactory().createFromValue(((PsiEnumConstant)value).getName(), type); + } + } + return null; + } + private static Object getConstantValue(DfaMemoryState memoryState, DfaValue value) { if (value != null) { LongRangeSet fact = memoryState.getValueFact(value, DfaFactType.RANGE); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/EnumName.java b/java/java-tests/testData/inspection/dataFlow/fixture/EnumName.java new file mode 100644 index 000000000000..1d29a5987de4 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/EnumName.java @@ -0,0 +1,13 @@ +enum X { + FOO, BAR, BAZ +} + +class C { + void test(X x) { + if (x == X.FOO) { + if (x.name().equals("FOO")) { + + } + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java index d92181e8fac1..5e98c724e827 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -671,4 +671,5 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testCellsComplex() { doTest(); } public void testArraysAsList() { doTest(); } public void testArraycopy() { doTest(); } + public void testEnumName() { doTest(); } }