import type { CommentSyntaxEntry } from "./comment-syntax.types.ts"; /** * why: the whole per-language knowledge of the comment gate, as one table. It replaced three hand-written regexes * and a ten-extension list; adding a language is an entry here and nothing else * ([/decisions/ad-058.md](/decisions/ad-058.md)). * * invariant: a module rather than a JSON file read at runtime. A hook is a process, so a data file would be one * more read on every invocation and one more path to resolve differently under Bun, under `dist/` and under a * hermetic test home — which is exactly how the first version of this broke its own suite. Bundled, it costs * nothing and behaves identically everywhere. * * invariant: shapes follow the `comments` block of an editor language-configuration file, which is the maintained * machine-readable form of this knowledge. `middle` is the continuation prefix a block conventionally carries. */ export const COMMENT_SYNTAX: readonly CommentSyntaxEntry[] = [ { id: "typescript", extensions: [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "python", extensions: [".py", ".pyi", ".pyw"], line: ["#"], block: [ ['"""', '"""'], ["'''", "'''"], ], middle: [], }, { id: "ruby", extensions: [".rb", ".rake", ".gemspec"], line: ["#"], block: [["=begin", "=end"]], middle: [], }, { id: "shell", extensions: [".sh", ".bash", ".zsh", ".ksh", ".fish"], line: ["#"], block: [], middle: [], }, { id: "go", extensions: [".go"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "rust", extensions: [".rs"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "java", extensions: [".java"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "kotlin", extensions: [".kt", ".kts"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "swift", extensions: [".swift"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "c", extensions: [".c", ".h"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "cpp", extensions: [".cc", ".cpp", ".cxx", ".hpp", ".hh", ".hxx"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "csharp", extensions: [".cs"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "php", extensions: [".php"], line: ["//", "#"], block: [["/*", "*/"]], middle: ["*"], }, { id: "scala", extensions: [".scala", ".sc"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "dart", extensions: [".dart"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "elixir", extensions: [".ex", ".exs"], line: ["#"], block: [], middle: [], }, { id: "erlang", extensions: [".erl", ".hrl"], line: ["%"], block: [], middle: [], }, { id: "haskell", extensions: [".hs"], line: ["--"], block: [["{-", "-}"]], middle: [], }, { id: "lua", extensions: [".lua"], line: ["--"], block: [["--[[", "]]"]], middle: [], }, { id: "sql", extensions: [".sql"], line: ["--"], block: [["/*", "*/"]], // hazard: `middle: ["*"]` matched any line starting with a bare `*`, comment or not. In C-family languages // that is safe — a line rarely opens with `*` outside a block continuation — but `SELECT *` does exactly // that, so a multi-line query flagged its own projection as an undeclared comment. middle: [], }, { id: "css", extensions: [".css", ".scss", ".sass", ".less"], line: ["//"], block: [["/*", "*/"]], // hazard: same defect as sql above — the universal selector `*` and a bare `*,` in a reset both start with // `*`, so `middle: ["*"]` flagged ordinary CSS as an undeclared comment. middle: [], }, { id: "yaml", extensions: [".yaml", ".yml"], line: ["#"], block: [], middle: [], }, { id: "toml", extensions: [".toml"], line: ["#"], block: [], middle: [], }, { id: "ini", extensions: [".ini", ".cfg", ".conf", ".properties"], line: [";", "#"], block: [], middle: [], }, { id: "dockerfile", extensions: [".dockerfile", "dockerfile"], line: ["#"], block: [], middle: [], }, { id: "makefile", extensions: [".mk", "makefile"], line: ["#"], block: [], middle: [], }, { id: "terraform", extensions: [".tf", ".tfvars"], line: ["#", "//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "powershell", extensions: [".ps1", ".psm1", ".psd1"], line: ["#"], block: [["<#", "#>"]], middle: [], }, { id: "perl", extensions: [".pl", ".pm"], line: ["#"], block: [], middle: [], }, { id: "r", extensions: [".r"], line: ["#"], block: [], middle: [], }, { id: "julia", extensions: [".jl"], line: ["#"], block: [["#=", "=#"]], middle: [], }, { id: "vue", extensions: [".vue", ".svelte"], line: ["//"], block: [ ["/*", "*/"], [""], ], middle: ["*"], }, { id: "html", extensions: [".html", ".htm", ".xml", ".xhtml"], line: [], block: [[""]], middle: [], }, { id: "graphql", extensions: [".graphql", ".gql"], line: ["#"], block: [], middle: [], }, { id: "protobuf", extensions: [".proto"], line: ["//"], block: [["/*", "*/"]], middle: ["*"], }, { id: "zig", extensions: [".zig"], line: ["//"], block: [], middle: [], }, { id: "clojure", extensions: [".clj", ".cljs", ".cljc", ".edn"], line: [";"], block: [], middle: [], }, { id: "ocaml", extensions: [".ml", ".mli"], line: [], block: [["(*", "*)"]], middle: ["*"], }, { id: "fsharp", extensions: [".fs", ".fsi", ".fsx"], line: ["//"], block: [["(*", "*)"]], middle: ["*"], }, { id: "vim", extensions: [".vim"], line: ['"'], block: [], middle: [], }, { id: "tex", extensions: [".tex", ".sty", ".cls"], line: ["%"], block: [], middle: [], }, ];