public override Node Clone(Node newParent) { var newSelector = new Selector(newParent); newSelector.Names = new List<string>(Names); newSelector.Block = (Block)Block.Clone(newSelector); return newSelector; }
internal static bool TryParse(Node parent, Queue<Word> remainingWords, out Selector selector) { var openingBraceFound = false; foreach (var word in remainingWords) { if (word.Text == "{") { openingBraceFound = true; break; } } if (!openingBraceFound) { selector = null; return false; } selector = new Selector(parent); while (remainingWords.Peek().Text != "{") { selector.Names.Add(remainingWords.Dequeue().Text); } Block block; if (!Block.TryParse(selector, remainingWords, out block)) { selector = null; return false; } selector.Block = block; return true; }
internal void TryExtend(Selector targetSelector) { var searchNode = this as Node; while (searchNode != null && !(searchNode is Selector)) { searchNode = searchNode.Parent; } var parentSelector = searchNode as Selector; var expressionValue = Value as Expression; foreach (NamedValue namedValue in expressionValue.Children) { var criteria = namedValue.Text; var originalTargetSelectorNames = new List<string>(targetSelector.Names); foreach (var targetSelectorName in originalTargetSelectorNames) { if (!targetSelectorName.StartsWith(criteria)) { continue; } var extendedNameSuffix = targetSelectorName.Substring(criteria.Length); foreach (var parentName in parentSelector.Names) { var extendedName = parentName + extendedNameSuffix; targetSelector.Names.Add(","); targetSelector.Names.Add(extendedName); } } } }