[fix] positions
This commit is contained in:
parent
1483a807f4
commit
77bc1e524c
5 changed files with 40 additions and 23 deletions
|
@ -1 +1 @@
|
|||
{"cells":[{"kind":2,"language":"xquery","value":"(:<:)\r\n\r\nimport module namespace docs=\"lsp/docs\" at \"/srv/basex/webapp/lsp/docs.xqm\";"},{"kind":2,"language":"xquery","value":"ws:ids()"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"textDocument\")\r\nreturn map:put($t,\"text\",substring($t?text,1,15))"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"parse\")\r\nreturn $t/self::ERROR"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"textDocument\")?text\r\nreturn $t"}]}
|
||||
{"cells":[{"kind":2,"language":"xquery","value":"(:<:)\r\n\r\nimport module namespace docs=\"lsp/docs\" at \"/srv/basex/webapp/lsp/docs.xqm\";"},{"kind":2,"language":"xquery","value":"ws:ids()"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"textDocument\")\r\nreturn map:put($t,\"text\",substring($t?text,1,15))"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"parse\")\r\nreturn $t/self::ERROR"},{"kind":2,"language":"xquery","value":"let $sock:=foot(ws:ids())\r\nlet $f:=docs:list($sock)\r\nlet $t:=docs:get($sock,$f,\"textDocument\")\r\nreturn $t"}]}
|
|
@ -12,7 +12,7 @@ import module namespace pos="lsp/position" at "../webapp/lsp/position.xqm";
|
|||
(:~ count lines. :)
|
||||
declare %unit:test function test:line-count() {
|
||||
let $text:=unparsed-text("sample.docs/pdfbox.xqm")
|
||||
let $nl:= index-of(string-to-codepoints($text),10)=>trace("SSS ")
|
||||
let $nl:= index-of(string-to-codepoints($text),10)
|
||||
return unit:assert-equals(count($nl),521)
|
||||
};
|
||||
|
||||
|
@ -23,8 +23,21 @@ declare %unit:test function test:resolvePosition() {
|
|||
return unit:assert-equals($p,18751)
|
||||
};
|
||||
|
||||
(:~ convert position. :)
|
||||
declare %unit:test("expected", "pos:range")
|
||||
function test:toPosition() {
|
||||
let $text:="1+2 a"
|
||||
return pos:toPosition($text,5)
|
||||
};
|
||||
(:~ convert position. :)
|
||||
declare %unit:test
|
||||
function test:toPosition2() {
|
||||
let $text:="1+2 a"
|
||||
return unit:assert-equals(pos:toPosition($text,4),{"line":0,"character":4})
|
||||
};
|
||||
|
||||
(:~ convert all position. :)
|
||||
declare %unit:test function test:toPosition() {
|
||||
declare %unit:test %unit:ignore function test:toPositionAll() {
|
||||
let $text:=unparsed-text("sample.docs/pdfbox.xqm")
|
||||
return for $i in 0 to string-length($text)-1
|
||||
let $pos:=pos:toPosition($text,$i)
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
import module namespace pos="lsp/position" at "../webapp/lsp/position.xqm";
|
||||
let $text:=unparsed-text("sample.docs/pdfbox.xqm")
|
||||
let $nl:= index-of(string-to-codepoints($text),10)
|
||||
let $text:="1+2 a"
|
||||
|
||||
return pos:toPosition($text,5)
|
||||
|
||||
return (
|
||||
pos:toPosition($text,10744),pos:toPosition($text,10745)
|
||||
)
|
|
@ -17,7 +17,7 @@ declare record lsp-diags:nostic(
|
|||
range as pos:Range,
|
||||
severity as xs:integer, (: enum('error', 'hint', 'info', 'warning') :)
|
||||
message as xs:string,
|
||||
code? as xs:string,
|
||||
code as xs:string,
|
||||
source as xs:string:="xquery"
|
||||
);
|
||||
|
||||
|
@ -33,10 +33,11 @@ declare function lsp-diags:publish(
|
|||
$text as xs:string,
|
||||
$xml as lsp-diags:ParseResult)
|
||||
as map(*){
|
||||
let $_:=trace($xml,"PABLISH ")
|
||||
let $diagnostics:=if($xml/self::ERROR)
|
||||
then array{lsp-diags:parse-error($text, $xml)}
|
||||
else array{ lsp-diags:parse-xquery($text,$xml)}
|
||||
|
||||
let $_:=trace($diagnostics,"PIBLISH ")
|
||||
return {"jsonrpc": "2.0",
|
||||
"method":"textDocument/publishDiagnostics",
|
||||
"params":{"uri": $uri, "diagnostics": $diagnostics}
|
||||
|
@ -44,25 +45,28 @@ as map(*){
|
|||
};
|
||||
|
||||
(:~
|
||||
<ERROR b="10819" e="10820" o="234" s="43">syntax error, found '}' while expecting [S,'else'] at line 290, column 3: ...} }; ? return bookmark info for children of $outlineItem as s...</ERROR>
|
||||
assert.equal(markers[0].code, 'XPST0003', 'parse error');
|
||||
assert.equal(markers[1].code, 'XQLT0001', 'previous parse error');
|
||||
<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(*)*{
|
||||
let $dmesg:=$xml/string()
|
||||
let $dmesg:=$xml/string()=>trace("parse-error")
|
||||
let $dmesg:=translate($dmesg," ",";")
|
||||
let $b:=number($xml/@b)-1
|
||||
let $e:= number($xml/@e)-1
|
||||
return (
|
||||
lsp-diags:nostic(pos:Range(pos:toPosition($text, $xml/@b),
|
||||
pos:toPosition($text, $xml/@e)),
|
||||
$lsp-diags:severities('error'),
|
||||
$dmesg,code:="XPST0003"),
|
||||
|
||||
lsp-diags:nostic(pos:Range(pos:toPosition($text, $xml/@e +1 ),
|
||||
lsp-diags:nostic(pos:Range(pos:toPosition($text, $b),
|
||||
pos:toPosition($text, min(($e,string-length($text)-1)))),
|
||||
1,
|
||||
$dmesg,'XPST0003'),
|
||||
if($e ge string-length($text))
|
||||
then ()
|
||||
else lsp-diags:nostic(pos:Range(pos:toPosition($text, $e +1 ),
|
||||
pos:toPosition($text, string-length($text)-1)),
|
||||
$lsp-diags:severities('warning'),
|
||||
2,
|
||||
"Unparsed due to previous parser error.",
|
||||
code:="XQLT0001")
|
||||
"XQLT0001")
|
||||
)
|
||||
};
|
||||
|
||||
|
|
|
@ -56,7 +56,9 @@ declare function pos:toPosition($text as xs:string,
|
|||
$index as pos:num
|
||||
)
|
||||
as pos:Position {
|
||||
let $nl:= index-of(string-to-codepoints($text),10)
|
||||
let $nl:= if($index=>trace("IN ") ge string-length($text)=>trace("L "))
|
||||
then error(xs:QName("pos:range"),"out of range")
|
||||
else index-of(string-to-codepoints($text),10)
|
||||
let $line:=pos:lineAt($nl,$index)
|
||||
let $off:=if($line eq 0)
|
||||
then 0
|
||||
|
@ -70,7 +72,7 @@ return pos:Position($line, $index - $off)
|
|||
declare function pos:lineAt($nl as xs:integer*,$pos as pos:num)
|
||||
as xs:integer
|
||||
{
|
||||
if($pos le head($nl))
|
||||
if(empty($nl) or $pos le head($nl))
|
||||
then 0
|
||||
else if($pos gt foot($nl))
|
||||
then count($nl)
|
||||
|
|
Loading…
Add table
Reference in a new issue