示例#1
0
        public override IEnumerable <ProgramState> TrySetConstraint(SymbolicValueConstraint constraint, ProgramState currentProgramState)
        {
            var boolConstraint = constraint as BoolConstraint;

            if (boolConstraint == null)
            {
                return(new[] { currentProgramState });
            }

            SymbolicValueConstraint oldConstraint;

            if (TryGetConstraint(currentProgramState, out oldConstraint) &&
                oldConstraint is BoolConstraint /* could also be ObjectConstraint.NotNull, which can be overridden */ &&
                oldConstraint != constraint)
            {
                return(Enumerable.Empty <ProgramState>());
            }

            SymbolicValueConstraint leftConstraint;
            var leftHasConstraint = LeftOperand.TryGetConstraint(currentProgramState, out leftConstraint);
            SymbolicValueConstraint rightConstraint;
            var rightHasConstraint = RightOperand.TryGetConstraint(currentProgramState, out rightConstraint);

            var relationship = GetRelationship(boolConstraint);

            var newProgramState = currentProgramState.TrySetRelationship(relationship);

            if (newProgramState == null)
            {
                return(Enumerable.Empty <ProgramState>());
            }

            if (!rightHasConstraint && !leftHasConstraint)
            {
                return(new[] { newProgramState });
            }

            return(SetConstraint(boolConstraint, leftConstraint, rightConstraint, newProgramState));
        }