public SetVariableResult SetValue(IVariableStore variables, VariableValue value)
        {
            var left  = Left.Evaluate(variables);
            var right = Right.Evaluate(variables);

            var result = VariableHandler.Apply(ref left, right, value);

            if (result == SetVariableResult.Success && !left.HasReference)
            {
                if (Left is IAssignableOperation assignable)
                {
                    return(assignable.SetValue(variables, value));
                }
                else
                {
                    throw new ExpressionEvaluationException(_invalidAssignException, value, right, Left);
                }
            }

            switch (result)
            {
            case SetVariableResult.NotFound: throw new ExpressionEvaluationException(_missingAssignmentException, value, right, left);

            case SetVariableResult.ReadOnly: throw new ExpressionEvaluationException(_readOnlyAssignmentException, value, right, left);

            case SetVariableResult.TypeMismatch: throw new ExpressionEvaluationException(_mismatchedAssignmentException, value, value.Type, right, left);
            }

            return(result);
        }
Exemple #2
0
        public SetVariableResult SetValue(ref VariableValue owner, VariableValue value)
        {
            var result = VariableHandler.Apply(ref owner, VariableValue.Create(Name), value);

            switch (result)
            {
            case SetVariableResult.NotFound: throw new ExpressionEvaluationException(_missingAssignmentException, value, Name, owner);

            case SetVariableResult.ReadOnly: throw new ExpressionEvaluationException(_readOnlyAssignmentException, value, Name, owner);

            case SetVariableResult.TypeMismatch: throw new ExpressionEvaluationException(_mismatchedAssignmentException, value, value.Type, Name, owner);
            }

            return(result);
        }
Exemple #3
0
        private SetVariableResult SetValue_(ref VariableValue owner, VariableValue value, int index)
        {
            var token = _tokens[index];

            if (index == _tokens.Count - 1)
            {
                switch (token.Type)
                {
                case VariableTokenType.Name:
                {
                    return(VariableHandler.Apply(ref owner, VariableValue.Create(token.Text), value));
                }

                case VariableTokenType.Number:
                {
                    if (int.TryParse(token.Text, out var number))
                    {
                        return(VariableHandler.Apply(ref owner, VariableValue.Create(number), value));
                    }

                    break;
                }

                case VariableTokenType.Type:
                {
                    return(SetVariableResult.ReadOnly);
                }
                }
            }
            else
            {
                var lookup = VariableValue.Empty;
                var child  = VariableValue.Empty;

                switch (token.Type)
                {
                case VariableTokenType.Name:
                {
                    lookup = VariableValue.Create(token.Text);
                    child  = VariableHandler.Lookup(owner, lookup);
                    break;
                }

                case VariableTokenType.Number:
                {
                    if (int.TryParse(token.Text, out var number))
                    {
                        lookup = VariableValue.Create(number);
                        child  = VariableHandler.Lookup(owner, lookup);
                    }

                    break;
                }

                case VariableTokenType.Type:
                {
                    child = VariableHandler.Cast(owner, token.Text);
                    break;
                }
                }

                if (!child.IsEmpty)
                {
                    // if a value is set on a struct (Vector3.x for instance), the variable value needs to be
                    // reassigned to its owner

                    var result = SetValue_(ref child, value, index + 1);

                    if (result == SetVariableResult.Success && !child.HasReference)
                    {
                        result = VariableHandler.Apply(ref owner, lookup, child);
                    }

                    return(result);
                }
            }

            return(SetVariableResult.NotFound);
        }