A estrutura de tópicos (estrutura de pacote gerenciado)
Estrutura de tópicos se torna possível recolher um programa complexo em uma visão geral ou a estrutura de tópicos. Por exemplo, em C# todos os métodos podem ser recolhidos para uma única linha, mostrando apenas a assinatura do método. Além disso, as estruturas e classes podem ser recolhidos para mostrar apenas os nomes das classes e estruturas. Dentro de um único método, lógica complexa pode ser recolhida para mostrar o fluxo total, mostrando apenas a primeira linha das instruções, como foreach, if, e while.
Ativando o suporte para a estrutura de tópicos
O AutoOutlining entrada do registro é definida como 1 para habilitar a estrutura de tópicos automática. Estrutura de tópicos automática configura uma análise da origem inteira quando um arquivo é carregado ou alterado para identificar as regiões ocultas e mostrar os glifos de estrutura de tópicos. Estrutura de tópicos também pode ser controlada manualmente pelo usuário.
O valor da AutoOutlining entrada do Registro pode ser obtida por meio do AutoOutlining propriedade no LanguagePreferences classe. O AutoOutlining entrada do Registro pode ser inicializada com um parâmetro nomeado para o ProvideLanguageServiceAttribute atributo (consulte Registrando um serviço de linguagem (estrutura de pacote gerenciado) para obter detalhes).
Região oculta
Para fornecer a estrutura de tópicos, o serviço de linguagem deve oferecer suporte a regiões ocultas. Essas são as extensões de texto que podem ser expandidas ou recolhidas. Regiões ocultas podem ser delimitadas por símbolos do idioma padrão, como, por exemplo, chaves, ou por símbolos personalizados. Por exemplo, C# tem um #region/#endregion par que delimita uma região oculta.
Regiões ocultas são gerenciados por um gerente de região oculta, o que é exposto como a IVsHiddenTextSession interface.
Estrutura de tópicos usa regiões ocultas do IVsHiddenRegion interface e conter o trecho de região oculta, o estado atual de visibilidade e a faixa a ser mostrado quando o intervalo estiver recolhido.
O analisador de serviço do idioma usa a AddHiddenRegion método para adicionar uma nova região oculta com o comportamento padrão para regiões ocultas, enquanto o AddHiddenRegion método permite que você personalize a aparência e comportamento da estrutura de tópicos. Depois que as regiões ocultas são fornecidos para a sessão de região oculta, Visual Studio gerencia as regiões ocultas para o serviço de linguagem.
Se você precisar determinar quando a sessão de região oculta é destruída, uma região oculta é alterada ou você precisará certificar-se de que uma determinada região oculta é visível; Você deve derivar uma classe a partir de Source de classe e substituir os métodos apropriados, OnBeforeSessionEnd, OnHiddenRegionChange, e MakeBaseSpanVisible, respectivamente.
Exemplo
Aqui está um exemplo simplificado de criação de regiões ocultas para todos os pares de chaves. Presume que a linguagem fornece correspondência de chaves e as chaves a ser correspondido incluam pelo menos as chaves ({e}). Essa abordagem é somente para fins ilustrativos. Uma implementação completa teria um tratamento completo de casos no ParseSource. Este exemplo também mostra como definir o AutoOutlining preferência para true temporariamente. Uma alternativa é especificar o AutoOutlining chamado parâmetro na ProvideLanguageServiceAttribute atributo no seu pacote de idioma.
Este exemplo assume que C# regras para comentários e cadeias de caracteres literais.
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace MyLanguagePackage
{
public class MyLanguageService : LanguageService
{
private LanguagePreferences m_preferences;
public override LanguagePreferences GetLanguagePreferences()
{
if (m_preferences == null)
{
m_preferences = new LanguagePreferences(this.Site,
typeof(MyLanguageService).GUID,
Name);
m_preferences.Init();
// Temporarily enabled auto-outlining
m_preferences.AutoOutlining = true;
}
return m_preferences;
}
public override AuthoringScope ParseSource(ParseRequest req)
{
Source source = (Source) this.GetSource(req.FileName);
switch (req.Reason)
{
case ParseReason.HighlightBraces:
case ParseReason.MatchBraces:
case ParseReason.MemberSelectAndHighlightBraces:
if (source.Braces != null)
{
foreach (TextSpan[] brace in source.Braces)
{
if (brace.Length == 2)
{
if (req.Sink.HiddenRegions == true
&& source.GetText(brace[0]).Equals("{")
&& source.GetText(brace[1]).Equals("}"))
{
//construct a TextSpan of everything between the braces
TextSpan hideSpan = new TextSpan();
hideSpan.iStartIndex = brace[0].iStartIndex;
hideSpan.iStartLine = brace[0].iStartLine;
hideSpan.iEndIndex = brace[1].iEndIndex;
hideSpan.iEndLine = brace[1].iEndLine;
req.Sink.ProcessHiddenRegions = true;
req.Sink.AddHiddenRegion(hideSpan);
}
req.Sink.MatchPair(brace[0], brace[1], 1);
}
else if (brace.Length >= 3)
req.Sink.MatchTriple(brace[0], brace[1], brace[2], 1);
}
}
break;
default:
break;
}
// Must always return a valid AuthoringScope object.
return new MyAuthoringScope();
}
}
}
Consulte também
Conceitos
Registrando um serviço de linguagem (estrutura de pacote gerenciado)
Outros recursos
Recursos de serviço de linguagem (estrutura de pacote gerenciado)