实现一系列语言服务

时间:2013-01-08 16:44:11

标签: typescript languageservice

在阅读 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是否可以使用?有人可以简要解释一下上述方法的用途吗?

1 个答案:

答案 0 :(得分:5)

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

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

getScriptId()

您需要返回每个文件(脚本)唯一的字符串,但不会从调用调用中更改。返回脚本的文件名可以很好地工作。

getScriptIsResident()

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

getScriptVersion()

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

getScriptEditRangeSinceVersion()

此函数应返回从现在到指定的先前版本号之间发生的编辑范围列表(希望是不言自明的)(参见上面的getScriptVersion)。显然这实现起来有点痛苦,但这里允许返回TypeScript.ScriptEditRange.unknown(),此时语言服务将对文件进行完全重新分析(显着的性能影响,因此请尽量少做互动环境)。