Expor listas de símbolos fornecidos pela biblioteca ao gerenciador de objetos
As ferramentas de navegação de símbolos, Modo de Exibição de Classe, Pesquisador de Objetos, Navegador de Chamadas e Localizar Resultados de Símbolos, passam solicitações de novos dados para o gerenciador de objetos do Visual Studio. O gerenciador de objetos localiza as bibliotecas apropriadas e solicita novas listas de símbolos. As bibliotecas respondem fornecendo dados solicitados para o gerenciador de objetos do Visual Studio por meio da IVsSimpleObjectList2 interface. O gerenciador de objetos do Visual Studio chama os métodos na IVsSimpleObjectList2 interface para obter os dados e os usa para preencher ou atualizar os modos de exibição das ferramentas de navegação de símbolos.
Uma biblioteca pode receber solicitações de dados quando a ferramenta é chamada, o nó é expandido ou a exibição é atualizada. Quando uma ferramenta de navegação de símbolos é invocada pela primeira vez, o gerenciador de objetos solicita que a biblioteca forneça a lista de nível superior. Quando o usuário expande um nó de lista, a biblioteca fornece uma lista de filhos sob esse nó. Cada consulta do gerenciador de objetos contém um índice do item de interesse. Para exibir uma nova lista, o gerenciador de objetos deve determinar quantos itens estão na lista, o tipo dos itens, seus nomes, acessibilidade e outras propriedades.
Observação
Os exemplos de código gerenciado a seguir demonstram como fornecer listas de símbolos por meio da implementação da IVsSimpleObjectList2 interface. O gerenciador de objetos chama os métodos nessa interface e usa os dados obtidos para preencher ou atualizar as ferramentas de navegação de símbolos.
Para a implementação do provedor de símbolo de código nativo, use a IVsObjectList2 interface.
Para fornecer listas de símbolos ao gerenciador de objetos
Obtenha o número de itens na lista de símbolos implementando o GetItemCount método. O exemplo a seguir demonstra como o gerenciador de objetos obtém as informações sobre o número de itens na lista.
Obtenha informações sobre as categorias e os atributos de um determinado item de lista implementando o GetCategoryField2 método. As categorias de item são especificadas LIB_CATEGORY na enumeração. O exemplo a seguir demonstra como o gerenciador de objetos obtém atributos de itens para uma determinada categoria.
public int GetCategoryField2(uint index, int Category, out uint pfCatField) { pfCatField = 0; switch ((LIB_CATEGORY)Category) { case LIB_CATEGORY.LC_MEMBERTYPE: pfCatField = (uint)_LIBCAT_MEMBERTYPE.LCMT_METHOD; break; case LIB_CATEGORY.LC_MEMBERACCESS: { Method method = m_Methods.Values[(int)index]; if (method.IsPublic) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PUBLIC; } else if (method.IsPrivate) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PRIVATE; } else if (method.IsFamily) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PROTECTED; } else if (method.IsFamilyOrAssembly) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PROTECTED | (uint)_LIBCAT_MEMBERACCESS.LCMA_PACKAGE; } else { // Show everything else as internal. pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PACKAGE; } } break; case LIB_CATEGORY.LC_VISIBILITY: pfCatField = (uint)_LIBCAT_VISIBILITY.LCV_VISIBLE; break; case LIB_CATEGORY.LC_LISTTYPE: pfCatField = (uint)_LIB_LISTTYPE.LLT_MEMBERS; break; default: return Microsoft.VisualStudio.VSConstants.S_FALSE; } return Microsoft.VisualStudio.VSConstants.S_OK; }
Obtenha a representação de texto de um determinado item de lista implementando o GetTextWithOwnership método. O exemplo a seguir demonstra como obter um nome completo de um determinado item.
public int GetTextWithOwnership([System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.OLE.Interop.ULONG")] uint index, [System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.Shell.Interop.VSTREETEXTOPTIONS")] Microsoft.VisualStudio.Shell.Interop.VSTREETEXTOPTIONS tto, [System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.OLE.Interop.WCHAR")] out string ppszText) { ppszText = m_Methods.Values[(int)index].FullName; return Microsoft.VisualStudio.VSConstants.S_OK; }
Obtenha as informações de ícone para um determinado item de lista implementando o GetDisplayData método. O ícone representa o tipo (classe, método e assim por diante) e a acessibilidade (privada, pública e assim por diante) de um item de lista. O exemplo a seguir demonstra como obter as informações de ícone com base em um determinado atributo de item.
public virtual int GetDisplayData(uint index, Microsoft.VisualStudio.Shell.Interop.VSTREEDISPLAYDATA[] pData) { if (pData == null) { return Microsoft.VisualStudio.VSConstants.E_INVALIDARG; } Method method = m_Methods.Values[(int)index]; int iImage = 12 * 6; // See env\inc\OMGlyphs.h. const int OM_GLYPH_ACC_PUBLIC = 0; const int OM_GLYPH_ACC_INTERNAL = 1; const int OM_GLYPH_ACC_PROTECTED = 3; const int OM_GLYPH_ACC_PRIVATE = 4; if (method.IsPublic) { iImage += OM_GLYPH_ACC_PUBLIC; } else if (method.IsPrivate) { iImage += OM_GLYPH_ACC_PRIVATE; } else if (method.IsFamily) { iImage += OM_GLYPH_ACC_PROTECTED; } else if (method.IsFamilyOrAssembly) { iImage += OM_GLYPH_ACC_PROTECTED; } else { iImage += OM_GLYPH_ACC_INTERNAL; } pData[0].Image = (ushort)iImage; pData[0].SelectedImage = (ushort)iImage; return Microsoft.VisualStudio.VSConstants.S_OK; }
Obtenha as informações sobre se um determinado item de lista é expansível implementando o GetExpandable3 método. O exemplo a seguir demonstra como obter as informações sobre se um determinado item pode ser expandido.
public int GetExpandable(uint index, out int pfExpandable) { pfExpandable = Microsoft.VisualStudio.VSIP.Samples.CallBrowser.Constants.TRUE; return Microsoft.VisualStudio.VSConstants.S_OK; } public int GetExpandable3(uint index, uint ListTypeExcluded, out int pfExpandable) { return GetExpandable(index, out pfExpandable); }
Obtenha uma lista filho de símbolos de um determinado item de lista implementando o GetList2 método. O exemplo a seguir demonstra como obter uma lista filho de símbolos de um determinado item para gráficos Call ou Callers .
// Call graph list. public class CallsList : ResultsList, Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 { public CallsList(Library library) : base(library) { } public int GetList2(uint index, uint ListType, uint flags, Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2[] pobSrch, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { return base.GetCallsList(index, out ppList); } } // Callers graph list. public class CallersList : ResultsList, Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 { public CallersList(Library library) : base(library) { } public int GetList2(uint index, uint ListType, uint flags, Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2[] pobSrch, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { return base.GetCallersList(index, out ppList); } } // Call graph list. public int GetCallsList(uint index, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { ppList = null; ResultsList callsList = new CallsList(m_Library); Method method = m_Methods.Values[(int)index]; string strMethod = method.m_strPrototype; System.Collections.Generic.List<CallInstance> Calls = m_Library.CallGraph.GetCallGraph(method); for (int i = 0; i < Calls.Count; i++) { Method caller = Calls[i].m_Target; callsList.AddMethod(caller); } ppList = (Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2)(callsList); return Microsoft.VisualStudio.VSConstants.S_OK; } // Callers graph list. public int GetCallersList(uint index, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { ppList = null; ResultsList callersList = new CallersList(m_Library); Method method = m_Methods.Values[(int)index]; string strMethod = method.m_strPrototype; System.Collections.Generic.List<CallInstance> Callers = m_Library.CallGraph.GetCallersGraph(method); for (int i = 0; i < Callers.Count; i++) { Method caller = Callers[i].m_Source; callersList.AddMethod(caller); } ppList = (Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2)(callersList); return Microsoft.VisualStudio.VSConstants.S_OK; } // Get a child list of symbols for a given list item. public int GetList2(uint index, uint ListType, uint flags, Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2[] pobSrch, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { ppList = null; Method method = m_Methods.Values[(int)index]; string strMethod = method.m_strPrototype; // Determine if the list belongs to Call or Callers graphs. if ((uint)(m_nFlags & (uint)Microsoft.VisualStudio.Shell.Interop._VSOBSEARCHOPTIONS2.VSOBSO_CALLSFROM) > 0) { // Build the list for the Call graph. return base.GetCallsList(index, out ppList); } else if ((uint)(m_nFlags & (uint)Microsoft.VisualStudio.Shell.Interop._VSOBSEARCHOPTIONS2.VSOBSO_CALLSTO) > 0) { // Build the list for the Callers graph. return base.GetCallersList(index, out ppList); } return Microsoft.VisualStudio.VSConstants.E_FAIL; }