2

カスタム スクリプト言語用の Visual Studio 言語サービスを実装しています。構文の強調表示、エラー チェック、コード補完、および「定義へ移動」を実装することができました。「Find All References」メニューオプションに接続する方法を理解するのに苦労しています(または、この時点で表示することさえできます)。

カスタム言語の Visual Studio で「すべての参照を検索」機能を実装するための便利なリソースを教えてもらえますか? グーグルで情報を探してみましたが、何も見つからないようです。

4

1 に答える 1

5

まず、Find All References を起動できる場所が複数あります。主なものは次のとおりです。

  1. クラス ビューでノードを右クリックします。
  2. テキスト エディタ内で右クリックします。

その他は次のとおりです。

  1. 呼び出し階層

入門

IVsSimpleLibrary2理想的な実装では、言語のサポートを [クラス ビュー] ウィンドウと [オブジェクト ブラウザー] ウィンドウに統合する実装が得られます。IVsFindSymbolFind All References の実装は、Visual Studio によって提供されるインターフェイスを中心にしています。コードは、 の実装で関連する検索を処理しますIVsSimpleLibrary2.GetList2

クラス ビューでのノードの右クリックのサポート

  1. ライブラリ機能に が含まれていることを確認してください_LIB_FLAGS2.LF_SUPPORTSLISTREFERENCES

  2. のハンドラーでIVsSimpleLibrary2.GetList2、次のすべてが true の場合に関心があります。

    1. pobSrch長さ 1 の非 null 配列です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.FindReferencesしかし、guidCmdGroupは前述と同じになります。この不一致は、Visual Studio 2008 以降で修正され、その後、ポイントVSStd2KCmdID.FindReferencesは使用されなくなりました。
  2. ViewFilter.HandlePreExec上記のコマンド GUID と ID の場合はオーバーライドし、その場合は次のコードを実行します。

    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いる場合、クラス ビューまたはオブジェクト ブラウザ ノードで [すべての参照を検索] コマンドの結果を計算するのではなく、メソッドIVsSimpleObjectList2によって以前に計算された結果をラップする のみを返す必要がありますHandleFindReferencesResponse

于 2014-02-25T01:51:37.890 に答える