From c14268718be7699b9e44fed2521f634ed1da44d7 Mon Sep 17 00:00:00 2001 From: Giorbo <43214182+Giorbo@users.noreply.github.com> Date: Wed, 7 Sep 2022 20:13:06 +0200 Subject: [PATCH] Add syntax highlighting for SML (#3692) Co-authored-by: Michael Davis --- book/src/generated/lang-support.md | 1 + languages.toml | 12 ++++ runtime/queries/sml/highlights.scm | 91 ++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 runtime/queries/sml/highlights.scm diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index 4e10ffc121cda..a66fae211a6c3 100644 --- a/book/src/generated/lang-support.md +++ b/book/src/generated/lang-support.md @@ -95,6 +95,7 @@ | scheme | ✓ | | | | | scss | ✓ | | | `vscode-css-language-server` | | slint | ✓ | | ✓ | `slint-lsp` | +| sml | ✓ | | | | | solidity | ✓ | | | `solc` | | sql | ✓ | | | | | sshclientconfig | ✓ | | | | diff --git a/languages.toml b/languages.toml index d3051377955b7..38d9cb5551b8f 100644 --- a/languages.toml +++ b/languages.toml @@ -1712,3 +1712,15 @@ language-server = { command = "pasls", args = [] } [[grammar]] name = "pascal" source = { git = "https://github.com/Isopod/tree-sitter-pascal", rev = "2fd40f477d3e2794af152618ccfac8d92eb72a66" } + +[[language]] +name = "sml" +scope = "source.sml" +injection-regex = "sml" +file-types = ["sml"] +comment-token = "(*" +roots = [] + +[[grammar]] +name = "sml" +source = { git = "https://github.com/Giorbo/tree-sitter-sml", rev = "bd4055d5554614520d4a0706b34dc0c317c6b608" } diff --git a/runtime/queries/sml/highlights.scm b/runtime/queries/sml/highlights.scm new file mode 100644 index 0000000000000..dfbf5caf3f7fa --- /dev/null +++ b/runtime/queries/sml/highlights.scm @@ -0,0 +1,91 @@ +; Highlights queries from Matthew Fluet (https://github.com/MatthewFluet/tree-sitter-sml) +; +; MIT License +; +; Copyright (c) 2022 Matthew Fluet +; +; Permission is hereby granted, free of charge, to any person obtaining a copy +; of this software and associated documentation files (the "Software"), to deal +; in the Software without restriction, including without limitation the rights +; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +; copies of the Software, and to permit persons to whom the Software is +; furnished to do so, subject to the following conditions: +; +; The above copyright notice and this permission notice shall be included in all +; copies or substantial portions of the Software. +; +; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +; SOFTWARE. + +;; ******************************************************************* +;; Comments +;; ******************************************************************* + +[(block_comment) (line_comment)] @comment + +;; ******************************************************************* +;; Keywords +;; ******************************************************************* + +[ + ;; Reserved Words Core + "abstype" "and" "andalso" "as" "case" "datatype" "do" "else" "end" + "exception" "fn" "fun" "handle" "if" "in" "infix" "infixr" "let" + "local" "nonfix" "of" "op" "open" "orelse" "raise" "rec" "then" + "type" "val" "with" "withtype" "while" + ;; Reserved Words Modules + "eqtype" "functor" "include" "sharing" "sig" "signature" "struct" + "structure" "where" +] @keyword + +;; ******************************************************************* +;; Constants +;; ******************************************************************* + +(integer_scon) @constant.numeric.integer +(real_scon) @constant.numeric.float +(word_scon) @constant.numeric +(string_scon) @string +(char_scon) @constant.character + +;; ******************************************************************* +;; Types +;; ******************************************************************* + +(fn_ty "->" @type) +(tuple_ty "*" @type) +(paren_ty ["(" ")"] @type) +(tyvar_ty (tyvar) @type) +(record_ty + ["{" "," "}"] @type + (tyrow [(lab) ":"] @type)? + (ellipsis_tyrow ["..." ":"] @type)?) +(tycon_ty + (tyseq ["(" "," ")"] @type)? + (longtycon) @type) + +;; ******************************************************************* +;; Constructors +;; ******************************************************************* + +;; Assume value identifiers starting with capital letter are constructors +((vid) @constructor + (#match? @constructor "^[A-Z].*")) + +((vid) @constant.builtin (#eq? @constant.builtin "nil")) +((vid) @constant.builtin.boolean + (#match? @constant.builtin.boolean "^(true|false)$")) +((vid) @operator (#eq? @operator "::")) +((vid) @keyword.storage.modifier (#eq? @keyword.storage.modifier "ref")) + +;; ******************************************************************* +;; Punctuation +;; ******************************************************************* + +["(" ")" "[" "]" "{" "}"] @punctuation.bracket +["." "," ":" ";" "|" "=>" ":>"] @punctuation.delimiter