gpt4 book ai didi

c# - 在 Visual Studio 2010 语言服务中实现查找引用

转载 作者:行者123 更新时间:2023-12-05 01:47:48 25 4
gpt4 key购买 nike

我正在为自定义脚本语言实现 Visual Studio 语言服务。我已经设法实现了语法高亮显示、错误检查、代码完成和“转到定义”。我无法弄清楚如何连接到“查找所有引用”菜单选项(或者甚至让它在此时显示)。

任何人都可以为我指出在 Visual Studio 中针对自定义语言实现“查找所有引用”功能的有用资源吗?我已经尝试使用谷歌搜索来获取有关它的任何信息,但我做不到似乎找到了什么。

最佳答案

首先,有多个位置可以调用“查找所有引用”。主要的是:

  1. 通过右键单击类 View 中的节点。
  2. 在文本编辑器中右键单击。

其他包括:

  1. 调用层次结构

开始

在理想的实现中,您将实现 IVsSimpleLibrary2它将对您的语言的支持集成到类 View 和对象浏览器窗口中。 Find All References 的实现以 IVsFindSymbol 为中心接口(interface),由 Visual Studio 提供。您的代码在 IVsSimpleLibrary2.GetList2 的实现中处理相关搜索.

支持在类 View 中右键单击节点

  1. 确保您的图书馆功能包括 _LIB_FLAGS2.LF_SUPPORTSLISTREFERENCES .

  2. 在您的处理程序中 IVsSimpleLibrary2.GetList2 ,您对以下所有情况都成立的情况感兴趣。

    1. pobSrch 是一个长度为 1 的非空数组。对于这些条件的其余部分,我假设第一个元素分配给局部变量 criteria
    2. criteria.eSrchType == VSOBSEARCHTYPE.SO_ENTIREWORD
    3. criteria.grfOptions 有标志 _VSOBSEARCHOPTIONS.VSOBSO_LOOKINREFS
    4. criteria.grfOptions 具有标志 _VSOBSEARCHOPTIONS.VSOBSO_CASESENSITIVE
  3. 当满足上述条件时,返回一个IVsSimpleObjectList2其子项是“查找所有引用”命令的延迟计算结果的实现。

支持文本编辑命令

  1. 在您的 ViewFilter.QueryCommandStatus 实现中,当 guidCmdGroup == VSConstants.GUID_VSStandardCommandSet97nCmdId == VSStd97CmdID.FindReferences 时,您需要返回 OLECMDF.OLECMDF_SUPPORTED | OLECMDF.OLECMDF_ENABLED.

    • 在 Visual Studio 2005 中,请注意 nCmdId 将是 VSStd2KCmdID.FindReferencesguidCmdGroup 将与前面提到的相同。从 Visual Studio 2008 开始更正了这种不匹配,之后不再使用 VSStd2KCmdID.FindReferences
  2. 针对上面列出的命令 GUID 和 ID 的情况覆盖 ViewFilter.HandlePreExec,并针对该情况执行以下代码:

    HandleFindReferences();
    return true;
  3. 添加如下扩展方法类:

    public static class IVsFindSymbolExtensions
    {
    public static void DoSearch(this IVsFindSymbol findSymbol, Guid symbolScope, VSOBSEARCHCRITERIA2 criteria)
    {
    if (findSymbol == null)
    throw new ArgumentNullException("findSymbol");

    VSOBSEARCHCRITERIA2[] criteriaArray = { criteria };
    ErrorHandler.ThrowOnFailure(findSymbol.DoSearch(ref symbolScope, criteriaArray));
    }
    }
  4. 将以下方法添加到您的 ViewFilter 类:

    public virtual void HandleFindReferences()
    {
    int line;
    int col;

    // Get the caret position
    ErrorHandler.ThrowOnFailure( TextView.GetCaretPos( out line, out col ) );

    // Get the tip text at that location.
    Source.BeginParse(line, col, new TokenInfo(), ParseReason.Autos, TextView, HandleFindReferencesResponse);
    }

    // this can be any constant value, it's just used in the next step.
    public const int FindReferencesResults = 100;

    void HandleFindReferencesResponse( ParseRequest req )
    {
    if ( req == null )
    return;

    // make sure the caret hasn't moved
    int line;
    int col;
    ErrorHandler.ThrowOnFailure( TextView.GetCaretPos( out line, out col ) );
    if ( req.Line != line || req.Col != col )
    return;

    IVsFindSymbol findSymbol = CodeWindowManager.LanguageService.GetService(typeof(SVsObjectSearch)) as IVsFindSymbol;
    if ( findSymbol == null )
    return;

    // TODO: calculate references as an IEnumerable<IVsSimpleObjectList2>

    // TODO: set the results on the IVsSimpleLibrary2 (used as described below)

    VSOBSEARCHCRITERIA2 criteria =
    new VSOBSEARCHCRITERIA2()
    {
    dwCustom = FindReferencesResults,
    eSrchType = VSOBSEARCHTYPE.SO_ENTIREWORD,
    grfOptions = (uint)_VSOBSEARCHOPTIONS2.VSOBSO_LISTREFERENCES,
    pIVsNavInfo = null,
    szName = "Find All References"
    };

    findSymbol.DoSearch(new Guid(SymbolScopeGuids80.All), criteria);
    }
  5. 更新您对 IVsSimpleLibrary2.GetList2 的实现.当搜索条件的 dwCustom 值设置为 FindReferencesResults 时,无需在类 View 或对象浏览器节点上计算“查找所有引用”命令的结果,您只需返回一个IVsSimpleObjectList2包装先前由您的 HandleFindReferencesResponse 方法计算的结果。

关于c# - 在 Visual Studio 2010 语言服务中实现查找引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com