summaryrefslogtreecommitdiff
path: root/extension/src/util/util.ts
diff options
context:
space:
mode:
authorNate Sesti <sestinj@gmail.com>2023-05-23 23:45:12 -0400
committerNate Sesti <sestinj@gmail.com>2023-05-23 23:45:12 -0400
commitf53768612b1e2268697b5444e502032ef9f3fb3c (patch)
tree4ed49b73e6bd3c2f8fceffa9643973033f87af95 /extension/src/util/util.ts
downloadsncontinue-f53768612b1e2268697b5444e502032ef9f3fb3c.tar.gz
sncontinue-f53768612b1e2268697b5444e502032ef9f3fb3c.tar.bz2
sncontinue-f53768612b1e2268697b5444e502032ef9f3fb3c.zip
copying from old repo
Diffstat (limited to 'extension/src/util/util.ts')
-rw-r--r--extension/src/util/util.ts115
1 files changed, 115 insertions, 0 deletions
diff --git a/extension/src/util/util.ts b/extension/src/util/util.ts
new file mode 100644
index 00000000..d33593e1
--- /dev/null
+++ b/extension/src/util/util.ts
@@ -0,0 +1,115 @@
+import { RangeInFile, SerializedDebugContext } from "../client";
+import * as fs from "fs";
+
+function charIsEscapedAtIndex(index: number, str: string): boolean {
+ if (index === 0) return false;
+ if (str[index - 1] !== "\\") return false;
+ return !charIsEscapedAtIndex(index - 1, str);
+}
+
+export function convertSingleToDoubleQuoteJSON(json: string): string {
+ const singleQuote = "'";
+ const doubleQuote = '"';
+ const isQuote = (char: string) =>
+ char === doubleQuote || char === singleQuote;
+
+ let newJson = "";
+ let insideString = false;
+ let enclosingQuoteType = doubleQuote;
+ for (let i = 0; i < json.length; i++) {
+ if (insideString) {
+ if (json[i] === enclosingQuoteType && !charIsEscapedAtIndex(i, json)) {
+ // Close string with a double quote
+ insideString = false;
+ newJson += doubleQuote;
+ } else if (json[i] === singleQuote) {
+ if (charIsEscapedAtIndex(i, json)) {
+ // Unescape single quote
+ newJson = newJson.slice(0, -1);
+ }
+ newJson += singleQuote;
+ } else if (json[i] === doubleQuote) {
+ if (!charIsEscapedAtIndex(i, json)) {
+ // Escape double quote
+ newJson += "\\";
+ }
+ newJson += doubleQuote;
+ } else {
+ newJson += json[i];
+ }
+ } else {
+ if (isQuote(json[i])) {
+ insideString = true;
+ enclosingQuoteType = json[i];
+ newJson += doubleQuote;
+ } else {
+ newJson += json[i];
+ }
+ }
+ }
+
+ return newJson;
+}
+
+export async function readRangeInFile(
+ rangeInFile: RangeInFile
+): Promise<string> {
+ const range = rangeInFile.range;
+ return new Promise((resolve, reject) => {
+ fs.readFile(rangeInFile.filepath, (err, data) => {
+ if (err) {
+ reject(err);
+ } else {
+ let lines = data.toString().split("\n");
+ if (range.start.line === range.end.line) {
+ resolve(
+ lines[rangeInFile.range.start.line].slice(
+ rangeInFile.range.start.character,
+ rangeInFile.range.end.character
+ )
+ );
+ } else {
+ let firstLine = lines[range.start.line].slice(range.start.character);
+ let lastLine = lines[range.end.line].slice(0, range.end.character);
+ let middleLines = lines.slice(range.start.line + 1, range.end.line);
+ resolve([firstLine, ...middleLines, lastLine].join("\n"));
+ }
+ }
+ });
+ });
+}
+
+export function codeSelectionsToVirtualFileSystem(
+ codeSelections: RangeInFile[]
+): {
+ [filepath: string]: string;
+} {
+ let virtualFileSystem: { [filepath: string]: string } = {};
+ for (let cs of codeSelections) {
+ if (!cs.filepath) continue;
+ if (cs.filepath in virtualFileSystem) continue;
+ let content = fs.readFileSync(cs.filepath, "utf8");
+ virtualFileSystem[cs.filepath] = content;
+ }
+ return virtualFileSystem;
+}
+
+export function addFileSystemToDebugContext(
+ ctx: SerializedDebugContext
+): SerializedDebugContext {
+ ctx.filesystem = codeSelectionsToVirtualFileSystem(ctx.rangesInFiles);
+ return ctx;
+}
+
+export function debounced(delay: number, fn: Function) {
+ let timerId: NodeJS.Timeout | null;
+ return function (...args: any[]) {
+ if (timerId) {
+ clearTimeout(timerId);
+ }
+ timerId = setTimeout(() => {
+ fn(...args);
+ timerId = null;
+ }, delay);
+ };
+}