[mod] clean up tree walk
This commit is contained in:
parent
3465a751bb
commit
e38385b593
8 changed files with 66 additions and 89 deletions
76
webapp/lsp/providers/diagnostics.xqm
Normal file
76
webapp/lsp/providers/diagnostics.xqm
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
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," ",";")
|
||||
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") :)
|
||||
|
||||
};
|
||||
44
webapp/lsp/providers/documentSymbols.xqm
Normal file
44
webapp/lsp/providers/documentSymbols.xqm
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
xquery version '4.0';
|
||||
(:~ Symbols from walking the parse tree :)
|
||||
module namespace syms="lsp/symbols";
|
||||
import module namespace hnd="lsp/handlers" at "../handlers.xqm";
|
||||
import module namespace lspt = 'lsp-typedefs' at "../lsp-typedefs.xqm";
|
||||
|
||||
declare function syms:list($parse as element(),$syms as lspt:DocumentSymbol* :=() )
|
||||
{
|
||||
let $actions as hnd:actionMap :={
|
||||
"ContextValueDecl": syms:action#2,
|
||||
"VarDecl": syms:VarDecl#2,
|
||||
"FunctionDecl": syms:FunctionDecl#2,
|
||||
"ItemTypeDecl": syms:action#2,
|
||||
"NamedRecordTypeDecl": syms:action#2
|
||||
}
|
||||
let $state:= hnd:Result(())
|
||||
let $result:= hnd:walk($parse,$actions,$state)
|
||||
return $result?result
|
||||
};
|
||||
|
||||
declare function syms:action($parse as element(),$state as hnd:Result )
|
||||
as hnd:Result{
|
||||
hnd:Result($state?result,true()) ,message(name($parse),"ACTION: ")
|
||||
};
|
||||
|
||||
declare function syms:VarDecl($parse as element(VarDecl),$state as hnd:Result )
|
||||
as hnd:Result{
|
||||
let $name:=$parse/VarNameAndType/EQName
|
||||
let $length:=string($parse)=>string-length()
|
||||
let $range:=lspt:Range(lspt:Position(0,0),lspt:Position(0,3))
|
||||
let $sym:=lspt:DocumentSymbol($name,$lspt:SymbolKindMap('Variable'),$range,$range,"TODO")
|
||||
return ($state?result,$sym)=>hnd:Result(true())
|
||||
};
|
||||
|
||||
declare function syms:FunctionDecl($parse as element(FunctionDecl),$state as hnd:Result )
|
||||
as hnd:Result{
|
||||
let $name:=$parse/UnreservedFunctionEQName
|
||||
let $range:=lspt:Range(lspt:Position(0,0),lspt:Position(0,3))
|
||||
let $sym:=lspt:DocumentSymbol($name,$lspt:SymbolKindMap('Method'),$range,$range,"TODO")
|
||||
return ($state?result,$sym)=>hnd:Result(true())
|
||||
};
|
||||
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue