2017-11-02 9 views
1

ビジュアルスタジオの拡張機能を少し演奏して作成する方法を学ぼうとしています。
私はコードエディタ(c#)でマウスの下にある単語に関するすべての情報を取得したいと思いますが、それを行う方法を理解できません。コードを分析する必要はありません。なぜなら、これらの情報はすべてツールヒント(ツールチップのデータをキャプチャするのに十分かもしれません)などであるからです。
これをもっと明確にするには
- 変数の上にマウスを置くと、この単語も変数であることを知りたいと思います。この変数とタイプの名前も欲しいです。 - 「var」キーワードにカーソルを合わせると、この単語は「var」というキーワードであり、そのタイプを知りたいと思います。
- 'List [Domain.Example.TestClass]'のようなジェネリック内部のオブジェクトにマウスポインタを合わせると、 'TestClass'と等しくなるタイプを取得したいとします。
基本的にツールヒントと同じものです。ビジュアルスタジオ内線のコードエディタでマウスの位置にある単語に関する情報を取得するには

私は 'IQuickInfoSource'を使用しようとしていましたが、カーソル下で単語を取得することができましたが、追加データを取得する方法はわかりません。
私も 'IMouseProcessorProvider'を試してみましたが、私は同じ結果で終わりました。私は現在の単語を得ることができましたが、他の情報は得られませんでした。

これを達成する方法を教えてください。少なくとも、正しい方向に私を指してください。なぜなら、ビジュアルスタジオの拡張について適切な文書を見つけることは非常に難しいからです。それ以上の情報が必要な場合はお尋ねください。

ありがとうございます。

答えて

1

数時間後、私は自分が望むものを達成することができました。誰かが同じことをしようとしている場合、あなたは以下のステップを見つけることができます。

私もマウスイベントを反応させることができるようにIMouseProcessorProviderを使用など

を、私はそれらの情報を取得するために「ロズリン」を使用していますので、私は「Microsoft.CodeAnalysis」のようなnugetパッケージをダウンロードするために必要な:

[Export(typeof(IMouseProcessorProvider))] 
[Order] 
[ContentType("CSharp")] 
[Name("MouseNavigation")] 
[TextViewRole(PredefinedTextViewRoles.Interactive)] 
internal class MouseNavigationProvider : IMouseProcessorProvider 

は、その使用して、次のコードの後、私は型情報を取得することができた

SnapshotPoint caretPosition = _textView.Caret.Position.BufferPosition; 
Document document = caretPosition.Snapshot.GetOpenDocumentInCurrentContextWithChanges(); 
SemanticModel semanticModel = document.GetSemanticModelAsync().Result; 
if (semanticModel == null) 
    return null; 

TypeInfo typeInfo; 
SyntaxNode expressionNode = document.GetSyntaxRootAsync().Result.FindToken(caretPosition).Parent; 
if (expressionNode is VariableDeclaratorSyntax) 
{ 
    SyntaxNode childNode = expressionNode.ChildNodes()?.FirstOrDefault() 
     ?.ChildNodes()?.FirstOrDefault(); 
    typeInfo = semanticModel.GetTypeInfo(childNode); 
} 
else if (expressionNode is ClassDeclarationSyntax) 
{ 
    throw new NotImplementedException(); 
} 
else 
{ 
    // NOTE: This probably should be changed for specific type of syntax, but right now it is only for testing purposes 
    typeInfo = semanticModel.GetTypeInfo(expressionNode); 
    if (typeInfo.Type == null) 
    { 
     expressionNode = expressionNode.Parent; 
     typeInfo = semanticModel.GetTypeInfo(expressionNode); 
    } 
} 
関連する問題