Example #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);
        }
Example #2
0
        private ExpressionContainer AddIfDefExpressionContainer(IfDefReference ifdef)
        {
            var expr = new FlatExpression(new Operands(ifdef.Node.Value),
                                          new FlatExpressionLine(ifdef.Defined ? 1ul : 0ul));

            if (ifdef.Node.Extra.Define.IfDefs?.Count > 0)
            {
                var parentIfDefs   = ifdef.Node.Extra.Define.IfDefs;
                var listContainers = new List <ExpressionContainer>(parentIfDefs.Count);
                foreach (var ifDef in parentIfDefs)
                {
                    listContainers.Add(GetOrAddExpressionContainer(new IfDefSet(ifDef)));
                }

                var operands = new Operands(listContainers
                                            .Select(_ => _.FlatExpression.Operands.Concat(expr.Operands))
                                            .SelectMany(_ => _)
                                            .Distinct()
                                            .OrderBy(_ => _)
                                            .ToArray());
                var flatExpr = new FlatExpression(operands);
                foreach (var c in listContainers)
                {
                    flatExpr = flatExpr.Or(c.FlatExpression);
                }

                expr = flatExpr.And(expr);
            }

            if (ifdef.Defined)
            {
                ifdef.Node.Extra.Define.IfDefExpression = expr.AsTreeExpression().ToString();
            }
            else
            {
                ifdef.Node.Extra.Define.IfNotDefExpression = expr.AsTreeExpression().ToString();
            }
            var container = new ExpressionContainer {
                FlatExpression = expr
            };

            _knownReferences.Add(new IfDefSet(ifdef), container);
            return(container);
        }