private static IAnalysisSet EvaluateYieldFrom(ExpressionEvaluator ee, Node node)
        {
            var yield = (YieldFromExpression)node;
            var scope = ee.Scope as FunctionScope;

            if (scope != null && scope.Generator != null)
            {
                var gen = scope.Generator;
                var res = ee.Evaluate(yield.Expression);

                gen.AddYieldFrom(node, ee._unit, res);

                return(res.GetReturnForYieldFrom(node, ee._unit));
            }

            return(AnalysisSet.Empty);
        }
        private static IAnalysisSet EvaluateSet(ExpressionEvaluator ee, Node node)
        {
            var n = (SetExpression)node;

            var setInfo = (SetInfo)ee.Scope.GetOrMakeNodeValue(node, NodeValueKind.Set, x => new SetInfo(
                                                                   ee.ProjectState,
                                                                   x,
                                                                   ee._unit.ProjectEntry
                                                                   ));

            foreach (var x in n.Items)
            {
                setInfo.AddTypes(ee._unit, ee.Evaluate(x));
            }

            return(setInfo);
        }
        private static IAnalysisSet EvaluateYield(ExpressionEvaluator ee, Node node)
        {
            var yield = (YieldExpression)node;
            var scope = ee.Scope as FunctionScope;

            if (scope != null && scope.Generator != null)
            {
                var gen = scope.Generator;
                var res = ee.Evaluate(yield.Expression);

                gen.AddYield(node, ee._unit, res);

                gen.Sends.AddDependency(ee._unit);
                return(gen.Sends.Types);
            }
            return(AnalysisSet.Empty);
        }
Example #4
0
        public override bool Walk(AssignmentStatement node)
        {
            var valueType = _eval.Evaluate(node.Right);

            // For self assignments (e.g. "fob = fob"), include values from
            // outer scopes, otherwise such assignments will always be unknown
            // because we use the unassigned variable for the RHS.
            var ne = node.Right as NameExpression;
            InterpreterScope oldScope;

            if (ne != null &&
                (oldScope = _eval.Scope).OuterScope != null &&
                (node.Left.OfType <NameExpression>().Any(n => n.Name == ne.Name) ||
                 node.Left.OfType <ExpressionWithAnnotation>().Select(e => e.Expression).OfType <NameExpression>().Any(n => n.Name == ne.Name)))
            {
                try {
                    _eval.Scope = _eval.Scope.OuterScope;
                    valueType   = valueType.Union(_eval.Evaluate(node.Right));
                } finally {
                    _eval.Scope = oldScope;
                }
            }

            foreach (var left in node.Left)
            {
                if (left is ExpressionWithAnnotation annoExpr && annoExpr.Annotation != null)
                {
                    var annoType = _eval.EvaluateAnnotation(annoExpr.Annotation);
                    if (annoType?.Any() == true)
                    {
                        _eval.AssignTo(node, annoExpr.Expression, annoType);
                    }
                }

                _eval.AssignTo(node, left, valueType);
            }
            return(false);
        }
        private static IAnalysisSet EvaluateBinary(ExpressionEvaluator ee, Node node)
        {
            var n = (BinaryExpression)node;

            return(ee.Evaluate(n.Left).BinaryOperation(node, ee._unit, n.Operator, ee.Evaluate(n.Right)));
        }
        private static IAnalysisSet EvaluateUnary(ExpressionEvaluator ee, Node node)
        {
            var n = (UnaryExpression)node;

            return(ee.Evaluate(n.Expression).UnaryOperation(node, ee._unit, n.Op));;
        }
        private static IAnalysisSet EvaluateAwait(ExpressionEvaluator ee, Node node)
        {
            var n = (AwaitExpression)node;

            return(ee.Evaluate(n.Expression).Await(node, ee._unit));
        }
        private static IAnalysisSet EvaluateIndex(ExpressionEvaluator ee, Node node)
        {
            var n = (IndexExpression)node;

            return(ee.Evaluate(n.Target).GetIndex(n, ee._unit, ee.Evaluate(n.Index)));
        }
        private static IAnalysisSet EvaluateParenthesis(ExpressionEvaluator ee, Node node)
        {
            var n = (ParenthesisExpression)node;

            return(ee.Evaluate(n.Expression));
        }
Example #10
0
        private static IAnalysisSet EvaluateMember(ExpressionEvaluator ee, Node node)
        {
            var n = (MemberExpression)node;

            return(ee.Evaluate(n.Target).GetMember(node, ee._unit, n.Name));
        }