Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
let pos: Position = insertLeave ? { line: position.line + 1, character: 0 } : position
try {
let edits = await languages.provideDocumentOntTypeEdits(ch, doc.textDocument, pos)
// changed by other process
if (doc.changedtick != changedtick) return
if (insertLeave) {
edits = edits.filter(edit => {
return edit.range.start.line < position.line + 1
})
}
if (edits && edits.length) {
await doc.applyEdits(this.nvim, edits)
let newLine = doc.getline(position.line)
if (newLine.length > origLine.length) {
let character = position.character + (newLine.length - origLine.length)
await workspace.moveTo(Position.create(position.line, character))
}
}
} catch (e) {
if (!/timeout\s/.test(e.message)) {
console.error(`Error on formatOnType: ${e.message}`) // tslint:disable-line
}
}
}
let { id } = service
if (!id) logger.error('invalid service configuration. ', service.name)
if (this.registered.get(id)) return
this.registered.set(id, service)
logger.info(`registered service "${id}"`)
if (this.shouldStart(service)) {
service.start() // tslint:disable-line
}
if (service.state == ServiceStat.Running) {
this.emit('ready', id)
}
service.onServiceReady(() => {
logger.info(`service ${id} started`)
this.emit('ready', id)
}, null, this.disposables)
return Disposable.create(() => {
service.stop()
service.dispose()
this.registered.delete(id)
})
}
private async applyTextEdit(item: CompletionItem, option: CompleteOption): Promise {
let { nvim } = this
let { textEdit } = item
if (!textEdit) return false
let { line, bufnr, linenr } = option
let doc = workspace.getDocument(bufnr)
if (!doc) return false
let { range, newText } = textEdit
let isSnippet = item.insertTextFormat === InsertTextFormat.Snippet
// replace inserted word
let start = line.substr(0, range.start.character)
let end = line.substr(range.end.character)
if (isSnippet) {
await doc.applyEdits(nvim, [{
range: Range.create(linenr - 1, 0, linenr, 0),
newText: `${start}${end}\n`
}])
// can't select, since additionalTextEdits would break selection
let pos = Position.create(linenr - 1, range.start.character)
return await snippetManager.insertSnippet(newText, false, Range.create(pos, pos))
}
let newLines = `${start}${newText}${end}`.split('\n')
if (newLines.length == 1) {
await nvim.call('coc#util#setline', [linenr, newLines[0]])
await workspace.moveTo(Position.create(linenr - 1, (start + newText).length))
} else {
let buffer = nvim.createBuffer(bufnr)
await buffer.setLines(newLines, {
start: linenr - 1,
end: linenr,
strictIndexing: false
if (!textEdit) return false
let { line, bufnr, linenr } = option
let doc = workspace.getDocument(bufnr)
if (!doc) return false
let { range, newText } = textEdit
let isSnippet = item.insertTextFormat === InsertTextFormat.Snippet
// replace inserted word
let start = line.substr(0, range.start.character)
let end = line.substr(range.end.character)
if (isSnippet) {
await doc.applyEdits(nvim, [{
range: Range.create(linenr - 1, 0, linenr, 0),
newText: `${start}${end}\n`
}])
// can't select, since additionalTextEdits would break selection
let pos = Position.create(linenr - 1, range.start.character)
return await snippetManager.insertSnippet(newText, false, Range.create(pos, pos))
}
let newLines = `${start}${newText}${end}`.split('\n')
if (newLines.length == 1) {
await nvim.call('coc#util#setline', [linenr, newLines[0]])
await workspace.moveTo(Position.create(linenr - 1, (start + newText).length))
} else {
let buffer = nvim.createBuffer(bufnr)
await buffer.setLines(newLines, {
start: linenr - 1,
end: linenr,
strictIndexing: false
})
let line = linenr - 1 + newLines.length - 1
let character = newLines[newLines.length - 1].length - end.length
await workspace.moveTo({ line, character })
// replace inserted word
let start = line.substr(0, range.start.character)
let end = line.substr(range.end.character)
if (isSnippet) {
await doc.applyEdits(nvim, [{
range: Range.create(linenr - 1, 0, linenr, 0),
newText: `${start}${end}\n`
}])
// can't select, since additionalTextEdits would break selection
let pos = Position.create(linenr - 1, range.start.character)
return await snippetManager.insertSnippet(newText, false, Range.create(pos, pos))
}
let newLines = `${start}${newText}${end}`.split('\n')
if (newLines.length == 1) {
await nvim.call('coc#util#setline', [linenr, newLines[0]])
await workspace.moveTo(Position.create(linenr - 1, (start + newText).length))
} else {
let buffer = nvim.createBuffer(bufnr)
await buffer.setLines(newLines, {
start: linenr - 1,
end: linenr,
strictIndexing: false
})
let line = linenr - 1 + newLines.length - 1
let character = newLines[newLines.length - 1].length - end.length
await workspace.moveTo({ line, character })
}
return false
}
public async showSignatureHelp(): Promise {
if (this.signatureTokenSource) {
this.signatureTokenSource.cancel()
this.signatureTokenSource.dispose()
this.signatureTokenSource = null
}
let document = workspace.getDocument(workspace.bufnr)
if (!document) return
let position = await workspace.getCursorPosition()
let part = document.getline(position.line).slice(0, position.character)
if (/\)\s*$/.test(part)) return
let idx = Math.max(part.lastIndexOf(','), part.lastIndexOf('('))
if (idx != -1) position.character = idx + 1
let tokenSource = this.signatureTokenSource = new CancellationTokenSource()
let token = tokenSource.token
let timer = setTimeout(() => {
if (!token.isCancellationRequested) {
tokenSource.cancel()
}
}, 3000)
let signatureHelp = await languages.getSignatureHelp(document.textDocument, position, token)
clearTimeout(timer)
if (token.isCancellationRequested || !signatureHelp || signatureHelp.signatures.length == 0) {
this.signatureFactory.close()
return
}
let { activeParameter, activeSignature, signatures } = signatureHelp
if (activeSignature) {
// make active first
let [active] = signatures.splice(activeSignature, 1)
public async onPumChange(ev: PopupChangeEvent): Promise {
if (!this.activated) return
if (this.document && this.document.uri.endsWith('%5BCommand%20Line%5D')) return
this.cancel()
let { completed_item, col, row, height, width, scrollbar } = ev
let bounding: PumBounding = { col, row, height, width, scrollbar }
this.currItem = completed_item.hasOwnProperty('word') ? completed_item : null
// it's pum change by vim, ignore it
if (this.lastInsert) return
let resolvedItem = this.getCompleteItem(completed_item)
if (!resolvedItem) {
this.floating.close()
return
}
let source = this.resolveTokenSource = new CancellationTokenSource()
let { token } = source
await sources.doCompleteResolve(resolvedItem, token)
if (token.isCancellationRequested) return
let docs = resolvedItem.documentation
if (!docs && resolvedItem.info) {
let { info } = resolvedItem
let isText = /^[\w-\s.,\t]+$/.test(info)
docs = [{ filetype: isText ? 'txt' : this.document.filetype, content: info }]
}
if (!docs || docs.length == 0) {
this.floating.close()
} else {
if (token.isCancellationRequested) return
await this.floating.show(docs, bounding, token)
}
this.resolveTokenSource = null
public async applyEdits(_nvim: Neovim, edits: TextEdit[], sync = true): Promise {
if (edits.length == 0) return
let orig = this.lines.join('\n') + (this.eol ? '\n' : '')
let textDocument = TextDocument.create(this.uri, this.filetype, 1, orig)
let content = TextDocument.applyEdits(textDocument, edits)
// could be equal sometimes
if (orig === content) {
this.createDocument()
} else {
let d = diffLines(orig, content)
await this.buffer.setLines(d.replacement, {
start: d.start,
end: d.end,
strictIndexing: false
})
// can't wait vim sync buffer
this.lines = (this.eol && content.endsWith('\n') ? content.slice(0, -1) : content).split('\n')
if (sync) this.forceSync()
}
}
fixId: tsAction.fixId
}
try {
const res = await this.client.execute('getCombinedCodeFix', args, CancellationToken.None)
if (res.type != 'response') {
return
}
let { body } = res
const edit = typeConverters.WorkspaceEdit.fromFileCodeEdits(
this.client,
body.changes
)
await workspace.applyEdit(edit)
const token = CancellationToken.None
const { commands } = body
if (commands && commands.length) {
for (const command of commands) {
await this.client.execute('applyCodeActionCommand', { command }, token)
}
}
} catch {
// noop
}
}
}
}
lines.push(...content.trim().split('\n'))
docs.push({ filetype: item.language, content: item.value })
}
}
} else if (typeof contents == 'string') {
lines.push(...contents.split('\n'))
docs.push({ content: contents, filetype: 'markdown' })
} else if (MarkedString.is(contents)) { // tslint:disable-line
let content = contents.value.trim()
if (target == 'preview') {
content = '``` ' + contents.language + '\n' + content + '\n```'
}
lines.push(...content.split('\n'))
docs.push({ filetype: contents.language, content: contents.value })
} else if (MarkupContent.is(contents)) {
lines.push(...contents.value.split('\n'))
docs.push({ filetype: contents.kind == 'markdown' ? 'markdown' : 'txt', content: contents.value })
}
i++
}
if (target == 'echo') {
const msg = lines.join('\n').trim()
if (msg.length) {
await this.nvim.call('coc#util#echo_hover', msg)
}
} else if (target == 'float') {
diagnosticManager.hideFloat()
await this.hoverFactory.create(docs)
} else {
this.documentLines = lines
let arr = await this.nvim.call('getcurpos') as number[]