Skip to content

Commit

Permalink
OCaml support (#666)
Browse files Browse the repository at this point in the history
* added some stuff

* add interface

* indent

* highlights and locals

* scope

* change some stuff

* add indents

* fix blanket highlight

* macro

* use inherits
  • Loading branch information
oberblastmeister authored Sep 1, 2021
1 parent 825bcee commit 5766f5d
Show file tree
Hide file tree
Showing 8 changed files with 223 additions and 0 deletions.
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
;--------

[(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)

0 comments on commit 5766f5d

Please sign in to comment.