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); }
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); }