basex-lsp/webapp/lsp/providers/diagnostics.xqm
2025-10-05 16:18:40 +01:00

74 lines
3.1 KiB
Text
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

module namespace lsp-diags = 'lsp-diags';
(:~ codemirror
from: number The start position of the relevant text.
to: number The end position. May be equal to from, though actually covering text is preferable.
severity: "error" | "hint" | "info" | "warning" The severity of the problem. This will influence how it is displayed.
markClass?: string When given, add an extra CSS class to parts of the code that this diagnostic applies to.
source?: string An optional source string indicating where the diagnostic is coming from. You can put the name of your linter here, if applicable.
message: string The message associated with this diagnostic.
renderMessage?: fn(view: EditorView) → Node An optional custom rendering function that displays the message as a DOM node.
actions?: readonly Action[] An optional array of actions that can be taken on this diagnostic.
:)
import module namespace lspt = 'lsp-typedefs' at "../lsp-typedefs.xqm";
import module namespace pos="lsp/position" at "../position.xqm";
declare type lsp-diags:ParseResult as element(Module|ERROR);
declare function lsp-diags:list(
$uri as xs:string,
$text as xs:string,
$xml as lsp-diags:ParseResult)
as map(*)*{
if($xml/self::ERROR)
then lsp-diags:parse-error($text, $xml)
else lsp-diags:parse-xquery($text,$xml)
};
(:~
<ERROR b="10819" e="10820" o="234" s="43">syntax error, found '}' while expecting [S,'else'] at line 290, column 'XPST0003', 'parse error'
'XQLT0001', 'previous parse error'
:)
declare function lsp-diags:parse-error($text as xs:string, $xml as element(ERROR))
as map(*)*{
if(string-length($text) gt 0)
then let $last:= string-length($text)-1
let $dmesg:=$xml/string()=>trace("parse-error")
let $dmesg:=translate($dmesg,"&#10;",";")
let $b:=number($xml/@b)-1
let $e:= number($xml/@e)-1
return (
(: mark error :)
lspt:Diagnostic(lspt:Range(pos:toPosition($text, $b),
pos:toPosition($text, $e)),
1,
$dmesg,'XPST0003'),
(:mark after error:)
if($e ge string-length($text))
then ()
else lspt:Diagnostic(lspt:Range(pos:toPosition($text, $e +1 ),
pos:toPosition($text, $last)),
2,
"Unparsed due to previous parser error.",
"XQLT0001")
)
else ()
};
(: test data :)
declare function lsp-diags:parse-xquery($text as xs:string, $xml as element(Module))
as map(*)*{
(: lsp-diags:nostic(pos:Range(pos:Position(0,0), pos:Position(0, 5)),
$lsp-diags:severities('error'),"error"),
lsp-diags:nostic(pos:Range(pos:Position(1,0), pos:Position(1,5)),
$lsp-diags:severities('warning'),"warning"),
lsp-diags:nostic(pos:Range(pos:Position(2,0), pos:Position(2, 5)),
$lsp-diags:severities('info'),"info"),
lsp-diags:nostic(pos:Range(pos:Position(3,0), pos:Position(3, 6)),
$lsp-diags:severities('hint'), "hint") :)
};