Skip to content

Commit

Permalink
add partial scala syntax highlights
Browse files Browse the repository at this point in the history
  • Loading branch information
dwat3r committed Dec 16, 2021
1 parent 0c44715 commit a7bbfeb
Show file tree
Hide file tree
Showing 3 changed files with 214 additions and 0 deletions.
9 changes: 9 additions & 0 deletions languages.toml
Original file line number Diff line number Diff line change
Expand Up @@ -430,3 +430,12 @@ file-types = ["md"]
roots = []

indent = { tab-width = 2, unit = " " }

[[language]]
name = "scala"
scope = "source.scala"
roots = ["build.sbt"]
file-types = ["scala", "sbt"]
comment-token = "//"
indent = { tab-width = 2, unit = " " }
language-server = { command = "metals" }
204 changes: 204 additions & 0 deletions runtime/queries/scala/highlights.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
; CREDITS @stumash (stuart.mashaal@gmail.com)

;; variables

(identifier) @variable

((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) @method)))
(object_definition
body: (template_body
(function_definition
name: (identifier) @method)))
(trait_definition
body: (template_body
(function_definition
name: (identifier) @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) @method))

((call_expression
function: (identifier) @constructor)
(#match? @constructor "^[A-Z]"))

(generic_function
function: (identifier) @function)

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

; function definitions

(function_definition
name: (identifier) @function)

(parameter
name: (identifier) @parameter)

; expressions


(field_expression field: (identifier) @property)
(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.builtin.boolean

[
(symbol_literal)
(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) @keyword
(wildcard) @keyword

;; special keywords

"new" @keyword.operator

[
"else"
"if"
"match"
] @conditional

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

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

; [
; "do"
; "for"
; "while"
; "yield"
; ] @repeat

"def" @keyword.function

;[
; "=>"
; "<-"
; "@"
;] @operator

"import" @include

;[
; "try"
; "catch"
; "throw"
;] @exception

;"return" @keyword.return

(comment) @comment

;; `case` is a conditional keyword in case_block

(case_block
(case_clause ("case") @conditional))
1 change: 1 addition & 0 deletions runtime/queries/scala/injections.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(comment) @comment

0 comments on commit a7bbfeb

Please sign in to comment.