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 |
Permite a correspondência de chaves |
|
MatchBracesAtCaret |
Correspondência de chave permite que está o cursor se move. |
|
ShowMatchingBrace |
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)