diff --git a/src/app/lsp/codeaction.ts b/src/app/lsp/codeaction.ts index e0e6299..793a848 100644 --- a/src/app/lsp/codeaction.ts +++ b/src/app/lsp/codeaction.ts @@ -2,6 +2,7 @@ import * as lsp from "vscode-languageserver-protocol"; import { StateEffect, StateField } from "@codemirror/state"; import { GutterMarker, ViewPlugin, ViewUpdate } from "@codemirror/view"; import { LSPPlugin, LSPClientExtension } from "@codemirror/lsp-client"; +import { OpenFile } from "../filestate"; type GutterCodeAction = { diff --git a/src/app/lsp/definition.ts b/src/app/lsp/definition.ts index 8342d30..cdbf687 100644 --- a/src/app/lsp/definition.ts +++ b/src/app/lsp/definition.ts @@ -41,10 +41,19 @@ function jumpToOrigin(view: EditorView, type: { get: typeof getDefinition, capab plugin.client.withMapping(mapping => type.get(plugin, view.state.selection.main.head).then(async response => { if (!response) return let loc = Array.isArray(response) ? response[0] : response; + // TODO: deal with special characters in pathname + // (node_modules/@codemirror is %40codemirror) const path = new URL(loc.uri).pathname; const target = addEditor(await OpenFile.openFile(path)); - const pos = mapping.getMapping(loc.uri) ? mapping.mapPosition(loc.uri, loc.range.start) : plugin.fromPosition(loc.range.start, target.view.state.doc); - target.view.dispatch({selection: {anchor: pos}, scrollIntoView: true, userEvent: "select.definition"}); + const pos = mapping.getMapping(loc.uri) + ? mapping.mapPosition(loc.uri, loc.range.start) + : plugin.fromPosition(loc.range.start, target.view.state.doc); + target.view.dispatch({ + selection: {anchor: pos}, + scrollIntoView: true, + userEvent: "select.definition", + }); + setTimeout(() => target.focus(), 0); }, error => plugin.reportError("Find definition failed", error))) return true } diff --git a/src/app/lsp/diagnostics.ts b/src/app/lsp/diagnostics.ts index 6fed573..3c5a650 100644 --- a/src/app/lsp/diagnostics.ts +++ b/src/app/lsp/diagnostics.ts @@ -123,6 +123,7 @@ export function serverDiagnostics(): LSPClientExtension { return false; } + // TODO: add support for DiagnosticRelatedInformation file.setDiagnostics( params.diagnostics.map((item) => ({ from: file.changes.mapPos(