/// <summary>This constructor is called when a CoordinablePhraseBuilder transforms itself into a CoordinatedPhraseBuilder during Coordinate.</summary> /// <remarks>This implementation creates a CoordinatedPhraseBuilder that contains only coordinated elements and optionally a coordinating word. Subclasses may need /// to override with implementations that bring in additional syntax elements.<para>The argument <paramref name="childOrderings"/> may contain ChildOrderings /// referring to elements that are not coordinated elements or a coordinator. We remove those orderings here.</para></remarks> internal CoordinatedPhraseBuilder(phraseCategory category, IEnumerable <IElementTreeNode> coordinated, ConjunctionBuilder coordinator, HashSet <ChildOrdering> childOrderings) : base() { Phrase = new CoordinatedPhraseElement(category); SetCoordinatedElements(coordinated); SetCoordinator(coordinator); ChildOrderings = childOrderings; HashSet <IElementTreeNode> childrenInOrderingsThatHaveNotBeenMovedYet = new HashSet <IElementTreeNode>(); foreach (ChildOrdering ordering in ChildOrderings) { if (!Children.Contains(ordering.Before)) { childrenInOrderingsThatHaveNotBeenMovedYet.Add(ordering.Before); } if (!Children.Contains(ordering.After)) { childrenInOrderingsThatHaveNotBeenMovedYet.Add(ordering.After); } } foreach (IElementTreeNode missingChild in childrenInOrderingsThatHaveNotBeenMovedYet) { RemoveChildOrderingsThatReferTo(missingChild); } }
public CoordinatedPhraseElement(phraseCategory category) => Category = category;
private CoordinatedPhraseBuilder(phraseCategory category) : base() { Phrase = new CoordinatedPhraseElement(category); }