From 3a77d8cb6a584d6738233f51d26e6996b3384ced Mon Sep 17 00:00:00 2001
From: Tom Ross <tom@umpox.com>
Date: Wed, 15 Jan 2025 13:06:30 +0000
Subject: [PATCH] add syntax highlighting support for more languages

---
 .../renderer/decorators/default-decorator.ts  |   2 +-
 ...rk.png => highlighted-suggestion-dark.png} | Bin
 ...t.png => highlighted-suggestion-light.png} | Bin
 .../unhighlighted-suggestion-dark.png         | Bin 0 -> 10603 bytes
 .../unhighlighted-suggestion-light.png        | Bin 0 -> 9848 bytes
 .../autoedits/renderer/image-gen/canvas.ts    |  29 +++++++----
 .../autoedits/renderer/image-gen/highlight.ts |  33 ++++++++++--
 .../renderer/image-gen/index.test.ts          |  49 +++++++++++++-----
 .../src/autoedits/renderer/image-gen/index.ts |  19 ++++---
 vscode/src/completions/detect-multiline.ts    |  10 ++--
 10 files changed, 103 insertions(+), 39 deletions(-)
 rename vscode/src/autoedits/renderer/image-gen/__image_snapshots__/{generated-suggestion-dark.png => highlighted-suggestion-dark.png} (100%)
 rename vscode/src/autoedits/renderer/image-gen/__image_snapshots__/{generated-suggestion-light.png => highlighted-suggestion-light.png} (100%)
 create mode 100644 vscode/src/autoedits/renderer/image-gen/__image_snapshots__/unhighlighted-suggestion-dark.png
 create mode 100644 vscode/src/autoedits/renderer/image-gen/__image_snapshots__/unhighlighted-suggestion-light.png

diff --git a/vscode/src/autoedits/renderer/decorators/default-decorator.ts b/vscode/src/autoedits/renderer/decorators/default-decorator.ts
index 09f07832d971..bf4766456a74 100644
--- a/vscode/src/autoedits/renderer/decorators/default-decorator.ts
+++ b/vscode/src/autoedits/renderer/decorators/default-decorator.ts
@@ -266,7 +266,7 @@ export class DefaultDecorator implements AutoEditsDecorator {
         const blockifiedAddedLines = blockify(this.editor.document, addedLinesInfo)
         const { dark, light } = generateSuggestionAsImage({
             decorations: blockifiedAddedLines,
-            lang: 'typescript',
+            lang: this.editor.document.languageId,
         })
         const startLineEndColumn = this.getEndColumn(this.editor.document.lineAt(startLine))
 
diff --git a/vscode/src/autoedits/renderer/image-gen/__image_snapshots__/generated-suggestion-dark.png b/vscode/src/autoedits/renderer/image-gen/__image_snapshots__/highlighted-suggestion-dark.png
similarity index 100%
rename from vscode/src/autoedits/renderer/image-gen/__image_snapshots__/generated-suggestion-dark.png
rename to vscode/src/autoedits/renderer/image-gen/__image_snapshots__/highlighted-suggestion-dark.png
diff --git a/vscode/src/autoedits/renderer/image-gen/__image_snapshots__/generated-suggestion-light.png b/vscode/src/autoedits/renderer/image-gen/__image_snapshots__/highlighted-suggestion-light.png
similarity index 100%
rename from vscode/src/autoedits/renderer/image-gen/__image_snapshots__/generated-suggestion-light.png
rename to vscode/src/autoedits/renderer/image-gen/__image_snapshots__/highlighted-suggestion-light.png
diff --git a/vscode/src/autoedits/renderer/image-gen/__image_snapshots__/unhighlighted-suggestion-dark.png b/vscode/src/autoedits/renderer/image-gen/__image_snapshots__/unhighlighted-suggestion-dark.png
new file mode 100644
index 0000000000000000000000000000000000000000..73ca2159ec2b84aff607cbc7fe1356296f064dd6
GIT binary patch
literal 10603
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
KTy@*w>Hh(U2igPx

literal 0
HcmV?d00001

diff --git a/vscode/src/autoedits/renderer/image-gen/__image_snapshots__/unhighlighted-suggestion-light.png b/vscode/src/autoedits/renderer/image-gen/__image_snapshots__/unhighlighted-suggestion-light.png
new file mode 100644
index 0000000000000000000000000000000000000000..15a62a53fb0927bb9443c8eae67fbd1d63253c86
GIT binary patch
literal 9848
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

literal 0
HcmV?d00001

diff --git a/vscode/src/autoedits/renderer/image-gen/canvas.ts b/vscode/src/autoedits/renderer/image-gen/canvas.ts
index be9ad33a2c33..d08304008276 100644
--- a/vscode/src/autoedits/renderer/image-gen/canvas.ts
+++ b/vscode/src/autoedits/renderer/image-gen/canvas.ts
@@ -1,7 +1,7 @@
 import fs from 'node:fs/promises'
 import path from 'node:path'
 import CanvasKitInit, { type EmulatedCanvas2D } from 'canvaskit-wasm'
-import type { HighlightedAddedLinesDecorationInfo } from './highlight'
+import type { HIGHLIGHT_THEMES, HighlightedAddedLinesDecorationInfo } from './highlight'
 
 type CanvasKitType = Awaited<ReturnType<typeof CanvasKitInit>>
 type RenderContext = {
@@ -76,8 +76,16 @@ function drawText(
     ctx: CanvasRenderingContext2D,
     line: HighlightedAddedLinesDecorationInfo,
     position: { x: number; y: number },
+    mode: keyof typeof HIGHLIGHT_THEMES,
     config: RenderConfig
 ): number {
+    if (!line.highlightedTokens) {
+        // We weren't able to highlight this text, so we just draw the full line
+        ctx.fillStyle = mode === 'dark' ? '#ffffff' : '#000000'
+        ctx.fillText(line.lineText, position.x, position.y + config.fontSize)
+        return ctx.measureText(line.lineText).width
+    }
+
     let xPos = position.x
 
     for (const token of line.highlightedTokens) {
@@ -100,6 +108,12 @@ function drawHighlights(
         return
     }
 
+    if (!line.highlightedTokens) {
+        // No highlighting. TODO Improve this so we still support highlighted regions on non-syntax highlighted
+        // text
+        return
+    }
+
     ctx.fillStyle = config.highlightColor
 
     let xPos = position.x
@@ -131,6 +145,7 @@ function drawHighlights(
 
 export function drawTokensToCanvas(
     highlightedDecorations: HighlightedAddedLinesDecorationInfo[],
+    mode: keyof typeof HIGHLIGHT_THEMES,
     /**
      * Specific configuration to determine how we render the canvas.
      * Consider changing this, or supporting configuration from the user (e.g. font-size)
@@ -161,13 +176,9 @@ export function drawTokensToCanvas(
     // and the required height of the canvas (number of lines determined by their line height)
     let tempYPos = renderConfig.padding.y
     let requiredWidth = 0
-    for (const { highlightedTokens } of highlightedDecorations) {
-        let tempXPos = renderConfig.padding.x
-        for (const token of highlightedTokens) {
-            const measure = tempCtx.measureText(token.content)
-            tempXPos += measure.width
-            requiredWidth = Math.max(requiredWidth, tempXPos)
-        }
+    for (const { lineText } of highlightedDecorations) {
+        const measure = tempCtx.measureText(lineText)
+        requiredWidth = Math.max(requiredWidth, renderConfig.padding.x + measure.width)
         tempYPos += renderConfig.lineHeight
     }
 
@@ -196,7 +207,7 @@ export function drawTokensToCanvas(
         drawHighlights(ctx, line, position, renderConfig)
 
         // Draw text on top
-        drawText(ctx, line, position, renderConfig)
+        drawText(ctx, line, position, mode, renderConfig)
 
         yPos += renderConfig.lineHeight
     }
diff --git a/vscode/src/autoedits/renderer/image-gen/highlight.ts b/vscode/src/autoedits/renderer/image-gen/highlight.ts
index 237f6ef049c4..35c43b927f50 100644
--- a/vscode/src/autoedits/renderer/image-gen/highlight.ts
+++ b/vscode/src/autoedits/renderer/image-gen/highlight.ts
@@ -1,8 +1,9 @@
 import { type BundledLanguage, type Highlighter, type ThemedToken, createHighlighter } from 'shiki'
+import type { MultiLineSupportedLanguage } from '../../../completions/detect-multiline'
 import type { AddedLinesDecorationInfo } from '../decorators/default-decorator'
 
 export interface HighlightedAddedLinesDecorationInfo extends AddedLinesDecorationInfo {
-    highlightedTokens: ThemedToken[]
+    highlightedTokens?: ThemedToken[]
 }
 
 let highlighter: Highlighter | null = null
@@ -12,15 +13,37 @@ export const HIGHLIGHT_THEMES = {
     dark: 'vitesse-dark',
 } as const
 
-export const HIGHLIGHT_LANGUAGES: Record<string, BundledLanguage> = {
-    TypeScript: 'typescript',
-} as const
+/**
+ * Mapping of supported completiion languages to highlighter languages
+ */
+export const SYNTAX_HIGHLIGHT_MAPPING: Record<MultiLineSupportedLanguage, BundledLanguage> = {
+    astro: 'astro',
+    c: 'c',
+    cpp: 'cpp',
+    csharp: 'csharp',
+    css: 'css',
+    dart: 'dart',
+    elixir: 'elixir',
+    go: 'go',
+    html: 'html',
+    java: 'java',
+    javascript: 'javascript',
+    javascriptreact: 'jsx',
+    kotlin: 'kotlin',
+    php: 'php',
+    python: 'python',
+    rust: 'rust',
+    svelte: 'svelte',
+    typescript: 'typescript',
+    typescriptreact: 'tsx',
+    vue: 'vue',
+}
 
 export async function initHighlighter(): Promise<void> {
     if (!highlighter) {
         highlighter = await createHighlighter({
             themes: Object.values(HIGHLIGHT_THEMES),
-            langs: Object.values(HIGHLIGHT_LANGUAGES),
+            langs: Object.values(SYNTAX_HIGHLIGHT_MAPPING),
         })
     }
 }
diff --git a/vscode/src/autoedits/renderer/image-gen/index.test.ts b/vscode/src/autoedits/renderer/image-gen/index.test.ts
index bda010dd815a..7bab4fdeb6b0 100644
--- a/vscode/src/autoedits/renderer/image-gen/index.test.ts
+++ b/vscode/src/autoedits/renderer/image-gen/index.test.ts
@@ -33,27 +33,48 @@ const MOCK_DECORATIONS = [
 
 expect.extend({ toMatchImageSnapshot })
 
-describe('generateSuggestionAsImage', () => {
-    it('generates correct images, with correct highlighting applied, from a set of tokens', async () => {
-        await initImageSuggestionService()
+async function generateImageForTest(
+    decorations: AddedLinesDecorationInfo[],
+    lang: string
+): Promise<{ darkBuffer: Buffer; lightBuffer: Buffer }> {
+    await initImageSuggestionService()
 
-        // These are dataURLs created via .toDataURL('image/png') in CanvasKit.
-        // I need to convert these to images and somehow diff the images with Vitest.
-        // Any ideas would be helpful
-        const { light, dark } = generateSuggestionAsImage({
-            decorations: MOCK_DECORATIONS,
-            lang: 'typescript',
-        })
+    // These are dataURLs created via .toDataURL('image/png') in CanvasKit.
+    // I need to convert these to images and somehow diff the images with Vitest.
+    // Any ideas would be helpful
+    const { light, dark } = generateSuggestionAsImage({
+        decorations,
+        lang,
+    })
 
+    return {
         // These suggestions are generated as dataURLs, so let's convert them back to a useful Buffer for testing
-        const lightBuffer = Buffer.from(light.split(',')[1], 'base64')
-        const darkBuffer = Buffer.from(dark.split(',')[1], 'base64')
+        darkBuffer: Buffer.from(dark.split(',')[1], 'base64'),
+        lightBuffer: Buffer.from(light.split(',')[1], 'base64'),
+    }
+}
+
+describe('generateSuggestionAsImage', () => {
+    it('generates correct images, with correct highlighting applied, from a set of tokens', async () => {
+        const { darkBuffer, lightBuffer } = await generateImageForTest(MOCK_DECORATIONS, 'typescript')
+        expect(lightBuffer).toMatchImageSnapshot({
+            customSnapshotIdentifier: 'highlighted-suggestion-light',
+        })
+        expect(darkBuffer).toMatchImageSnapshot({
+            customSnapshotIdentifier: 'highlighted-suggestion-dark',
+        })
+    })
 
+    it('generates correct images, with correct highlighting applied, from a set of tokens in a language that does not have supported highlighting', async () => {
+        const { darkBuffer, lightBuffer } = await generateImageForTest(
+            MOCK_DECORATIONS,
+            'non-existent-language'
+        )
         expect(lightBuffer).toMatchImageSnapshot({
-            customSnapshotIdentifier: 'generated-suggestion-light',
+            customSnapshotIdentifier: 'unhighlighted-suggestion-light',
         })
         expect(darkBuffer).toMatchImageSnapshot({
-            customSnapshotIdentifier: 'generated-suggestion-dark',
+            customSnapshotIdentifier: 'unhighlighted-suggestion-dark',
         })
     })
 })
diff --git a/vscode/src/autoedits/renderer/image-gen/index.ts b/vscode/src/autoedits/renderer/image-gen/index.ts
index 7f514742d02d..f83011e644ba 100644
--- a/vscode/src/autoedits/renderer/image-gen/index.ts
+++ b/vscode/src/autoedits/renderer/image-gen/index.ts
@@ -1,7 +1,7 @@
-import type { BundledLanguage } from 'shiki/langs'
+import type { MultiLineSupportedLanguage } from '../../../completions/detect-multiline'
 import type { AddedLinesDecorationInfo } from '../decorators/default-decorator'
 import { drawTokensToCanvas, initCanvas } from './canvas'
-import { highlightDecorations, initHighlighter } from './highlight'
+import { SYNTAX_HIGHLIGHT_MAPPING, highlightDecorations, initHighlighter } from './highlight'
 
 export async function initImageSuggestionService() {
     return Promise.all([initHighlighter(), initCanvas()])
@@ -9,17 +9,22 @@ export async function initImageSuggestionService() {
 
 interface SuggestionOptions {
     decorations: AddedLinesDecorationInfo[]
-    lang: BundledLanguage
+    lang: string
 }
 
 export function generateSuggestionAsImage(options: SuggestionOptions): { light: string; dark: string } {
     const { decorations, lang } = options
+    const highlightingLang = SYNTAX_HIGHLIGHT_MAPPING[lang as MultiLineSupportedLanguage]
 
-    const highlightedLightDecorations = highlightDecorations(decorations, lang, 'light')
-    const highlightedDarkDecorations = highlightDecorations(decorations, lang, 'dark')
+    const darkDecorations = highlightingLang
+        ? highlightDecorations(decorations, highlightingLang, 'dark')
+        : decorations
+    const lightDecorations = highlightingLang
+        ? highlightDecorations(decorations, highlightingLang, 'light')
+        : decorations
 
     return {
-        dark: drawTokensToCanvas(highlightedDarkDecorations).toDataURL('image/png'),
-        light: drawTokensToCanvas(highlightedLightDecorations).toDataURL('image/png'),
+        dark: drawTokensToCanvas(darkDecorations, 'dark').toDataURL('image/png'),
+        light: drawTokensToCanvas(lightDecorations, 'light').toDataURL('image/png'),
     }
 }
diff --git a/vscode/src/completions/detect-multiline.ts b/vscode/src/completions/detect-multiline.ts
index 983d9d812083..d8fb32cae17e 100644
--- a/vscode/src/completions/detect-multiline.ts
+++ b/vscode/src/completions/detect-multiline.ts
@@ -31,7 +31,7 @@ export function endsWithBlockStart(text: string, languageId: string): string | n
 
 // Languages with more than 100 multiline completions in the last month and CAR > 20%:
 // https://sourcegraph.looker.com/explore/sourcegraph/cody?qid=JBItVt6VFMlCtMa9KOBmjh&origin_space=562
-const LANGUAGES_WITH_MULTILINE_SUPPORT = [
+export const LANGUAGES_WITH_MULTILINE_SUPPORT = [
     'astro',
     'c',
     'cpp',
@@ -52,13 +52,17 @@ const LANGUAGES_WITH_MULTILINE_SUPPORT = [
     'typescript',
     'typescriptreact',
     'vue',
-]
+] as const
+
+export type MultiLineSupportedLanguage = (typeof LANGUAGES_WITH_MULTILINE_SUPPORT)[number]
 
 export function detectMultiline(params: DetectMultilineParams): DetectMultilineResult {
     const { docContext, languageId, position } = params
     const { prefix, prevNonEmptyLine, nextNonEmptyLine, currentLinePrefix, currentLineSuffix } =
         docContext
-    const isMultilineSupported = LANGUAGES_WITH_MULTILINE_SUPPORT.includes(languageId)
+    const isMultilineSupported = LANGUAGES_WITH_MULTILINE_SUPPORT.includes(
+        languageId as MultiLineSupportedLanguage
+    )
 
     const blockStart = endsWithBlockStart(prefix, languageId)
     const isBlockStartActive = Boolean(blockStart)