private void AfterCall(Guid id, RelinqScriptExpression e, TypeInferenceCache cache) { var startedEntry = History.Single(entry2 => entry2.Id == id); var finishedEntry = new TypeInferenceHistoryEntry(startedEntry); finishedEntry.InferredType = cache.ContainsKey(e) ? cache[e] : null; if (e.IsCall()) { RelinqScriptExpression invtarget = null; if (e is InvokeExpression) { invtarget = e.Children.ElementAt(0); } else if (e is IndexerExpression || e is OperatorExpression) { invtarget = e; } if (invtarget != null && cache.Invocations.ContainsKey(invtarget)) { finishedEntry.InferredInvocation = cache.Invocations[invtarget]; } } History.Add(finishedEntry); if (History.Count % 20000 == 0) DumpHistory(); }
public TypeInferenceHistoryEntry(TypeInferenceHistoryEntry entry) { Id = entry.Id; Expression = entry.Expression; Closure = entry.Closure; Finished = true; }
private Guid BeforeCall(RelinqScriptExpression e, TypeInferenceCache cache) { var startedEntry = new TypeInferenceHistoryEntry{Expression = e}; startedEntry.InferredType = cache.ContainsKey(e) ? cache[e] : null; History.Add(startedEntry); Func<LambdaExpression, String, RelinqScriptType> argType = (lambda, arg) => { var argIndex = Array.IndexOf(lambda.Args.ToArray(), arg); var lambdaType = ((Lambda)cache[lambda]).Type.GetFunctionSignature(); return lambdaType.GetParameters()[argIndex].ParameterType; }; e.GetClosure().ForEach(kvp => startedEntry.Closure.Add(kvp.Key, cache.ContainsKey(kvp.Value) ? argType(kvp.Value, kvp.Key) : null)); return startedEntry.Id; }