Skip to content

Commit

Permalink
feat: add rename, highlight, link and codeAction providers
Browse files Browse the repository at this point in the history
  • Loading branch information
NGPixel committed Mar 16, 2024
1 parent 583612f commit ec716e4
Show file tree
Hide file tree
Showing 3 changed files with 187 additions and 0 deletions.
15 changes: 15 additions & 0 deletions src-electron/lsp.js
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,21 @@ export default {
this.registeredCapabilities.push(...params.registrations)
console.log(ansicolor.yellow('<<< INCOMING - REGISTER CAPABILITY <<< ') + params.registrations?.map(r => r.method).join(', '))
return {}
} else if (method === 'workspace/configuration') {
const confArray = []
for (const item of params.items) {
switch (item.section) {
case 'xml.format.insertSpaces': {
confArray.push(true)
break
}
case 'xml.format.tabSize': {
confArray.push(2)
break
}
}
}
return confArray
} else {
console.warn(ansicolor.red(`Unexpected LSP request: ${method} -> ${JSON.stringify(params)}`))
return null
Expand Down
19 changes: 19 additions & 0 deletions src/helpers/lsp.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,25 @@ export function convertLSPSeverityToMonaco (severity) {
}
}

/**
* Converts a Monaco severity value to an LSP severity value.
*
* @param {number} severity - The Monaco severity value.
* @returns {number} The corresponding LSP severity value.
*/
export function convertMonacoSeverityToLSP (severity) {
switch (severity) {
case monaco.MarkerSeverity.Error:
return 1
case monaco.MarkerSeverity.Warning:
return 2
case monaco.MarkerSeverity.Info:
return 3
default:
return 4
}
}

/**
* Convert a range from LSP server to Monaco editor range
*
Expand Down
153 changes: 153 additions & 0 deletions src/pages/EditorMain.vue
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,156 @@ monaco.languages.registerDocumentRangeFormattingEditProvider('xmlrfc', {
}
})
monaco.languages.registerRenameProvider('xmlrfc', {
provideRenameEdits: async (model, pos, newName, cancelToken) => {
const renameInfo = await window.ipcBridge.lspSendRequest('textDocument/rename', {
textDocument: {
uri: model.uri.toString()
},
position: {
line: pos.lineNumber - 1,
character: pos.column - 1
},
newName
})
if (renameInfo.documentChanges?.length > 0) {
return {
edits: renameInfo.documentChanges[0].edits.map(edit => ({
resource: model.uri,
textEdit: {
text: edit.newText,
range: {
endColumn: edit.range.end.character + 1,
endLineNumber: edit.range.end.line + 1,
startColumn: edit.range.start.character + 1,
startLineNumber: edit.range.start.line + 1
}
},
versionId: renameInfo.documentChanges[0].textDocument.version
}))
}
}
}
})
monaco.languages.registerDocumentHighlightProvider('xmlrfc', {
provideDocumentHighlights: async (model, pos, cancelToken) => {
const highlightInfo = await window.ipcBridge.lspSendRequest('textDocument/documentHighlight', {
textDocument: {
uri: model.uri.toString()
},
position: {
line: pos.lineNumber - 1,
character: pos.column - 1
}
})
return highlightInfo.map(hl => ({
kind: hl.kind + 1,
range: {
endColumn: hl.range.end.character + 1,
endLineNumber: hl.range.end.line + 1,
startColumn: hl.range.start.character + 1,
startLineNumber: hl.range.start.line + 1
}
}))
}
})
monaco.languages.registerLinkProvider('xmlrfc', {
provideLinks: async (model, cancelToken) => {
const linksInfo = await window.ipcBridge.lspSendRequest('textDocument/documentLink', {
textDocument: {
uri: model.uri.toString()
}
})
return {
links: linksInfo.map(lnk => ({
url: lnk.target,
range: {
endColumn: lnk.range.end.character + 1,
endLineNumber: lnk.range.end.line + 1,
startColumn: lnk.range.start.character + 1,
startLineNumber: lnk.range.start.line + 1
},
...(lnk.tooltip && { tooltip: lnk.tooltip })
}))
}
}
})
monaco.languages.registerCodeActionProvider('xmlrfc', {
provideCodeActions: async (model, range, ctx, cancelToken) => {
const codeActionsInfo = await window.ipcBridge.lspSendRequest('textDocument/codeAction', {
textDocument: {
uri: model.uri.toString()
},
range: {
start: {
line: range.startLineNumber - 1,
character: range.startColumn - 1
},
end: {
line: range.endLineNumber - 1,
character: range.endColumn - 1
}
},
context: {
diagnostics: ctx.markers.map(m => ({
code: m.code,
message: m.message,
range: {
start: {
line: m.startLineNumber - 1,
character: m.startColumn - 1
},
end: {
line: m.endLineNumber - 1,
character: m.endColumn - 1
}
},
severity: lspHelpers.convertMonacoSeverityToLSP(m.severity),
source: m.source,
tags: m.tags
})),
only: ctx.only,
triggerKind: ctx.trigger
}
})
return {
actions: codeActionsInfo.map(c => ({
diagnostics: c.diagnostics.map(d => ({
code: d.code,
message: d.message,
severity: lspHelpers.convertLSPSeverityToMonaco(d.severity),
source: d.source,
endColumn: d.range.end.character + 1,
endLineNumber: d.range.end.line + 1,
startColumn: d.range.start.character + 1,
startLineNumber: d.range.start.line + 1
})),
edit: {
edits: c.edit.documentChanges[0].edits.map(edit => ({
resource: model.uri,
textEdit: {
text: edit.newText,
range: {
endColumn: edit.range.end.character + 1,
endLineNumber: edit.range.end.line + 1,
startColumn: edit.range.start.character + 1,
startLineNumber: edit.range.start.line + 1
}
},
versionId: c.edit.documentChanges[0].textDocument?.version
}))
},
kind: c.kind,
title: c.title
})),
dispose () { }
}
}
})
// monaco.languages.registerHoverProvider('xmlrfc', {
// provideHover: async (model, pos, cancelToken) => {
// const hoverInfo = await window.ipcBridge.lspSendRequest('textDocument/hover', {
Expand Down Expand Up @@ -485,6 +635,9 @@ function docOpenFinished (doc) {
}
}
})
// const banner = document.createElement('div')
// banner.innerHTML = 'TEST!'
// editor.setBanner(banner, 50)
}
function handleEditorActions (evt, action) {
Expand Down

0 comments on commit ec716e4

Please sign in to comment.