Пошаговое руководство: Получение списка установленных фрагментов кода (MPF)
Фрагмент кода является частью кода, которые можно вставить в буфер источника или с помощью команды меню (которая позволяет выбрать устанавливанных из списка фрагментов кода) или путем выбора ярлык фрагмента из списка завершения IntelliSense.
EnumerateExpansions метод возвращает все фрагменты кода для конкретного идентификатора GUID языка. Ярлыки для этих фрагментов могут быть вставлены в списке завершения IntelliSense.
См. Поддержка фрагментов кода (MPF) дополнительные сведения о реализации фрагменты кода в управляемой службе языка платформы пакета (MPF).
Получить список фрагментов кода
В следующем примере кода показано, как получить список фрагментов кода для данного языка. Результаты хранятся в массиве VsExpansion структуры. Этот метод использует статическое GetGlobalService метод доступа IVsTextManager интерфейс из SVsTextManager служба. Однако можно также использовать поставщик служб заданного в VSPackage и вызвать QueryService метод.
using System; using System.Collections; using System.Runtime.InteropServices; using Microsoft.VisualStudio.Package; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.TextManager.Interop; [Guid("00000000-0000-0000-0000-000000000000")] //create a new GUID for the language service namespace TestLanguage { class TestLanguageService : LanguageService { private void GetSnippets(Guid languageGuid, ref ArrayList expansionsList) { IVsTextManager textManager = (IVsTextManager)Package.GetGlobalService(typeof(SVsTextManager)); if (textManager != null) { IVsTextManager2 textManager2 = (IVsTextManager2)textManager; if (textManager2 != null) { IVsExpansionManager expansionManager = null; textManager2.GetExpansionManager(out expansionManager); if (expansionManager != null) { // Tell the environment to fetch all of our snippets. IVsExpansionEnumeration expansionEnumerator = null; expansionManager.EnumerateExpansions(languageGuid, 0, // return all info null, // return all types 0, // return all types 1, // include snippets without types 0, // do not include duplicates out expansionEnumerator); if (expansionEnumerator != null) { // Cache our expansions in a VsExpansion array uint count = 0; uint fetched = 0; VsExpansion expansionInfo = new VsExpansion(); IntPtr[] pExpansionInfo = new IntPtr[1]; // Allocate enough memory for one VSExpansion structure. This memory is filled in by the Next method. pExpansionInfo[0] = Marshal.AllocCoTaskMem(Marshal.SizeOf(expansionInfo)); expansionEnumerator.GetCount(out count); for (uint i = 0; i < count; i++) { expansionEnumerator.Next(1, pExpansionInfo, out fetched); if (fetched > 0) { // Convert the returned blob of data into a structure that can be read in managed code. expansionInfo = (VsExpansion)Marshal.PtrToStructure(pExpansionInfo[0], typeof(VsExpansion)); if (!String.IsNullOrEmpty(expansionInfo.shortcut)) { expansionsList.Add(expansionInfo); } } } Marshal.FreeCoTaskMem(pExpansionInfo[0]); } } } } } } }
Вызвать метод GetSnippets
- Следующий метод показано, как вызвать GetSnippets метод при завершении операции анализа. OnParseComplete метод вызывается после операции анализа, которая запущена с причиной Check.
Примечание
expansionsList listis массива кэшированные для повышения производительности.Изменения не отражаются на фрагменты в списке до тех пор, пока не останавливается и перезапускается служба языка (например, путем остановки и перезапуска Visual Studio).
class TestLanguageService : LanguageService
{
private ArrayList expansionsList;
public override void OnParseComplete(ParseRequest req)
{
if (this.expansionsList == null)
{
this.expansionsList = new ArrayList();
GetSnippets(this.GetLanguageServiceGuid(),
ref this.expansionsList);
}
}
}
Использовать данные фрагмента
В следующем примере кода показано, как использовать данные фрагмента, возвращаемые GetSnippets метод. AddSnippets метод вызывается из средства синтаксического анализа в ответ на любые анализирует причина, которая используется для заполнения списка фрагментов кода. Это должно происходить после полные анализируют выполненных впервые.
AddDeclaration метод создает список объявлений, который впоследствии приводится в списке завершения.
TestDeclaration класс содержит все сведения, которые могут отображаться в списке завершения, а также тип объявления.
class TestAuthoringScope : AuthoringScope { public void AddDeclarations(TestDeclaration declaration) { if (m_declarations == null) m_declarations = new List<TestDeclaration>(); m_declarations.Add(declaration); } } class TestDeclaration { private string m_name; private string m_description; private string m_type; public TestDeclaration(string name, string desc, string type) { m_name = name; m_description = desc; m_type = type; } class TestLanguageService : LanguageService { internal void AddSnippets(ref TestAuthoringScope scope) { if (this.expansionsList != null && this.expansionsList.Count > 0) { int count = this.expansionsList.Count; for (int i = 0; i < count; i++) { VsExpansion expansionInfo = (VsExpansion)this.expansionsList[i]; scope.AddDeclaration(new TestDeclaration(expansionInfo.title, expansionInfo.description, "snippet")); } } } }