Unnamed repository; edit this file 'description' to name the repository.
Add TypeSpec support (#11412)
* Add TypeSpec support Adds support for TypeSpec <https://typespec.io> in helix. * Resolve PR comments * Pull in LICENSE Co-authored-by: Michael Davis <[email protected]> --------- Co-authored-by: Michael Davis <[email protected]>
Heath Stewart 2024-08-09
parent c9c4452 · commit d6431f4
-rw-r--r--book/src/generated/lang-support.md1
-rw-r--r--languages.toml18
-rw-r--r--runtime/queries/typespec/highlights.scm177
-rw-r--r--runtime/queries/typespec/indents.scm18
-rw-r--r--runtime/queries/typespec/injections.scm5
-rw-r--r--runtime/queries/typespec/textobjects.scm51
6 files changed, 270 insertions, 0 deletions
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index e3e59c5f..d53bd35f 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -205,6 +205,7 @@
| tsx | ✓ | ✓ | ✓ | `typescript-language-server` |
| twig | ✓ | | | |
| typescript | ✓ | ✓ | ✓ | `typescript-language-server` |
+| typespec | ✓ | ✓ | ✓ | `tsp-server` |
| typst | ✓ | | | `tinymist`, `typst-lsp` |
| ungrammar | ✓ | | | |
| unison | ✓ | | ✓ | |
diff --git a/languages.toml b/languages.toml
index 5c8118da..d834b964 100644
--- a/languages.toml
+++ b/languages.toml
@@ -94,6 +94,7 @@ taplo = { command = "taplo", args = ["lsp", "stdio"] }
templ = { command = "templ", args = ["lsp"] }
terraform-ls = { command = "terraform-ls", args = ["serve"] }
texlab = { command = "texlab" }
+typespec = { command = "tsp-server", args = ["--stdio"] }
vala-language-server = { command = "vala-language-server" }
vhdl_ls = { command = "vhdl_ls", args = [] }
vlang-language-server = { command = "v-analyzer" }
@@ -768,6 +769,23 @@ name = "typescript"
source = { git = "https://github.com/tree-sitter/tree-sitter-typescript", rev = "b1bf4825d9eaa0f3bdeb1e52f099533328acfbdf", subpath = "typescript" }
[[language]]
+name = "typespec"
+scope = "source.typespec"
+injection-regex = "(tsp|typespec)"
+language-id = "typespec"
+file-types = ["tsp"]
+roots = ["tspconfig.yaml"]
+auto-format = true
+comment-token = "//"
+block-comment-tokens = { start = "/*", end = "*/" }
+language-servers = ["typespec"]
+indent = { tab-width = 2, unit = " " }
+
+[[grammar]]
+name = "typespec"
+source = { git = "https://github.com/happenslol/tree-sitter-typespec", rev = "0ee05546d73d8eb64635ed8125de6f35c77759fe" }
+
+[[language]]
name = "tsx"
scope = "source.tsx"
injection-regex = "(tsx)" # |typescript
diff --git a/runtime/queries/typespec/highlights.scm b/runtime/queries/typespec/highlights.scm
new file mode 100644
index 00000000..8b8aa4c3
--- /dev/null
+++ b/runtime/queries/typespec/highlights.scm
@@ -0,0 +1,177 @@
+; Keywords
+
+[
+ "is"
+ "extends"
+ "valueof"
+] @keyword.operator
+
+[
+ "namespace"
+ "scalar"
+ "interface"
+ "alias"
+] @keyword
+
+[
+ "model"
+ "enum"
+ "union"
+] @keyword.storage.type
+
+[
+ "op"
+ "fn"
+ "dec"
+] @keyword.function
+
+"extern" @keyword.storage.modifier
+
+[
+ "import"
+ "using"
+] @keyword.control.import
+
+[
+ "("
+ ")"
+ "{"
+ "}"
+ "<"
+ ">"
+ "["
+ "]"
+] @punctuation.bracket
+
+[
+ ","
+ ";"
+ "."
+ ":"
+] @punctuation.delimiter
+
+[
+ "|"
+ "&"
+ "="
+ "..."
+] @operator
+
+"?" @punctuation.special
+
+; Imports
+
+(import_statement
+ (quoted_string_literal) @string.special.path)
+
+; Namespaces
+
+(using_statement
+ module: (identifier_or_member_expression) @namespace)
+
+(namespace_statement
+ name: (identifier_or_member_expression) @namespace)
+
+; Comments
+
+[
+ (single_line_comment)
+] @comment.line
+
+[
+ (multi_line_comment)
+] @comment.block
+
+; Decorators
+
+(decorator
+ "@" @attribute
+ name: (identifier_or_member_expression) @attribute)
+
+(augment_decorator_statement
+ name: (identifier_or_member_expression) @attribute)
+
+(decorator
+ (decorator_arguments) @variable.parameter)
+
+; Scalars
+
+(scalar_statement
+ name: (identifier) @type)
+
+; Models
+
+(model_statement
+ name: (identifier) @type)
+
+(model_property
+ name: (identifier) @variable.other.member)
+
+; Operations
+
+(operation_statement
+ name: (identifier) @function.method)
+
+(operation_arguments
+ (model_property
+ name: (identifier) @variable.parameter))
+
+(template_parameter
+ name: (identifier) @type.parameter)
+
+(function_parameter
+ name: (identifier) @variable.parameter)
+
+; Interfaces
+
+(interface_statement
+ name: (identifier) @type)
+
+(interface_statement
+ (interface_body
+ (interface_member
+ (identifier) @function.method)))
+
+; Enums
+
+(enum_statement
+ name: (identifier) @type.enum)
+
+(enum_member
+ name: (identifier) @constant)
+
+; Unions
+
+(union_statement
+ name: (identifier) @type)
+
+(union_variant
+ name: (identifier) @type.enum.variant)
+
+; Aliases
+
+(alias_statement
+ name: (identifier) @type)
+
+; Built-in types
+
+[
+ (quoted_string_literal)
+ (triple_quoted_string_literal)
+] @string
+
+(escape_sequence) @constant.character.escape
+
+(boolean_literal) @constant.builtin.boolean
+
+[
+ (decimal_literal)
+ (hex_integer_literal)
+ (binary_integer_literal)
+] @constant.numeric.integer
+
+(builtin_type) @type.builtin
+
+; Identifiers
+
+(identifier_or_member_expression) @type
diff --git a/runtime/queries/typespec/indents.scm b/runtime/queries/typespec/indents.scm
new file mode 100644
index 00000000..aee01f35
--- /dev/null
+++ b/runtime/queries/typespec/indents.scm
@@ -0,0 +1,18 @@
+[
+ (model_expression)
+ (tuple_expression)
+ (namespace_body)
+ (interface_body)
+ (union_body)
+ (enum_body)
+ (template_arguments)
+ (template_parameters)
+ (operation_arguments)
+] @indent.begin
+
+[
+ "}"
+ ")"
+ ">"
+ "]"
+] @indent.end
diff --git a/runtime/queries/typespec/injections.scm b/runtime/queries/typespec/injections.scm
new file mode 100644
index 00000000..81d7734c
--- /dev/null
+++ b/runtime/queries/typespec/injections.scm
@@ -0,0 +1,5 @@
+([
+ (single_line_comment)
+ (multi_line_comment)
+] @injection.content
+ (#set! injection.language "comment"))
diff --git a/runtime/queries/typespec/textobjects.scm b/runtime/queries/typespec/textobjects.scm
new file mode 100644
index 00000000..7ee1251c
--- /dev/null
+++ b/runtime/queries/typespec/textobjects.scm
@@ -0,0 +1,51 @@
+; Classes
+
+(enum_statement
+ (enum_body) @class.inside) @class.around
+
+(model_statement
+ (model_expression) @class.inside) @class.around
+
+(union_statement
+ (union_body) @class.inside) @class.around
+
+; Interfaces
+
+(interface_statement
+ (interface_body
+ (interface_member) @function.around) @class.inside) @class.around
+
+; Comments
+
+[
+ (single_line_comment)
+ (multi_line_comment)
+] @comment.inside
+
+[
+ (single_line_comment)
+ (multi_line_comment)
+]+ @comment.around
+
+; Functions
+
+[
+ (decorator)
+ (decorator_declaration_statement)
+ (function_declaration_statement)
+ (operation_statement)
+] @function.around
+
+(function_parameter_list
+ (function_parameter)? @parameter.inside)* @function.inside
+
+(decorator_arguments
+ (expression_list
+ (_) @parameter.inside)*) @function.inside
+
+(operation_arguments
+ (model_property)? @parameter.inside)* @function.inside
+
+(template_parameters
+ (template_parameter_list
+ (template_parameter) @parameter.inside)) @function.inside