public void PushToken(ref SyntaxNodeOrToken value)
 {
     tokenStack.Push(value);
     discriminatorStack.Push(Which.Token);
 }
Beispiel #2
0
 /// <summary>
 /// Gets a list of all the diagnostics in either the sub tree that has the specified node as its root or
 /// associated with the token and its related trivia.
 /// This method does not filter diagnostics based on #pragmas and compiler options
 /// like nowarn, warnaserror etc.
 /// </summary>
 public abstract IEnumerable <Diagnostic> GetDiagnostics(SyntaxNodeOrToken nodeOrToken);
 public SyntaxNodeOrTokenList Add(SyntaxNodeOrToken nodeOrToken)
 {
     return(Insert(this.Count, nodeOrToken));
 }
Beispiel #4
0
 public SourceLocation(SyntaxNodeOrToken nodeOrToken)
     : this(nodeOrToken.SyntaxTree, nodeOrToken.Span)
 {
 }
 private static bool AreSimilar(SyntaxNodeOrToken node1, SyntaxNodeOrToken node2)
 {
     return(node1.RawKind == node2.RawKind);
 }
 private static bool AreIdentical(SyntaxNodeOrToken node1, SyntaxNodeOrToken node2)
 {
     return(node1.UnderlyingNode == node2.UnderlyingNode);
 }
        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)
            {
                string text1 = node1.ToString();
                string text2 = node2.ToString();

                if (text1 == text2)
                {
                    // main text of token is the same
                    w += text1.Length;
                }

                foreach (SyntaxTrivia tr in node1.GetLeadingTrivia())
                {
                    _nodeSimilaritySet.Add(tr.UnderlyingNode);
                }

                foreach (SyntaxTrivia tr in node1.GetTrailingTrivia())
                {
                    _nodeSimilaritySet.Add(tr.UnderlyingNode);
                }

                foreach (SyntaxTrivia tr in node2.GetLeadingTrivia())
                {
                    if (_nodeSimilaritySet.Contains(tr.UnderlyingNode))
                    {
                        w += tr.FullSpan.Length;
                    }
                }

                foreach (SyntaxTrivia tr in node2.GetTrailingTrivia())
                {
                    if (_nodeSimilaritySet.Contains(tr.UnderlyingNode))
                    {
                        w += tr.FullSpan.Length;
                    }
                }
            }
            else
            {
                foreach (SyntaxNodeOrToken n1 in node1.ChildNodesAndTokens())
                {
                    _nodeSimilaritySet.Add(n1.UnderlyingNode);

                    if (n1.IsToken)
                    {
                        _tokenTextSimilaritySet.Add(n1.ToString());
                    }
                }

                foreach (SyntaxNodeOrToken n2 in node2.ChildNodesAndTokens())
                {
                    if (_nodeSimilaritySet.Contains(n2.UnderlyingNode))
                    {
                        w += n2.FullSpan.Length;
                    }
                    else if (n2.IsToken)
                    {
                        string tokenText = n2.ToString();
                        if (_tokenTextSimilaritySet.Contains(tokenText))
                        {
                            w += tokenText.Length;
                        }
                    }
                }
            }

            return(w);
        }
        private void FindBestMatch(Stack <SyntaxNodeOrToken> stack, SyntaxNodeOrToken node, out int index, out int similarity, int startIndex = 0)
        {
            index      = -1;
            similarity = -1;

            int i = 0;

            foreach (SyntaxNodeOrToken stackNode in stack)
            {
                if (i >= MaxSearchLength)
                {
                    break;
                }

                if (i >= startIndex)
                {
                    if (AreIdentical(stackNode, node))
                    {
                        int sim = node.FullSpan.Length;
                        if (sim > similarity)
                        {
                            index      = i;
                            similarity = sim;
                            return;
                        }
                    }
                    else if (AreSimilar(stackNode, node))
                    {
                        int sim = GetSimilarity(stackNode, node);

                        // Are these really the same? This may be expensive so only check this if
                        // similarity is rated equal to them being identical.
                        if (sim == node.FullSpan.Length && node.IsToken)
                        {
                            if (stackNode.ToFullString() == node.ToFullString())
                            {
                                index      = i;
                                similarity = sim;
                                return;
                            }
                        }

                        if (sim > similarity)
                        {
                            index      = i;
                            similarity = sim;
                        }
                    }
                    else
                    {
                        // check one level deep inside list node's children
                        int j = 0;
                        foreach (SyntaxNodeOrToken child in stackNode.ChildNodesAndTokens())
                        {
                            if (j >= MaxSearchLength)
                            {
                                break;
                            }

                            j++;

                            if (AreIdentical(child, node))
                            {
                                index      = i;
                                similarity = node.FullSpan.Length;
                                return;
                            }
                            else if (AreSimilar(child, node))
                            {
                                int sim = GetSimilarity(child, node);
                                if (sim > similarity)
                                {
                                    index      = i;
                                    similarity = sim;
                                }
                            }
                        }
                    }
                }

                i++;
            }
        }