public void WithLotsOfChildrenTest() { var alphabet = "abcdefghijklmnopqrstuvwxyz"; var commaSeparatedList = string.Join(",", (IEnumerable <char>)alphabet); var parsedArgumentList = SyntaxFactory.ParseArgumentList(commaSeparatedList); Assert.Equal(alphabet.Length, parsedArgumentList.Arguments.Count); for (int position = 0; position < parsedArgumentList.FullWidth; position++) { var item = ChildSyntaxList.ChildThatContainsPosition(parsedArgumentList, position); Assert.Equal(position, item.Position); Assert.Equal(1, item.Width); if (position % 2 == 0) { // Even. We should get a node Assert.True(item.IsNode); Assert.True(item.IsKind(SyntaxKind.Argument)); string expectedArgName = ((char)('a' + (position / 2))).ToString(); Assert.Equal(expectedArgName, ((ArgumentSyntax)item).Expression.ToString()); } else { // Odd. We should get a comma Assert.True(item.IsToken); Assert.True(item.IsKind(SyntaxKind.CommaToken)); int expectedTokenIndex = position + 1; // + 1 because there is a (missing) OpenParen at slot 0 Assert.Equal(expectedTokenIndex, item.AsToken().Index); } } }
/// <summary> /// Returns child node or token that contains given position. /// </summary> public override SyntaxNodeOrToken ChildThatContainsPosition(int position) { //PERF: it is very important to keep this method fast. if (!FullSpan.Contains(position)) { throw new ArgumentOutOfRangeException("position"); } SyntaxNodeOrToken childNodeOrToken = ChildSyntaxList.ChildThatContainsPosition(this, position); Debug.Assert(childNodeOrToken.FullSpan.Contains(position), "ChildThatContainsPosition's return value does not contain the requested position."); return childNodeOrToken; }