coc-tsserver/src/server/index.ts
Qiming Zhao e7fd3852d7 fix ensureConfigurationForDocument could not work
Document could not exists on BufEnter
2020-04-17 22:16:26 +08:00

97 lines
3.3 KiB
TypeScript

import { Uri, disposeAll, IServiceProvider, ServiceStat, workspace, WorkspaceConfiguration } from 'coc.nvim'
import { Disposable, DocumentSelector, Emitter, Event } from 'vscode-languageserver-protocol'
import TypeScriptServiceClientHost from './typescriptServiceClientHost'
import { LanguageDescription, standardLanguageDescriptions } from './utils/languageDescription'
import { PluginManager } from '../utils/plugins'
import { TextDocument } from 'vscode-languageserver-textdocument'
export default class TsserverService implements IServiceProvider {
public id = 'tsserver'
public name = 'tsserver'
public enable: boolean
// supported language types
public selector: DocumentSelector
public state = ServiceStat.Initial
public clientHost: TypeScriptServiceClientHost
private _onDidServiceReady = new Emitter<void>()
public readonly onServiceReady: Event<void> = this._onDidServiceReady.event
private readonly disposables: Disposable[] = []
private descriptions: LanguageDescription[] = []
constructor(private pluginManager: PluginManager) {
const config = workspace.getConfiguration('tsserver')
const enableJavascript = !!config.get<boolean>('enableJavascript')
this.enable = config.get<boolean>('enable')
this.descriptions = standardLanguageDescriptions.filter(o => {
return enableJavascript ? true : o.id != 'javascript'
})
this.selector = this.descriptions.reduce((arr, c) => {
return arr.concat(c.modeIds)
}, [])
workspace.onDidOpenTextDocument(doc => {
this.ensureConfigurationForDocument(doc)
}, null, this.disposables)
}
public get config(): WorkspaceConfiguration {
return workspace.getConfiguration('tsserver')
}
public ensureConfigurationForDocument(document: TextDocument): void {
let uri = Uri.parse(document.uri)
let language = this.clientHost.findLanguage(uri)
if (!language) return
language.fileConfigurationManager.ensureConfigurationForDocument(document).catch(_e => {
// noop
})
}
public start(): Promise<void> {
if (this.clientHost) return
this.state = ServiceStat.Starting
this.clientHost = new TypeScriptServiceClientHost(this.descriptions, this.pluginManager)
this.disposables.push(this.clientHost)
let client = this.clientHost.serviceClient
return new Promise(resolve => {
let started = false
client.onTsServerStarted(() => {
Object.defineProperty(this, 'state', {
get: () => {
return this.clientHost.serviceClient.state
}
})
this._onDidServiceReady.fire(void 0)
this.ensureConfiguration()
if (!started) {
started = true
resolve()
}
})
})
}
private ensureConfiguration(): void {
if (!this.clientHost) return
for (let doc of workspace.documents) {
this.ensureConfigurationForDocument(doc.textDocument)
}
}
public dispose(): void {
disposeAll(this.disposables)
}
public async restart(): Promise<void> {
if (!this.clientHost) return
let client = this.clientHost.serviceClient
await client.restartTsServer()
}
public async stop(): Promise<void> {
if (!this.clientHost) return
this.clientHost.reset()
let client = this.clientHost.serviceClient
await client.stop()
return
}
}