From 78dc4656fb27a44f086e004036e82ab042f05d26 Mon Sep 17 00:00:00 2001 From: Maxime Kjaer Date: Sat, 23 Jan 2021 13:41:40 +0100 Subject: [PATCH] Fix 'end val' and 'end var' --- src/typescript/Scala.tmLanguage.ts | 8 + tests/snap/end.test.scala | 48 ++++++ tests/snap/end.test.scala.snap | 256 +++++++++++++++++++++++++++++ tests/unit/#192.test.scala | 14 ++ 4 files changed, 326 insertions(+) create mode 100644 tests/snap/end.test.scala create mode 100644 tests/snap/end.test.scala.snap create mode 100644 tests/unit/#192.test.scala diff --git a/src/typescript/Scala.tmLanguage.ts b/src/typescript/Scala.tmLanguage.ts index 434b428..5b7f27c 100644 --- a/src/typescript/Scala.tmLanguage.ts +++ b/src/typescript/Scala.tmLanguage.ts @@ -583,6 +583,14 @@ export const scalaTmLanguage: TmLanguage = { match: `^\\s*(end)\\s+(if|while|for|match)${endOfLineMaybeWithComment}`, name: 'keyword.control.flow.end.scala' }, + { + match: `^\\s*(end)\\s+(val)${endOfLineMaybeWithComment}`, + name: 'keyword.declaration.stable.end.scala' + }, + { + match: `^\\s*(end)\\s+(var)${endOfLineMaybeWithComment}`, + name: 'keyword.declaration.volatile.end.scala' + }, { match: `^\\s*(end)\\s+(?:(new|extension)|(${idUpper}))${endOfLineMaybeWithComment}`, captures: { diff --git a/tests/snap/end.test.scala b/tests/snap/end.test.scala new file mode 100644 index 0000000..88838f1 --- /dev/null +++ b/tests/snap/end.test.scala @@ -0,0 +1,48 @@ +/// SYNTAX TEST "source.scala" +// From: https://dotty.epfl.ch/docs/reference/other-new-features/indentation.html + +package p1.p2: + + abstract class C() with + + def this(x: Int) = + this() + if x > 0 then + val a :: b = + x :: Nil + end val + var y = + x + end y + while y > 0 do + println(y) + y -= 1 + end while + try + x match + case 0 => println("0") + case _ => + end match + finally + println("done") + end try + end if + end this + + def f: String + end C + + object C with + given C = + new C: + def f = "!" + end f + end new + end given + end C + + extension (x: C) + def ff: String = x.f ++ x.f + end extension + +end p2 diff --git a/tests/snap/end.test.scala.snap b/tests/snap/end.test.scala.snap new file mode 100644 index 0000000..0922d59 --- /dev/null +++ b/tests/snap/end.test.scala.snap @@ -0,0 +1,256 @@ +>/// SYNTAX TEST "source.scala" +#^^ source.scala comment.line.double-slash.scala punctuation.definition.comment.scala +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.scala comment.line.double-slash.scala +>// From: https://dotty.epfl.ch/docs/reference/other-new-features/indentation.html +#^^ source.scala comment.line.double-slash.scala punctuation.definition.comment.scala +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.scala comment.line.double-slash.scala +> +>package p1.p2: +#^^^^^^^ source.scala meta.package.scala keyword.other.import.scala +# ^ source.scala meta.package.scala +# ^^ source.scala meta.package.scala entity.name.package.scala +# ^ source.scala meta.package.scala punctuation.definition.package +# ^^ source.scala meta.package.scala entity.name.package.scala +# ^ source.scala meta.package.scala entity.name.package.scala +> +> abstract class C() with +#^^^ source.scala +# ^^^^^^^^ source.scala storage.modifier.other +# ^ source.scala +# ^^^^^ source.scala keyword.declaration.scala +# ^ source.scala +# ^ source.scala entity.name.class.declaration +# ^^ source.scala meta.parentheses.scala meta.bracket.scala +# ^ source.scala +# ^^^^ source.scala keyword.declaration.scala +> +> def this(x: Int) = +#^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.scala +# ^ source.scala +# ^^^^ source.scala entity.name.function.declaration +# ^ source.scala meta.bracket.scala +# ^ source.scala variable.parameter.scala +# ^ source.scala meta.colon.scala +# ^ source.scala +# ^^^ source.scala entity.name.class +# ^ source.scala meta.bracket.scala +# ^ source.scala +# ^ source.scala keyword.operator.comparison.scala +> this() +#^^^^^^^^^ source.scala +# ^^^^ source.scala variable.language.scala +# ^^ source.scala meta.parentheses.scala meta.bracket.scala +> if x > 0 then +#^^^^^^^^^ source.scala +# ^^ source.scala keyword.control.flow.scala +# ^^^ source.scala +# ^ source.scala keyword.operator.comparison.scala +# ^ source.scala +# ^ source.scala constant.numeric.scala +# ^ source.scala +# ^^^^ source.scala keyword.control.flow.scala +> val a :: b = +#^^^^^^^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.stable.scala +# ^ source.scala +# ^ source.scala variable.other.declaration.scala +# ^ source.scala +# ^^ source.scala keyword.operator.scala +# ^^^ source.scala +# ^ source.scala keyword.operator.comparison.scala +> x :: Nil +#^^^^^^^^^^^^^^^^^ source.scala +# ^^ source.scala keyword.operator.scala +# ^ source.scala +# ^^^ source.scala entity.name.class +> end val +#^^^^^^^^^^^^^^^^^^^ source.scala keyword.declaration.stable.end.scala +> var y = +#^^^^^^^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.volatile.scala +# ^ source.scala +# ^ source.scala variable.other.declaration.scala +# ^ source.scala +# ^ source.scala keyword.operator.comparison.scala +> x +#^^^^^^^^^^^^^^^^^ source.scala +> end y +#^^^^^^^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.end.scala +# ^ source.scala +# ^ source.scala entity.name.declaration +> while y > 0 do +#^^^^^^^^^^^^ source.scala +# ^^^^^ source.scala keyword.control.flow.scala +# ^^^ source.scala +# ^ source.scala keyword.operator.comparison.scala +# ^ source.scala +# ^ source.scala constant.numeric.scala +# ^ source.scala +# ^^ source.scala keyword.control.flow.scala +> println(y) +#^^^^^^^^^^^^^^^^^^^^^^ source.scala +# ^ source.scala meta.bracket.scala +# ^ source.scala +# ^ source.scala meta.bracket.scala +> y -= 1 +#^^^^^^^^^^^^^^^^^ source.scala +# ^ source.scala keyword.operator.arithmetic.scala +# ^ source.scala keyword.operator.comparison.scala +# ^ source.scala +# ^ source.scala constant.numeric.scala +> end while +#^^^^^^^^^^^^^^^^^^^^^ source.scala keyword.control.flow.end.scala +> try +#^^^^^^^^^^^^ source.scala +# ^^^ source.scala keyword.control.exception.scala +> x match +#^^^^^^^^^^^^^^^^^ source.scala +# ^^^^^ source.scala keyword.control.flow.scala +> case 0 => println("0") +#^^^^^^^^^^^^^^^^^^ source.scala +# ^^^^ source.scala keyword.control.flow.scala +# ^ source.scala +# ^ source.scala constant.numeric.scala +# ^ source.scala +# ^ source.scala keyword.operator.comparison.scala +# ^ source.scala keyword.operator.comparison.scala +# ^^^^^^^^ source.scala +# ^ source.scala meta.bracket.scala +# ^ source.scala string.quoted.double.scala punctuation.definition.string.begin.scala +# ^ source.scala string.quoted.double.scala +# ^ source.scala string.quoted.double.scala punctuation.definition.string.end.scala +# ^ source.scala meta.bracket.scala +> case _ => +#^^^^^^^^^^^^^^^^^^ source.scala +# ^^^^ source.scala keyword.control.flow.scala +# ^^^ source.scala +# ^ source.scala keyword.operator.comparison.scala +# ^ source.scala keyword.operator.comparison.scala +> end match +#^^^^^^^^^^^^^^^^^^^^^^^^ source.scala keyword.control.flow.end.scala +> finally +#^^^^^^^^^^^^ source.scala +# ^^^^^^^ source.scala keyword.control.exception.scala +> println("done") +#^^^^^^^^^^^^^^^^^^^^^^ source.scala +# ^ source.scala meta.bracket.scala +# ^ source.scala string.quoted.double.scala punctuation.definition.string.begin.scala +# ^^^^ source.scala string.quoted.double.scala +# ^ source.scala string.quoted.double.scala punctuation.definition.string.end.scala +# ^ source.scala meta.bracket.scala +> end try +#^^^^^^^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.end.scala +# ^ source.scala +# ^^^ source.scala entity.name.declaration +> end if +#^^^^^^^^^^^^^^^ source.scala keyword.control.flow.end.scala +> end this +#^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.end.scala +# ^ source.scala +# ^^^^ source.scala entity.name.declaration +> +> def f: String +#^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.scala +# ^ source.scala +# ^ source.scala entity.name.function.declaration +# ^ source.scala keyword.operator.scala +# ^ source.scala +# ^^^^^^ source.scala entity.name.class +> end C +#^^^ source.scala +# ^^^ source.scala keyword.declaration.end.scala +# ^ source.scala +# ^ source.scala entity.name.type.declaration +> +> object C with +#^^^ source.scala +# ^^^^^^ source.scala keyword.declaration.scala +# ^ source.scala +# ^ source.scala entity.name.class.declaration +# ^ source.scala +# ^^^^ source.scala keyword.declaration.scala +> given C = +#^^^^^^ source.scala +# ^^^^^ source.scala keyword.declaration.scala +# ^ source.scala +# ^ source.scala entity.name.class +# ^ source.scala +# ^ source.scala keyword.operator.comparison.scala +> new C: +#^^^^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.scala +# ^ source.scala +# ^ source.scala entity.name.class +# ^ source.scala keyword.operator.scala +> def f = "!" +#^^^^^^^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.scala +# ^ source.scala +# ^ source.scala entity.name.function.declaration +# ^ source.scala +# ^ source.scala keyword.operator.comparison.scala +# ^ source.scala +# ^ source.scala string.quoted.double.scala punctuation.definition.string.begin.scala +# ^ source.scala string.quoted.double.scala +# ^ source.scala string.quoted.double.scala punctuation.definition.string.end.scala +> end f +#^^^^^^^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.end.scala +# ^ source.scala +# ^ source.scala entity.name.declaration +> end new +#^^^^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.end.scala +# ^ source.scala +# ^^^ source.scala keyword.declaration.end.scala +> end given +#^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.end.scala +# ^ source.scala +# ^^^^^ source.scala entity.name.declaration +> end C +#^^^ source.scala +# ^^^ source.scala keyword.declaration.end.scala +# ^ source.scala +# ^ source.scala entity.name.type.declaration +> +> extension (x: C) +#^^^ source.scala +# ^^^^^^^^^ source.scala keyword.declaration.scala +# ^ source.scala +# ^ source.scala meta.bracket.scala +# ^ source.scala variable.parameter.scala +# ^ source.scala meta.colon.scala +# ^ source.scala +# ^ source.scala entity.name.class +# ^ source.scala meta.bracket.scala +> def ff: String = x.f ++ x.f +#^^^^^^ source.scala +# ^^^ source.scala keyword.declaration.scala +# ^ source.scala +# ^^ source.scala entity.name.function.declaration +# ^ source.scala keyword.operator.scala +# ^ source.scala +# ^^^^^^ source.scala entity.name.class +# ^ source.scala +# ^ source.scala keyword.operator.comparison.scala +# ^^^^^ source.scala +# ^ source.scala keyword.operator.arithmetic.scala +# ^ source.scala keyword.operator.arithmetic.scala +# ^^^^^ source.scala +> end extension +#^^^ source.scala +# ^^^ source.scala keyword.declaration.end.scala +# ^ source.scala +# ^^^^^^^^^ source.scala keyword.declaration.end.scala +> +>end p2 +#^^^ source.scala keyword.declaration.end.scala +# ^ source.scala +# ^^ source.scala entity.name.declaration +> \ No newline at end of file diff --git a/tests/unit/#192.test.scala b/tests/unit/#192.test.scala new file mode 100644 index 0000000..a8cd95b --- /dev/null +++ b/tests/unit/#192.test.scala @@ -0,0 +1,14 @@ +// SYNTAX TEST "source.scala" + + + val a :: b = + x :: Nil + end val +// ^^^ source.scala keyword.declaration.stable.end.scala +// ^^^ source.scala keyword.declaration.stable.end.scala + + var a :: b = + x :: Nil + end var +// ^^^ source.scala keyword.declaration.volatile.end.scala +// ^^^ source.scala keyword.declaration.volatile.end.scala \ No newline at end of file