diff --git a/languages.toml b/languages.toml index 8777408f9113a..ea9cc53461000 100644 --- a/languages.toml +++ b/languages.toml @@ -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" diff --git a/runtime/queries/smali/folds.scm b/runtime/queries/smali/folds.scm new file mode 100644 index 0000000000000..c2062e5eff91d --- /dev/null +++ b/runtime/queries/smali/folds.scm @@ -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 diff --git a/runtime/queries/smali/highlights.scm b/runtime/queries/smali/highlights.scm new file mode 100644 index 0000000000000..2e2b84b8b2c0f --- /dev/null +++ b/runtime/queries/smali/highlights.scm @@ -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 "" "")) + +"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 diff --git a/runtime/queries/smali/indents.scm b/runtime/queries/smali/indents.scm new file mode 100644 index 0000000000000..cdfd9081e32cd --- /dev/null +++ b/runtime/queries/smali/indents.scm @@ -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 diff --git a/runtime/queries/smali/injections.scm b/runtime/queries/smali/injections.scm new file mode 100644 index 0000000000000..4bb7d675dfacd --- /dev/null +++ b/runtime/queries/smali/injections.scm @@ -0,0 +1 @@ +(comment) @comment diff --git a/runtime/queries/smali/locals.scm b/runtime/queries/smali/locals.scm new file mode 100644 index 0000000000000..fcb3b631cb934 --- /dev/null +++ b/runtime/queries/smali/locals.scm @@ -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)