public IAnalysisSet ResolveParameter(AnalysisUnit unit, string name, ArgumentSet arguments) { var parameters = FunctionDefinition.Parameters; if (parameters == null || parameters.Count == 0) { return(ResolveParameter(unit, name)); } for (int i = 0; i < parameters.Count; ++i) { if (parameters[i].Name == name) { IAnalysisSet res = AnalysisSet.Empty; if (i < arguments.Count) { arguments.Args[i].Split(v => (v as ParameterInfo)?.Function != this, out var args, out _); res = res.Union(args); } if (parameters[i].IsList) { arguments.SequenceArgs.Split(v => (v as ParameterInfo)?.Function != this, out var args, out _); res = res.Add(new LazyIndexableInfo(parameters[i], args, () => ResolveParameter(_analysisUnit, parameters[i].Name))); } if (parameters[i].IsDictionary) { arguments.DictArgs.Split(v => (v as ParameterInfo)?.Function != this, out var args, out _); res = res.Add(new LazyIndexableInfo(parameters[i], args, () => ResolveParameter(_analysisUnit, parameters[i].Name))); } return(res); } } return(ResolveParameter(unit, name)); }
/// <summary> /// Returns possible variable refs associated with the expr in the expression evaluators scope. /// </summary> internal IAnalysisSet EvaluateNoMemberRecursion(Expression node, HashSet <AnalysisValue> seenValues = null) { if (seenValues == null) { seenValues = new HashSet <AnalysisValue>(); } MemberExpression member = node as MemberExpression; if (member != null) { var target = EvaluateNoMemberRecursion(member.Target, seenValues); IAnalysisSet unseenValues = AnalysisSet.Empty; foreach (var value in target) { if (!seenValues.Add(value)) { unseenValues = unseenValues.Add(value, true); } } if (unseenValues.Count > 0) { return(unseenValues.GetMember(member, _unit, member.Name)); } return(AnalysisSet.Empty); } var res = EvaluateWorker(node); Debug.Assert(res != null); return(res); }
public void AddProtocol(Protocol p) { _protocols = _protocols.Add(p); _instance = null; _members = null; _typeId = null; _memberType = null; }
private static void TestImmutableSet(IAnalysisSet emptySet) { int count = emptySet.Count; var projectEntry = CreateProjectEntry(); var value = new TestAnalysisValue(projectEntry); var newSet = emptySet.Add(value.Proxy); Assert.AreNotEqual(emptySet, newSet); Assert.AreEqual(count, emptySet.Count); Assert.AreEqual(count + 1, newSet.Count); bool wasChanged; newSet = emptySet.Add(value.Proxy, out wasChanged); Assert.AreNotEqual(emptySet, newSet); Assert.IsTrue(wasChanged); Assert.AreEqual(count, emptySet.Count); Assert.AreEqual(count + 1, newSet.Count); newSet = emptySet.Union(new[] { value.Proxy }); Assert.AreNotEqual(emptySet, newSet); Assert.AreEqual(count, emptySet.Count); Assert.AreEqual(count + 1, newSet.Count); newSet = emptySet.Union(new[] { value.Proxy }, out wasChanged); Assert.IsTrue(wasChanged); Assert.AreNotEqual(emptySet, newSet); Assert.AreEqual(count, emptySet.Count); Assert.AreEqual(count + 1, newSet.Count); Assert.AreEqual(emptySet, emptySet.Clone()); Assert.IsFalse(emptySet.Contains(value.Proxy)); }
public static IAnalysisSet Add(this IAnalysisSet set, AnalysisProxy item) { bool dummy; return(set.Add(item, out dummy)); }