Condividi tramite


Corrispondenza di parentesi graffe (managed package Framework)

La corrispondenza di parentesi graffe consente allo sviluppatore di tenere traccia degli elementi che devono verificarsi raccolta, come le parentesi e parentesi graffe. Quando uno sviluppatore immette una parentesi graffa di chiusura, la parentesi graffa aperta evidenziata.

È possibile confrontare due o tre elementi co-verificanteti, denominati coppie e triple. I gruppi sono insiemi di tre elementi co-verificantesi. Ad esempio, in c#, l'istruzione di foreach forma una tripla: “foreach()„, “{„ e “}„. Tutti e tre gli elementi sono evidenziati quando la parentesi graffa di chiusura è tipizzata.

La classe di AuthoringSink supporta entrambi i coppie e tripli con l'entity_M:Microsoft.VisualStudio.Package.AuthoringSink.MatchPair(Microsoft.VisualStudio.TextManager.Interop.TextSpan, Microsoft.VisualStudio.TextManager.Interop

Implementazione

Il servizio di linguaggio deve identificare tutti gli elementi corrispondenti del linguaggio e quindi individuare tutte le coppie di corrispondenza. Questa operazione in genere viene eseguita la distribuzione IScanner per rilevare un linguaggio corrispondente e quindi utilizzando il metodo di ParseSource per individuare gli elementi.

Le chiamate al metodo di OnCommand lo scanner per un'operazione la riga e restituire il token subito prima del cursore. Lo scanner indica che una coppia di elementi del linguaggio è stata trovata impostando un valore token del trigger di MatchBraces nel token corrente. Le chiamate al metodo di OnCommand il metodo di MatchBraces che a sua volta chiama il metodo di BeginParse con il valore di analisi motivi di MatchBraces per posizionare l'elemento del linguaggio corrispondente. Quando l'elemento del linguaggio corrispondente eventualmente rilevato, entrambi gli elementi sono evidenziati.

Per una descrizione completa di come digitare una parentesi graffa attiva l'evidenziazione parentesi graffa, vedere la sezione “esempio dell'operazione di analisi nell'Parser del servizio di linguaggio e analisi (managed package Framework)argomento.

Abilitare supporto per la corrispondenza di parentesi graffe

L'attributo di ProvideLanguageServiceAttribute possibile impostare MatchBraces, MatchBracesAtCarete i parametri denominati di ShowMatchingBrace che impostano le proprietà corrispondenti di LanguagePreferences la classe. Le proprietà di preferenze di lingua possono essere impostate dall'utente.

Voce del Registro di sistema

Proprietà

Descrizione

MatchBraces

EnableMatchBraces

Consente la corrispondenza di parentesi graffe

MatchBracesAtCaret

EnableMatchBracesAtCaret

Consente la corrispondenza di parentesi graffe quando il cursore viene spostato.

ShowMatchingBrace

EnableShowMatchingBrace

Evidenziare la parentesi graffa corrispondente.

istruzioni condizionali corrispondenti

È possibile confrontare le istruzioni condizionali, come if, else ife else, o #if, #elif, #else, #endif, come delimitatori corrispondenti. È possibile creare una sottoclasse la classe di AuthoringSink e fornire un metodo che può aggiungere gli intervalli di testo nonché i delimitatori alla matrice interna di elementi corrispondenti.

impostare il trigger

Nell'esempio seguente viene illustrato come rilevare le parentesi corrispondenti, parentesi graffe e parentesi graffe del quadrato e impostazione del trigger per lo scanner. Il metodo di OnCommand sulla classe di Source rileva il trigger e chiama il parser per trovare la coppia corrispondente (vedere “cercare la sezione della corrispondenza„ in questo argomento). Questo esempio è solo a titolo esemplificativo. Si presuppone che lo scanner contenga un metodo GetNextToken che identifica e restituisce i token da una riga di testo.

using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;

namespace TestLanguagePackage
{
    public class TestScanner : IScanner
    {
        private const string braces = "()[]{}";
        private Lexer lex;

        public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo,
                                                   ref int state)
        {
            bool foundToken = false;
            string token = lex.GetNextToken();
            if (token != null)
            {
                foundToken = true;
                char firstChar = token[0];
                if (Char.IsPunctuation(firstChar) && token.Length == 0)
                {
                    if (braces.IndexOf(c) != -1)
                    {
                        tokenInfo.Trigger = TokenTriggers.MatchBraces;
                    }
                }
            }
            return foundToken;
        }

La corrispondenza delle parentesi graffe

Di seguito è riportato un esempio semplificato per individuare gli elementi del linguaggio {}, () e [] e aggiungendo le loro intervalli a AuthoringSink oggetto. Questo approccio non è un approccio consigliato l'analisi del codice sorgente, è solo a titolo esemplificativo.

using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;

namespace TestLanguagePackage
{
    public class Parser
    {
         private IList<TextSpan[]> m_braces;
         public IList<TextSpan[]> Braces
         {
             get { return m_braces; }
         }
         private void AddMatchingBraces(TextSpan braceSpan1, TextSpan braceSpan2)
         {
             if IsMatch(braceSpan1, braceSpan2)
                 m_braces.Add(new TextSpan[] { braceSpan1, braceSpan2 });
         }

         private bool IsMatch(TextSpan braceSpan1, TextSpan braceSpan2)
         {
             //definition for matching here
          }
    }

    public class TestLanguageService : LanguageService
    {
         Parser parser = new Parser();
         Source source = (Source) this.GetSource(req.FileName);

         private AuthoringScope ParseSource(ParseRequest req)
         {
             if (req.Sink.BraceMatching)
             {
                 if (req.Reason==ParseReason.MatchBraces)
                 {
                     foreach (TextSpan[] brace in parser.Braces)
                     {
                         req.Sink.MatchPair(brace[0], brace[1], 1);
                     }
                 }
             }
             return new TestAuthoringScope();
         }
    }
}

Vedere anche

Concetti

Parser del servizio di linguaggio e analisi (managed package Framework)

Altre risorse

Funzionalità del servizio di linguaggio (managed package Framework)