public FunctionAnalysisUnit(FunctionAnalysisUnit originalUnit, CallChain callChain, ArgumentSet callArgs) : base(originalUnit.Ast, null) { _originalUnit = originalUnit; _declUnit = originalUnit._declUnit; Function = originalUnit.Function; _decoratorCalls = originalUnit._decoratorCalls; CallChain = callChain; var scope = new FunctionScope(Function, Ast, originalUnit.Scope.OuterScope); scope.UpdateParameters(this, callArgs, false, originalUnit.Scope as FunctionScope); _scope = scope; var walker = new OverviewWalker(originalUnit.ProjectEntry, this); if (Ast.Body != null) { Ast.Body.Walk(walker); } AnalysisLog.NewUnit(this); Enqueue(); }
internal bool UpdateParameters(FunctionAnalysisUnit unit, ArgumentSet others, bool enqueue = true, FunctionScope scopeWithDefaultParameters = null) { EnsureParameters(unit, scopeWithDefaultParameters); var astParams = Function.FunctionDefinition.Parameters; bool added = false; var entry = unit.ProjectEntry; var state = unit.ProjectState; var limits = state.Limits; for (int i = 0; i < others.Args.Length && i < astParams.Count; ++i) { VariableDef param; if (!Variables.TryGetValue(astParams[i].Name, out param)) { Debug.Assert(false, "Parameter " + astParams[i].Name + " has no variable in this scope"); } param.MakeUnionStrongerIfMoreThan(limits.NormalArgumentTypes, others.Args[i]); added |= param.AddTypes(entry, others.Args[i], false); } if (_seqParameters != null) { _seqParameters.List.MakeUnionStrongerIfMoreThan(limits.ListArgumentTypes, others.SequenceArgs); added |= _seqParameters.List.AddTypes(unit, new[] { others.SequenceArgs }); } if (_dictParameters != null) { _dictParameters.Dict.MakeUnionStrongerIfMoreThan(limits.DictArgumentTypes, others.DictArgs); added |= _dictParameters.Dict.AddTypes(Function.FunctionDefinition, unit, state.GetConstant(""), others.DictArgs); } if (enqueue && added) { unit.Enqueue(); } return added; }
internal bool UpdateParameters(ArgumentSet callArgs, bool enqueue = true) { var defScope = _originalUnit != null ? _originalUnit.Scope as FunctionScope : null; return ((FunctionScope)Scope).UpdateParameters(this, callArgs, enqueue, defScope); }
public static bool AreCompatible(ArgumentSet x, ArgumentSet y) { return x.Args.Length == y.Args.Length; }