diff --git a/test/ast.xq b/test/ast.xq index 2a27a27..575520b 100644 --- a/test/ast.xq +++ b/test/ast.xq @@ -1,20 +1,10 @@ -import module namespace ast="lsp/ast" at "../webapp/lsp/ast/ast.xqm"; +import module namespace syms="lsp/symbols" at "../webapp/lsp/ast/ast.xqm"; -(: declare variable $file:="sample.docs/pdfbox.xqm"; :) -declare variable $file:="sample.docs/simple.xq"; +declare $file:="C:\Users\mrwhe\git\quodatum\basex-lsp\test\sample.docs\pdfbox.xqm"; -declare variable $A:=doc("sample.docs/parse-pdfbox.xml"); - - -unparsed-text($file) - -=>ast:build() - -update{ - for $e in descendant-or-self::element() +declare variable $A:=doc("C:\Users\mrwhe\git\quodatum\basex-lsp\test\sample.docs\parse-pdfbox.xml"); +$A update{ + for $e in .//element() let $len:=string-length($e) - let $before:=$e/preceding-sibling::node()/string-length()=>sum() - return (insert node attribute len { $len } into $e, - insert node attribute before { $before } into $e - ) -} + return insert node attribute len { $len } into $e +} diff --git a/test/sample.docs/simple.xq b/test/sample.docs/simple.xq deleted file mode 100644 index 86206b4..0000000 --- a/test/sample.docs/simple.xq +++ /dev/null @@ -1,6 +0,0 @@ -(: simple parse test :) -declare function local:print($src as xs:string, $dest as xs:string) -{ - concat($src,"->", $dest) -}; -local:print("sss","bbb") \ No newline at end of file diff --git a/webapp/lsp/ast/ast.xqm b/webapp/lsp/ast/ast.xqm index 58ec031..b731136 100644 --- a/webapp/lsp/ast/ast.xqm +++ b/webapp/lsp/ast/ast.xqm @@ -5,23 +5,14 @@ module namespace ast="lsp/ast"; (: import module namespace p="xq4" at "xq4.xqm"; :) import module namespace xq4="java:quodatum.parser.xq4"; -(:~ build -$opts uri, - abstract:true(), - position: true() -:) -declare function ast:build($text as xs:string,$opts as map(*):={}) +(:~ build :) +declare function ast:build($text as xs:string,$uri as xs:string:="") as element(*){ - let $xml:= xq4:parseModule($text)=>prof:time("⏱️ parseModule " || $opts?uri) - let $res:= if($opts?abstract) - then ast:flatten($xml)=>prof:time("⏱️ abstract ") - else $xml - -let $res:=if($opts?position) - then ast:annotate-with-positions($res)=>prof:time("⏱️ position ") - else $res - -return $res + let $xml:= xq4:parseModule($text)=>prof:time("⏱️ p:parse-Module " || $uri) + return ($xml, + message(ast:report($xml),"REP"), + message(ast:report(ast:flatten($xml)),"flat") + ) }; (:~ @@ -40,82 +31,7 @@ declare function ast:flatten($input as element()) as element() { } }; -declare function ast:add-positions($nodes as node()*, $start-pos as xs:integer) as item()+ { - if (empty($nodes)) then ( - $start-pos, () - ) else ( - let $head := $nodes[1] - let $tail := $nodes[position() > 1] - return - typeswitch($head) - case element() return - let $children := $head/node() - let $child-result := ast:add-positions($children, $start-pos) - let $child-end-pos := $child-result[1] - let $processed-children := subsequence($child-result, 2) - let $element-text := string-join($processed-children ! string(.), "") - let $element-length := string-length($element-text) - let $element-end-pos := - if ($element-length > 0) then $start-pos + $element-length - 1 - else $start-pos - let $tail-result := - if (exists($tail)) then - ast:add-positions($tail, $element-end-pos + 1) - else ( - $element-end-pos + 1, () - ) - let $final-end-pos := $tail-result[1] - let $processed-tail := subsequence($tail-result, 2) - return ( - $final-end-pos, - element {node-name($head)} { - attribute start {$start-pos}, - attribute end {$element-end-pos}, - $processed-children - }, - $processed-tail - ) - case text() return - let $text-length := string-length($head) - let $text-end-pos := - if ($text-length > 0) then $start-pos + $text-length - 1 - else $start-pos - let $tail-result := - if (exists($tail)) then - ast:add-positions($tail, $text-end-pos + 1) - else ( - $text-end-pos + 1, () - ) - let $final-end-pos := $tail-result[1] - let $processed-tail := subsequence($tail-result, 2) - return ( - $final-end-pos, - $head, - $processed-tail - ) - default return - let $tail-result := - if (exists($tail)) then - ast:add-positions($tail, $start-pos) - else ( - $start-pos, () - ) - let $final-end-pos := $tail-result[1] - let $processed-tail := subsequence($tail-result, 2) - return ( - $final-end-pos, - $head, - $processed-tail - ) - ) -}; - -declare function ast:annotate-with-positions($xml as element()) as element() { - let $result := ast:add-positions($xml, 1) - return $result[2] -}; - -(:-------reporting------------------------------------:) +(:-------------------------------------------:) declare function ast:report($el as element(*)) { { diff --git a/webapp/lsp/docs.xqm b/webapp/lsp/docs.xqm index e02b08b..249f00d 100644 --- a/webapp/lsp/docs.xqm +++ b/webapp/lsp/docs.xqm @@ -118,7 +118,7 @@ declare function docs:parse( )as map(*)? { let $text:=docs:get($socket,$file,"textDocument")?text - let $xml:= ast:build($text, {"uri": $file, "abstract":false(), "position":true()}) + let $xml:= ast:build($text, $file) let $diags:=lsp-diags:list($file, $text, $xml)=>prof:time("⏱️ diags " || $file) return ( ws:set($socket,docs:key($socket,$file,"parse"),$xml), diff --git a/webapp/lsp/handlers.xqm b/webapp/lsp/handlers.xqm index 74dcd8d..d1c7076 100644 --- a/webapp/lsp/handlers.xqm +++ b/webapp/lsp/handlers.xqm @@ -7,14 +7,10 @@ module namespace hnd="lsp/handlers"; (:~ structure returned by tree walkers :) declare record hnd:Result( result as item()*, - skipchildren? as xs:boolean:=false(), - extras? + skipchildren? as xs:boolean:=false() ); -declare type hnd:actionFn as fn( - $parse as element(), - $state as hnd:Result -) as hnd:Result; +declare type hnd:actionFn as fn($parse as element(),$state as hnd:Result ) as hnd:Result; declare type hnd:actionMap as map(xs:string,hnd:actionFn); diff --git a/webapp/lsp/jsonrpc.xqm b/webapp/lsp/jsonrpc.xqm index f673186..b69e822 100644 --- a/webapp/lsp/jsonrpc.xqm +++ b/webapp/lsp/jsonrpc.xqm @@ -70,8 +70,7 @@ declare function rpc:send($msg as map(*)) as empty-sequence() { - rpc:admin-log($msg,"⬅️"), - ws:send($msg ,ws:id()) + rpc:admin-log($msg,"⬅️"),ws:send($msg ,ws:id()) }; (:~ canned initialize response :) diff --git a/webapp/lsp/lsp-ws.xqm b/webapp/lsp/lsp-ws.xqm index 312e6bc..378af2d 100644 --- a/webapp/lsp/lsp-ws.xqm +++ b/webapp/lsp/lsp-ws.xqm @@ -35,7 +35,7 @@ function lsp-ws:message( $message as xs:string ) as empty-sequence() { - let $json := rpc:parse($message=>trace("IN: ")) + let $json := rpc:parse($message) return if(exists($json)) then rpc:reply($json) else message($message,"bad RPC: ") diff --git a/webapp/lsp/position.xqm b/webapp/lsp/position.xqm index 3fd4e94..303f8fe 100644 --- a/webapp/lsp/position.xqm +++ b/webapp/lsp/position.xqm @@ -84,14 +84,3 @@ declare function pos:full-range($text as xs:string) as lspt:Range{ lspt:Range(pos:toPosition($text,0), pos:toPosition($text, string-length($text))) }; - -(:~ range for $text from indices:) -declare function pos:range-from-ast( - $ast as element(*), - $text as xs:string) -as lspt:Range{ - lspt:Range( - pos:toPosition($text,number($ast/@start)), - pos:toPosition($text, number($ast/@end)) - ) -}; diff --git a/webapp/lsp/providers/documentSymbols.xqm b/webapp/lsp/providers/documentSymbols.xqm index 1430bd4..7f48006 100644 --- a/webapp/lsp/providers/documentSymbols.xqm +++ b/webapp/lsp/providers/documentSymbols.xqm @@ -51,9 +51,8 @@ declare function syms:FunctionDecl($parse as element(FunctionDecl),$state as hn as hnd:Result{ let $name:=syms:localName($parse/UnreservedFunctionEQName) let $prev:=$state?result[$name eq ?name] - let $range:=pos:range-from-ast($parse,$state?context?text)=>trace("POSSSS") - let $full-range:=$range - let $sym:=lspt:DocumentSymbol($name,$lspt:SymbolKindMap('Method'),$range,$full-range,"FUN") + let $range:=lspt:Range(lspt:Position(0,0),lspt:Position(0,3)) + let $sym:=lspt:DocumentSymbol($name,$lspt:SymbolKindMap('Method'),$range,$range,"FUN") return ($state?result,$sym)=>hnd:Result(true()) }; diff --git a/webapp/static/clients/codemirror/grail.html b/webapp/static/clients/codemirror/grail.html index d815632..9b74b73 100644 --- a/webapp/static/clients/codemirror/grail.html +++ b/webapp/static/clients/codemirror/grail.html @@ -1,5 +1,5 @@ - +
@@ -8,14 +8,8 @@ - - - - - - + + @@ -33,7 +27,7 @@