diff --git a/web/workspace/src/lib/workspace/config-source/completion.ts b/web/workspace/src/lib/workspace/config-source/completion.ts index 8467bdb2..7a4d755c 100644 --- a/web/workspace/src/lib/workspace/config-source/completion.ts +++ b/web/workspace/src/lib/workspace/config-source/completion.ts @@ -13,12 +13,11 @@ type ConfigSourceCompletionItem = { }; export function toCodeMirrorCompletion( - source: string, result: ConfigSourceCompletionResult | null, ): CompletionResult | null { if (!result) return null; return { - from: utf8ByteOffsetToUtf16(source, result.from), + from: result.from, options: result.items.map((item) => ({ label: item.label, type: item.kind, @@ -27,31 +26,3 @@ export function toCodeMirrorCompletion( })), }; } - -function utf8ByteOffsetToUtf16(source: string, byteOffset: number): number { - if (!Number.isSafeInteger(byteOffset) || byteOffset < 0) { - throw new RangeError( - "completion byte offset must be a non-negative integer", - ); - } - - let bytes = 0; - let utf16 = 0; - for (const character of source) { - if (bytes === byteOffset) return utf16; - const codePoint = character.codePointAt(0)!; - bytes += codePoint <= 0x7f - ? 1 - : codePoint <= 0x7ff - ? 2 - : codePoint <= 0xffff - ? 3 - : 4; - utf16 += character.length; - if (bytes > byteOffset) { - throw new RangeError("completion byte offset splits a UTF-8 code point"); - } - } - if (bytes === byteOffset) return utf16; - throw new RangeError("completion byte offset is outside the source"); -} diff --git a/web/workspace/src/lib/workspace/config-source/toolchain.ts b/web/workspace/src/lib/workspace/config-source/toolchain.ts index 510b4a00..53969a0f 100644 --- a/web/workspace/src/lib/workspace/config-source/toolchain.ts +++ b/web/workspace/src/lib/workspace/config-source/toolchain.ts @@ -79,7 +79,7 @@ export class ConfigSourceToolchain { utf16Offset, explicit, }); - return toCodeMirrorCompletion(source, result); + return toCodeMirrorCompletion(result); } format(source: string): Promise { return this.#request({ kind: "format", source }); diff --git a/web/workspace/src/lib/workspace/config-source/vite-dedupe.ts b/web/workspace/src/lib/workspace/config-source/vite-dedupe.ts new file mode 100644 index 00000000..c41ab5ba --- /dev/null +++ b/web/workspace/src/lib/workspace/config-source/vite-dedupe.ts @@ -0,0 +1,7 @@ +export const CODEMIRROR_VITE_DEDUPE = [ + "@codemirror/autocomplete", + "@codemirror/language", + "@codemirror/state", + "@codemirror/view", + "@lezer/common", +]; diff --git a/web/workspace/src/lib/workspace/settings/DecodalSourceEditor.svelte b/web/workspace/src/lib/workspace/settings/DecodalSourceEditor.svelte index 12623b97..821c8a9e 100644 --- a/web/workspace/src/lib/workspace/settings/DecodalSourceEditor.svelte +++ b/web/workspace/src/lib/workspace/settings/DecodalSourceEditor.svelte @@ -1,6 +1,13 @@