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); }
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)); }
private static IAnalysisSet EvaluateMember(ExpressionEvaluator ee, Node node) { var n = (MemberExpression)node; return(ee.Evaluate(n.Target).GetMember(node, ee._unit, n.Name)); }