Skip to content

Commit

Permalink
SE - Nullable: Learn NotNull from recursive pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
pavel-mikula-sonarsource committed Mar 20, 2023
1 parent 65df768 commit 7d8ae7d
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,9 @@ private static SymbolicConstraint ConstraintFromConstantPattern(ProgramState sta

private static ObjectConstraint ConstraintFromRecursivePattern(IRecursivePatternOperationWrapper recursive, bool falseBranch, bool hasObjectConstraint)
{
if (hasObjectConstraint || !recursive.InputType.IsReferenceType)
if (hasObjectConstraint)
{
return null; // Don't learn if we can't, or we already know the answer
return null; // Don't learn if we already know the answer
}
else if (falseBranch)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -582,6 +582,7 @@ public void Branching_LearnsObjectConstraint_TypePattern_Negated(string expressi
[DataRow("arg is not not { }")]
[DataRow("!!(arg is { })")]
[DataRow("arg is (A: var a, B: _)", "Deconstructable")]
[DataRow("arg is { }", "T")]
public void Branching_LearnsObjectConstraint_RecursivePattern_ElseIsNull(string expression, string argType = "object")
{
var validator = CreateIfElseEndValidatorCS(expression, OperationKind.RecursivePattern, argType);
Expand All @@ -602,6 +603,7 @@ public void Branching_LearnsObjectConstraint_RecursivePattern_ElseIsNull(string
[DataRow("arg is TClass { }")]
[DataRow("arg is TStruct { }")]
[DataRow("arg is DateTime { Ticks: 0 }")]
[DataRow("arg is string { }", "T")]
public void Branching_LearnsObjectConstraint_RecursivePattern_ElseIsUnknown(string expression, string argType = "object")
{
var validator = CreateIfElseEndValidatorCS(expression, OperationKind.RecursivePattern, argType);
Expand All @@ -612,13 +614,11 @@ public void Branching_LearnsObjectConstraint_RecursivePattern_ElseIsUnknown(stri
.And.ContainSingle(x => x != null && x.HasConstraint(ObjectConstraint.NotNull));
}

[DataTestMethod]
[DataRow("arg is { }", "T")]
[DataRow("arg is string { }", "T")] // Could have NotNull instead. T is not known to be reference type.
[DataRow("(arg, Unknown<object>()) is ({ }, { })", "object")] // We don't support learning for tuples (yet). Should behave same as "arg is { }". Gets tricky when nesting (a, (b, c))
public void Branching_LearnsObjectConstraint_RecursivePattern_NoConstraint(string expression, string argType)
[TestMethod]
public void Branching_LearnsObjectConstraint_RecursivePattern_Tuple_NoConstraint()
{
var validator = CreateIfElseEndValidatorCS(expression, OperationKind.RecursivePattern, argType);
// We don't support learning for tuples (yet). Should behave same as "arg is { }". Gets tricky when nesting (a, (b, c))
var validator = CreateIfElseEndValidatorCS("(arg, Unknown<object>()) is ({ }, { })", OperationKind.RecursivePattern);
validator.ValidateTag("If", x => x.Should().HaveNoConstraints());
validator.ValidateTag("Else", x => x.Should().HaveNoConstraints());
validator.ValidateTag("End", x => x.Should().HaveNoConstraints());
Expand Down

0 comments on commit 7d8ae7d

Please sign in to comment.