[java-dfa] IDEA-277611 Enhance enum support in Java DFA (this in enum classes support)

GitOrigin-RevId: 078ff8adc32f123e3d8a4c874a028b3fc6a257a3
This commit is contained in:
Tagir Valeev
2021-09-08 14:55:06 +00:00
committed by intellij-monorepo-bot
parent 5bdf9bb98a
commit 603075c16e
3 changed files with 17 additions and 1 deletions
@@ -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);
}
}
@@ -0,0 +1,9 @@
public class ThisInEnumSubclass {
enum MyEnum {
A, B, C {
void test() {
if (<warning descr="Condition 'this == C' is always 'true'">this == C</warning>) {}
}
}
}
}
@@ -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(); }
}