From c8cc69a56ef251bb41170f7b9ae747e86a4145ba Mon Sep 17 00:00:00 2001
From: arookieofc <2128194521@qq.com>
Date: Mon, 2 Nov 2026 10:04:03 +0800
Subject: [PATCH] feat(language): add D language support (#728)
Register D (.d/.di) with comments, indentation, the built-in D highlighting mode, a file icon, and serve-d as its language server (dub.json/dub.sdl roots). Closes #727.
Co-authored-by: a-rookie-of-C-language <186315048+a-rookie-of-C-language@users.noreply.github.com>
---
crates/ide-language/src/registry.rs | 1 +
languages/d.toml | 13 +++++++++++++
src/ui/icons.tsx | 2 ++
src/ui/openidea/fileTypes/d.svg | 3 +++
src/ui/openidea/fileTypes/d_dark.svg | 3 +++
5 files changed, 22 insertions(+)
create mode 100644 languages/d.toml
create mode 100644 src/ui/openidea/fileTypes/d.svg
create mode 100644 src/ui/openidea/fileTypes/d_dark.svg
diff --git a/crates/ide-language/src/registry.rs b/crates/ide-language/src/registry.rs
index 908d3ca59..5ceaec741 100644
--- a/crates/ide-language/src/registry.rs
+++ b/crates/ide-language/src/registry.rs
@@ -16,6 +16,7 @@ const BUILTIN: &[(&str, &str)] = &[
("cpp", include_str!("../../../languages/cpp.toml")),
("csharp", include_str!("../../../languages/csharp.toml")),
("css", include_str!("../../../languages/css.toml")),
+ ("d", include_str!("../../../languages/d.toml")),
("dart", include_str!("../../../languages/dart.toml")),
("diff", include_str!("../../../languages/diff.toml")),
("dockerfile", include_str!("../../../languages/dockerfile.toml")),
diff --git a/languages/d.toml b/languages/d.toml
new file mode 100644
index 000000000..2fcdc2cf7
--- /dev/null
+++ b/languages/d.toml
@@ -0,0 +1,13 @@
+id = "d"
+name = "D"
+extensions = ["d", "di"]
+line-comment = "//"
+block-comment = ["/*", "*/"]
+indent = { tab-size = 4, insert-spaces = true }
+ui-mode = "D"
+
+[[language-servers]]
+name = "serve-d"
+command = "serve-d"
+root-markers = ["dub.json", "dub.sdl", "dub.selections.json"]
+install-hint = "Install serve-d (https://github.com/symmetryinvestments/serve-d) and expose it as `serve-d`"
diff --git a/src/ui/icons.tsx b/src/ui/icons.tsx
index bcf50a27a..341630142 100644
--- a/src/ui/icons.tsx
+++ b/src/ui/icons.tsx
@@ -130,6 +130,7 @@ const ICONS = {
"file-gdscript": "openidea/fileTypes/gdscript",
"file-godot": "openidea/fileTypes/godot",
"file-gdshader": "openidea/fileTypes/gdshader",
+ "file-d": "openidea/fileTypes/d",
"file-dart": "openidea/fileTypes/dart",
"file-elixir": "openidea/fileTypes/elixir",
"file-erlang": "openidea/fileTypes/erlang",
@@ -878,6 +879,7 @@ const EXT_ICONS = table({
"file-gdscript": "gd",
"file-godot": "tscn tres godot import",
"file-gdshader": "gdshader gdshaderinc",
+ "file-d": "d di",
"file-dart": "dart",
"file-elixir": "ex exs",
"file-erlang": "erl hrl escript app.src",
diff --git a/src/ui/openidea/fileTypes/d.svg b/src/ui/openidea/fileTypes/d.svg
new file mode 100644
index 000000000..861238ca3
--- /dev/null
+++ b/src/ui/openidea/fileTypes/d.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/ui/openidea/fileTypes/d_dark.svg b/src/ui/openidea/fileTypes/d_dark.svg
new file mode 100644
index 000000000..216cac953
--- /dev/null
+++ b/src/ui/openidea/fileTypes/d_dark.svg
@@ -0,0 +1,3 @@
+