From 1daa4587e5fbde857074a1605c377d84795d2b0d Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Thu, 4 Jun 2026 18:26:23 +0800 Subject: [PATCH] Add Dart syntax highlighting (#1326) --- .../highlight/src/__tests__/highlighter.test.ts | 16 ++++++++++++++++ packages/highlight/src/__tests__/parsers.test.ts | 2 ++ packages/highlight/src/parsers.ts | 3 +++ 3 files changed, 21 insertions(+) diff --git a/packages/highlight/src/__tests__/highlighter.test.ts b/packages/highlight/src/__tests__/highlighter.test.ts index af2d97615..74bc49bbd 100644 --- a/packages/highlight/src/__tests__/highlighter.test.ts +++ b/packages/highlight/src/__tests__/highlighter.test.ts @@ -46,6 +46,22 @@ describe("highlightCode", () => { expect(stringToken?.style).toBe("string"); }); + it("highlights Dart code", () => { + const code = 'class Greeter {\n final String message = "hello";\n}'; + const result = highlightCode(code, "test.dart"); + + expect(result).toHaveLength(3); + + const classToken = result[0].find((t) => t.text === "class"); + expect(classToken?.style).toBe("keyword"); + + const finalToken = result[1].find((t) => t.text === "final"); + expect(finalToken?.style).toBe("keyword"); + + const stringToken = result[1].find((t) => t.text.includes("hello")); + expect(stringToken?.style).toBe("string"); + }); + it("highlights TSX code with correct dialect", () => { const code = 'const el =
hello
;'; const result = highlightCode(code, "test.tsx"); diff --git a/packages/highlight/src/__tests__/parsers.test.ts b/packages/highlight/src/__tests__/parsers.test.ts index c0bf459bb..a04ad64c6 100644 --- a/packages/highlight/src/__tests__/parsers.test.ts +++ b/packages/highlight/src/__tests__/parsers.test.ts @@ -14,6 +14,7 @@ describe("isLanguageSupported", () => { expect(isLanguageSupported("test.html")).toBe(true); expect(isLanguageSupported("test.java")).toBe(true); expect(isLanguageSupported("test.swift")).toBe(true); + expect(isLanguageSupported("test.dart")).toBe(true); expect(isLanguageSupported("test.ex")).toBe(true); }); @@ -51,6 +52,7 @@ describe("getSupportedExtensions", () => { expect(extensions).toContain("go"); expect(extensions).toContain("rs"); expect(extensions).toContain("swift"); + expect(extensions).toContain("dart"); expect(extensions).toContain("json"); }); }); diff --git a/packages/highlight/src/parsers.ts b/packages/highlight/src/parsers.ts index 32854914e..a9df5ebe2 100644 --- a/packages/highlight/src/parsers.ts +++ b/packages/highlight/src/parsers.ts @@ -1,4 +1,5 @@ import { StreamLanguage } from "@codemirror/language"; +import { dart } from "@codemirror/legacy-modes/mode/clike"; import { swift } from "@codemirror/legacy-modes/mode/swift"; import { parser as jsParser } from "@lezer/javascript"; import { parser as jsonParser } from "@lezer/json"; @@ -59,6 +60,8 @@ const parsersByExtension: Record = { rs: rustParser, // Swift swift: StreamLanguage.define(swift).parser, + // Dart + dart: StreamLanguage.define(dart).parser, // Elixir ex: elixirParser, exs: elixirParser,