阅读 src\services 代码后,似乎这是语言服务的任何主机必须满足的接口(interface):
//
// Public interface of the host of a language service instance.
//
export interface ILanguageServiceHost extends TypeScript.ILogger {
getCompilationSettings(): TypeScript.CompilationSettings;
getScriptCount(): number;
getScriptId(scriptIndex: number): string;
getScriptSourceText(scriptIndex: number, start: number, end: number): string;
getScriptSourceLength(scriptIndex: number): number;
getScriptIsResident(scriptIndex: number): bool;
getScriptVersion(scriptIndex: number): number;
getScriptEditRangeSinceVersion(scriptIndex: number, scriptVersion: number): TypeScript.ScriptEditRange;
}
我找不到任何文档或示例,虽然有些方法是不言自明的,但其他方法则不是,特别是:
getScriptId()
getScriptIsResident()
getScriptVersion()
getScriptEditRangeSinceVersion()
语言服务 API 准备好使用了吗?有人可以简要解释一下上述方法的目的吗?
最佳答案
免责声明:语言服务托管 API 将在 future 版本中更改。我不确定变化的全部范围是什么——我预计事情会大体相同,但几乎肯定会有突破性的变化。
此外,src\harness\harness.ts
中有托管 API 的完整 TypeScript 实现,用于语言服务单元测试,您可以引用。以下是您列出的功能的概念分割:getScriptId()
您需要返回一个对每个文件(脚本)都是唯一的字符串,但不会因调用而改变。返回脚本的文件名会很好地工作。getScriptIsResident()
编译器有一个不可变的“常驻”文件的概念(例如,lib.d.ts)。驻留状态用于性能原因——例如,驻留文件中的类型被认为是不可变的(这就是为什么当您尝试扩展 lib.d.ts 中定义的类型时,您会在 Visual Studio 中看到奇怪的情况)。您可以在此处安全地为所有文件返回 false
,或者如果您知道文件是不可变的,则可以返回 true
。一旦改进的类型检查器上线,“常驻”文件的概念将在编译器的某些 future 版本中消失。getScriptVersion()
在这里,您需要返回一个单调递增的数字,只要脚本的源文本发生变化,该数字就会递增。语言服务使用这个数字来确定它是否应该对文件进行重新解析/重新类型检查。getScriptEditRangeSinceVersion()
此函数应返回从现在到指定的先前版本号(参见上文 getScriptVersion
)之间发生的编辑范围列表(希望不言自明)。显然,这实现起来有点麻烦,但这里允许返回 TypeScript.ScriptEditRange.unknown()
,此时语言服务将对文件进行完整的重新解析(显着的性能影响,因此尝试在交互式上下文中谨慎地执行此操作)。
关于typescript - 实现一个语言服务的主机,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14219884/