Структурирование (MPF)
Структурирование делает возможной свернуть сложная программа в обзор или структуры. Например, в c# все методы можно свернуть только к одной линии, указывающее подпись метода. Кроме того, структуры и классы можно свернуть, чтобы отобразить только имена структур и классов. Внутри одного метода, сложная логика может быть свернута, чтобы указать общий поток путем отображения только первую линию выписок как foreach" ifи while.
Включение поддержки для структуризации
AutoOutlining запись реестра присваивается значение 1, чтобы включить автоматическое структурирование. Автоматическое структурирование настраивает анализ всего источника при загрузке файла или изменяется, чтобы определить скрытые области и отображения структурирование глифы. Структура может также можно изменить вручную пользователем.
Значение AutoOutlining запись реестра можно получить с помощью AutoOutlining свойство LanguagePreferences класс. AutoOutlining запись реестра можно инициализировать с именованным параметром к ProvideLanguageServiceAttribute атрибут (см. Регистрация службы языка (MPF) дополнительные сведения).
Скрытая область
Для предоставления структура, служба языка должна поддерживать скрытые области. Эти диапазоны текста, которые можно развернуть или свернуть. Скрытые области могут быть разделены символами речи дикторов радио и телевидения, как фигурные скобки или пользовательскими символами. Например, в c# присутствует #region/#endregion пара, которая обозначает скрытая область.
Скрытые области управляемые скрытый диспетчером области, который предоставляется как IVsHiddenTextSession интерфейс.
Структура использует скрытые области IVsHiddenRegion интерфейс и содержит диапазон скрытой области текущего видимого состояния и баннера, отображаемое, если диапазон свернут.
Средство анализа языковой службы использует AddHiddenRegion метод, чтобы добавить новую область скрытая по умолчанию реакцией на событие для скрытых областей, пока AddHiddenRegion метод позволяет настраивать внешний вид и функциональности макета. После того как скрытый области даны для скрытого области, сеансу Visual Studio управляет скрытые области для языковой службы.
Если необходимо указать, когда скрытый сеанс области уничтожается, скрытая область изменяется или необходимо убедиться, что указанная область скрытая видима. необходимо создать класс, производный от MakeBaseSpanVisibleпереопределяет класс и соответствующие методы OnHiddenRegionChange" Source и OnBeforeSessionEndсоответственно.
Пример
Ниже приведен упрощенный пример создания скрытые области для всех пар фигурных скобок. Требуется язык предоставляет соответствующие расчалку и фигурные скобки для сопоставления включают хотя бы фигурные скобки ({и}). Этот подход для иллюстративных целях. Полная реализация имела бы полный обработка вариантов in ParseSource. В этом примере также показано, как присвоить AutoOutlining предпочтение true временное. Альтернативой является определение AutoOutlining именованный параметр ProvideLanguageServiceAttribute атрибут в пакете языка.
В этом примере предполагается правила c# для комментариев, строк и литералов.
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();
}
}
}
См. также
Основные понятия
Регистрация службы языка (MPF)