private static SyntaxNode CreateNode(IEnumerable<SyntaxNodeOrToken> nodesAndTokens) { if (nodesAndTokens == null) { throw new ArgumentNullException(nameof(nodesAndTokens)); } var builder = new SyntaxNodeOrTokenListBuilder(8); builder.Add(nodesAndTokens); return builder.ToList().Node; }
// deal with separated lists and removal of associated separators public override SeparatedSyntaxList <TNode> VisitList <TNode>(SeparatedSyntaxList <TNode> list) { var eolKind = Language.SyntaxFacts.DefaultEndOfLineKind; var withSeps = list.GetWithSeparators(); bool removeNextSeparator = false; SyntaxNodeOrTokenListBuilder alternate = null; for (int i = 0, n = withSeps.Count; i < n; i++) { var item = withSeps[i]; SyntaxNodeOrToken visited; if (item.IsToken) // separator { if (removeNextSeparator) { removeNextSeparator = false; visited = default(SyntaxNodeOrToken); } else { visited = this.VisitListSeparator(item.AsToken()); } } else { var node = (TNode)item.AsNode(); if (this.IsForRemoval(node)) { if (alternate == null) { alternate = new SyntaxNodeOrTokenListBuilder(n); alternate.Add(withSeps, 0, i); } CommonSyntaxNodeRemover.GetSeparatorInfo( withSeps, i, eolKind.GetValue(), out bool nextTokenIsSeparator, out bool nextSeparatorBelongsToNode); if (!nextSeparatorBelongsToNode && alternate.Count > 0 && alternate[alternate.Count - 1].IsToken) { var separator = alternate[alternate.Count - 1].AsToken(); this.AddTrivia(separator, node); alternate.RemoveLast(); } else if (nextTokenIsSeparator) { var separator = withSeps[i + 1].AsToken(); this.AddTrivia(node, separator); removeNextSeparator = true; } else { this.AddTrivia(node); } visited = default; } else { visited = this.VisitListElement((TNode)item.AsNode()); } } if (item != visited && alternate == null) { alternate = new SyntaxNodeOrTokenListBuilder(n); alternate.Add(withSeps, 0, i); } if (alternate != null && visited.GetKind() != SyntaxKind.None) { alternate.Add(visited); } } if (alternate != null) { return(alternate.ToList().AsSeparatedList <TNode>()); } return(list); }