Descrizione (managed package Framework)
La struttura consente di comprimere un programma complesso nei cenni preliminari o una struttura. Ad esempio, in c# tutti i metodi possono essere compresse in una sola riga, mostrando solo la firma del metodo. Inoltre, le strutture e le classi possono essere compresse per mostrare solo i nomi delle classi e strutture. In un singolo metodo, la logica complessa può essere compressa per mostrare il flusso globale mostra solo la prima riga di istruzioni come foreach, ife while.
Abilitare il supporto della descrizione
La voce del Registro di sistema di AutoOutlining è impostata su 1 per abilitare la struttura automatica. La struttura automatica installa un di analisi del codice sorgente di tutto quando un file viene caricato o modificato per identificare aree nascoste e mostrare i glifi della struttura. La struttura può anche essere controllata manualmente dall'utente.
Il valore della voce del Registro di sistema di AutoOutlining può essere ottenuto mediante la proprietà di AutoOutlining sulla classe di LanguagePreferences . La voce del Registro di sistema di AutoOutlining può essere inizializzata con un parametro denominato all'attributo di ProvideLanguageServiceAttribute ( Registrando un servizio di linguaggio (managed package Framework) per i dettagli).
L'area nascosta
Per fornire la struttura, il servizio di linguaggio deve supportare aree nascoste. Si tratta di intervalli di testo che possono essere espanse o compresse. Le aree nascoste possono essere delimitate dai simboli di linguaggio standard, ad esempio una parentesi graffe, o dai simboli personalizzati. Ad esempio, c# dispone di una coppia#endregion / #regionche delimita un'area nascosta.
Le aree nascoste vengono gestite da un amministratore nascosto dell'area, che viene esposto come interfaccia di IVsHiddenTextSession .
La struttura utilizza le aree nascoste l'interfaccia di IVsHiddenRegion e contengono l'intervallo dell'area nascosta, stato visibile corrente e del messaggio per indicare se l'ampiezza è compressa.
Il parser del servizio di linguaggio utilizzato il metodo di AddHiddenRegion per aggiungere una nuova area nascosta con il comportamento predefinito per le aree nascoste, mentre il metodo di AddHiddenRegion consente di personalizzare l'aspetto e il comportamento della struttura. Una volta che le aree nascoste vengono fornite alla sessione nascosta dell'area, Visual Studio gestisce le aree nascoste per il servizio di linguaggio.
Se è necessario determinare quando la sessione nascosta dell'area viene eliminato, un'area nascosta viene modificata, o è necessario assicurarsi che un'area nascosta particolare sia visibile; è necessario derivare una classe dalla classe di Source ed eseguire l'override dei metodi appropriati, OnBeforeSessionEnd, OnHiddenRegionChangee MakeBaseSpanVisible, rispettivamente.
Esempio
Di seguito è riportato un esempio semplice di creare aree nascoste per tutte le coppie di parentesi graffe. Si presuppone che il linguaggio fornisce la corrispondenza di parentesi graffe e che le parentesi graffe da corrispondere a includono almeno le parentesi graffe ({e}). Questo approccio è solo a titolo esemplificativo. Un'implementazione completa richiede una gestione completo dei casi in ParseSource. Viene inoltre descritto come impostare temporaneamente la preferenza di AutoOutlining a true . Un'alternativa consiste nello specificare il parametro denominato di AutoOutlining nell'attributo di ProvideLanguageServiceAttribute nel pacchetto di linguaggio.
In questo esempio si presuppone le regole di c# per i commenti, stringhe e valori letterali.
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();
}
}
}
Vedere anche
Concetti
Registrando un servizio di linguaggio (managed package Framework)
Altre risorse
Funzionalità del servizio di linguaggio (managed package Framework)