store vscode Ranges on ktxt2 blocks

This commit is contained in:
2021-10-19 11:38:29 -04:00
parent 2a67f3483d
commit 737e42c588
2 changed files with 21 additions and 8 deletions

View File

@@ -305,4 +305,4 @@ import kiss.List;
class ${className} {}
")
(File.saveContent kissFile "")
(Vscode.window.showTextDocument (Uri.file kissFile)))))
(Vscode.window.showTextDocument (Uri.file kissFile)))))

View File

@@ -64,17 +64,26 @@
(outputDocument.save)]
(assert (and saveSourceSuccess saveOutputSuccess))))))
(function streamPosToVscodePos [pos]
(new vscode.Position pos.line (- pos.column 1)))
(function rangeFromStartEnd [start end]
(new Range (streamPosToVscodePos start) (streamPosToVscodePos end)))
(function :Array<Dynamic> splitFileBlocks []
(let [fileText (activeTextEditor.document.getText)
fileStream (kiss.Stream.fromString fileText)
blocks []]
(loop
(let [block (object source "" output "" outputLocked false)]
(let [block (object source "" sourceRange null output "" outputRange null outputLocked false)]
(case (fileStream.takeUntilAndDrop blockStartEnd)
((Some _)
(let [sourceBlock (fileStream.expect "A chunk of source text followed by one of $outputStarts"
->(fileStream.takeUntilOneOf outputStarts))]
(set block.source sourceBlock))
(let [sourceStartPosition (fileStream.position)
sourceBlock (fileStream.expect "A chunk of source text followed by one of $outputStarts"
->(fileStream.takeUntilOneOf outputStarts))
sourceEndPosition (fileStream.position)]
(set block.source sourceBlock)
(set block.sourceRange (rangeFromStartEnd sourceStartPosition sourceEndPosition)))
(assert (apply = (for outputStart outputStarts outputStart.length)) "all output starts must be the same length!")
(set block.outputLocked
(case (fileStream.expect "One of $outputStarts" ->(fileStream.takeChars .length (first outputStarts)))
@@ -82,9 +91,13 @@
(unlockedStart false)
(otherwise
(throw "Expected one of $outputStarts"))))
(let [outputBlock (fileStream.expect "A chunk of output text followed by $blockStartEnd"
->(fileStream.takeUntilAndDrop blockStartEnd))]
(set block.output outputBlock)))
(let [outputStartPosition (fileStream.position)
outputBlock (fileStream.expect "A chunk of output text followed by $blockStartEnd"
->(fileStream.takeUntilOneOf [blockStartEnd]))
outputEndPosition (fileStream.position)]
(fileStream.dropChars blockStartEnd.length)
(set block.output outputBlock)
(set block.outputRange (rangeFromStartEnd outputStartPosition outputEndPosition))))
(None
(break)))
(blocks.push block)))