[java-dfa] Support in DFA some range methods from Character class

GitOrigin-RevId: 9f3c251259dd9f4cdc5a778b844d435d22de1d7b
This commit is contained in:
Tagir Valeev
2022-12-02 17:28:52 +00:00
committed by intellij-monorepo-bot
parent d8bf7b1732
commit 65aaff55ed
3 changed files with 51 additions and 1 deletions
@@ -197,7 +197,38 @@ public final class HardcodedContracts {
singleConditionContract(ContractValue.qualifier(), RelationType.EQ, ContractValue.argument(0), returnFalse())
))
//for propagation CONSUMED_STREAM
.register(ConsumedStreamUtils.getSkipStreamMatchers(), ContractProvider.of(trivialContract(returnThis())));
.register(ConsumedStreamUtils.getSkipStreamMatchers(), ContractProvider.of(trivialContract(returnThis())))
.register(staticCall(JAVA_LANG_CHARACTER, "isSurrogate").parameterCount(1),
ContractProvider.of(
singleConditionContract(ContractValue.argument(0), RelationType.LT, ContractValue.constant(Character.MIN_SURROGATE, PsiType.CHAR), returnFalse()),
singleConditionContract(ContractValue.argument(0), RelationType.GT, ContractValue.constant(Character.MAX_SURROGATE, PsiType.CHAR), returnFalse()),
trivialContract(returnTrue())))
.register(staticCall(JAVA_LANG_CHARACTER, "isHighSurrogate").parameterCount(1),
ContractProvider.of(
singleConditionContract(ContractValue.argument(0), RelationType.LT, ContractValue.constant(Character.MIN_HIGH_SURROGATE, PsiType.CHAR), returnFalse()),
singleConditionContract(ContractValue.argument(0), RelationType.GT, ContractValue.constant(Character.MAX_HIGH_SURROGATE, PsiType.CHAR), returnFalse()),
trivialContract(returnTrue())))
.register(staticCall(JAVA_LANG_CHARACTER, "isLowSurrogate").parameterCount(1),
ContractProvider.of(
singleConditionContract(ContractValue.argument(0), RelationType.LT, ContractValue.constant(Character.MIN_LOW_SURROGATE, PsiType.CHAR), returnFalse()),
singleConditionContract(ContractValue.argument(0), RelationType.GT, ContractValue.constant(Character.MAX_LOW_SURROGATE, PsiType.CHAR), returnFalse()),
trivialContract(returnTrue())))
.register(staticCall(JAVA_LANG_CHARACTER, "isSupplementaryCodePoint").parameterCount(1),
ContractProvider.of(
singleConditionContract(ContractValue.argument(0), RelationType.LT, ContractValue.constant(Character.MIN_SUPPLEMENTARY_CODE_POINT, PsiType.INT), returnFalse()),
singleConditionContract(ContractValue.argument(0), RelationType.GT, ContractValue.constant(Character.MAX_CODE_POINT, PsiType.INT), returnFalse()),
trivialContract(returnTrue())))
.register(staticCall(JAVA_LANG_CHARACTER, "isValidCodePoint").parameterCount(1),
ContractProvider.of(
singleConditionContract(ContractValue.argument(0), RelationType.LT, ContractValue.constant(Character.MIN_CODE_POINT, PsiType.INT), returnFalse()),
singleConditionContract(ContractValue.argument(0), RelationType.GT, ContractValue.constant(Character.MAX_CODE_POINT, PsiType.INT), returnFalse()),
trivialContract(returnTrue())))
.register(staticCall(JAVA_LANG_CHARACTER, "isBmpCodePoint").parameterCount(1),
ContractProvider.of(
singleConditionContract(ContractValue.argument(0), RelationType.LT, ContractValue.constant(Character.MIN_CODE_POINT, PsiType.INT), returnFalse()),
singleConditionContract(ContractValue.argument(0), RelationType.GE, ContractValue.constant(Character.MIN_SUPPLEMENTARY_CODE_POINT, PsiType.INT), returnFalse()),
trivialContract(returnTrue())))
;
private static @NotNull ContractProvider getArraycopyContract() {
ContractValue src = ContractValue.argument(0);
@@ -0,0 +1,18 @@
import java.util.*;
class X {
void test(char ch, int codePoint) {
if (<warning descr="Condition 'Character.isHighSurrogate(ch) && Character.isLowSurrogate(ch)' is always 'false'">Character.isHighSurrogate(ch) && <warning descr="Condition 'Character.isLowSurrogate(ch)' is always 'false' when reached">Character.isLowSurrogate(ch)</warning></warning>) {
}
if (<warning descr="Condition 'Character.isBmpCodePoint(codePoint) && Character.isSupplementaryCodePoint(codePoint)' is always 'false'">Character.isBmpCodePoint(codePoint) && <warning descr="Condition 'Character.isSupplementaryCodePoint(codePoint)' is always 'false' when reached">Character.isSupplementaryCodePoint(codePoint)</warning></warning>) {
}
if (!Character.isValidCodePoint(codePoint)) {
if (<warning descr="Condition 'Character.isBmpCodePoint(codePoint)' is always 'false'">Character.isBmpCodePoint(codePoint)</warning>) {
}
if (<warning descr="Condition 'Character.isSupplementaryCodePoint(codePoint)' is always 'false'">Character.isSupplementaryCodePoint(codePoint)</warning>) {
}
}
}
}
@@ -183,4 +183,5 @@ public class HardcodedContractsTest extends DataFlowInspectionTestCase {
checkHighlighting();
}
public void testCharacterMethods() { checkHighlighting(); }
}