Skip to content

Commit

Permalink
add smali language support
Browse files Browse the repository at this point in the history
  • Loading branch information
evanrichter committed Dec 15, 2023
1 parent e6cdc5f commit 9f32e21
Show file tree
Hide file tree
Showing 7 changed files with 319 additions and 0 deletions.
1 change: 1 addition & 0 deletions book/src/generated/lang-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@
| scheme || | | |
| scss || | | `vscode-css-language-server` |
| slint || || `slint-lsp` |
| smali || || |
| smithy || | | `cs` |
| sml || | | |
| solidity || | | `solc` |
Expand Down
13 changes: 13 additions & 0 deletions languages.toml
Original file line number Diff line number Diff line change
Expand Up @@ -843,6 +843,19 @@ indent = { tab-width = 2, unit = " " }
name = "java"
source = { git = "https://github.com/tree-sitter/tree-sitter-java", rev = "09d650def6cdf7f479f4b78f595e9ef5b58ce31e" }

[[language]]
name = "smali"
scope = "source.smali"
injection-regex = "smali"
file-types = ["smali"]
comment-token = "#"
language-servers = []
indent = { tab-width = 4, unit = " " }

[[grammar]]
name = "smali"
source = { git = "https://github.com/amaanq/tree-sitter-smali", rev = "5ae51e15c4d1ac93cba6127caf3d1f0a072c140c" }

[[language]]
name = "ledger"
scope = "source.ledger"
Expand Down
12 changes: 12 additions & 0 deletions runtime/queries/smali/folds.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[
(annotation_directive)
(array_data_directive)
(field_definition)
(method_definition)
(packed_switch_directive)
(param_directive)
(parameter_directive)
(sparse_switch_directive)
(subannotation_directive)
(list)
] @fold
218 changes: 218 additions & 0 deletions runtime/queries/smali/highlights.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
; Types

(class_identifier
(identifier) @type)

(primitive_type) @type.builtin

((class_identifier
. (identifier) @_first @type.builtin
(identifier) @type.builtin)
(#any-of? @_first "android" "dalvik" "java" "kotlinx"))

((class_identifier
. (identifier) @_first @type.builtin
. (identifier) @_second @type.builtin
(identifier) @type.builtin)
(#eq? @_first "com")
(#any-of? @_second "android" "google"))

; Methods

(method_definition
(method_signature (method_identifier) @method))

(expression
(opcode) @_invoke
(body
(full_method_signature
(method_signature (method_identifier) @method.call)))
(#lua-match? @_invoke "^invoke"))

(method_handle
(full_method_signature
(method_signature (method_identifier) @method.call)))

(custom_invoke
. (identifier) @method.call
(method_signature (method_identifier) @method.call))

(annotation_value
(body
(method_signature (method_identifier) @method.call)))

(annotation_value
(body
(full_method_signature
(method_signature (method_identifier) @method.call))))

(field_definition
(body
(method_signature (method_identifier) @method.call)))

(field_definition
(body
(full_method_signature
(method_signature (method_identifier) @method.call))))

((method_identifier) @constructor
(#any-of? @constructor "<init>" "<clinit>"))

"constructor" @constructor

; Fields

[
(field_identifier)
(annotation_key)
] @field

((field_identifier) @constant
(#lua-match? @constant "^[%u_]*$"))

; Variables

(variable) @variable.builtin

(local_directive
(identifier) @variable)

; Parameters

(parameter) @parameter.builtin
(param_identifier) @parameter

; Labels

[
(label)
(jmp_label)
] @label

; Operators

(opcode) @keyword.operator

((opcode) @keyword.return
(#lua-match? @keyword.return "^return"))

((opcode) @conditional
(#lua-match? @conditional "^if"))

((opcode) @conditional
(#lua-match? @conditional "^cmp"))

((opcode) @exception
(#lua-match? @exception "^throw"))

((opcode) @comment
(#eq? @comment "nop")) ; haha, anyone get it? ;)

[
"="
".."
] @operator

; Keywords

[
".class"
".super"
".implements"
".field"
".end field"
".annotation"
".end annotation"
".subannotation"
".end subannotation"
".param"
".end param"
".parameter"
".end parameter"
".line"
".locals"
".local"
".end local"
".restart local"
".registers"
".packed-switch"
".end packed-switch"
".sparse-switch"
".end sparse-switch"
".array-data"
".end array-data"
".enum"
(prologue_directive)
(epilogue_directive)
] @keyword

[
".source"
] @include

[
".method"
".end method"
] @keyword.function

[
".catch"
".catchall"
] @exception

; Literals

(string) @string
(source_directive (string "\"" _ @text.uri "\""))
(escape_sequence) @string.escape

(character) @character

"L" @character.special

(number) @number

[
(float)
(NaN)
(Infinity)
] @float

(boolean) @boolean

(null) @constant.builtin

; Misc

(annotation_visibility) @storageclass

(access_modifier) @type.qualifier

(array_type
"[" @punctuation.special)

["{" "}"] @punctuation.bracket

["(" ")"] @punctuation.bracket

[
"->"
","
":"
";"
"@"
"/"
] @punctuation.delimiter

(line_directive (number) @text.underline @text.literal)

; Comments

(comment) @comment @spell

(class_definition
(comment) @comment.documentation)

; Errors

(ERROR) @error
32 changes: 32 additions & 0 deletions runtime/queries/smali/indents.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
[
(annotation_directive)
(array_data_directive)
(field_definition)
(method_definition)
(packed_switch_directive)
(param_directive)
(parameter_directive)
(sparse_switch_directive)
(subannotation_directive)
(list)
] @indent.begin

[
".end annotation"
".end array-data"
".end field"
".end method"
".end packed-switch"
".end param"
".end parameter"
".end sparse-switch"
".end subannotation"
"}"
] @indent.end

[ "{" "}" ] @indent.branch

[
(ERROR)
(comment)
] @indent.auto
1 change: 1 addition & 0 deletions runtime/queries/smali/injections.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(comment) @comment
42 changes: 42 additions & 0 deletions runtime/queries/smali/locals.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
[
(class_directive)
(expression)
(annotation_directive)
(array_data_directive)
(method_definition)
(packed_switch_directive)
(sparse_switch_directive)
(subannotation_directive)
] @scope

[
(identifier)
(class_identifier)
(label)
(jmp_label)
] @reference

(enum_reference
(field_identifier) @definition.enum)

((field_definition
(access_modifiers) @_mod
(field_identifier) @definition.enum)
(#eq? @_mod "enum"))

(field_definition
(field_identifier) @definition.field
(field_type) @definition.associated)

(annotation_key) @definition.field

(method_definition
(method_signature (method_identifier) @definition.method))

(param_identifier) @definition.parameter

(annotation_directive
(class_identifier) @definition.type)

(class_directive
(class_identifier) @definition.type)

0 comments on commit 9f32e21

Please sign in to comment.