From 32bde79ba742190275590a71ea59a48a9f51e3cd Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Thu, 9 Sep 2021 21:23:00 +0200 Subject: [PATCH] enh(scala) add Scala 3 `end` and `extension` soft keywords (#3327) * enh(scala) add Scala 3 extension soft keyword Based on https://github.com/scala/vscode-scala-syntax/blob/57e0829cd46980699570101a68c320a20330d36c/src/typescript/Scala.tmLanguage.ts#L1134. Also see https://docs.scala-lang.org/scala3/reference/contextual/extension-methods.html#syntax. * enh(scala) add Scala 3 end soft keyword Add Scala 3 end of definition or expression. Simplified verion of https://github.com/scala/vscode-scala-syntax/blob/main/src/typescript/Scala.tmLanguage.ts#L599-L634. Here we only need one kind of keyword. --- CHANGES.md | 2 ++ src/languages/scala.js | 26 ++++++++++++++++ test/markup/scala/end.expect.txt | 41 ++++++++++++++++++++++++++ test/markup/scala/end.txt | 41 ++++++++++++++++++++++++++ test/markup/scala/extension.expect.txt | 19 ++++++++++++ test/markup/scala/extension.txt | 19 ++++++++++++ 6 files changed, 148 insertions(+) create mode 100644 test/markup/scala/end.expect.txt create mode 100644 test/markup/scala/end.txt create mode 100644 test/markup/scala/extension.expect.txt create mode 100644 test/markup/scala/extension.txt diff --git a/CHANGES.md b/CHANGES.md index 96dfc0bd69..978c6dbc81 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -18,6 +18,8 @@ Grammars: - enh(scala) add missing `do` and `then` keyword (#3323) [Nicolas Stucki][] - enh(scala) add missing `enum`, `export` and `given` keywords (#3328) [Nicolas Stucki][] - enh(scala) remove symbol syntax and fix quoted code syntax (#3324) [Nicolas Stucki][] +- enh(scala) add Scala 3 `extension` soft keyword (#3326) [Nicolas Stucki][] +- enh(scala) add Scala 3 `end` soft keyword (#3327) [Nicolas Stucki][] - enh(scala) add `inline` soft keyword (#3329) [Nicolas Stucki][] [Austin Schick]: https://github.com/austin-schick diff --git a/src/languages/scala.js b/src/languages/scala.js index 65dfa9240c..0dee48c0d7 100644 --- a/src/languages/scala.js +++ b/src/languages/scala.js @@ -112,6 +112,30 @@ export default function(hljs) { contains: [ NAME ] }; + const EXTENSION = { + begin: [ + /^\s*/, // Is first token on the line + 'extension', + /\s+(?=[[(])/, // followed by at least one space and `[` or `(` + ], + beginScope: { + 2: "keyword", + } + }; + + const END = [{ + begin: [ + /^\s*/, // Is first token on the line + /end/, + /\s+/, + /(extension\b)?/, // `extension` is the only marker that follows an `end` that cannot be captured by another rule. + ], + beginScope: { + 2: "keyword", + 4: "keyword", + } + }]; + // TODO: use negative look-behind in future // /(?def foo = + if (true) + () + else + () + end if + + while true do + () + end while + + for x <- xs do + () + end for + + x match + case _ => + end match +end foo + +def bar = + new Foo: + def f = () + end new +end + +val baz = + () +end val + +var baz2 = + () +end var + +extension (x: Int) + def f = 1 + def f = 2 +end extension + +class Foo: +end Foo diff --git a/test/markup/scala/end.txt b/test/markup/scala/end.txt new file mode 100644 index 0000000000..fbf16d363b --- /dev/null +++ b/test/markup/scala/end.txt @@ -0,0 +1,41 @@ +def foo = + if (true) + () + else + () + end if + + while true do + () + end while + + for x <- xs do + () + end for + + x match + case _ => + end match +end foo + +def bar = + new Foo: + def f = () + end new +end + +val baz = + () +end val + +var baz2 = + () +end var + +extension (x: Int) + def f = 1 + def f = 2 +end extension + +class Foo: +end Foo diff --git a/test/markup/scala/extension.expect.txt b/test/markup/scala/extension.expect.txt new file mode 100644 index 0000000000..9daa346a91 --- /dev/null +++ b/test/markup/scala/extension.expect.txt @@ -0,0 +1,19 @@ +extension (x: Int) def plus(y: Int) = x + y + +extension [T](x: T) def f = () + +extension (x: Int) + def f = 1 + def f = 2 + +object Foo { + extension (x: Int) + def f = 1 + def f = 2 +} + +def extension(file: File) = + file.extension + + file + .extension diff --git a/test/markup/scala/extension.txt b/test/markup/scala/extension.txt new file mode 100644 index 0000000000..75a6327980 --- /dev/null +++ b/test/markup/scala/extension.txt @@ -0,0 +1,19 @@ +extension (x: Int) def plus(y: Int) = x + y + +extension [T](x: T) def f = () + +extension (x: Int) + def f = 1 + def f = 2 + +object Foo { + extension (x: Int) + def f = 1 + def f = 2 +} + +def extension(file: File) = + file.extension + + file + .extension