问题标签 [languageservice]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
185 浏览

c# - 提供语言服务的问题

我发现了两种在互联网上提供语言服务的方法。

第一种方法IOleComponentManager是在空闲时间使用并注册一个计时器来调用我的服务。

第二种方法涉及将我的服务封装为一个IServiceContainer并添加一个ServiceCreatorCallback以“按需提供服务”。

据说第二种方式现在是做事的“首选方式”。不幸的是,当我使用这种方法时,我的实现OnSynchronizeDropdowns永远不会被调用。TypeAndMembersDropdownBars

此外,当我LanguageService在文件中发现错误时,它会使用ParseRequest.Sink.AddError()将错误添加到错误列表中。当提供“按需”时,这些错误不会显示在 GUI 中,即使我在调试代码时看到它们被添加。

我知道我的语言服务正在注册,因为语法突出显示、“转到定义”和“查找所有参考”仍然有效。

这是我用来“按需提供服务”的代码:

谁能告诉我为什么我的某些功能LanguageService在按需提供时不起作用?我是否遗漏了什么,或者这种方式不适合功能齐全的语言服务?

0 投票
1 回答
722 浏览

c# - 向 IElisonBuffer 添加语法高亮

我正在开展一个项目,我们将 C# 代码拆分为函数并将这些函数存储在IElisonBuffers中。我已经连接了 Intellisense,并且缓冲区与其他扩展很好地交互,如下所示:

在此处输入图像描述

但是,我无法在这些编辑器中使用语法突出显示。

我通过以下步骤嵌入这些编辑器:

  1. 为文件创建一个IVsInvisibleEditor
  2. 得到IVsTextLines这个IVsInvisibleEditor
  3. 创建一个IVsCodeWindow并将其设置为IVsCodeWindow来自IVsTextLines的缓冲区IVsInvisibleEditor
  4. IWpfTextViewHost从此代码窗口获取一个。这让我回到了“WPF Land”,在那里我可以与传统跨度进行交互。
  5. 创建IWpfTextViewHost的文本视图的 SnapshotSpan。此 SnapshotSpan 包含一个函数。
  6. 创建一个IElisionBuffer包含 SnapshotSpan。
  7. 创建一个IVsTextBuffer通过IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer()IElisionBuffer.
  8. 现在我在 C# GUID 中IVsTextBuffer转换IVsTextLines并调用SetLanguageServiceID()传递:694DD9B6-B865-4C5B-AD85-86356E9C88DC。
  9. 我仔细检查它是否设置正确GetLanguageServiceID(),一切看起来都很好。
  10. 我创建一个IVsTextView并用新的IVsTextBuffer.
  11. 然后我得到了IWpfTextViewHost这个IVsTextView

为 IElisionBuffer 设置语言服务 ID 时,是否需要注意任何特殊步骤?

为了完整起见,这是我正在使用的代码:

0 投票
4 回答
1690 浏览

c# - 如何使用投影缓冲区来支持 Visual Studio 编辑器中的嵌入式语言

在此链接的第一段末尾,它指出:

Visual Studio 文本大纲功能是通过使用投影缓冲区来隐藏折叠的文本来实现的,而用于 ASP.NET 页面的 Visual Studio 编辑器使用投影来支持 Visual Basic 和 C# 等嵌入式语言

我已经搜索和搜索,但根本没有找到任何示例或文档来完成此操作,有人知道这是如何完成的吗?我已经开始分类工作,并创建了一个我想要分类为 C# 代码的跨度的投影缓冲区。我将缓冲区上下文类型设置为“CSharp”,但跨度从未被分类。我也尝试将我的内容类型基于“投影”,但现在也可以。

0 投票
1 回答
26 浏览

visual-studio - 如何在 Visual Studio 编辑器窗口中创建类似于插入片段之一的 UI

在文本编辑器窗口中,我可以右键单击并选择“插入片段...”,然后我会看到一个搜索框,我可以输入并查找片段。选择后,编辑器窗口将使用片段中的文本进行更新。这是如何运作的?这可以从 MEF 完成,还是我必须使用 MPF 并实施语言服务?如果有人能指出我的方向,看 MSDN 文档有点不知所措,似乎有很多方法可以处理任何任务(MEF、MPF、直接实现接口)。

0 投票
2 回答
421 浏览

typescript - Typescript 编译器即服务:如何测试一种类型是否可分配给另一种类型?

我正在制作一个命令行 nodejs 工具,它使用 Typescript 语言服务自动重命名 Typescript 文件中的符号。

您告诉工具:将此类型的所有符号重命名为此符号。就像 resharper 一样,它也会重命名局部变量、属性等。由于它允许一次重命名多个符号,您还可以交换两个符号名称,而无需中间的临时唯一名称(例如,将 Foo 重命名为 Bar,反之亦然)。

我必须公开语言服务中的私有函数 getSymbolInfoAtPosition 才能使其工作,这样我才能获得 PullSymbol 信息

目前,它仅通过在 PullSymbol 上调用 getNameAndTypeName 来检测确切的名称+类型匹配,但我想执行结构上兼容的匹配。

在 C# 中,这很容易,因为 Type 具有 IsAssignableFrom 方法。

有谁知道如何使用 Typescript 编译器即服务来检测一个 PullSymbol 在结构上是否与另一个 PullSymbol 兼容?

非常感谢,彼得 Verswyvelen

0 投票
2 回答
182 浏览

visual-studio-2013 - Visual Studio 扩展中的自定义 ColorableItems

我正在为 Visual Studio 开发 LanguageService,并且在 Visual Studio 2013 中遇到自定义颜色问题。我最近从 Visual Studio 2010 迁移到 2013,现在每当我设置RequestStockColors为时false,我都会失去所有语法突出显示。

我的 LanguageService 实现GetColorableItemGetItemCount. 我正在使用 9 种自定义颜色。当我调试我的语言服务时,我注意到它GetColorableItem被调用了几次,但从GetItemCount未被击中。

通过 Visual Studio 进行调试时,我使用以下命令行参数:

/ranu /rootsuffix Exp

更新:我更改了前 5 种颜色的名称(与标准标记颜色重叠的颜色)以匹配标准名称(例如“关键字”、“标识符”等),这些颜色现在显示,但我的没有出现额外的颜色类型。此外,我从未看到它们中的任何一个出现在 Visual Studio 的字体和颜色配置中。我如何让它们安装在那里?

0 投票
1 回答
1608 浏览

typescript - 如何使用 Typescript 语言服务获取属性信息

如何使用 Typescript 1.4.0 获取对象属性的类型。

我正在寻找类似于 C# 的东西,它可以查找对象的属性。

到目前为止,我所拥有的是:

给定示例接口:

TypeScript 语言服务返回结果:

我缺少的信息是类型 (string,number,Map<>,any) 以及它是否是数组或对象,例如

任何想法如何实现这一目标?

非常感谢您的帮助。

0 投票
0 回答
113 浏览

c# - 如何在 Visual Studio 中使用投影缓冲区来编辑嵌入在 C# 中的语言?

投影技术可用于自定义 Visual Studio 编辑器以支持嵌入式语言。在线提供的示例,例如Django 的编辑器自定义支持嵌入在 HTML 中的脚本语言。这些实现似乎与内置的 HTML 编辑器相关联。

有没有人有关于如何为嵌入在 C#中的语言实现类似功能的建议?我尝试复制用于 Django 编辑器的投影缓冲区解决方案,并将内容类型从“HTML”更改为“CSharp”。编辑器似乎将 C# 内容识别为“代码”,但不提供语法高亮、IntelliSense 等。

0 投票
0 回答
158 浏览

c# - Visual Studio 扩展,将对象从 VSPackage 传递到 IOleCommandTarget

我创建了一个对象,该对象使用 DTE 访问 Visual Studio 解决方案中的文件并解析它们以提取信息以驱动我正在实现的新功能。此对象还使用 DTE 事件来检测解决方案的内容何时更改。因此,该对象的范围在 VSPackage 中。但是,我需要对象在实现功能的 IOleCommandTarget 中收集的信息。我曾尝试寻找一种将这个对象从 VSPackage 传递到 IOleCommandTarget 的方法,但到目前为止我还是一无所获。我已经尝试在 IOleCommandTarget 中确定对象的范围,但这不起作用,因为我认为 DTE 事件不会因范围或垃圾收集而触发。

这是我的 IOleCommandTarget 提供程序:

0 投票
1 回答
1477 浏览

languageservice - 在 Monaco Editor 中创建语言服务器

我浏览了文档,发现为了在 Monaco 编辑器中为自定义语言提供诊断,我们需要编写自己的语言服务器/客户端。在示例 [1] 中,它是用 Typescript 编写的。我们可以用 Javascript 本身编写服务器吗?

[1] https://github.com/Microsoft/vscode-languageserver-node-example/tree/master/client