如何使用 VSIX 中的 GetSyntaxRoot 将 Typescript 作为 FileCodeModel 或 (Roslyn) Document

How to get Typescript as either FileCodeModel or (Roslyn) Document with working GetSyntaxRoot in VSIX

标题就差不多了。我需要能够解析文档的语法,以确定用户右击的是什么来执行我的操作。我不是在操纵文档,所以我真的只需要一些可以让我获得语法节点或等效项的东西。我已经使用 C# 和 VB,但无法弄清楚 VSSDK 或 Roslyn SDK 的任何部分可以为我提供任何类型的打字稿语法树。

我如何使用 Roslyn 使用其他语言的示例,我有其他代码可以与 FileCodeModels 一起使用,所以如果我能得到它,我也可以使用它。

我实际上认为我需要利用安装到 VS 中的 TypeScript 扩展(创建扩展依赖项)但我不太确定。

Microsoft.VisualStudio.Text.Editor.IWpfTextView textView = GetTextView();
if (textView != null)
{
                SnapshotPoint caretPosition = textView.Caret.Position.BufferPosition;
                Document document = caretPosition.Snapshot.GetOpenDocumentInCurrentContextWithChanges();
                if (document != null)
                {
                    SyntaxToken? token = document.GetSyntaxRootAsync().Result?.FindToken(caretPosition);                        
    }
}

对于 TypeScript 代码既没有 Roslyn SyntaxTree 也没有 FileCodeModel,部分原因是 TypeScript 引擎本身是用 TypeScript 编写的,所以没有托管表示可言。 TypeScript 的 IDE 体验在内部使用了一点 Roslyn,这就是为什么你看到有一个文档可供你获取,但没有语法树可供使用。

作为@Jason Malinowski stated, you cannot retrieve Roslyn SyntaxTree or FileCodeModel, but you can use Javascript.NET to run the typescriptServices and communicate with it through a JavaScriptContext. If you are interested you can look at SharpDevelop的实现。