From 737e42c5880c039eb9e28000d990117625a3da72 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Tue, 19 Oct 2021 11:38:29 -0400 Subject: [PATCH] store vscode Ranges on ktxt2 blocks --- projects/kiss-vscode/config/KissConfig.kiss | 2 +- projects/kiss-vscode/src/commands/ktxt2.kiss | 27 +++++++++++++++----- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/projects/kiss-vscode/config/KissConfig.kiss b/projects/kiss-vscode/config/KissConfig.kiss index d23ba245..04910a61 100644 --- a/projects/kiss-vscode/config/KissConfig.kiss +++ b/projects/kiss-vscode/config/KissConfig.kiss @@ -305,4 +305,4 @@ import kiss.List; class ${className} {} ") (File.saveContent kissFile "") - (Vscode.window.showTextDocument (Uri.file kissFile))))) + (Vscode.window.showTextDocument (Uri.file kissFile))))) \ No newline at end of file diff --git a/projects/kiss-vscode/src/commands/ktxt2.kiss b/projects/kiss-vscode/src/commands/ktxt2.kiss index 24d26214..f31c7279 100644 --- a/projects/kiss-vscode/src/commands/ktxt2.kiss +++ b/projects/kiss-vscode/src/commands/ktxt2.kiss @@ -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 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)))