From 603075c16e4be9c05eaf82650e0e60cf4e86ead7 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 7 Sep 2021 08:35:43 +0700 Subject: [PATCH] [java-dfa] IDEA-277611 Enhance enum support in Java DFA (this in enum classes support) GitOrigin-RevId: 078ff8adc32f123e3d8a4c874a028b3fc6a257a3 --- .../dataFlow/jvm/descriptors/ThisDescriptor.java | 8 +++++++- .../inspection/dataFlow/fixture/ThisInEnumSubclass.java | 9 +++++++++ .../java/codeInspection/DataFlowInspectionTest.java | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/ThisInEnumSubclass.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/jvm/descriptors/ThisDescriptor.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/jvm/descriptors/ThisDescriptor.java index 5a39217b5b41..1f0918fa4b84 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/jvm/descriptors/ThisDescriptor.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/jvm/descriptors/ThisDescriptor.java @@ -4,6 +4,8 @@ package com.intellij.codeInspection.dataFlow.jvm.descriptors; import com.intellij.codeInsight.Nullability; import com.intellij.codeInspection.dataFlow.Mutability; import com.intellij.codeInspection.dataFlow.MutationSignature; +import com.intellij.codeInspection.dataFlow.TypeConstraint; +import com.intellij.codeInspection.dataFlow.TypeConstraints; import com.intellij.codeInspection.dataFlow.types.DfType; import com.intellij.codeInspection.dataFlow.types.DfTypes; import com.intellij.codeInspection.dataFlow.value.DfaValueFactory; @@ -81,10 +83,14 @@ public final class ThisDescriptor extends PsiVarDescriptor { if (context != null) { PsiMethod method = ObjectUtils.tryCast(context.getParent(), PsiMethod.class); if (method != null && myQualifier.equals(method.getContainingClass())) { + if (myQualifier instanceof PsiEnumConstantInitializer) { + PsiEnumConstant constant = ((PsiEnumConstantInitializer)myQualifier).getEnumConstant(); + return DfTypes.referenceConstant(constant, TypeConstraints.exactClass(myQualifier)); + } if (!method.isConstructor() && MutationSignature.fromMethod(method).preservesThis()) { return dfType.meet(Mutability.UNMODIFIABLE_VIEW.asDfType()); } - else if (method.isConstructor()) { + if (method.isConstructor()) { return dfType.meet(DfTypes.LOCAL_OBJECT); } } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ThisInEnumSubclass.java b/java/java-tests/testData/inspection/dataFlow/fixture/ThisInEnumSubclass.java new file mode 100644 index 000000000000..37265069f327 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ThisInEnumSubclass.java @@ -0,0 +1,9 @@ +public class ThisInEnumSubclass { + enum MyEnum { + A, B, C { + void test() { + if (this == C) {} + } + } + } +} \ 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 acdfc02237e1..ccc668c3c22b 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -712,4 +712,5 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testTempVarsInContracts() { doTest(); } public void testNestedUnrolledLoopNotComplex() { doTest(); } public void testEnumOrdinal() { doTest(); } + public void testThisInEnumSubclass() { doTest(); } }