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

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