4

阅读src\services代码后,似乎这是任何语言服务主机必须满足的接口:

//
// 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 是否可以使用?有人可以简要解释上述方法的目的吗?

4

1 回答 1

7

免责声明:语言服务托管 API 将在未来版本中更改。我不确定变化的全部范围是什么——我预计事情会大体相同,但几乎肯定会有重大变化。

src\harness\harness.ts此外,还有用于语言服务单元测试的托管 API 的完整 TypeScript 实现,您可以参考。这是您列出的功能的概念细分:

getScriptId()

您需要为每个文件(脚本)返回一个唯一的字符串,但不会因调用而改变。返回脚本的文件名会很好。

getScriptIsResident()

编译器有一个不可变的“驻留”文件的概念(例如,lib.d.ts)。常驻状态用于性能原因 - 例如,来自常驻文件的类型被认为是不可变的(这就是为什么当您尝试扩展 lib.d.ts 中定义的类型时在 Visual Studio 中看到奇怪的原因)。你可以在这里安全地返回false所有文件,或者如果你知道一个文件是不可变的,你可以返回true. 一旦改进的类型检查器上线,“驻留”文件的概念将在编译器的某些未来版本中消失。

getScriptVersion()

在这里,您需要返回一个单调递增的数字,只要脚本的源文本发生更改,该数字就会递增。语言服务使用这个数字来确定它是否应该对文件进行重新解析/重新类型检查。

getScriptEditRangeSinceVersion()

此函数应返回从现在到指定的先前版本号(见上文)之间发生的编辑范围列表(希望不言自明getScriptVersion)。显然这实现起来有点麻烦,但这里允许 return TypeScript.ScriptEditRange.unknown(),此时语言服务将对文件进行完全重新解析(显着的性能影响,所以尽量在交互式上下文中谨慎地执行此操作)。

于 2013-01-08T18:18:26.727 回答