From e3c6c82828299f1728f16a8d8fcfa5c3603a3d47 Mon Sep 17 00:00:00 2001
From: Matthew Toohey <contact@mtoohey.com>
Date: Sat, 9 Mar 2024 02:59:56 -0500
Subject: [PATCH] add linker script language (#9835)

---
 book/src/generated/lang-support.md |   1 +
 languages.toml                     |  12 ++
 runtime/queries/ld/highlights.scm  | 173 +++++++++++++++++++++++++++++
 runtime/queries/ld/indents.scm     |  12 ++
 runtime/queries/ld/injections.scm  |   2 +
 5 files changed, 200 insertions(+)
 create mode 100644 runtime/queries/ld/highlights.scm
 create mode 100644 runtime/queries/ld/indents.scm
 create mode 100644 runtime/queries/ld/injections.scm

diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index 9149acad..7792bf59 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -94,6 +94,7 @@
 | kdl | ✓ | ✓ | ✓ |  |
 | kotlin | ✓ |  |  | `kotlin-language-server` |
 | latex | ✓ | ✓ |  | `texlab` |
+| ld | ✓ |  | ✓ |  |
 | lean | ✓ |  |  | `lean` |
 | ledger | ✓ |  |  |  |
 | llvm | ✓ | ✓ | ✓ |  |
diff --git a/languages.toml b/languages.toml
index e96f0618..2e9f5d19 100644
--- a/languages.toml
+++ b/languages.toml
@@ -3273,3 +3273,15 @@ indent = { tab-width = 4, unit = "    " }
 [[grammar]]
 name = "powershell"
 source = { git = "https://github.com/airbus-cert/tree-sitter-powershell", rev = "c9316be0faca5d5b9fd3b57350de650755f42dc0" }
+
+[[language]]
+name = "ld"
+scope = "source.ld"
+injection-regex = "ld"
+file-types = ["ld"]
+block-comment-tokens = { start = "/*", end = "*/" }
+indent = { tab-width = 2, unit = "  " }
+
+[[grammar]]
+name = "ld"
+source = { git = "https://github.com/mtoohey31/tree-sitter-ld", rev = "81978cde3844bfc199851e39c80a20ec6444d35e" }
diff --git a/runtime/queries/ld/highlights.scm b/runtime/queries/ld/highlights.scm
new file mode 100644
index 00000000..4f935e75
--- /dev/null
+++ b/runtime/queries/ld/highlights.scm
@@ -0,0 +1,173 @@
+; Identifiers
+
+(section
+  .
+  (NAME) @namespace)
+
+(NAME) @variable
+
+; Operators
+
+[
+  "="
+  "+="
+  "-="
+  "*="
+  "/="
+  "<<="
+  ">>="
+  "&="
+  "|="
+  "^="
+  "*"
+  "/"
+  "%"
+  "+"
+  "-"
+  "<<"
+  ">>"
+  "=="
+  "!="
+  "<="
+  ">="
+  "<"
+  ">"
+  "&"
+  "^"
+  "|"
+  "&&"
+  "||"
+  "?"
+] @operator
+
+; Keywords
+
+[
+  "ABSOLUTE"
+  "ADDR"
+  "ALIGNOF"
+  "ASSERT"
+  "BYTE"
+  "CONSTANT"
+  "DATA_SEGMENT_ALIGN"
+  "DATA_SEGMENT_END"
+  "DATA_SEGMENT_RELRO_END"
+  "DEFINED"
+  "LOADADDR"
+  "LOG2CEIL"
+  "LONG"
+  "MAX"
+  "MIN"
+  "NEXT"
+  "QUAD"
+  "SHORT"
+  "SIZEOF"
+  "SQUAD"
+  "FILL"
+  "SEGMENT_START"
+] @function.builtin
+
+[
+  "CONSTRUCTORS"
+  "CREATE_OBJECT_SYMBOLS"
+  "LINKER_VERSION"
+  "SIZEOF_HEADERS"
+] @constant.builtin
+
+[
+  "AFTER"
+  "ALIGN"
+  "ALIGN_WITH_INPUT"
+  "ASCIZ"
+  "AS_NEEDED"
+  "AT"
+  "BEFORE"
+  "BIND"
+  "BLOCK"
+  "COPY"
+  "DSECT"
+  "ENTRY"
+  "EXCLUDE_FILE"
+  "EXTERN"
+  "extern"
+  "FLOAT"
+  "FORCE_COMMON_ALLOCATION"
+  "FORCE_GROUP_ALLOCATION"
+  "global"
+  "GROUP"
+  "HIDDEN"
+  "HLL"
+  "INCLUDE"
+  "INFO"
+  "INHIBIT_COMMON_ALLOCATION"
+  "INPUT"
+  "INPUT_SECTION_FLAGS"
+  "KEEP"
+  "l"
+  "LD_FEATURE"
+  "len"
+  "LENGTH"
+  "local"
+  "MAP"
+  "MEMORY"
+  "NOCROSSREFS"
+  "NOCROSSREFS_TO"
+  "NOFLOAT"
+  "NOLOAD"
+  "o"
+  "ONLY_IF_RO"
+  "ONLY_IF_RW"
+  "org"
+  "ORIGIN"
+  "OUTPUT"
+  "OUTPUT_ARCH"
+  "OUTPUT_FORMAT"
+  "OVERLAY"
+  "PHDRS"
+  "PROVIDE"
+  "PROVIDE_HIDDEN"
+  "READONLY"
+  "REGION_ALIAS"
+  "REVERSE"
+  "SEARCH_DIR"
+  "SECTIONS"
+  "SORT"
+  "SORT_BY_ALIGNMENT"
+  "SORT_BY_INIT_PRIORITY"
+  "SORT_BY_NAME"
+  "SORT_NONE"
+  "SPECIAL"
+  "STARTUP"
+  "SUBALIGN"
+  "SYSLIB"
+  "TARGET"
+  "TYPE"
+  "VERSION"
+] @keyword
+
+; Delimiters
+
+[
+  ","
+  ";"
+  "&"
+  ":"
+  ">"
+] @punctuation.delimiter
+
+[
+  "("
+  ")"
+  "["
+  "]"
+  "{"
+  "}"
+] @punctuation.bracket
+
+; Literals
+
+(INT) @constant.numeric.integer
+
+; Comment
+
+(comment) @comment
diff --git a/runtime/queries/ld/indents.scm b/runtime/queries/ld/indents.scm
new file mode 100644
index 00000000..2e2928b5
--- /dev/null
+++ b/runtime/queries/ld/indents.scm
@@ -0,0 +1,12 @@
+[
+  (sections)
+  (memory)
+  (section)
+  (phdrs)
+  (overlay_section)
+  (version)
+  (vers_node)
+  (vers_defns)
+] @indent
+
+"}" @outdent @extend.prevent-once
diff --git a/runtime/queries/ld/injections.scm b/runtime/queries/ld/injections.scm
new file mode 100644
index 00000000..2f0e58eb
--- /dev/null
+++ b/runtime/queries/ld/injections.scm
@@ -0,0 +1,2 @@
+((comment) @injection.content
+  (#set! injection.language "comment"))