public void SpecializeFunction(string name, CallDelegate callable, bool mergeOriginalAnalysis) { int lastIndex; IAnalysisSet def; if (TryGetMember(name, out def)) { foreach (var v in def) { if (!(v is SpecializedNamespace)) { this[name] = new SpecializedCallable(v, callable, mergeOriginalAnalysis).SelfSet; break; } } } else if ((lastIndex = name.LastIndexOf('.')) != -1 && TryGetMember(name.Substring(0, lastIndex), out def)) { var methodName = name.Substring(lastIndex + 1, name.Length - (lastIndex + 1)); foreach (var v in def) { BuiltinClassInfo ci = v as BuiltinClassInfo; if (ci != null) { IAnalysisSet classValue; if (ci.TryGetMember(methodName, out classValue)) { ci[methodName] = new SpecializedCallable(classValue.FirstOrDefault(), callable, mergeOriginalAnalysis).SelfSet; } else { ci[methodName] = new SpecializedCallable(null, callable, mergeOriginalAnalysis).SelfSet; } IAnalysisSet instValue; if (ci.Instance.TryGetMember(methodName, out instValue)) { ci.Instance[methodName] = new SpecializedCallable( instValue.FirstOrDefault(), ci.Instance, callable, mergeOriginalAnalysis).SelfSet; } else { ci.Instance[methodName] = new SpecializedCallable( null, ci.Instance, callable, mergeOriginalAnalysis).SelfSet; } } } } else { this[name] = new SpecializedCallable(null, callable, false); } }
private IAnalysisSet GetFunction(Node node, AnalysisUnit unit, string name, CallDelegate callable) { lock (_callables) { if (_callables.TryGetValue(name, out var res)) { return(res); } } if (unit.ForEval) { return(null); } var inner = _inner.GetMember(node, unit, name).OfType <BuiltinFunctionInfo>().FirstOrDefault(); lock (_callables) { return(_callables[name] = new SpecializedCallable(inner, callable, false)); } }