feat: add support for Tact (#6554)

This commit is contained in:
Novus Nota 2024-05-03 18:42:51 +02:00 committed by GitHub
parent cbf9090a4c
commit 440f177277
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 459 additions and 0 deletions

View file

@ -407,6 +407,7 @@ We are looking for maintainers to add more parsers and to write query files for
- [x] [systemtap](https://github.com/ok-ryoko/tree-sitter-systemtap) (maintained by @ok-ryoko)
- [x] [t32](https://gitlab.com/xasc/tree-sitter-t32.git) (maintained by @xasc)
- [x] [tablegen](https://github.com/amaanq/tree-sitter-tablegen) (maintained by @amaanq)
- [x] [tact](https://github.com/tact-lang/tree-sitter-tact) (maintained by @novusnota)
- [x] [tcl](https://github.com/tree-sitter-grammars/tree-sitter-tcl) (maintained by @lewis6991)
- [x] [teal](https://github.com/euclidianAce/tree-sitter-teal) (maintained by @euclidianAce)
- [x] [templ](https://github.com/vrischmann/tree-sitter-templ) (maintained by @vrischmann)

View file

@ -701,6 +701,9 @@
"tablegen": {
"revision": "6b7eb096621443627cc5e29c8c34ff1fde482cf3"
},
"tact": {
"revision": "83d5de4c0566ce4415c30cd4633e4ebb09a1d6b8"
},
"tcl": {
"revision": "8784024358c233efd0f3a6fd9e7a3c5852e628bc"
},

View file

@ -2041,6 +2041,14 @@ list.tablegen = {
maintainers = { "@amaanq" },
}
list.tact = {
install_info = {
url = "https://github.com/tact-lang/tree-sitter-tact",
files = { "src/parser.c" },
},
maintainers = { "@novusnota" },
}
list.teal = {
install_info = {
url = "https://github.com/euclidianAce/tree-sitter-teal",

16
queries/tact/folds.scm Normal file
View file

@ -0,0 +1,16 @@
[
; import …
(import_statement)+
; (…, …)
(parameter_list)
(argument_list)
; {…, …}
(instance_argument_list)
; {…; …}
(message_body)
(struct_body)
(contract_body)
(trait_body)
(function_body)
(block_statement)
] @fold

307
queries/tact/highlights.scm Normal file
View file

@ -0,0 +1,307 @@
; variable
; --------
(identifier) @variable
; variable.builtin
; ----------------
(self) @variable.builtin
; variable.parameter
; ------------------
(parameter
name: (identifier) @variable.parameter)
; punctuation.delimiter
; ---------------------
[
";"
","
"."
":"
"?"
] @punctuation.delimiter
; punctuation.bracket
; -------------------
[
"("
")"
"{"
"}"
] @punctuation.bracket
; operator
; --------
[
"-"
"-="
"+"
"+="
"*"
"*="
"/"
"/="
"%"
"%="
"="
"=="
"!"
"!="
"!!"
"<"
"<="
"<<"
">"
">="
">>"
"&"
"|"
"^"
"&&"
"||"
] @operator
; constructor
; -----------
(instance_expression
name: (identifier) @constructor)
(initOf
name: (identifier) @constructor)
; type
; ----
(type_identifier) @type
; type.builtin
; ------------
((identifier) @type.builtin
(#eq? @type.builtin "SendParameters"))
(bounced_type
"bounced" @type.builtin
"<" @punctuation.bracket
">" @punctuation.bracket)
(map_type
"map" @type.builtin
"<" @punctuation.bracket
">" @punctuation.bracket)
((type_identifier) @type.builtin
(#any-of? @type.builtin "Address" "Bool" "Builder" "Cell" "Int" "Slice" "String" "StringBuilder"))
(tlb_serialization
"as" @keyword
type: (identifier) @type.builtin
(#any-of? @type.builtin
"int8" "int16" "int32" "int64" "int128" "int256" "int257" "uint8" "uint16" "uint32" "uint64"
"uint128" "uint256" "coins" "remaining" "bytes32" "bytes64"))
; string
; ------
(string) @string
; string.escape
; -------------
(escape_sequence) @string.escape
; string.special.path
; -------------------
(import_statement
library: (string) @string.special.path)
; boolean
; -------
(boolean) @boolean
; constant
; --------
(constant
name: (identifier) @constant)
; constant.builtin
; ----------------
(null) @constant.builtin
((identifier) @constant.builtin
(#any-of? @constant.builtin
"SendBounceIfActionFail" "SendPayGasSeparately" "SendIgnoreErrors" "SendDestroyIfZero"
"SendRemainingValue" "SendRemainingBalance" "ReserveExact" "ReserveAllExcept" "ReserveAtMost"
"ReserveAddOriginalBalance" "ReserveInvertSign" "ReserveBounceIfActionFail"))
; property
; --------
(instance_argument
name: (identifier) @variable.member)
(lvalue
(_)
(_) @variable.member)
(field_access_expression
name: (identifier) @variable.member)
(trait_body
(constant
name: (identifier) @variable.member))
(contract_body
(constant
name: (identifier) @variable.member))
(field
name: (identifier) @variable.member)
; number
; ------
(integer) @number
; keyword
; -------
[
"with"
"const"
"let"
; "public" ; -- not used, but declared in grammar.ohm
; "extend" ; -- not used, but declared in grammar.ohm
] @keyword
; keyword.type
; ------------
[
"contract"
"trait"
"struct"
"message"
] @keyword.type
; keyword.function
; ----------------
[
"fun"
"native"
] @keyword.function
; keyword.operator
; ----------------
"initOf" @keyword.operator
; keyword.import
; --------------
"import" @keyword.import
; keyword.modifier
; ---------------
[
"get"
"mutates"
"extends"
"virtual"
"override"
"inline"
"abstract"
] @keyword.modifier
; keyword.repeat
; --------------
(foreach_statement
.
(_)
.
(_)
.
"in" @keyword.repeat)
[
"while"
"repeat"
"do"
"until"
"foreach"
] @keyword.repeat
; keyword.return
; --------------
"return" @keyword.return
; keyword.exception
; -----------------
[
"try"
"catch"
] @keyword.exception
; keyword.conditional
; -------------------
[
"if"
"else"
] @keyword.conditional
; keyword.directive.define
; ------------------------
"primitive" @keyword.directive.define
; function
; --------
(native_function
name: (identifier) @function)
(static_function
name: (identifier) @function)
(func_identifier) @function
; function.method
; ---------------
(init_function
"init" @function.method)
(receive_function
"receive" @function.method)
(bounced_function
"bounced" @function.method)
(external_function
"external" @function.method)
(function
name: (identifier) @function.method)
; function.call
; -------------
(static_call_expression
name: (identifier) @function.call)
; function.method.call
; ---------------
(method_call_expression
name: (identifier) @function.method.call)
; function.builtin
; ----------------
(static_call_expression
name: (identifier) @function.builtin
(#any-of? @function.builtin
"log" "log2" "send" "sender" "require" "now" "myBalance" "myAddress" "newAddress"
"contractAddress" "contractAddressExt" "emit" "cell" "ton" "dump" "dumpStack" "beginString"
"beginComment" "beginTailString" "beginStringFromBuilder" "beginCell" "emptyCell" "randomInt"
"random" "checkSignature" "checkDataSignature" "sha256" "min" "max" "abs" "pow" "pow2" "throw"
"nativeThrowWhen" "nativeThrowUnless" "getConfigParam" "nativeRandomize" "nativeRandomizeLt"
"nativePrepareRandom" "nativeRandom" "nativeRandomInterval" "nativeReserve"))
; comment
; -------
(comment) @comment @spell
((comment) @comment.documentation
(#lua-match? @comment.documentation "^/[*][*][^*].*[*]/$"))
; attribute
; ---------
[
"@name"
"@interface"
] @attribute

50
queries/tact/indents.scm Normal file
View file

@ -0,0 +1,50 @@
; indent.begin ; indent children when matching this node
; ------------
[
; (..., ...)
(parameter_list)
(argument_list)
; {..., ...}
(instance_argument_list)
; {...; ...}
(message_body)
(struct_body)
(contract_body)
(trait_body)
(function_body)
(block_statement)
; misc.
(binary_expression)
(ternary_expression)
(return_statement)
(static_call_expression)
(method_call_expression)
] @indent.begin
; indent.branch ; dedent itself when matching this node
; -------------
[
"}"
")"
">"
] @indent.branch
; indent.end ; marks the end of indented block
; ----------
[
"}"
")"
">"
] @indent.end
; indent.auto ; behaves like 'autoindent' buffer option
; -----------
[
(comment)
(ERROR)
] @indent.auto
; indent.align ; behaves like python aligned/hanging indent
; indent.dedent ; dedent children when matching this node
; indent.ignore ; do not indent in this node
; indent.zero ; sets this node at position 0 (no indent)

View file

@ -0,0 +1,2 @@
((comment) @injection.content
(#set! injection.language "comment"))

72
queries/tact/locals.scm Normal file
View file

@ -0,0 +1,72 @@
; Scopes @local.scope
; -------------------------
[
(static_function)
(init_function)
(bounced_function)
(receive_function)
(external_function)
(function)
(block_statement)
] @local.scope
; Definitions @local.definition
; ------------------------------
; variables
(let_statement
name: (identifier) @local.definition.var)
; constants
(constant
name: (identifier) @local.definition.constant)
; functions
(static_function
name: (identifier) @local.definition.function
(#set! definition.var.scope parent))
; methods (functions off of contracts and traits)
(init_function
"init" @local.definition.method
(#set! definition.var.scope parent))
(bounced_function
"bounced" @local.definition.method
(#set! definition.var.scope parent))
(receive_function
"receive" @local.definition.method
(#set! definition.var.scope parent))
(external_function
"external" @local.definition.method
(#set! definition.var.scope parent))
(function
name: (identifier) @local.definition.method
(#set! definition.var.scope parent))
; parameters
(parameter
name: (identifier) @local.definition.parameter)
; user-defined types (structs and messages)
(type_identifier) @local.definition.type
; fields (and properties)
(field
name: (identifier) @local.definition.field)
; imports
(import_statement
(string) @local.definition.import)
; References @local.reference
; -----------------------------
(self) @local.reference
(value_expression
(identifier) @local.reference)
(lvalue
(identifier) @local.reference)