basex-lsp/webapp/lsp/handlers.xqm
2025-09-11 12:46:17 +01:00

58 lines
1.3 KiB
Text

(: tools to analyse xml parse tree
@author Andy Bunce
:)
module namespace hnd="lsp/handlers";
import module namespace pos="lsp/position" at "position.xqm";
declare record hnd:hand(
result as item()*,
skipchildren as xs:boolean
);
declare function hnd:default-handler($el as element(*),$state)
as function(*){
fn(){hnd:hand($state,false())}
};
declare function hnd:get-handler($el as element(*),$state)
as function(*)
{ function-lookup(xs:QName(name($el)),2)
otherwise hnd:default-handler($el,$state)
};
declare function hnd:diags($parse as element(),$diags:=())
{
let $_:=trace(($parse,$diags),"diags")
let $h:= hnd:get-handler($parse,$diags)
let $walk:=$h($parse,$diags)
return if($walk?skipchildren)
then $walk?result
else fold-left($parse/*,$diags,
fn($r,$this){
hnd:diags($this,$r)
})
};
declare record hnd:symbol (
name as xs:string,
type as xs:string,
range-name? as pos:Range,
range-full? as pos:Range,
children? as array(hnd:symbol)
);
declare function hnd:symbols($parse as element(),$syms as hnd:symbol* :=() )
{
'todo'
};
declare function hnd:anotated-declaration($parse as element(),$syms)
as hnd:hand
{
let $sym:=hnd:symbol(
$parse/token,
"AA"
)
return hnd:hand(($syms,$sym),true())
};