9

EnvDTE.ProjectItem から Roslyn の SyntaxTree を取得する最良の方法は何ですか? 別の方法 (Roslyn のドキュメントを ProjectItem に変換) の方法を見つけました。

開いているドキュメントから呼び出される VSIX コマンドを取得しました。そこで Roslyn の構文ツリーを試してみたいと思います。

このコードは機能しますが、私にはぎこちなく見えます:

    var pi = GetProjectItem();
    var piName = pi.get_FileNames(1);

    var componentModel = (IComponentModel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel));
    var workspace = componentModel.GetService<Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace>();
    var ids = workspace.GetOpenDocumentIds();
    var id1 = ids.First(id => workspace.GetFilePath(id) == piName);

        Microsoft.CodeAnalysis.Solution sln = workspace.CurrentSolution;
        var doc = sln.GetDocument(id1);
        //var w = await doc.GetSyntaxTreeAsync();
        Microsoft.CodeAnalysis.SyntaxTree syntaxTree;
        if (doc.TryGetSyntaxTree(out syntaxTree))

アクティブなドキュメントから Roslyn のドキュメントを取得するより良い方法はありますか?

4

3 に答える 3

8

フランクの答えはうまくいきます。型名が何であるかを理解するのは難しいことがわかったので、完全修飾型名を使用したフランクのコードを次に示します。

using System.Linq;

var dte = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
var activeDocument = dte?.ActiveDocument;
if (activeDocument != null)
{
    var componentModel = (Microsoft.VisualStudio.ComponentModelHost.IComponentModel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(Microsoft.VisualStudio.ComponentModelHost.SComponentModel));
    var workspace = (Microsoft.CodeAnalysis.Workspace)componentModel.GetService<Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace>();
    var documentId = workspace.CurrentSolution.GetDocumentIdsWithFilePath(activeDocument.FullName).FirstOrDefault();
    if (documentId != null)
    {
        var document = workspace.CurrentSolution.GetDocument(documentId);
    }
}

そして、これらのタイプを見つけるための参照は次のとおりです。

2 つのフレームワーク参照がVSSDK.DTEVSSDK.ComponentModelHostへの NuGet 参照に置き換えられることを願っていますが、試してみると、アセンブリ バージョンの不一致に関するビルド警告が表示されたので、断念しました。

于 2016-06-26T04:35:58.560 に答える
1

ProjectItemからエディターに移動する方法を理解できる場合は、ITextSnapshotを使用することをお勧めしますsnapshot.AsText().GetOpenDocumentInCurrentContextWithChanges()

上記のコードでは、 を使用TryGetSyntaxTreeすることで、他の誰かがあなたの前に解析ツリーを要求したことに依存していることにも注意してください。

于 2015-08-04T14:46:01.993 に答える