private static void ReplaceFirstWithChildren(Stack <SyntaxNodeOrToken> stack) { SyntaxNodeOrToken node = stack.Pop(); int c = 0; SyntaxNodeOrToken[] children = new SyntaxNodeOrToken[node.ChildNodesAndTokens().Count]; foreach (SyntaxNodeOrToken child in node.ChildNodesAndTokens()) { if (child.FullSpan.Length > 0) { children[c] = child; c++; } } for (int i = c - 1; i >= 0; i--) { stack.Push(children[i]); } }
private int GetSimilarity(SyntaxNodeOrToken node1, SyntaxNodeOrToken node2) { // count the characters in the common/identical nodes int w = 0; _nodeSimilaritySet.Clear(); _tokenTextSimilaritySet.Clear(); if (node1.IsToken && node2.IsToken) { var text1 = node1.ToString(); var text2 = node2.ToString(); if (text1 == text2) { // main text of token is the same w += text1.Length; } foreach (var tr in node1.GetLeadingTrivia()) { _nodeSimilaritySet.Add(tr.UnderlyingNode); } foreach (var tr in node1.GetTrailingTrivia()) { _nodeSimilaritySet.Add(tr.UnderlyingNode); } foreach (var tr in node2.GetLeadingTrivia()) { if (_nodeSimilaritySet.Contains(tr.UnderlyingNode)) { w += tr.FullSpan.Length; } } foreach (var tr in node2.GetTrailingTrivia()) { if (_nodeSimilaritySet.Contains(tr.UnderlyingNode)) { w += tr.FullSpan.Length; } } } else { foreach (var n1 in node1.ChildNodesAndTokens()) { _nodeSimilaritySet.Add(n1.UnderlyingNode); if (n1.IsToken) { _tokenTextSimilaritySet.Add(n1.ToString()); } } foreach (var n2 in node2.ChildNodesAndTokens()) { if (_nodeSimilaritySet.Contains(n2.UnderlyingNode)) { w += n2.FullSpan.Length; } else if (n2.IsToken) { var tokenText = n2.ToString(); if (_tokenTextSimilaritySet.Contains(tokenText)) { w += tokenText.Length; } } } } return(w); }