Unnamed repository; edit this file 'description' to name the repository.
Update Odin tree sitter grammar (#10698)
* Replace Odin grammar source * Update Odin highlights * Update Odin indents * Update Odin injections
Chris 2024-05-07
parent 5e3de68 · commit 81d4cbc
-rw-r--r--languages.toml2
-rw-r--r--runtime/queries/odin/highlights.scm275
-rw-r--r--runtime/queries/odin/indents.scm25
-rw-r--r--runtime/queries/odin/injections.scm2
4 files changed, 275 insertions, 29 deletions
diff --git a/languages.toml b/languages.toml
index f93ba9cc..ded3b656 100644
--- a/languages.toml
+++ b/languages.toml
@@ -2109,7 +2109,7 @@ args = { console = "internalConsole", attachCommands = [ "platform select remote
[[grammar]]
name = "odin"
-source = { git = "https://github.com/ap29600/tree-sitter-odin", rev = "b219207e49ffca2952529d33e94ed63b1b75c4f1" }
+source = { git = "https://github.com/tree-sitter-grammars/tree-sitter-odin", rev = "b5f668ef8918aab13812ce73acd89fe191fb8c5e" }
[[language]]
name = "meson"
diff --git a/runtime/queries/odin/highlights.scm b/runtime/queries/odin/highlights.scm
index d474bf3a..bdc4c129 100644
--- a/runtime/queries/odin/highlights.scm
+++ b/runtime/queries/odin/highlights.scm
@@ -1,26 +1,265 @@
-(keyword) @keyword
-(operator) @operator
+[
+ (calling_convention)
+ (tag)
+] @keyword.directive
-(int_literal) @constant.numeric.integer
-(float_literal) @constant.numeric.float
-(rune_literal) @constant.character
-(bool_literal) @constant.builtin.boolean
-(nil) @constant.builtin
+[
+ "import"
+ "package"
+] @namespace
-(type_identifier) @type
-(package_identifier) @namespace
-(label_identifier) @label
+[
+ "foreign"
+ "using"
+ "struct"
+ "enum"
+ "union"
+ "defer"
+ "cast"
+ "transmute"
+ "auto_cast"
+ "map"
+ "bit_set"
+ "matrix"
+ "bit_field"
+] @keyword
-(interpreted_string_literal) @string
-(raw_string_literal) @string
-(escape_sequence) @constant.character.escape
+[
+ "proc"
+] @keyword.function
-(comment) @comment
-(const_identifier) @constant
+[
+ "return"
+ "or_return"
+] @keyword.control.return
+[
+ "distinct"
+ "dynamic"
+] @keyword.storage.modifier
-(compiler_directive) @keyword.directive
-(calling_convention) @string.special.symbol
+[
+ "if"
+ "else"
+ "when"
+ "switch"
+ "case"
+ "where"
+ "break"
+ (fallthrough_statement)
+] @keyword.control.conditional
+
+((ternary_expression
+ [
+ "?"
+ ":"
+ "if"
+ "else"
+ "when"
+ ] @keyword.control.conditional))
+
+[
+ "for"
+ "do"
+ "continue"
+] @keyword.control.repeat
+
+[
+ ":="
+ "="
+ "+"
+ "-"
+ "*"
+ "/"
+ "%"
+ "%%"
+ ">"
+ ">="
+ "<"
+ "<="
+ "=="
+ "!="
+ "~="
+ "|"
+ "~"
+ "&"
+ "&~"
+ "<<"
+ ">>"
+ "||"
+ "&&"
+ "!"
+ "^"
+ ".."
+ "+="
+ "-="
+ "*="
+ "/="
+ "%="
+ "&="
+ "|="
+ "^="
+ "<<="
+ ">>="
+ "||="
+ "&&="
+ "&~="
+ "..="
+ "..<"
+ "?"
+] @operator
+
+[
+ "or_else"
+ "in"
+ "not_in"
+] @keyword.operator
+
+[ "{" "}" ] @punctuation.bracket
+
+[ "(" ")" ] @punctuation.bracket
+
+[ "[" "]" ] @punctuation.bracket
+
+[
+ "::"
+ "->"
+ "."
+ ","
+ ":"
+ ";"
+] @punctuation.delimiter
+
+[
+ "@"
+ "$"
+] @punctuation.special
+
+(number) @constant.numeric
+
+(float) @constant.numeric.float
+
+(string) @string
+
+(character) @string
+
+(escape_sequence) @string.special
+
+(boolean) @constant.builtin.boolean
+
+[
+ (uninitialized)
+ (nil)
+] @constant.builtin
+
+((identifier) @variable.builtin
+ (#any-of? @variable.builtin "context" "self"))
+
+(((identifier) @type.builtin)
+ (#any-of? @type.builtin
+ "bool" "byte" "b8" "b16" "b32" "b64"
+ "int" "i8" "i16" "i32" "i64" "i128"
+ "uint" "u8" "u16" "u32" "u64" "u128" "uintptr"
+ "i16le" "i32le" "i64le" "i128le" "u16le" "u32le" "u64le" "u128le"
+ "i16be" "i32be" "i64be" "i128be" "u16be" "u32be" "u64be" "u128be"
+ "float" "double" "f16" "f32" "f64" "f16le" "f32le" "f64le" "f16be" "f32be" "f64be"
+ "complex32" "complex64" "complex128" "complex_float" "complex_double"
+ "quaternion64" "quaternion128" "quaternion256"
+ "rune" "string" "cstring" "rawptr" "typeid" "any"))
+
+"..." @type.builtin
+
+[
+ (comment)
+ (block_comment)
+] @comment
+
+; Functions
+
+(procedure_declaration (identifier) @function)
+
+(procedure_declaration (identifier) @function (procedure (block)))
+
+(procedure_declaration (identifier) @function (procedure (uninitialized)))
+
+(overloaded_procedure_declaration (identifier) @function)
+
+(call_expression function: (identifier) @function)
+
+; Types
+
+(struct_declaration (identifier) @type "::")
+
+(enum_declaration (identifier) @type "::")
+
+(union_declaration (identifier) @type "::")
+
+(bit_field_declaration (identifier) @type "::")
+
+(const_declaration (identifier) @type "::" [(array_type) (distinct_type) (bit_set_type) (pointer_type)])
+
+(struct . (identifier) @type)
+
+(field_type . (identifier) "." (identifier) @type)
+
+(bit_set_type (identifier) @type ";")
+
+(polymorphic_parameters (identifier) @type)
+
+((identifier) @type
+ (#match? @type "^[A-Z][a-z0-9_]+"))
+
+(type (identifier) @type)
+
+; Constants
+
+(member_expression . "." (identifier) @constant)
+
+(enum_declaration "{" (identifier) @constant)
+
+((identifier) @constant
+ (#match? @constant "^[A-Z0-9_]*$"))
+
+; Attributes
+
+(attribute (identifier) @attribute "="?)
+
+; Labels
+
+(label_statement (identifier) @label ":")
+
+; Fields
+
+(member_expression "." (identifier) @variable.other.member)
+
+(struct_type "{" (identifier) @variable.other.member)
+
+(struct_field (identifier) @variable.other.member "="?)
+
+(bit_field_declaration (identifier) @variable.other.member)
+
+(field (identifier) @variable.other.member)
+
+; Namespaces
+
+(package_declaration (identifier) @namespace)
+
+(foreign_block (identifier) @namespace)
+
+(using_statement (identifier) @namespace)
+
+; Parameters
+
+(parameter (identifier) @variable.parameter ":" "="? (identifier)? @constant)
+
+(default_parameter (identifier) @variable.parameter ":=")
+
+(named_type (identifier) @variable.parameter)
+
+(call_expression argument: (identifier) @variable.parameter "=")
+
+(procedure_type (parameters (parameter (identifier) @variable.parameter)))
+
+; Variables
(identifier) @variable
-(pragma_identifier) @keyword.directive
diff --git a/runtime/queries/odin/indents.scm b/runtime/queries/odin/indents.scm
index a3b90a38..f456c1fe 100644
--- a/runtime/queries/odin/indents.scm
+++ b/runtime/queries/odin/indents.scm
@@ -1,16 +1,23 @@
[
- (foreign_block)
- (block)
- (compound_literal)
- (proc_call)
- (assignment_statement)
- (const_declaration)
- (var_declaration)
- (switch_statement)
+ (block)
+ (enum_declaration)
+ (union_declaration)
+ (struct_declaration)
+ (struct)
+ (parameters)
+ (tuple_type)
+ (call_expression)
+ (switch_case)
] @indent
[
")"
- "}"
+ "]"
] @outdent
+; Have to do all closing brackets separately because the one for switch statements shouldn't end.
+(block "}" @outdent)
+(enum_declaration "}" @outdent)
+(union_declaration "}" @outdent)
+(struct_declaration "}" @outdent)
+(struct "}" @outdent)
diff --git a/runtime/queries/odin/injections.scm b/runtime/queries/odin/injections.scm
index 2f0e58eb..5d4c951b 100644
--- a/runtime/queries/odin/injections.scm
+++ b/runtime/queries/odin/injections.scm
@@ -1,2 +1,2 @@
-((comment) @injection.content
+([(comment) (block_comment)] @injection.content
(#set! injection.language "comment"))