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 19, 2023
1 parent 63218a5 commit c8cb3f5
Show file tree
Hide file tree
Showing 7 changed files with 317 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 @@ -148,6 +148,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 @@ -956,6 +956,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 = "#"
roots = []
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
216 changes: 216 additions & 0 deletions runtime/queries/smali/highlights.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
; Types

(class_identifier
(identifier) @type)

(primitive_type) @type.builtin

((class_identifier
. (identifier) @_first @type.builtin
(identifier) @type.builtin)
(#match? @_first "^(android|dalvik|java|kotlinx)$"))

((class_identifier
. (identifier) @_first @type.builtin
. (identifier) @_second @type.builtin
(identifier) @type.builtin)
(#eq? @_first "com")
(#match? @_second "^(android|google)$"))

; Methods

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

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

(expression
(opcode) @_field_access
(body
(field_identifier) @variable.other.member)
(#match? @_field_access "^[is](get|put)-"))

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

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

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

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

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

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

((method_identifier) @constructor
(#match? @constructor "^(<init>|<clinit>)$"))

"constructor" @constructor

; Fields

[
(field_identifier)
(annotation_key)
] @variable.other.member

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

; Variables

(variable) @variable.builtin

(local_directive
(identifier) @variable)

; Parameters

(parameter) @variable.parameter
(param_identifier) @variable.parameter

; Labels

[
(label)
(jmp_label)
] @label

; Operators

; (opcode) @keyword.operator

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

((opcode) @keyword.control.conditional
(#match? @keyword.control.conditional "^if"))

((opcode) @keyword.control.conditional
(#match? @keyword.control.conditional "^cmp"))

((opcode) @keyword.control.exception
(#match? @keyword.control.exception "^throw"))

[
"="
".."
] @operator

; Keywords

[
".class"
".super"
".implements"
".field"
".end field"
".annotation"
".end annotation"
".subannotation"
".end subannotation"
".param"
".end param"
".parameter"
".end parameter"
".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"
] @keyword.directive

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

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

; Literals

(string) @string
(source_directive (string "\"" _ @string.special.url "\""))
(escape_sequence) @constant.character.escape

(character) @constant.character

"L" @punctuation

(line_directive (number) @comment) @comment
(".locals" (number) @comment) @comment

(number) @constant.numeric.integer

[
(float)
(NaN)
(Infinity)
] @constant.numeric.float

(boolean) @constant.builtin.boolean

(null) @constant.builtin

; Misc

(annotation_visibility) @keyword.storage.modifier

(access_modifier) @keyword.storage.type

(array_type
"[" @punctuation.special)

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

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

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

; Comments

(comment) @comment

(class_definition
(comment) @comment.block.documentation)
31 changes: 31 additions & 0 deletions runtime/queries/smali/indents.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
[
(annotation_directive)
(array_data_directive)
(field_definition)
(method_definition)
(packed_switch_directive)
(param_directive)
(parameter_directive)
(sparse_switch_directive)
(subannotation_directive)
(list)
"\{"
] @indent

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

[
(ERROR)
(comment)
] @indent.always
2 changes: 2 additions & 0 deletions runtime/queries/smali/injections.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
((comment) @injection.content
(#set! injection.language "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)
] @local.scope

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

(enum_reference
(field_identifier) @local.definition)

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

(field_definition
(field_identifier) @local.definition
(field_type) @local.definition)

(annotation_key) @local.definition

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

(param_identifier) @local.definition

(annotation_directive
(class_identifier) @local.definition)

(class_directive
(class_identifier) @local.definition)

0 comments on commit c8cb3f5

Please sign in to comment.