예제 #1
0
        private ExpressionContainer GetOrAddExpressionContainer(IfDefSet ifDefs)
        {
            ExpressionContainer container;

            if (_knownReferences.TryGetValue(ifDefs, out container))
            {
                return(container);
            }

            if (ifDefs.Count == 1)
            {
                return(AddIfDefExpressionContainer(ifDefs.First()));
            }

            container = new ExpressionContainer();
            var listContainers = new List <ExpressionContainer>(ifDefs.Count);

            foreach (var ifDef in ifDefs)
            {
                listContainers.Add(GetOrAddExpressionContainer(new IfDefSet(ifDef)));
            }
            var operands = new Operands(listContainers.Select(_ => _.FlatExpression.Operands).SelectMany(_ => _)
                                        .Distinct().OrderBy(_ => _).ToArray());
            var flatExpr = new FlatExpression(operands);

            foreach (var c in listContainers)
            {
                flatExpr = flatExpr.Or(c.FlatExpression);
            }

            container.FlatExpression = flatExpr;
            _knownReferences.Add(ifDefs, container);
            return(container);
        }
예제 #2
0
        private string BuildExpression(NodeHelper node)
        {
            var def = node.Extra.Define;

            if (def.IsAlways || def.IfDefs == null || def.IfDefs.Count == 0)
            {
                return(null);
            }

            node.Extra.Define.IfDefs.Sort();
            var key       = new IfDefSet(node.Extra.Define.IfDefs);
            var container = GetOrAddExpressionContainer(key);

            container.BuildExpression();
            return(container.Expression);
        }