From 6829f17673abc54462aef600c0b46abc37fa1eca Mon Sep 17 00:00:00 2001 From: Andy Bunce Date: Tue, 19 Aug 2025 15:20:44 +0100 Subject: [PATCH] [fix] diag msg --- docs/explore.xqbk | 2 +- webapp/lsp/lsp-diags.xqm | 47 ++++++++++++---------- webapp/lsp/position.xqm | 8 ++-- webapp/static/clients/codemirror/script.js | 7 ++-- 4 files changed, 36 insertions(+), 28 deletions(-) diff --git a/docs/explore.xqbk b/docs/explore.xqbk index 88d5072..296f23f 100644 --- a/docs/explore.xqbk +++ b/docs/explore.xqbk @@ -1 +1 @@ -{"cells":[{"kind":2,"language":"xquery","value":"(:<:)\r\n\r\nimport module namespace docs=\"lsp/docs\" at \"/srv/basex/webapp/lsp/docs.xqm\";"},{"kind":2,"language":"xquery","value":"ws:ids()"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"textDocument\")\r\nreturn map:put($t,\"text\",substring($t?text,1,15))"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"parse\")\r\nreturn $t/self::ERROR"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"textDocument\")\r\nreturn $t"}]} \ No newline at end of file +{"cells":[{"kind":2,"language":"xquery","value":"(:<:)\r\n\r\nimport module namespace docs=\"lsp/docs\" at \"/srv/basex/webapp/lsp/docs.xqm\";"},{"kind":2,"language":"xquery","value":"ws:ids()"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"textDocument\")\r\nreturn $t"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"parse\")\r\nreturn $t/self::ERROR"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"textDocument\")\r\nreturn $t"}]} \ No newline at end of file diff --git a/webapp/lsp/lsp-diags.xqm b/webapp/lsp/lsp-diags.xqm index 2c5f49a..6f18ccb 100644 --- a/webapp/lsp/lsp-diags.xqm +++ b/webapp/lsp/lsp-diags.xqm @@ -17,7 +17,7 @@ declare record lsp-diags:nostic( range as pos:Range, severity as xs:integer, (: enum('error', 'hint', 'info', 'warning') :) message as xs:string, - code as xs:string, + code? as xs:string, source as xs:string:="xquery" ); @@ -33,11 +33,11 @@ declare function lsp-diags:publish( $text as xs:string, $xml as lsp-diags:ParseResult) as map(*){ -let $_:=trace($xml,"PABLISH ") + let $diagnostics:=if($xml/self::ERROR) then array{lsp-diags:parse-error($text, $xml)} else array{ lsp-diags:parse-xquery($text,$xml)} -let $_:=trace($diagnostics,"PIBLISH ") + return {"jsonrpc": "2.0", "method":"textDocument/publishDiagnostics", "params":{"uri": $uri, "diagnostics": $diagnostics} @@ -50,25 +50,30 @@ let $_:=trace($diagnostics,"PIBLISH ") :) declare function lsp-diags:parse-error($text as xs:string, $xml as element(ERROR)) as map(*)*{ -let $dmesg:=$xml/string()=>trace("parse-error") -let $dmesg:=translate($dmesg," ",";") -let $b:=number($xml/@b)-1 -let $e:= number($xml/@e)-1 -let $last:= string-length($text)-1 -return ( + + if(string-length($text) gt 0) + then let $last:= max((0,string-length($text)-1)) + let $dmesg:=$xml/string()=>trace("parse-error") + let $dmesg:=translate($dmesg," ",";") + let $b:=number($xml/@b)-1 + let $e:= number($xml/@e)-1 + return ( + (: mark error :) + lsp-diags:nostic(pos:Range(pos:toPosition($text, $b), + pos:toPosition($text, min(($e,$last)))), + 1, + $dmesg,'XPST0003'), -lsp-diags:nostic(pos:Range(pos:toPosition($text, $b), - pos:toPosition($text, min(($e,$last)))), - 1, - $dmesg,'XPST0003'), -if($e ge string-length($text)) -then () -else lsp-diags:nostic(pos:Range(pos:toPosition($text, $e +1 ), - pos:toPosition($text, $last)), - 2, - "Unparsed due to previous parser error.", - "XQLT0001") -) + (:mark after error:) + if($e ge string-length($text)) + then () + else lsp-diags:nostic(pos:Range(pos:toPosition($text, $e +1 ), + pos:toPosition($text, $last)), + 2, + "Unparsed due to previous parser error.", + "XQLT0001") + ) + else () }; (: test data :) diff --git a/webapp/lsp/position.xqm b/webapp/lsp/position.xqm index 68abf2c..4b8ec05 100644 --- a/webapp/lsp/position.xqm +++ b/webapp/lsp/position.xqm @@ -1,5 +1,5 @@ (:~ -text editing API +positions in text :) module namespace pos="lsp/position"; @@ -89,6 +89,8 @@ as xs:integer return $s?max }; -declare function pos:ln-col($pos as pos:Position){ - `Ln { $pos?line}, Col { $pos?character}` +(:~ position text for display :) +declare function pos:ln-col($pos as pos:Position,$offset as xs:integer:=1) +{ + `Ln { $pos?line + $offset}, Col { $pos?character + $offset}` }; \ No newline at end of file diff --git a/webapp/static/clients/codemirror/script.js b/webapp/static/clients/codemirror/script.js index a44da73..3601571 100644 --- a/webapp/static/clients/codemirror/script.js +++ b/webapp/static/clients/codemirror/script.js @@ -56,7 +56,8 @@ document.getElementById("load").onchange = e => { insert: t } }) - console.log("SYNC") + client.sync(); + console.log("SYNC"); }); document.getElementById("load").value=""; }; @@ -104,11 +105,11 @@ function diags(params){ const severities=["error","warning" ,"info","hint" ] // const diagnostics = params.diagnostics - .map(({ range, message, severity }) => ({ + .map(({ range, message, severity,code }) => ({ from: plugin.fromPosition( range.start,view.state.doc), to: plugin.fromPosition( range.end,view.state.doc), severity: severities[severity -1], - message, + message: ((typeof code === 'undefined')?"":`[${code}] `)+message, })) .filter( ({ from, to }) =>