Partilhar via


Chave correspondente (estrutura de pacote gerenciado)

Correspondência de chave ajuda o desenvolvedor a acompanhar os elementos de linguagem que precisam ocorrer juntos, como, por exemplo, parênteses e chaves. Quando um desenvolvedor insere uma chave de fechamento, a chave de abertura é realçada.

Você pode combinar duas ou três elementos co-occurring, chamados de pares e triples. Triples são conjuntos de três elementos co-occurring. Por exemplo, em C#, o foreach um triplo de formulários de instrução: "foreach()","{", e "}". Todos os três elementos são realçados quando a chave de fechamento é digitada.

O AuthoringSink suporta dois pares de classe e triplica com o MatchPair e MatchTriple métodos.

Implementação

O serviço de linguagem precisa identificar todos os elementos correspondentes no idioma e, em seguida, localize todos os pares correspondentes. Isso geralmente é realizado por meio da implementação IScanner para detectar um idioma correspondente e, em seguida, usando o ParseSource método para coincidir com os elementos.

O OnCommand método chama o mecanismo de varredura para indexar a linha e retornar o token antes do cursor. O mecanismo de varredura indica que foi encontrado um par de elemento de linguagem definindo um valor de disparador de token de MatchBraces no token atual. O OnCommand chamadas de método de MatchBraces método que chama o BeginParse método com o valor de motivo de análise da MatchBraces para localizar o elemento de idioma correspondente. Quando o elemento de idioma correspondente for encontrado, os dois elementos são realçados.

Para obter uma descrição completa de como digitar uma chave aciona o realce de chave, consulte a seção de "Operação de análise de exemplo" no tópico Analisador de serviço de linguagem e o Scanner (estrutura de pacote gerenciado).

Ativando o suporte para a correspondência de chave

O ProvideLanguageServiceAttribute atributo pode definir o MatchBraces, MatchBracesAtCaret, e ShowMatchingBrace chamado parâmetros que definir as propriedades correspondentes da LanguagePreferences classe. Propriedades de preferência de idioma também podem ser definidas pelo usuário.

Entrada do registro

Propriedade

Descrição

MatchBraces

EnableMatchBraces

Permite a correspondência de chaves

MatchBracesAtCaret

EnableMatchBracesAtCaret

Correspondência de chave permite que está o cursor se move.

ShowMatchingBrace

EnableShowMatchingBrace

Realça a chave correspondente.

Correspondência de instruções condicionais

Você pode combinar instruções condicionais, tais como if, else if, e else, ou #if, #elif, #else, #endif, da mesma forma como delimitadores de correspondência. Você pode subclasse de AuthoringSink de classe e fornecem um método que pode adicionar texto abrange, bem como delimitadores à matriz interna de correspondência de elementos.

Definindo o disparador

O exemplo a seguir mostra como detectar os correspondentes parênteses, chaves e entre colchetes e definindo o disparador para ele no scanner. O OnCommand método sobre o Source classe detecta o disparador e chama o analisador para localizar o par correspondente (consulte a seção "Encontrar a correspondência" neste tópico). Este exemplo é apenas para fins ilustrativos. Ele assume que o scanner contém um método GetNextToken que identifica e retorna tokens a partir de uma linha de texto.

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

As chaves de correspondência.

Aqui está um exemplo simplificado para combinar a {} de elementos de linguagem, () e [] e a adição de suas extensões para o AuthoringSink objeto. Essa abordagem não é uma abordagem recomendada para análise de código fonte. ele é somente para fins ilustrativos.

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

Consulte também

Conceitos

Analisador de serviço de linguagem e o Scanner (estrutura de pacote gerenciado)

Outros recursos

Recursos de serviço de linguagem (estrutura de pacote gerenciado)