public override IAnalysisSet Call(Node node, AnalysisUnit unit, IAnalysisSet[] args, NameExpression[] keywordArgNames) { var newArgs = _args.Take(_args.Length - _keywordArgNames.Length) .Concat(args.Take(args.Length - keywordArgNames.Length)) .Concat(_args.Skip(_args.Length - _keywordArgNames.Length)) .Concat(args.Skip(args.Length - keywordArgNames.Length)) .ToArray(); var newKwArgs = _keywordArgNames.Concat(keywordArgNames).ToArray(); return _function.Call(node, unit, newArgs, newKwArgs); }
IAnalysisSet SpecialNext(Node node, AnalysisUnit unit, IAnalysisSet[] args, NameExpression[] keywordArgNames) { if (args.Length > 0) { var nextName = (unit.ProjectState.LanguageVersion.Is3x()) ? "__next__" : "next"; var newArgs = args.Skip(1).ToArray(); var newNames = (keywordArgNames.Any()) ? keywordArgNames.Skip(1).ToArray() : keywordArgNames; return args[0].GetMember(node, unit, nextName).Call(node, unit, newArgs, newNames); } else { return AnalysisSet.Empty; } }
IAnalysisSet PartialFunction(Node node, AnalysisUnit unit, IAnalysisSet[] args, NameExpression[] keywordArgNames) { if (args.Length >= 1) { return unit.Scope.GetOrMakeNodeValue(node, n => { return new PartialFunctionInfo(args[0], args.Skip(1).ToArray(), keywordArgNames); }); } return AnalysisSet.Empty; }
/// <summary> /// eventListener.emit(eventName, args...) /// /// Returns bool indicating if event was raised. /// </summary> private static IAnalysisSet EventEmitterEmit(FunctionValue func, Node node, AnalysisUnit unit, IAnalysisSet @this, IAnalysisSet[] args) { if (args.Length >= 1) { if (@this != null) { foreach (var thisArg in @this) { ExpandoValue expando = @thisArg.Value as ExpandoValue; if (expando != null && args[0].Count < unit.Analyzer.Limits.MaxEvents) { foreach (var arg in args[0]) { var strValue = arg.Value.GetStringValue(); if (strValue != null) { VariableDef events; if (expando.TryGetMetadata<VariableDef>(new EventListenerKey(strValue), out events)) { foreach (var type in events.GetTypesNoCopy(unit)) { type.Call(node, unit, @this, args.Skip(1).ToArray()); } } } } } } } } return func.ProjectState._trueInst.Proxy; }