public static SyntaxNode FindPartner(SyntaxNode leftRoot, SyntaxNode rightRoot, SyntaxNode leftNode) { // Finding a partner of a zero-width node is complicated and not supported atm: Debug.Assert(leftNode.FullSpan.Length > 0); Debug.Assert(leftNode.SyntaxTree == leftRoot.SyntaxTree); SyntaxNode originalLeftNode = leftNode; int leftPosition = leftNode.SpanStart; leftNode = leftRoot; SyntaxNode rightNode = rightRoot; while (leftNode != originalLeftNode) { Debug.Assert(leftNode.RawKind == rightNode.RawKind); int childIndex; var leftChild = leftNode.ChildThatContainsPosition(leftPosition, out childIndex); // Can only happen when searching for zero-width node. Debug.Assert(!leftChild.IsToken); rightNode = rightNode.ChildNodesAndTokens().ElementAt(childIndex).AsNode(); leftNode = leftChild.AsNode(); } return(rightNode); }
public static void FindLeafNodeAndPartner(SyntaxNode leftRoot, int leftPosition, SyntaxNode rightRoot, out SyntaxNode leftNode, out SyntaxNode rightNodeOpt) { leftNode = leftRoot; rightNodeOpt = rightRoot; while (true) { if (rightNodeOpt != null && leftNode.RawKind != rightNodeOpt.RawKind) { rightNodeOpt = null; } var leftChild = leftNode.ChildThatContainsPosition(leftPosition, out var childIndex); if (leftChild.IsToken) { return; } if (rightNodeOpt != null) { var rightNodeChildNodesAndTokens = rightNodeOpt.ChildNodesAndTokens(); if (childIndex >= 0 && childIndex < rightNodeChildNodesAndTokens.Count) { rightNodeOpt = rightNodeChildNodesAndTokens[childIndex].AsNode(); } else { rightNodeOpt = null; } } leftNode = leftChild.AsNode(); } }
static SyntaxToken?FindToken(SyntaxNode node, int start, int end) { SyntaxNodeOrToken nort = node; while (nort.IsNode) { node = nort.AsNode(); var startChild = node.ChildThatContainsPosition(start); var endChild = node.ChildThatContainsPosition(end - 1); if (startChild != endChild) { return(null); } nort = startChild; } if (nort.IsToken) { return(nort.AsToken()); } return(null); }
public static void FindLeafNodeAndPartner(SyntaxNode leftRoot, int leftPosition, SyntaxNode rightRoot, out SyntaxNode leftNode, out SyntaxNode rightNode) { leftNode = leftRoot; rightNode = rightRoot; while (true) { Debug.Assert(leftNode.RawKind == rightNode.RawKind); var leftChild = leftNode.ChildThatContainsPosition(leftPosition, out var childIndex); if (leftChild.IsToken) { return; } rightNode = rightNode.ChildNodesAndTokens()[childIndex].AsNode(); leftNode = leftChild.AsNode(); } }
public static SyntaxNode FindPartner(SyntaxNode leftRoot, SyntaxNode rightRoot, SyntaxNode leftNode) { // Finding a partner of a zero-width node is complicated and not supported atm: Debug.Assert(leftNode.FullSpan.Length > 0); Debug.Assert(leftNode.SyntaxTree == leftRoot.SyntaxTree); SyntaxNode originalLeftNode = leftNode; int leftPosition = leftNode.SpanStart; leftNode = leftRoot; SyntaxNode rightNode = rightRoot; while (leftNode != originalLeftNode) { Debug.Assert(leftNode.RawKind == rightNode.RawKind); var leftChild = leftNode.ChildThatContainsPosition(leftPosition, out var childIndex); // Can only happen when searching for zero-width node. Debug.Assert(!leftChild.IsToken); rightNode = rightNode.ChildNodesAndTokens()[childIndex].AsNode(); leftNode = leftChild.AsNode(); } return rightNode; }