summaryrefslogblamecommitdiff
path: root/runtime/queries/scala/highlights.scm
blob: 50a6e18a64bcf1a44a90d0fd5d1233250a2a4490 (plain) (tree)









































































































































































































                                                                 
; CREDITS @stumash (stuart.mashaal@gmail.com)

;; variables


((identifier) @variable.builtin
 (#match? @variable.builtin "^this$"))

(interpolation) @none

; Assume other uppercase names constants.
; NOTE: In order to distinguish constants we highlight
; all the identifiers that are uppercased. But this solution
; is not suitable for all occurrences e.g. it will highlight
; an uppercased method as a constant if used with no params.
; Introducing highlighting for those specific cases, is probably
; best way to resolve the issue.
((identifier) @constant (#match? @constant "^[A-Z]"))

;; types

(type_identifier) @type

(class_definition
  name: (identifier) @type)

(object_definition
  name: (identifier) @type)

(trait_definition
  name: (identifier) @type)

(type_definition
  name: (type_identifier) @type)

; method definition

(class_definition
  body: (template_body
    (function_definition
      name: (identifier) @function.method)))
(object_definition
  body: (template_body
    (function_definition
      name: (identifier) @function.method)))
(trait_definition
  body: (template_body
    (function_definition
      name: (identifier) @function.method)))

; imports

(import_declaration
  path: (identifier) @namespace)
((stable_identifier (identifier) @namespace))

((import_declaration
  path: (identifier) @type) (#match? @type "^[A-Z]"))
((stable_identifier (identifier) @type) (#match? @type "^[A-Z]"))

((import_selectors (identifier) @type) (#match? @type "^[A-Z]"))

; method invocation


(call_expression
  function: (identifier) @function)

(call_expression
  function: (field_expression
    field: (identifier) @function.method))

((call_expression
   function: (identifier) @variable.other.member)
 (#match? @variable.other.member "^[A-Z]"))

(generic_function
  function: (identifier) @function)

(
  (identifier) @function.builtin
  (#match? @function.builtin "^super$")
)

; function definitions

(function_definition
  name: (identifier) @function)

(parameter
  name: (identifier) @variable.parameter)

; expressions


(field_expression field: (identifier) @variable.other.member)
(field_expression value: (identifier) @type
 (#match? @type "^[A-Z]"))

(infix_expression operator: (identifier) @operator)
(infix_expression operator: (operator_identifier) @operator)
(infix_type operator: (operator_identifier) @operator)
(infix_type operator: (operator_identifier) @operator)

; literals
(boolean_literal) @constant.builtin.boolean
(integer_literal) @constant.numeric.integer
(floating_point_literal) @constant.numeric.float


(symbol_literal) @string.special.symbol
 
[
(string)
(character_literal)
(interpolated_string_expression)
] @string

(interpolation "$" @punctuation.special)

;; keywords

[
  "abstract"
  "case"
  "class"
  "extends"
  "final"
  "finally"
;; `forSome` existential types not implemented yet
  "implicit"
  "lazy"
;; `macro` not implemented yet
  "object"
  "override"
  "package"
  "private"
  "protected"
  "sealed"
  "trait"
  "type"
  "val"
  "var"
  "with"
] @keyword

(null_literal) @constant.builtin
(wildcard) @keyword

;; special keywords

"new" @keyword.operator

[
 "else"
 "if"
 "match"
 "try"
 "catch"
 "throw"
] @keyword.control.conditional

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

[
 "."
 ","
] @punctuation.delimiter

[
 "do"
 "for"
 "while"
 "yield"
] @keyword.control.repeat

"def" @keyword.function

[
  "=>"
  "<-"
  "@"
] @keyword.operator

"import" @keyword.control.import

"return" @keyword.control.return

(comment) @comment

;; `case` is a conditional keyword in case_block

(case_block
  (case_clause ("case") @keyword.control.conditional))

(identifier) @variable