Example #1
0
        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;
 }
Example #4
0
        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));
        }
        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));
        }
Example #6
0
        public static IAnalysisSet Add(this IAnalysisSet set, AnalysisProxy item)
        {
            bool dummy;

            return(set.Add(item, out dummy));
        }