From 9894581d195c9d49aa97b1f44c606f1b94dfd5e3 Mon Sep 17 00:00:00 2001 From: Andy Bunce Date: Fri, 10 Oct 2025 15:39:51 +0100 Subject: [PATCH] [mod] better completion info --- test/completion.xq | 2 +- webapp/lsp/etc/capabilities.json | 2 +- webapp/lsp/lsp-text.xqm | 15 +++++---------- webapp/lsp/lsp-typedefs.xqm | 15 ++++++++++++++- webapp/lsp/providers/completions.xqm | 16 ++++++++++------ webapp/lsp/providers/hover.xqm | 12 ++++++++++++ 6 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 webapp/lsp/providers/hover.xqm diff --git a/test/completion.xq b/test/completion.xq index 288baf7..65b4ad9 100644 --- a/test/completion.xq +++ b/test/completion.xq @@ -4,4 +4,4 @@ declare variable $src:="sample.docs/parse-pdfbox.xml"; declare variable $parse:=doc($src)/*; let $context:= {"triggerCharacter":":","triggerKind":2.0e0} -return comp:list($context ) +return comp:dummy($context )=>array:build() diff --git a/webapp/lsp/etc/capabilities.json b/webapp/lsp/etc/capabilities.json index ba6a2d3..d1952c4 100644 --- a/webapp/lsp/etc/capabilities.json +++ b/webapp/lsp/etc/capabilities.json @@ -13,7 +13,7 @@ } ] }, - "hoverProvider": true, + "hoverProvider": false, "documentSymbolProvider": true, "documentRangeFormattingProvider": false, "colorProvider": false, diff --git a/webapp/lsp/lsp-text.xqm b/webapp/lsp/lsp-text.xqm index df08a4b..9c44306 100644 --- a/webapp/lsp/lsp-text.xqm +++ b/webapp/lsp/lsp-text.xqm @@ -9,6 +9,7 @@ import module namespace lspt = 'lsp-typedefs' at 'lsp-typedefs.xqm'; import module namespace pos="lsp/position" at "position.xqm"; import module namespace syms="lsp/symbols" at "providers/documentSymbols.xqm"; import module namespace comp = 'lsp-completions' at "providers/completions.xqm"; +import module namespace hov = 'lsp-hover' at "providers/hover.xqm"; declare variable $lsp-text:methods:=map{ "textDocument/didOpen": lsp-text:didOpen#1, @@ -30,14 +31,8 @@ as map(*) { let $pos:=$json?params?position let $uri:= $json?params?textDocument?uri - let $word:="TODO" - let $r:= [ -`Hover { pos:ln-col($pos) }, uri: {$uri}, -[path](https://quodatum.github.io/basex-xqparse/i-BaseX.xhtml#EQName) - -WordAt: {$word}` - ] -return rpc:result($json,{"contents":$r}) + let $r:=hov:list($uri,$pos) +return rpc:result($json,{"contents":array:build($r)}) }; (:~ symbols :) @@ -57,8 +52,8 @@ as map(*)? { let $doc:=$json?params?textDocument?uri let $context:=$json?params?context (:{"triggerCharacter":":","triggerKind":2.0e0}:) - let $result:=comp:dummy($context)=>array:build() - return rpc:result($json,$result) + let $result:=comp:dummy($context) + return rpc:result($json,array:build($result)) }; declare diff --git a/webapp/lsp/lsp-typedefs.xqm b/webapp/lsp/lsp-typedefs.xqm index aebced9..a3036c4 100644 --- a/webapp/lsp/lsp-typedefs.xqm +++ b/webapp/lsp/lsp-typedefs.xqm @@ -339,5 +339,18 @@ export interface CompletionItem { :) declare record lspt:CompletionItem( label as xs:string, - kind? as lspt:CompletionItemKind + kind? as lspt:CompletionItemKind, + tags? as xs:string* :=(), + detail? as xs:string, + documentation? as (xs:string|lspt:MarkupContent) +); + + +declare type lspt:MarkupKind as enum('plaintext' , 'markdown'); +(: A `MarkupContent` literal represents a string value which content is + * interpreted base on its kind flag. + :) +declare record lspt:MarkupContent( + kind as lspt:MarkupKind, + value as xs:string ); \ No newline at end of file diff --git a/webapp/lsp/providers/completions.xqm b/webapp/lsp/providers/completions.xqm index f5d0b0b..965d02e 100644 --- a/webapp/lsp/providers/completions.xqm +++ b/webapp/lsp/providers/completions.xqm @@ -10,10 +10,14 @@ as lspt:CompletionItem*{ declare function comp:dummy($context as map(*)) as lspt:CompletionItem*{ - - message($context,"context: "), - map:for-each($lspt:CompletionItemKindMap, - fn($k,$v){ - lspt:CompletionItem($k,$v) - }) + message($context,"context: "), + map:for-each( + $lspt:CompletionItemKindMap, + fn($k,$v){ + let $d:=lspt:MarkupContent( + 'markdown', + '[path](https://quodatum.github.io/basex-xqparse/i-BaseX.xhtml#EQName)' + ) + return lspt:CompletionItem($k,$v,detail:="detail",documentation:=$d) + }) }; \ No newline at end of file diff --git a/webapp/lsp/providers/hover.xqm b/webapp/lsp/providers/hover.xqm new file mode 100644 index 0000000..5b239e9 --- /dev/null +++ b/webapp/lsp/providers/hover.xqm @@ -0,0 +1,12 @@ +module namespace hov = 'lsp-hover'; +import module namespace lspt = 'lsp-typedefs' at "../lsp-typedefs.xqm"; +import module namespace pos="lsp/position" at "../position.xqm"; + +declare function hov:list($uri, $pos as map(*)) +as xs:string*{ +let $word:="TODO" +return `Hover { pos:ln-col($pos) }, uri: {$uri}, +[path](https://quodatum.github.io/basex-xqparse/i-BaseX.xhtml#EQName) + +WordAt: {$word}` +}; \ No newline at end of file