Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ocaml support #666

Merged
merged 12 commits into from
Sep 1, 2021
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,10 @@
path = helix-syntax/languages/tree-sitter-protobuf
url = https://github.com/yusdacra/tree-sitter-protobuf.git
shallow = true
[submodule "helix-syntax/languages/tree-sitter-ocaml"]
path = helix-syntax/languages/tree-sitter-ocaml
url = https://github.com/tree-sitter/tree-sitter-ocaml
shallow = true
[submodule "helix-syntax/languages/tree-sitter-lua"]
path = helix-syntax/languages/tree-sitter-lua
url = https://github.com/nvim-treesitter/tree-sitter-lua
Expand Down
3 changes: 3 additions & 0 deletions helix-syntax/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ fn main() {
let ignore = vec![
"tree-sitter-typescript".to_string(),
"tree-sitter-haskell".to_string(), // aarch64 failures: https://github.com/tree-sitter/tree-sitter-haskell/issues/34
"tree-sitter-ocaml".to_string(),
];
let dirs = collect_tree_sitter_dirs(&ignore).unwrap();

Expand All @@ -202,4 +203,6 @@ fn main() {

build_dir("tree-sitter-typescript/tsx", "tsx");
build_dir("tree-sitter-typescript/typescript", "typescript");
build_dir("tree-sitter-ocaml/ocaml", "ocaml");
build_dir("tree-sitter-ocaml/interface", "ocaml-interface")
}
1 change: 1 addition & 0 deletions helix-syntax/languages/tree-sitter-ocaml
Submodule tree-sitter-ocaml added at 23d419
17 changes: 17 additions & 0 deletions languages.toml
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,23 @@ roots = []
comment-token = ";"
indent = { tab-width = 4, unit = " " }

[[language]]
name = "ocaml"
scope = "source.ocaml"
injection-regex = "ocaml"
file-types = ["ml"]
roots = []
comment-token = "(**)"
indent = { tab-width = 2, unit = " " }

[[language]]
name = "ocaml-interface"
scope = "source.ocaml.interface"
file-types = ["mli"]
roots = []
comment-token = "(**)"
indent = { tab-width = 2, unit = " "}

[[language]]
name = "lua"
scope = "source.lua"
Expand Down
1 change: 1 addition & 0 deletions runtime/queries/ocaml-interface/highlights.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
; inherits: ocaml
160 changes: 160 additions & 0 deletions runtime/queries/ocaml/highlights.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
; Modules
oberblastmeister marked this conversation as resolved.
Show resolved Hide resolved
;--------

[(module_name) (module_type_name)] @namespace

; Types
;------

[(class_name) (class_type_name) (type_constructor)] @type

[(constructor_name) (tag)] @constructor

; 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) @method

; Variables
;----------

(value_pattern) @parameter

; Application
;------------

(infix_expression
left: (value_path (value_name) @function)
(infix_operator) @operator
(#eq? @operator "@@"))

(infix_expression
(infix_operator) @operator
right: (value_path (value_name) @function)
(#eq? @operator "|>"))

(application_expression
function: (value_path (value_name) @function))

; Properties
;-----------

[(label_name) (field_name) (instance_variable_name)] @property

; Constants
;----------

[(boolean) (unit)] @constant

[(number) (signed_number)] @number

(character) @character

(string) @string

(quoted_string "{" @string "}" @string) @string

(escape_sequence) @string.escape

[
(conversion_specification)
(pretty_printing_indication)
] @punctuation.special

; Keywords
;---------

[
"and" "as" "assert" "begin" "class" "constraint"
"end" "external" "in"
"inherit" "initializer" "lazy" "let" "match" "method" "module"
"mutable" "new" "nonrec" "object" "of" "private" "rec" "sig" "struct"
"type" "val" "virtual" "when" "with"
] @keyword

["fun" "function" "functor"] @keyword.function

["if" "then" "else"] @keyword.control.conditional

["exception" "try"] @keyword.control.exception

["include" "open"] @include

["for" "to" "downto" "while" "do" "done"] @keyword.control.loop

; Macros
;-------

(attribute ["[@" "]"] @attribute)
(item_attribute ["[@@" "]"] @attribute)
(floating_attribute ["[@@@" "]"] @attribute)
(extension ["[%" "]"] @function.macro)
(item_extension ["[%%" "]"] @function.macro)
(quoted_extension ["{%" "}"] @function.macro)
(quoted_item_extension ["{%%" "}"] @function.macro)
"%" @function.macro

["(" ")" "[" "]" "{" "}" "[|" "|]" "[<" "[>"] @punctuation.bracket

(object_type ["<" ">"] @punctuation.bracket)

[
"," "." ";" ":" "=" "|" "~" "?" "+" "-" "!" ">" "&"
"->" ";;" ":>" "+=" ":=" ".."
] @punctuation.delimiter

; Operators
;----------

[
(prefix_operator)
(sign_operator)
(infix_operator)
(hash_operator)
(indexing_operator)
(let_operator)
(and_operator)
(match_operator)
] @operator

(match_expression (match_operator) @keyword)

(value_definition [(let_operator) (and_operator)] @keyword)

;; TODO: this is an error now
;(prefix_operator "!" @operator)

(infix_operator ["&" "+" "-" "=" ">" "|" "%"] @operator)

(signed_number ["+" "-"] @operator)

["*" "#" "::" "<-"] @operator

; Attributes
;-----------

(attribute_id) @property

; Comments
;---------

[(comment) (line_number_directive) (directive) (shebang)] @comment

(ERROR) @error

; Blanket highlights
; ------------------

[(value_name) (type_variable)] @variable
13 changes: 13 additions & 0 deletions runtime/queries/ocaml/indents.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
indent = [
"let_binding",
"type_binding",
"structure",
"signature",
"record_declaration",
"function_expression",
"match_case",
]

oudent = [
"}",
]
24 changes: 24 additions & 0 deletions runtime/queries/ocaml/locals.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
; Scopes
;-------

[
(let_binding)
(class_binding)
(class_function)
(method_definition)
(fun_expression)
(object_expression)
(for_expression)
(match_case)
(attribute_payload)
] @local.scope

; Definitions
;------------

(value_pattern) @local.definition

; References
;-----------

(value_path . (value_name) @local.reference)