aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--book/src/generated/lang-support.md1
-rw-r--r--languages.toml13
-rw-r--r--runtime/queries/gleam/highlights.scm101
-rw-r--r--runtime/queries/gleam/locals.scm15
4 files changed, 130 insertions, 0 deletions
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index 35a10c0f..34e65e46 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -17,6 +17,7 @@
| git-config | ✓ | | | |
| git-diff | ✓ | | | |
| git-rebase | ✓ | | | |
+| gleam | ✓ | | | |
| glsl | ✓ | | ✓ | |
| go | ✓ | ✓ | ✓ | `gopls` |
| graphql | ✓ | | | |
diff --git a/languages.toml b/languages.toml
index ce51e4fc..3439d7f0 100644
--- a/languages.toml
+++ b/languages.toml
@@ -1003,3 +1003,16 @@ language-server = { command = "solc", args = ["--lsp"] }
[[grammar]]
name = "solidity"
source = { git = "https://github.com/slinlee/tree-sitter-solidity", rev = "f3a002274744e859bf64cf3524985f8c31ea84fd" }
+
+[[language]]
+name = "gleam"
+scope = "source.gleam"
+injection-regex = "gleam"
+file-types = ["gleam"]
+roots = ["gleam.toml"]
+comment-token = "//"
+indent = { tab-width = 2, unit = " " }
+
+[[grammar]]
+name = "gleam"
+source = { git = "https://github.com/gleam-lang/tree-sitter-gleam", rev = "7159ce961592192b0e7cdf88782cda0fdf41a4cb" }
diff --git a/runtime/queries/gleam/highlights.scm b/runtime/queries/gleam/highlights.scm
new file mode 100644
index 00000000..ed3fceca
--- /dev/null
+++ b/runtime/queries/gleam/highlights.scm
@@ -0,0 +1,101 @@
+; Comments
+(module_comment) @comment
+(statement_comment) @comment
+(comment) @comment
+
+; Constants
+(constant
+ name: (identifier) @constant)
+
+; Modules
+(module) @namespace
+(import alias: (identifier) @namespace)
+(remote_type_identifier
+ module: (identifier) @namespace)
+((field_access
+ record: (identifier) @namespace
+ field: (label) @function)
+ (#is-not? local))
+
+; Functions
+(unqualified_import (identifier) @function)
+(function
+ name: (identifier) @function)
+(external_function
+ name: (identifier) @function)
+(function_parameter
+ name: (identifier) @variable.parameter)
+((function_call
+ function: (identifier) @function)
+ (#is-not? local))
+((binary_expression
+ operator: "|>"
+ right: (identifier) @function)
+ (#is-not? local))
+
+; "Properties"
+; Assumed to be intended to refer to a name for a field; something that comes
+; before ":" or after "."
+; e.g. record field names, tuple indices, names for named arguments, etc
+(label) @variable.other.member
+(tuple_access
+ index: (integer) @variable.other.member)
+
+; Type names
+(remote_type_identifier) @type
+(type_identifier) @type
+
+; Literals
+(string) @string
+(bit_string_segment_option) @function.builtin
+(integer) @constant.numeric.integer
+(float) @constant.numeric.float
+
+; Variables
+(identifier) @variable
+(discard) @comment.unused
+
+; Operators
+(binary_expression
+ operator: _ @operator)
+
+; Keywords
+[
+ (visibility_modifier) ; "pub"
+ (opacity_modifier) ; "opaque"
+ "as"
+ "assert"
+ "case"
+ "const"
+ "external"
+ "fn"
+ "if"
+ "import"
+ "let"
+ "todo"
+ "try"
+ "type"
+] @keyword
+
+; Punctuation
+[
+ "("
+ ")"
+ "["
+ "]"
+ "{"
+ "}"
+ "<<"
+ ">>"
+] @punctuation.bracket
+[
+ "."
+ ","
+ ;; Controversial -- maybe some are operators?
+ ":"
+ "#"
+ "="
+ "->"
+ ".."
+ "-"
+] @punctuation.delimiter
diff --git a/runtime/queries/gleam/locals.scm b/runtime/queries/gleam/locals.scm
new file mode 100644
index 00000000..bd5903e5
--- /dev/null
+++ b/runtime/queries/gleam/locals.scm
@@ -0,0 +1,15 @@
+; Scopes
+(function_body) @local.scope
+
+(case_clause) @local.scope
+
+; Definitions
+(let pattern: (identifier) @local.definition)
+(function_parameter name: (identifier) @local.definition)
+(list_pattern (identifier) @local.definition)
+(list_pattern assign: (identifier) @local.definition)
+(tuple_pattern (identifier) @local.definition)
+(record_pattern_argument pattern: (identifier) @local.definition)
+
+; References
+(identifier) @local.reference