Skip to content

Commit

Permalink
Fix #133: Highlight inline as a soft keyword
Browse files Browse the repository at this point in the history
If it is part of an inline `if` or `match` it is highlighted as a control flow keyword.
If it is part of a `def` or `val` definition it is highlighted as a declaration keyword.
Otherwise, it is not highlighted.
  • Loading branch information
nicolasstucki committed Sep 9, 2020
1 parent 40dc063 commit 2dd5afd
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 1 deletion.
25 changes: 24 additions & 1 deletion src/typescript/Scala.tmLanguage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,9 @@ export const scalaTmLanguage: TmLanguage = {
{
include: '#singleton-type'
},
{
include: '#inline'
},
{
include: '#scala-quoted'
},
Expand Down Expand Up @@ -571,6 +574,26 @@ export const scalaTmLanguage: TmLanguage = {
}
}
},
inline: {
patterns: [
{
match: `\\b(inline)\\b(?=(\\s+(?:${plainid}|${backQuotedId})\\s*:)|(.*(val|def)))`,
captures: {
'1': {
name: 'storage.modifier.other'
}
}
},
{
match: `\\b(inline)\\b(?=.*(if|match))`,
captures: {
'1': {
name: 'keyword.control.flow.scala'
}
}
}
]
},
'scala-quoted': {
match: "('\\{|'\\[)(?!')",
name: 'constant.other.quoted.scala'
Expand Down Expand Up @@ -822,7 +845,7 @@ export const scalaTmLanguage: TmLanguage = {
name: 'storage.modifier.access'
},
{
match: '\\b(synchronized|@volatile|abstract|final|lazy|sealed|implicit|inline |opaque |override|@transient|@native)\\b',
match: '\\b(synchronized|@volatile|abstract|final|lazy|sealed|implicit|opaque |override|@transient|@native)\\b',
name: 'storage.modifier.other'
}
]
Expand Down
41 changes: 41 additions & 0 deletions tests/unit/#133.test.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// SYNTAX TEST "source.scala"


inline val c = 0
// ^^^^^^ storage.modifier.other

inline def power(x: Double, inline n: Int): Double =
// ^^^^^^ storage.modifier.other
// ^^^^^^ storage.modifier.other
inline if (n == 0) 1.0
// ^^^^^^ keyword.control.flow.scala
else inline if (n % 2 == 1) x * power(x, n - 1)
// ^^^^^^ keyword.control.flow.scala
else power(x * x, n / 2)


inline x match {
// ^^^^^^ keyword.control.flow.scala
// ^^^^^ keyword.control.flow.scala


inline def power(x: Double, inline N: Int): Double =
// ^^^^^^ storage.modifier.other
// ^^^^^^ storage.modifier.other

inline def power(x: Double, inline `n`: Int): Double =
// ^^^^^^ storage.modifier.other
// ^^^^^^ storage.modifier.other

val x = inline + 2
// ^^^^^^ - storage.modifier.other keyword.control.flow.scala
val x = inline(x)
// ^^^^^^ - storage.modifier.other keyword.control.flow.scala
val x = inline[T]
// ^^^^^^ - storage.modifier.other keyword.control.flow.scala

inline def inline(inline inline: Int): Double =
// ^^^^^^ storage.modifier.other
// ^^^^^^ entity.name.function.declaration
// ^^^^^^ storage.modifier.other
// ^^^^^^ variable.parameter.scala

0 comments on commit 2dd5afd

Please sign in to comment.