92 lines
No EOL
3.8 KiB
Text
92 lines
No EOL
3.8 KiB
Text
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 hnd="lsp/handlers" at "../handlers.xqm";
|
||
import module namespace pos="lsp/position" at "../position.xqm";
|
||
|
||
declare type lsp-diags:ParseResult as element(Module|ERROR);
|
||
|
||
declare variable $lsp-diags:actions as hnd:actionMap :={
|
||
"Module": lsp-diags:Module#2
|
||
};
|
||
|
||
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 lspt:Diagnostic*
|
||
{
|
||
if(string-length($text) eq 0)
|
||
then ()
|
||
else let $last:= 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 :)
|
||
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")
|
||
)
|
||
};
|
||
|
||
(: test data :)
|
||
declare function lsp-diags:parse-xquery($text as xs:string, $parse as element(Module))
|
||
as map(*)*{
|
||
let $state:= hnd:Result(())
|
||
let $result:= hnd:walk($parse,$lsp-diags:actions,$state)
|
||
return $result?result
|
||
};
|
||
|
||
declare function lsp-diags:Module($parse as element(Module),$state as hnd:Result )
|
||
as hnd:Result{
|
||
let $new:=if(exists($parse/VersionDecl)=>trace("has ver: "))
|
||
then ()
|
||
else let $text:="dddjjjjjjjjjjjjjjjj"
|
||
let $e:=1
|
||
let $last:=8
|
||
return lspt:Diagnostic(lspt:Range(
|
||
pos:toPosition($text, 1 ),
|
||
pos:toPosition($text, 1)
|
||
),
|
||
$lspt:SeverityKind?info,
|
||
"No XQuery version declaration present",
|
||
"XQLT???")
|
||
return (
|
||
hnd:Result(($state?result,$new=>trace(" VER ")),true())
|
||
,message(name($parse),"Module: ")
|
||
)
|
||
}; |