Párování závorek ve službě starší verze jazyka

Párování závorek pomáhá vývojáři sledovat prvky jazyka, které se musí vyskytovat společně, jako jsou závorky a složené závorky. Když vývojář zadá uzavírací složenou závorku, je zvýrazněná počáteční složená závorka.

Můžete porovnat dva nebo tři souběžně se vyskytující prvky, které se nazývají páry a trojité shody. Trojité násobky jsou sady tří souběžně se vyskytujících prvků. Například v jazyce C# foreach příkaz tvoří trojitou hodnotu: foreach() , a { } . Při zadání uzavírací složené závorky jsou zvýrazněny všechny tři prvky.

Služby starší verze jazyka jsou implementovány jako součást balíčku VSPackage, ale novější způsob implementace funkcí služby jazyka je použití rozšíření MEF. Další informace o novém způsobu implementace párování složených závorek najdete v návodu: Zobrazení odpovídajících složených závorek.

Poznámka

Doporučujeme, abyste nové rozhraní API editoru začali používat co nejdříve. Tím se zlepší výkon služby jazyka a umožní vám to využívat nové funkce editoru.

Třída AuthoringSink podporuje dvojice i trojité hodnoty pomocí metod a MatchPair MatchTriple .

Implementace

Služba jazyka musí identifikovat všechny odpovídající prvky v jazyce a pak vyhledat všechny odpovídající páry. To se obvykle provádí implementací , která rozpozná odpovídající jazyk a pak pomocí metody porovná IScanner ParseSource elementy.

Metoda volá skener za účelem tokenizace řádku a vrácení OnCommand tokenu těsně před tečkou. Skener indikuje, že byla nalezena dvojice prvků jazyka nastavením hodnoty triggeru tokenu TokenTriggers pro aktuální token. Metoda volá metodu , která zase volá metodu s hodnotou důvodu analýzy pro vyhledání OnCommand MatchBraces BeginParse ParseReason odpovídajícího prvku jazyka. Když je nalezen odpovídající prvek jazyka, oba prvky jsou zvýrazněny.

Úplný popis toho, jak psaním složené závorky aktivujete zvýraznění složených závorek, najdete v části Example parse operation v článku Analyzátor a skener služby starší verze jazyka.

Povolení podpory párování závorek

Atribut může nastavit položky registru ProvideLanguageServiceAttribute MatchBraces, MatchBracesAtProvidert a ShowMatchingBrace, které nastavují odpovídající LanguagePreferences vlastnosti třídy. Vlastnosti předvoleb jazyka může také nastavit uživatel.

Položka registru Vlastnost Popis
MatchBraces EnableMatchBraces Povolí párování závorek.
MatchBracesAt Přemostěn EnableMatchBracesAtCaret Umožňuje párování závorek při přesouvání kurzoru.
ShowMatchingBrace EnableShowMatchingBrace Zvýrazní odpovídající složenou závorku.

Párování podmíněných příkazů

Podmíněné příkazy, jako jsou , a , nebo , , můžete spárovat stejným způsobem if else if jako odpovídající else #if #elif #else #endif oddělovače. Třídu můžete vytvořit podtřídou a poskytnout metodu , která může přidat textové rozsahy i oddělovače do interního pole AuthoringSink odpovídajících prvků.

Nastavení triggeru

Následující příklad ukazuje, jak rozpoznat odpovídající závorky, složené závorky a hranaté závorky a nastavit pro něj trigger ve skeneru. Metoda ve třídě rozpozná trigger a zavolá analyzátor, aby našel odpovídající pár (viz část Vyhledání shody OnCommand Source v tomto článku). Tento příklad je pouze ilustrativní. Předpokládá, že skener obsahuje metodu, která identifikuje a vrátí GetNextToken tokeny z řádku textu.

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(firstChar) != -1)
                    {
                        tokenInfo.Trigger = TokenTriggers.MatchBraces;
                    }
                }
            }
            return foundToken;
        }

Spárování složených závorek

Tady je zjednodušený příklad pro párování prvků jazyka , a a přidání { } ( ) jejich [ ] rozsahů do objektu AuthoringSink . Tento přístup se nedoporučuje k analýze zdrojového kódu. Je pouze pro ilustrativní účely.

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();
         }
    }
}

Viz také