diff --git a/extension.toml b/extension.toml index 961f380..051e880 100644 --- a/extension.toml +++ b/extension.toml @@ -8,7 +8,7 @@ repository = "https://github.com/zed-extensions/ocaml" [language_servers.ocamllsp] name = "ocamllsp" -languages = ["OCaml", "OCaml Interface"] +languages = ["OCaml", "OCaml Interface", "mlx"] [grammars.ocaml] repository = "https://github.com/tree-sitter/tree-sitter-ocaml" @@ -23,3 +23,8 @@ path = "grammars/interface" [grammars.dune] repository = "https://github.com/WHForks/tree-sitter-dune" commit = "b3f7882e1b9a1d8811011bf6f0de1c74c9c93949" + +[grammars.mlx] +repository = "https://github.com/ocaml-mlx/tree-sitter-mlx" +commit = "fbe904bbf55be15d34b57ba9c45750fc5187960f" +path = "grammars/mlx" diff --git a/languages/mlx/config.toml b/languages/mlx/config.toml new file mode 100644 index 0000000..40fc0ed --- /dev/null +++ b/languages/mlx/config.toml @@ -0,0 +1,14 @@ +name = "mlx" +grammar = "mlx" +path_suffixes = ["mlx"] +block_comment = ["(* ", " *)"] +autoclose_before = ";,=)}]" +brackets = [ + { start = "{", end = "}", close = true, newline = true }, + { start = "{|", end = "|", close = true, newline = true, not_in = ["string"] }, + { start = "[", end = "]", close = true, newline = true }, + { start = "[|", end = "|", close = true, newline = true, not_in = ["string"] }, + { start = "(", end = ")", close = true, newline = true }, + { start = "\"", end = "\"", close = true, newline = false, not_in = ["string"] } +] +tab_size = 2 \ No newline at end of file diff --git a/languages/mlx/highlights.scm b/languages/mlx/highlights.scm new file mode 100644 index 0000000..8bc78f7 --- /dev/null +++ b/languages/mlx/highlights.scm @@ -0,0 +1,148 @@ +; Punctuation +;------------ + +[ + "," "." ";" ":" "=" "|" "~" "?" "+" "-" "!" ">" "&" + "->" ";;" ":>" "+=" ":=" ".." +] @punctuation.delimiter + +["(" ")" "[" "]" "{" "}" "[|" "|]" "[<" "[>"] @punctuation.bracket + +(object_type ["<" ">"] @punctuation.bracket) + +"%" @punctuation.special + +(attribute ["[@" "]"] @punctuation.special) +(item_attribute ["[@@" "]"] @punctuation.special) +(floating_attribute ["[@@@" "]"] @punctuation.special) +(extension ["[%" "]"] @punctuation.special) +(item_extension ["[%%" "]"] @punctuation.special) +(quoted_extension ["{%" "}"] @punctuation.special) +(quoted_item_extension ["{%%" "}"] @punctuation.special) + +; Keywords +;--------- + +[ + "and" "as" "assert" "begin" "class" "constraint" "do" "done" "downto" "else" + "end" "exception" "external" "for" "fun" "function" "functor" "if" "in" + "include" "inherit" "initializer" "lazy" "let" "match" "method" "module" + "mutable" "new" "nonrec" "object" "of" "open" "private" "rec" "sig" "struct" + "then" "to" "try" "type" "val" "virtual" "when" "while" "with" +] @keyword + +; Operators +;---------- + +[ + (prefix_operator) + (sign_operator) + (pow_operator) + (mult_operator) + (add_operator) + (concat_operator) + (rel_operator) + (and_operator) + (or_operator) + (assign_operator) + (hash_operator) + (indexing_operator) + (let_operator) + (let_and_operator) + (match_operator) +] @operator + +(match_expression (match_operator) @keyword) + +(value_definition [(let_operator) (let_and_operator)] @keyword) + +["*" "#" "::" "<-"] @operator + +; Constants +;---------- + +(boolean) @constant + +[(number) (signed_number)] @number + +[(string) (character)] @string + +(quoted_string "{" @string "}" @string) @string + +(escape_sequence) @escape + +(conversion_specification) @string.special + +; Variables +;---------- + +[(value_name) (type_variable)] @variable + +(value_pattern) @variable.parameter + +; Properties +;----------- + +[(label_name) (field_name) (instance_variable_name)] @property + +; Functions +;---------- + +(let_binding + pattern: (value_name) @function + (parameter)) + +(let_binding + pattern: (value_name) @function + body: [(fun_expression) (function_expression)]) + +(value_specification (value_name) @function) + +(external (value_name) @function) + +(method_name) @function.method + +(application_expression + function: (value_path (value_name) @function)) + +(infix_expression + left: (value_path (value_name) @function) + operator: (concat_operator) @operator + (#eq? @operator "@@")) + +(infix_expression + operator: (rel_operator) @operator + right: (value_path (value_name) @function) + (#eq? @operator "|>")) + +( + (value_name) @function.builtin + (#match? @function.builtin "^(raise(_notrace)?|failwith|invalid_arg)$") +) + +; Types +;------ + +[(class_name) (class_type_name) (type_constructor)] @type + +( + (type_constructor) @type.builtin + (#match? @type.builtin "^(int|char|bytes|string|float|bool|unit|exn|array|list|option|int32|int64|nativeint|format6|lazy_t)$") +) + +[(constructor_name) (tag)] @constructor + +; Modules +;-------- + +[(module_name) (module_type_name)] @module + +; Attributes +;----------- + +(attribute_id) @tag + +; Comments +;--------- + +[(comment) (line_number_directive) (directive) (shebang)] @comment diff --git a/languages/mlx/indents.scm b/languages/mlx/indents.scm new file mode 100644 index 0000000..11d2bd1 --- /dev/null +++ b/languages/mlx/indents.scm @@ -0,0 +1,26 @@ +; inherits: ocaml + +[ + (jsx_element_opening) + (jsx_element_self_closing) + (jsx_expression) +] @indent.begin + +(jsx_element_opening + (jsx_tag) @indent.begin) + +(jsx_element_closing + ">" @indent.end) + +(jsx_element_self_closing + "/>" @indent.end) + +[ + (jsx_element_closing) + ">" +] @indent.branch + +;