public ExpressionSimplifierVisitor()
     : base(true, true)
 {
     evaluator = new ExpressionEvaluator();
 }
        /// <inheritdoc/>
        public override void Visit(MethodInvocationExpression methodInvocationExpression)
        {
            if (methodInvocationExpression.Target is TypeReferenceExpression)
            {
                var methodName = (methodInvocationExpression.Target as TypeReferenceExpression).Type.Name.Text;
                if (hlslScalarTypeNames.Contains(methodName))
                {
                    var evaluator = new ExpressionEvaluator();
                    var subResult = evaluator.Evaluate(methodInvocationExpression.Arguments[0]);
                    values.Push(subResult.Value);
                    return;
                }
            }

            result.Error("Method invocation expression evaluation [{0}] is not supported", methodInvocationExpression.Span, methodInvocationExpression);
        }
        /// <inheritdoc/>
        public override void Visit(VariableReferenceExpression variableReferenceExpression)
        {
            base.Visit(variableReferenceExpression);

            var variableDeclaration = variableReferenceExpression.TypeInference.Declaration as Variable;
            if (variableDeclaration == null)
            {
                result.Error("Unable to find variable [{0}]", variableReferenceExpression.Span, variableReferenceExpression);
            }
            else if (variableDeclaration.InitialValue == null || !variableDeclaration.Qualifiers.Contains(StorageQualifier.Const))
            {
                result.Error("Variable [{0}] used in expression is not constant", variableReferenceExpression.Span, variableDeclaration);
            }
            else
            {
                var evaluator = new ExpressionEvaluator();
                var subResult = evaluator.Evaluate(variableDeclaration.InitialValue);
                subResult.CopyTo(result);

                if (subResult.HasErrors)
                {
                    values.Push(0.0);
                }
                else
                {
                    values.Push(subResult.Value);
                }
            }
        }
Пример #4
0
        protected virtual ArrayType Visit(ArrayType arrayType)
        {
            Visit((Node)arrayType);

            // Process only if there is non-literal expressions
            if (arrayType.TypeInference.TargetType == null
                && arrayType.Dimensions.Any(x => !(x is LiteralExpression || x is EmptyExpression)))
            {
                // Try to evaluate each dimension into a Literal expression (i.e. float4[3 * 2] should become float4[6])
                var evaluator = new ExpressionEvaluator();
                var results = arrayType.Dimensions.Select(evaluator.Evaluate).ToArray();

                if (results.Any(x => x.HasErrors))
                {
                    foreach (var result in results.Where(x => x.HasErrors))
                        result.CopyTo(ParsingResult);
                }
                else
                {
                    arrayType.TypeInference.TargetType = new ArrayType(arrayType.Type, results.Select(x => new LiteralExpression(Convert.ToInt32(x.Value))).ToArray());
                }
            }

            return arrayType;
        }