diff --git a/.travis.yml b/.travis.yml
index b2c3fc5..ed26f23 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -10,7 +10,7 @@ stages:
jobs:
include:
- stage: build
- script: yarn build
+ script: yarn build && yarn test
- stage: release
script: bin/ci-release.sh
diff --git a/.vscodeignore b/.vscodeignore
index 9dc2806..b04aab4 100644
--- a/.vscodeignore
+++ b/.vscodeignore
@@ -4,4 +4,5 @@
tests/**
src/**
node_modules
-.gitkeep
\ No newline at end of file
+.gitkeep
+scripts
\ No newline at end of file
diff --git a/bin/ci-release.sh b/bin/ci-release.sh
index f3a1550..3b9c0ba 100755
--- a/bin/ci-release.sh
+++ b/bin/ci-release.sh
@@ -7,6 +7,7 @@ NEW_VERSION=${TRAVIS_TAG#"v"}
# Build the extension
yarn install
yarn build
+yarn test
# Update package.json and CHANGELOG.md
set-up-ssh() {
diff --git a/package.json b/package.json
index e639465..582b19a 100644
--- a/package.json
+++ b/package.json
@@ -48,11 +48,13 @@
"ts-node": "^8.1.0",
"tsc": "^1.20150623.0",
"typescript": "^3.3.3",
+ "vscode-tmgrammar-test": "0.0.5",
"vsce": "^1.59.0"
},
"scripts": {
"vscode:prepublish": "test -f ./syntaxes/Scala.tmLanguage.json",
"vscode:publish": "vsce publish --yarn",
- "build": "ts-node src/typescript/GenerateTmLanguageFile.ts > ./syntaxes/Scala.tmLanguage.json"
+ "build": "ts-node src/typescript/GenerateTmLanguageFile.ts > ./syntaxes/Scala.tmLanguage.json",
+ "test": "node scripts/unit.js && node scripts/snap.js"
}
}
diff --git a/scripts/snap.js b/scripts/snap.js
new file mode 100644
index 0000000..edbf84a
--- /dev/null
+++ b/scripts/snap.js
@@ -0,0 +1,9 @@
+var cp = require('child_process')
+
+try {
+cp.execSync("npx vscode-tmgrammar-snap -s source.scala -g syntaxes/Scala.tmLanguage.json -t 'tests/snap/**/*.test.scala'",
+ { stdio: 'inherit' })
+} catch(err) {
+ console.debug(err.toString())
+ process.exit(-1)
+}
\ No newline at end of file
diff --git a/scripts/unit.js b/scripts/unit.js
new file mode 100644
index 0000000..65a4ae5
--- /dev/null
+++ b/scripts/unit.js
@@ -0,0 +1,9 @@
+var cp = require('child_process')
+
+try {
+cp.execSync("npx vscode-tmgrammar-test -s source.scala -g syntaxes/Scala.tmLanguage.json -t 'tests/unit/**/*.test.scala'",
+ { stdio: 'inherit' })
+} catch(err) {
+ console.debug(err.toString())
+ process.exit(-1)
+}
\ No newline at end of file
diff --git a/tests/snap/lexical.test.scala b/tests/snap/lexical.test.scala
new file mode 100644
index 0000000..55b179e
--- /dev/null
+++ b/tests/snap/lexical.test.scala
@@ -0,0 +1,78 @@
+
+object ExampleIdentifiers {
+ val x = 3
+ val Object = 3
+ val maxIndex = 3
+ val p2p = 3
+ val empty_? = 3
+ val + = 3
+ val `yield` = 3
+ val αρετη = 3
+ val _y = 3
+ val dot_product_* = 3
+ val __system = 3
+ val _MAX_LEN_ = 3
+}
+
+object IntegerLiterals {
+ (0, 21, 0xFFFFFFFF, -42L)
+}
+
+object FloatingPointLiterals {
+ ( 0.0, 1e30f, 3.14159f, 1.0e-100, .1 )
+}
+
+object Boolean {
+ (true, false)
+}
+
+object CharacterLiterals {
+ ('a', '\u0041', '\n', '\t')
+}
+
+object StringLiterals {
+ ("Hello,\nWorld!", "This string contains a \" character.")
+
+ """the present string
+ spans three
+ lines."""
+
+ """the present string
+ |spans three
+ |lines.""".stripMargin
+
+
+ val escapeSequences = "\b\t\n\f\r\"\'\\"
+
+ s"$x plain ${val x = y}"
+ custom"$x plain ${val x = y}"
+
+ s"""$x plain ${val x = y}"""
+ custom"""$x plain ${val x = y}"""
+}
+
+object Symbols {
+ ('x, 'X, 'αρετη, '=, '+ )
+}
+
+// single line comment
+
+ /*
+
+multiline comment*/
+
+ /**
+ * Scaladoc comment
+ * @scaladoc @param
+ */
+
+ /* nested /* multi-line */ comment */
+
+
+object Xml {
+ val b =
+ The Scala Language Specification
+ {scalaBook.version}
+ {scalaBook.authors.mkList("", ", ", "")}
+
+}
diff --git a/tests/snap/lexical.test.scala.snap b/tests/snap/lexical.test.scala.snap
new file mode 100644
index 0000000..b3f0fea
--- /dev/null
+++ b/tests/snap/lexical.test.scala.snap
@@ -0,0 +1,495 @@
+>
+>object ExampleIdentifiers {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> val x = 3
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> val Object = 3
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^^^ source.scala constant.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^^^^^^^^ source.scala
+> val maxIndex = 3
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^^^ source.scala
+> val p2p = 3
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^^^^^^ source.scala
+> val empty_? = 3
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> val + = 3
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^^^^^^^^^ source.scala
+> val `yield` = 3
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^^^^^^^ source.scala
+> val αρετη = 3
+#^^^^^^^^^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^^^^^ source.scala
+> val _y = 3
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^^^^^^^ source.scala
+> val dot_product_* = 3
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> val __system = 3
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^^ source.scala
+> val _MAX_LEN_ = 3
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^^^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object IntegerLiterals {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> (0, 21, 0xFFFFFFFF, -42L)
+#^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala constant.numeric.scala
+# ^^ source.scala
+# ^^ source.scala constant.numeric.scala
+# ^^^ source.scala
+# ^^^^^^^^^^ source.scala constant.numeric.scala
+# ^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^^^ source.scala constant.numeric.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^^ source.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object FloatingPointLiterals {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> ( 0.0, 1e30f, 3.14159f, 1.0e-100, .1 )
+#^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^^^ source.scala constant.numeric.scala
+# ^^^^^^^^^ source.scala
+# ^^^^^^^^ source.scala constant.numeric.scala
+# ^^ source.scala
+# ^^^^^^^^ source.scala constant.numeric.scala
+# ^^^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^ source.scala
+# ^ source.scala meta.bracket.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object Boolean {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> (true, false)
+#^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala constant.language.scala
+# ^^ source.scala
+# ^^^^^ source.scala constant.language.scala
+# ^ source.scala meta.bracket.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object CharacterLiterals {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> ('a', '\u0041', '\n', '\t')
+#^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala constant.character.literal.scala punctuation.definition.character.begin.scala
+# ^ source.scala constant.character.literal.scala
+# ^ source.scala constant.character.literal.scala punctuation.definition.character.end.scala
+# ^^^^^ source.scala
+# ^ source.scala constant.character.literal.scala punctuation.definition.character.begin.scala
+# ^^^^^^ source.scala constant.character.literal.scala constant.character.escape.scala
+# ^ source.scala constant.character.literal.scala punctuation.definition.character.end.scala
+# ^^^^^ source.scala
+# ^ source.scala constant.character.literal.scala punctuation.definition.character.begin.scala
+# ^^ source.scala constant.character.literal.scala constant.character.escape.scala
+# ^ source.scala constant.character.literal.scala punctuation.definition.character.end.scala
+# ^^^^^ source.scala
+# ^ source.scala constant.character.literal.scala punctuation.definition.character.begin.scala
+# ^^ source.scala constant.character.literal.scala constant.character.escape.scala
+# ^ source.scala constant.character.literal.scala punctuation.definition.character.end.scala
+# ^ source.scala meta.bracket.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object StringLiterals {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> ("Hello,\nWorld!", "This string contains a \" character.")
+#^^^^ 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 constant.character.escape.scala
+# ^^^^^^ source.scala string.quoted.double.scala
+# ^ source.scala string.quoted.double.scala punctuation.definition.string.end.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 constant.character.escape.scala
+# ^^^^^^^^^^^ source.scala string.quoted.double.scala
+# ^ source.scala string.quoted.double.scala punctuation.definition.string.end.scala
+# ^ source.scala meta.bracket.scala
+>
+> """the present string
+#^^^^ source.scala
+# ^^^ source.scala string.quoted.triple.scala punctuation.definition.string.begin.scala
+# ^^^^^^^^^^^^^^^^^^^ source.scala string.quoted.triple.scala
+> spans three
+#^^^^^^^^^^^^^^^^^ source.scala string.quoted.triple.scala
+> lines."""
+#^^^^^^^^^^^ source.scala string.quoted.triple.scala
+# ^^^ source.scala string.quoted.triple.scala punctuation.definition.string.end.scala
+>
+> """the present string
+#^^^^ source.scala
+# ^^^ source.scala string.quoted.triple.scala punctuation.definition.string.begin.scala
+# ^^^^^^^^^^^^^^^^^^^ source.scala string.quoted.triple.scala
+> |spans three
+#^^^^^^^^^^^^^^^^^^^ source.scala string.quoted.triple.scala
+> |lines.""".stripMargin
+#^^^^^^^^^^^^^ source.scala string.quoted.triple.scala
+# ^^^ source.scala string.quoted.triple.scala punctuation.definition.string.end.scala
+# ^^^^^^^^^^^^^ source.scala
+>
+>
+> val escapeSequences = "\b\t\n\f\r\"\'\\"
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^^^ source.scala variable.other.declaration.scala
+# ^ 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 constant.character.escape.scala
+# ^^ source.scala string.quoted.double.scala constant.character.escape.scala
+# ^^ source.scala string.quoted.double.scala constant.character.escape.scala
+# ^^ source.scala string.quoted.double.scala constant.character.escape.scala
+# ^^ source.scala string.quoted.double.scala constant.character.escape.scala
+# ^^ source.scala string.quoted.double.scala constant.character.escape.scala
+# ^^ source.scala string.quoted.double.scala constant.character.escape.scala
+# ^^ source.scala string.quoted.double.scala constant.character.escape.scala
+# ^ source.scala string.quoted.double.scala punctuation.definition.string.end.scala
+>
+> s"$x plain ${val x = y}"
+#^^ source.scala
+# ^ source.scala keyword.interpolation.scala
+# ^ source.scala string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
+# ^ source.scala punctuation.definition.template-expression.begin.scala
+# ^ source.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^^ source.scala punctuation.definition.template-expression.scala punctuation.definition.template-expression.begin.scala
+# ^^^ source.scala punctuation.definition.template-expression.scala keyword.declaration.stable.scala
+# ^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala variable.other.declaration.scala
+# ^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala keyword.operator.comparison.scala
+# ^^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala punctuation.definition.template-expression.end.scala
+# ^ source.scala string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
+> custom"$x plain ${val x = y}"
+#^^ source.scala
+# ^^^^^^ source.scala keyword.interpolation.scala
+# ^ source.scala string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
+# ^ source.scala punctuation.definition.template-expression.begin.scala
+# ^ source.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^ source.scala string.quoted.double.interpolated.scala
+# ^^ source.scala punctuation.definition.template-expression.scala punctuation.definition.template-expression.begin.scala
+# ^^^ source.scala punctuation.definition.template-expression.scala keyword.declaration.stable.scala
+# ^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala variable.other.declaration.scala
+# ^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala keyword.operator.comparison.scala
+# ^^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala punctuation.definition.template-expression.end.scala
+# ^ source.scala string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
+>
+> s"""$x plain ${val x = y}"""
+#^^ source.scala
+# ^ source.scala keyword.interpolation.scala
+# ^^^ source.scala string.quoted.triple.interpolated.scala punctuation.definition.string.begin.scala
+# ^ source.scala punctuation.definition.template-expression.begin.scala
+# ^ source.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^^ source.scala punctuation.definition.template-expression.scala punctuation.definition.template-expression.begin.scala
+# ^^^ source.scala punctuation.definition.template-expression.scala keyword.declaration.stable.scala
+# ^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala variable.other.declaration.scala
+# ^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala keyword.operator.comparison.scala
+# ^^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala punctuation.definition.template-expression.end.scala
+# ^^^ source.scala string.quoted.triple.interpolated.scala punctuation.definition.string.end.scala
+> custom"""$x plain ${val x = y}"""
+#^^ source.scala
+# ^^^^^^ source.scala keyword.interpolation.scala
+# ^^^ source.scala string.quoted.triple.interpolated.scala punctuation.definition.string.begin.scala
+# ^ source.scala punctuation.definition.template-expression.begin.scala
+# ^ source.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^ source.scala string.quoted.triple.interpolated.scala
+# ^^ source.scala punctuation.definition.template-expression.scala punctuation.definition.template-expression.begin.scala
+# ^^^ source.scala punctuation.definition.template-expression.scala keyword.declaration.stable.scala
+# ^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala variable.other.declaration.scala
+# ^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala keyword.operator.comparison.scala
+# ^^ source.scala punctuation.definition.template-expression.scala
+# ^ source.scala punctuation.definition.template-expression.scala punctuation.definition.template-expression.end.scala
+# ^^^ source.scala string.quoted.triple.interpolated.scala punctuation.definition.string.end.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object Symbols {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> ('x, 'X, 'αρετη, '=, '+ )
+#^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala constant.other.symbol.scala
+# ^^ source.scala
+# ^^ source.scala constant.other.symbol.scala
+# ^^ source.scala
+# ^^^^^^ source.scala constant.other.symbol.scala
+# ^^ source.scala
+# ^ source.scala constant.character.literal.scala punctuation.definition.character.begin.scala
+# ^^^ source.scala constant.character.literal.scala invalid.illegal.character-literal-too-long
+# ^ source.scala constant.character.literal.scala punctuation.definition.character.end.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>// single line comment
+#^^ source.scala comment.line.double-slash.scala punctuation.definition.comment.scala
+# ^^^^^^^^^^^^^^^^^^^^ source.scala comment.line.double-slash.scala
+>
+> /*
+#^^ source.scala
+# ^^ source.scala comment.block.scala punctuation.definition.comment.scala
+>
+>multiline comment*/
+#^^^^^^^^^^^^^^^^^ source.scala comment.block.scala
+# ^^ source.scala comment.block.scala punctuation.definition.comment.scala
+>
+> /**
+#^^ source.scala comment.block.documentation.scala
+# ^^^ source.scala comment.block.documentation.scala punctuation.definition.comment.scala
+> * Scaladoc comment
+#^^^^^^^^^^^^^^^^^^^^^^ source.scala comment.block.documentation.scala
+> * @scaladoc @param
+#^^^^^^^^^^^^^^^^^^^^^^^ source.scala comment.block.documentation.scala
+> */
+#^^^ source.scala comment.block.documentation.scala
+# ^^ source.scala comment.block.documentation.scala punctuation.definition.comment.scala
+>
+> /* nested /* multi-line */ comment */
+#^^^ source.scala
+# ^^ source.scala comment.block.scala punctuation.definition.comment.scala
+# ^^^^^^^^^^^^^^^^^^^^^^^ source.scala comment.block.scala
+# ^^ source.scala comment.block.scala punctuation.definition.comment.scala
+# ^^^^^^^^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+>
+>
+>object Xml {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> val b =
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+# ^^^^ source.scala meta.tag.xml entity.name.tag.localname.xml
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+> The Scala Language Specification
+#^^^^^^^^^^ source.scala
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+# ^^^^^ source.scala meta.tag.xml entity.name.tag.localname.xml
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+# ^^^ source.scala entity.name.class
+# ^ source.scala
+# ^^^^^ source.scala entity.name.class
+# ^ source.scala
+# ^^^^^^^^ source.scala entity.name.class
+# ^ source.scala
+# ^^^^^^^^^^^^^ source.scala entity.name.class
+# ^^ source.scala meta.tag.xml punctuation.definition.tag.xml
+# ^^^^^ source.scala meta.tag.xml entity.name.tag.localname.xml
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+> {scalaBook.version}
+#^^^^^^^^^^ source.scala
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+# ^^^^^^^ source.scala meta.tag.xml entity.name.tag.localname.xml
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+# ^ source.scala punctuation.section.block.begin.scala
+# ^^^^^^^^^^^^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+# ^^ source.scala meta.tag.xml punctuation.definition.tag.xml
+# ^^^^^^^ source.scala meta.tag.xml entity.name.tag.localname.xml
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+> {scalaBook.authors.mkList("", ", ", "")}
+#^^^^^^^^^^ source.scala
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+# ^^^^^^^ source.scala meta.tag.xml entity.name.tag.localname.xml
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+# ^ source.scala punctuation.section.block.begin.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 punctuation.definition.string.end.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
+# ^^ source.scala
+# ^ source.scala string.quoted.double.scala punctuation.definition.string.begin.scala
+# ^ source.scala string.quoted.double.scala punctuation.definition.string.end.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala punctuation.section.block.end.scala
+# ^^ source.scala meta.tag.xml punctuation.definition.tag.xml
+# ^^^^^^^ source.scala meta.tag.xml entity.name.tag.localname.xml
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+>
+#^^^^^^^^ source.scala
+# ^^ source.scala meta.tag.xml punctuation.definition.tag.xml
+# ^^^^ source.scala meta.tag.xml entity.name.tag.localname.xml
+# ^ source.scala meta.tag.xml punctuation.definition.tag.xml
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
\ No newline at end of file
diff --git a/tests/snap/scala_spec.test.scala b/tests/snap/scala_spec.test.scala
new file mode 100644
index 0000000..4822faa
--- /dev/null
+++ b/tests/snap/scala_spec.test.scala
@@ -0,0 +1,242 @@
+package org.scala.syntax
+package test
+
+
+class TreeMap[A <: Comparable[A], B] { }
+class List[A] { }
+class I extends Comparable[I] {}
+
+class F[M[_], X] { }
+class S[K <: String] {}
+class G[M[ Z <: I ], I] { }
+
+case class Bird (val name: String @suspendable) extends Object {
+ def fly(height: Int @suspendable) = ???
+ def walk[T1 : T2](_distance: Int, empty_? : Int, `yield`: String, αρετη: Boolean)(implicit fa: Functor[T1]) = ???
+ def c (x: Int) (y: String, z: String): String = ???
+ def union[A <: Comparable[A]] (x: Set[A], xs: Set[A]): Set[A]
+}
+
+trait Iterable[+X] {
+ def flatMap[newType[+X] <: Iterable[X], S](f: X => newType[S]): newType[S]
+}
+
+package org.scala {
+ class List[+T]
+ class Set[-T]
+}
+
+class A[+T] {}
+class B extends A[B]
+class C extends A[C]
+
+
+
+abstract class AbstractClass
+sealed trait Sealed
+
+object Types {
+ val x : String @suspendable = ""
+
+ def infix() : T1 \/ T2 = ???
+
+ type Z1 = Ref[T] forSome { type T <: java.lang.Number }
+ type Z2 = Ref[x.T] forSome { val x: Outer }
+ type Z3 = Ref[x_type # T] forSome { type x_type <: Outer with Singleton }
+
+ def complexBounds[A, B >: A, C >: A <: B]()
+ def complexBounds2[M[X <: Bound[X]], Bound[_]]
+ def complexBounds3[@specialized T, U]()
+
+ def compare[T](a: T = 0)(b: T = a) = (a == b)
+ def f(a: Int = 0)(b: Int = a + 1) = b
+
+ def whileLoop (cond: => Boolean) (stat: => Unit): Unit
+
+ def sum(args: Int*) = {
+ var result = 0
+ for (arg <- args) result += arg
+ result
+ }
+
+ def write(str: String) { System.out.println(str) }
+ def write(str: String): Unit = { System.out.println(str) }
+
+
+
+ type Pair[+A, +B] = Tuple2[A, B]
+ object Pair {
+ { import M.{one, z => zero, _}; add(zero, one) }
+ def apply[A, B](x: A, y: B) = Tuple2(x, y)
+ def unapply[A, B](x: Tuple2[A, B]): Option[Tuple2[A, B]] = Some(x)
+ }
+}
+
+object ValueDefinitions {
+ val pi = 3.1415
+ val pi: Double = 3.1415 // equivalent to first definition
+ val Some(x) = f() // a pattern definition
+ val x :: xs = mylist // an infix pattern definition
+}
+
+class Iter extends StringIterator with RichIterator { }
+trait A extends Root { type T <: A }
+
+class Modifiers {
+ final val x = e
+ override def f()
+ private val y = ""
+ abstract override def g()
+ private lazy final val h = 3
+}
+
+object m {
+ abstract sealed class C (x: Int) {
+ def nextC = new C(x + 1) {}
+ }
+ val empty = new C(0) {}
+}
+
+class LinkedList[A]() { self: List with Seq =>
+ var head = ???
+ var tail = null
+ def isEmpty = tail != null
+ def this(head: A) = { this(); this.head = head }
+ def this(head: A, tail: List[A]) = { this(head); this.tail = tail }
+}
+
+case class Lambda(x: String, e: Expr) extends Expr
+
+trait Comparable[T <: Comparable[T]] { self: T =>
+ def < (that: T): Boolean
+ def <=(that: T): Boolean = this < that || this == that
+ def > (that: T): Boolean = that < this
+ def >=(that: T): Boolean = that <= this
+}
+
+class A extends Root { override def x = "A" ; def superA = super.x }
+
+object Appl {
+ def sum(xs: Int*) = (0 /: xs) ((x, y) => x + y)
+ sum(List(1, 2, 3, 4): _*)
+
+ val x : S = new Z
+ val y : S = new Z {
+ val x = 5
+ }
+
+ def matmul(xss: Array[Array[Double]], yss: Array[Array[Double]]) = {
+ val zss: Array[Array[Double]] = new Array(xss.length, yss(0).length)
+ var i = 0
+ while (i < xss.length) {
+ var j = 0
+ while (j < yss(0).length) {
+ var acc = 0.0
+ var k = 0
+ while (k < yss.length) {
+ acc = acc + xss(i)(k) * yss(k)(j)
+ k += 1
+ }
+ zss(i)(j) = acc
+ j += 1
+ }
+ i += 1
+ }
+ zss
+ }
+
+ def whileLoop(cond: => Boolean)(body: => Unit): Unit =
+ if (cond) { body ; whileLoop(cond)(body) } else {}
+
+ do {x += 2} while (x < 100)
+
+ for { i <- 1 until n
+ j <- 1 until i
+ if isPrime(i+j)
+ } yield (i, j)
+
+ (1 until n)
+ .flatMap {
+ case i => (1 until i)
+ .withFilter { j => isPrime(i+j) }
+ .map { case j => (i, j) } }
+
+ try {
+ throw ex;
+ } catch {
+ case NonFatal(e) => throw e;
+ case other => throw other
+ }
+}
+
+object Inline {
+ val summ = (x: Int,y: Int) => x + y
+}
+
+object Monoids {
+ implicit object stringMonoid extends Monoid[String] {
+ def add(x: String, y: String): String = x.concat(y)
+ def unit: String = ""
+ }
+}
+
+object A1 {
+ def sum[A](xs: List[A])(implicit m: Monoid[A]): A =
+ if (xs.isEmpty) m.unit
+ else m.add(xs.head, sum(xs.tail))
+
+ implicit def list2ordered[A](x: List[A])
+ (implicit elem2ordered: A => Ordered[A]): Ordered[List[A]]
+}
+
+object PatternMatching {
+ def f(x: Int, y: Int) = x match {
+ case `y` =>
+ case s @ Seq(_, _, _) =>
+ case Seq(first, tail @ _*) =>
+ case first +: tail =>
+ case 3 | 5 | 6 =>
+ case y: Number => y.n
+ case Lit(n) => n
+ case IsZero(u) => eval(u) == 0
+ case _ => 15
+ }
+
+}
+
+package p1 {
+ package p2 {
+ object Kitten
+ }
+}
+
+package a.b {
+ class A {
+ val x = new _root_.b.B
+ }
+}
+
+object HelloWorld {
+ def main(args: Array[String]) { println("Hello World") }
+}
+
+object HelloWorld extends App {
+ println("Hello World")
+}
+
+@SerialVersionUID(12345)
+object Annotations {
+ @deprecated("Use D", "1.0") class C { }
+ @transient @volatile var m: Int
+
+ def f(x: Option[Int]) = (x: @unchecked) match {
+ case Some(y) => y
+ }
+
+ trait Function0[@specialized(Unit, Int, Double) T] {
+ def apply: T
+ }
+
+ @UserDefinedUpperCase def x
+ @userDefinedLowerCase def y
+}
\ No newline at end of file
diff --git a/tests/snap/scala_spec.test.scala.snap b/tests/snap/scala_spec.test.scala.snap
new file mode 100644
index 0000000..42fbd9d
--- /dev/null
+++ b/tests/snap/scala_spec.test.scala.snap
@@ -0,0 +1,2530 @@
+>package org.scala.syntax
+#^^^^^^^ 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 punctuation.definition.package
+# ^^^^^^ source.scala meta.package.scala entity.name.package.scala
+>package test
+#^^^^^^^ source.scala meta.package.scala keyword.other.import.scala
+# ^ source.scala meta.package.scala
+# ^^^^ source.scala meta.package.scala entity.name.package.scala
+>
+>
+>class TreeMap[A <: Comparable[A], B] { }
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>class List[A] { }
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>class I extends Comparable[I] {}
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^ source.scala entity.other.inherited-class.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+>class F[M[_], X] { }
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>class S[K <: String] {}
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^ source.scala storage.type.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala punctuation.section.block.end.scala
+>class G[M[ Z <: I ], I] { }
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+>case class Bird (val name: String @suspendable) extends Object {
+#^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^ source.scala storage.type.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.other.inherited-class.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> def fly(height: Int @suspendable) = ???
+#^^^^ 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 storage.type.primitive.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala keyword.operator.scala
+> def walk[T1 : T2](_distance: Int, empty_? : Int, `yield`: String, αρετη: Boolean)(implicit fa: Functor[T1]) = ???
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.function.declaration
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^ source.scala storage.type.primitive.scala
+# ^^ source.scala
+# ^^^^^^^ source.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^ source.scala storage.type.primitive.scala
+# ^^ source.scala
+# ^^^^^^^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^^^^ source.scala storage.type.scala
+# ^^^^^^^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^ source.scala storage.modifier.other
+# ^ source.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 entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala keyword.operator.scala
+> def c (x: Int) (y: String, z: String): String = ???
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.function.declaration
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^^^^ source.scala storage.type.scala
+# ^^ source.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^^^^ source.scala storage.type.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^ source.scala storage.type.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala keyword.operator.scala
+> def union[A <: Comparable[A]] (x: Set[A], xs: Set[A]): Set[A]
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^ source.scala entity.name.function.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.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
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^ source.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 entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>trait Iterable[+X] {
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> def flatMap[newType[+X] <: Iterable[X], S](f: X => newType[S]): newType[S]
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^ source.scala entity.name.function.declaration
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.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
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>package org.scala {
+#^^^^^^^ 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
+> class List[+T]
+#^^ source.scala
+# ^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+> class Set[-T]
+#^^ source.scala
+# ^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>class A[+T] {}
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala punctuation.section.block.end.scala
+>class B extends A[B]
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.other.inherited-class.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+>class C extends A[C]
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.other.inherited-class.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+>
+>
+>
+>abstract class AbstractClass
+#^^^^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^ source.scala entity.name.class.declaration
+>sealed trait Sealed
+#^^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.class.declaration
+>
+>object Types {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> val x : String @suspendable = ""
+#^^^^ 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 storage.type.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^^^^^ 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 punctuation.definition.string.end.scala
+>
+> def infix() : T1 \/ T2 = ???
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^ source.scala entity.name.function.declaration
+# ^^ source.scala meta.parentheses.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^ source.scala entity.name.class
+# ^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala
+# ^^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala keyword.operator.scala
+>
+> type Z1 = Ref[T] forSome { type T <: java.lang.Number }
+#^^^ source.scala
+# ^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^ source.scala entity.name.type.declaration
+# ^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.type.declaration
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^^^^ source.scala
+# ^^^^^^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+> type Z2 = Ref[x.T] forSome { val x: Outer }
+#^^^ source.scala
+# ^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^ source.scala entity.name.type.declaration
+# ^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+> type Z3 = Ref[x_type # T] forSome { type x_type <: Outer with Singleton }
+#^^^ source.scala
+# ^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^ source.scala entity.name.type.declaration
+# ^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.type.declaration
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^ source.scala entity.name.class
+# ^ source.scala
+# ^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^ source.scala entity.other.inherited-class.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+> def complexBounds[A, B >: A, C >: A <: B]()
+#^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^ source.scala entity.name.function.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala meta.parentheses.scala meta.bracket.scala
+> def complexBounds2[M[X <: Bound[X]], Bound[_]]
+#^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^^ source.scala entity.name.function.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+> def complexBounds3[@specialized T, U]()
+#^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^^ source.scala entity.name.function.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^^^^^ source.scala
+# ^ source.scala entity.name.class
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala meta.parentheses.scala meta.bracket.scala
+>
+> def compare[T](a: T = 0)(b: T = a) = (a == b)
+#^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^ source.scala entity.name.function.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.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
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala meta.bracket.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
+# ^ source.scala keyword.operator.comparison.scala
+# ^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^^ source.scala keyword.operator.comparison.scala
+# ^^ source.scala
+# ^ source.scala meta.bracket.scala
+> def f(a: Int = 0)(b: Int = a + 1) = b
+#^^^ 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 storage.type.primitive.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^ source.scala storage.type.primitive.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^ source.scala
+>
+> def whileLoop (cond: => Boolean) (stat: => Unit): Unit
+#^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^ source.scala entity.name.function.declaration
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^ source.scala storage.type.primitive.scala
+>
+> def sum(args: 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 storage.type.primitive.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> var result = 0
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.volatile.scala
+# ^ source.scala
+# ^^^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> for (arg <- args) result += arg
+#^^^^ source.scala
+# ^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^ source.scala
+> result
+#^^^^^^^^^^^ source.scala
+> }
+#^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+> def write(str: String) { System.out.println(str) }
+#^^ 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 storage.type.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.class
+# ^^^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+> def write(str: String): Unit = { System.out.println(str) }
+#^^ 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 storage.type.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.class
+# ^^^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+>
+>
+> type Pair[+A, +B] = Tuple2[A, B]
+#^^^^ source.scala
+# ^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.type.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala entity.name.class
+# ^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+> object Pair {
+#^^^^ source.scala
+# ^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> { import M.{one, z => zero, _}; add(zero, one) }
+#^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^^^ source.scala meta.import.scala keyword.other.import.scala
+# ^ source.scala meta.import.scala
+# ^ source.scala meta.import.scala entity.name.import.scala
+# ^ source.scala meta.import.scala punctuation.definition.import
+# ^ source.scala meta.import.scala meta.import.selector.scala meta.bracket.scala
+# ^^^ source.scala meta.import.scala meta.import.selector.scala entity.name.import.scala
+# ^ source.scala meta.import.scala meta.import.selector.scala
+# ^ source.scala meta.import.scala meta.import.selector.scala
+# ^ source.scala meta.import.scala meta.import.selector.scala entity.name.import.renamed-from.scala
+# ^ source.scala meta.import.scala meta.import.selector.scala
+# ^^ source.scala meta.import.scala meta.import.selector.scala keyword.other.arrow.scala
+# ^ source.scala meta.import.scala meta.import.selector.scala
+# ^^^^ source.scala meta.import.scala meta.import.selector.scala entity.name.import.renamed-to.scala
+# ^^ source.scala meta.import.scala meta.import.selector.scala
+# ^ source.scala meta.import.scala meta.import.selector.scala entity.name.import.scala
+# ^ source.scala meta.import.scala meta.import.selector.scala meta.bracket.scala
+# ^ source.scala meta.import.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+> def apply[A, B](x: A, y: B) = Tuple2(x, y)
+#^^^^^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^ source.scala entity.name.function.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.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
+# ^ 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
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+> def unapply[A, B](x: Tuple2[A, B]): Option[Tuple2[A, B]] = Some(x)
+#^^^^^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^ source.scala entity.name.function.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.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
+# ^ source.scala entity.name.class
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+> }
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object ValueDefinitions {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> val pi = 3.1415
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^^^ source.scala constant.numeric.scala
+> val pi: Double = 3.1415 // equivalent to first definition
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^ source.scala variable.other.declaration.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^^^ source.scala constant.numeric.scala
+# ^^^ source.scala
+# ^^ source.scala comment.line.double-slash.scala punctuation.definition.comment.scala
+# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.scala comment.line.double-slash.scala
+> val Some(x) = f() // a pattern definition
+#^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^ source.scala constant.other.declaration.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^ source.scala
+# ^^ source.scala meta.parentheses.scala meta.bracket.scala
+# ^^^^^^^^^ source.scala
+# ^^ source.scala comment.line.double-slash.scala punctuation.definition.comment.scala
+# ^^^^^^^^^^^^^^^^^^^^^ source.scala comment.line.double-slash.scala
+> val x :: xs = mylist // an infix pattern definition
+#^^ 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
+# ^^^^^^^^^^^^^ source.scala
+# ^^ source.scala comment.line.double-slash.scala punctuation.definition.comment.scala
+# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.scala comment.line.double-slash.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>class Iter extends StringIterator with RichIterator { }
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^^ source.scala entity.other.inherited-class.scala
+# ^ source.scala
+# ^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^ source.scala entity.other.inherited-class.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>trait A extends Root { type T <: A }
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^ source.scala entity.other.inherited-class.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.type.declaration
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+>class Modifiers {
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> final val x = e
+#^^^^ source.scala
+# ^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^ source.scala
+> override def f()
+#^^^^ source.scala
+# ^^^^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.function.declaration
+# ^^ source.scala meta.parentheses.scala meta.bracket.scala
+> private val y = ""
+#^^^^ source.scala
+# ^^^^^^^ source.scala storage.modifier.access
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ 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 punctuation.definition.string.end.scala
+> abstract override def g()
+#^^^^ source.scala
+# ^^^^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.function.declaration
+# ^^ source.scala meta.parentheses.scala meta.bracket.scala
+> private lazy final val h = 3
+#^^^^ source.scala
+# ^^^^^^^ source.scala storage.modifier.access
+# ^ source.scala
+# ^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object m {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> abstract sealed class C (x: Int) {
+#^^^^ source.scala
+# ^^^^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> def nextC = new C(x + 1) {}
+#^^^^^^ 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 keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala punctuation.section.block.end.scala
+> }
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+> val empty = new C(0) {}
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala punctuation.section.block.end.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>class LinkedList[A]() { self: List with Seq =>
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala meta.parentheses.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^ source.scala variable.language.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.class
+# ^ source.scala
+# ^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^ source.scala entity.other.inherited-class.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+> var head = ???
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.volatile.scala
+# ^ source.scala
+# ^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala keyword.operator.scala
+> var tail = null
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.volatile.scala
+# ^ source.scala
+# ^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^ source.scala constant.language.scala
+> def isEmpty = tail != null
+#^^^^ 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 keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^ source.scala constant.language.scala
+> def this(head: A) = { this(); this.head = head }
+#^^^^ 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
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^ source.scala variable.language.scala
+# ^^ source.scala meta.parentheses.scala meta.bracket.scala
+# ^^ source.scala
+# ^^^^ source.scala variable.language.scala
+# ^^^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+> def this(head: A, tail: List[A]) = { this(head); this.tail = tail }
+#^^^^ 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
+# ^^^^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^ source.scala variable.language.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^^^^ source.scala variable.language.scala
+# ^^^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>case class Lambda(x: String, e: Expr) extends Expr
+#^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^^^^ source.scala storage.type.scala
+# ^^ source.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.declaration.scala
+# ^ source.scala
+# ^^^^ source.scala entity.other.inherited-class.scala
+>
+>trait Comparable[T <: Comparable[T]] { self: T =>
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^ source.scala variable.language.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+> def < (that: T): Boolean
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.function.declaration
+# ^ 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
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^^ source.scala storage.type.primitive.scala
+> def <=(that: T): Boolean = this < that || this == that
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.function.declaration
+# ^ source.scala keyword.operator.comparison.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
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^ source.scala variable.language.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^^ source.scala
+# ^^ source.scala keyword.operator.logical.scala
+# ^ source.scala
+# ^^^^ source.scala variable.language.scala
+# ^ source.scala
+# ^^ source.scala keyword.operator.comparison.scala
+# ^^^^^^ source.scala
+> def > (that: T): Boolean = that < this
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.function.declaration
+# ^ 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
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^ source.scala variable.language.scala
+> def >=(that: T): Boolean = that <= this
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.function.declaration
+# ^ source.scala keyword.operator.comparison.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
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^^ source.scala
+# ^^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^ source.scala variable.language.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>class A extends Root { override def x = "A" ; def superA = super.x }
+#^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^ source.scala entity.other.inherited-class.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^^^^^ source.scala storage.modifier.other
+# ^ 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
+# ^^^ 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 variable.language.scala
+# ^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+>object Appl {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> def sum(xs: Int*) = (0 /: xs) ((x, y) => x + y)
+#^^^^ 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 storage.type.primitive.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala keyword.operator.scala
+# ^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^^ source.scala
+# ^ source.scala meta.bracket.scala
+> sum(List(1, 2, 3, 4): _*)
+#^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala constant.numeric.scala
+# ^^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala meta.bracket.scala
+>
+> val x : S = new Z
+#^^^^ 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 entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+> val y : S = new Z {
+#^^^^ 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 entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> val x = 5
+#^^^^^^^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> }
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+> def matmul(xss: Array[Array[Double]], yss: Array[Array[Double]]) = {
+#^^^^ 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 entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^^ source.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 entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> val zss: Array[Array[Double]] = new Array(xss.length, yss(0).length)
+#^^^^^^^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^ source.scala variable.other.declaration.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+> var i = 0
+#^^^^^^^^ source.scala
+# ^^^ source.scala keyword.declaration.volatile.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> while (i < xss.length) {
+#^^^^^^^^ source.scala
+# ^^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> var j = 0
+#^^^^^^^^^^ source.scala
+# ^^^ source.scala keyword.declaration.volatile.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> while (j < yss(0).length) {
+#^^^^^^^^^^ source.scala
+# ^^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> var acc = 0.0
+#^^^^^^^^^^^^ source.scala
+# ^^^ source.scala keyword.declaration.volatile.scala
+# ^ source.scala
+# ^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala constant.numeric.scala
+> var k = 0
+#^^^^^^^^^^^^ source.scala
+# ^^^ source.scala keyword.declaration.volatile.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> while (k < yss.length) {
+#^^^^^^^^^^^^ source.scala
+# ^^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> acc = acc + xss(i)(k) * yss(k)(j)
+#^^^^^^^^^^^^^^^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+> k += 1
+#^^^^^^^^^^^^^^^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> }
+#^^^^^^^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+> zss(i)(j) = acc
+#^^^^^^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^ source.scala
+> j += 1
+#^^^^^^^^^^^^^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> }
+#^^^^^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+> i += 1
+#^^^^^^^^^^^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> }
+#^^^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+> zss
+#^^^^^^^^^^^^ source.scala
+> }
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+> def whileLoop(cond: => Boolean)(body: => Unit): Unit =
+#^^^^ 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 keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^ source.scala storage.type.primitive.scala
+# ^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+> if (cond) { body ; whileLoop(cond)(body) } else {}
+#^^^^^^ source.scala
+# ^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^^^^^^^^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+# ^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+> do {x += 2} while (x < 100)
+#^^^^ source.scala
+# ^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala punctuation.section.block.end.scala
+# ^ source.scala
+# ^^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala constant.numeric.scala
+# ^ source.scala meta.bracket.scala
+>
+> for { i <- 1 until n
+#^^^^ source.scala
+# ^^^ source.scala keyword.control.flow.scala
+# ^^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^^^^^^^^ source.scala
+> j <- 1 until i
+#^^^^^^^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^^^^^^^^^ source.scala
+> if isPrime(i+j)
+#^^^^^^^^ source.scala
+# ^^ source.scala keyword.control.flow.scala
+# ^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+> } yield (i, j)
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+# ^ source.scala
+# ^^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+>
+> (1 until n)
+#^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala constant.numeric.scala
+# ^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+> .flatMap {
+#^^^^^^^^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> case i => (1 until i)
+#^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala constant.numeric.scala
+# ^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+> .withFilter { j => isPrime(i+j) }
+#^^^^^^^^^^^^^^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+> .map { case j => (i, j) } }
+#^^^^^^^^^^^^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+> try {
+#^^^^ source.scala
+# ^^^ source.scala keyword.control.exception.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> throw ex;
+#^^^^^^^^ source.scala
+# ^^^^^ source.scala keyword.control.flow.jump.scala
+# ^^^^^ source.scala
+> } catch {
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+# ^ source.scala
+# ^^^^^ source.scala keyword.control.exception.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> case NonFatal(e) => throw e;
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^^^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^^ source.scala keyword.control.flow.jump.scala
+# ^^^^ source.scala
+> case other => throw other
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^^^^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^^ source.scala keyword.control.flow.jump.scala
+# ^^^^^^^ source.scala
+> }
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object Inline {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> val summ = (x: Int,y: Int) => x + y
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^^^^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^ source.scala storage.type.primitive.scala
+# ^ source.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^^^^ source.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object Monoids {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> implicit object stringMonoid extends Monoid[String] {
+#^^^^ source.scala
+# ^^^^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.other.inherited-class.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^ source.scala storage.type.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> def add(x: String, y: String): String = x.concat(y)
+#^^^^^^ 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 storage.type.scala
+# ^^ source.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^^^^ source.scala storage.type.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^ source.scala storage.type.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+> def unit: 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 storage.type.scala
+# ^ 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 punctuation.definition.string.end.scala
+> }
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object A1 {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> def sum[A](xs: List[A])(implicit m: Monoid[A]): A =
+#^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^ source.scala entity.name.function.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.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
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^ source.scala storage.modifier.other
+# ^ source.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 entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+> if (xs.isEmpty) m.unit
+#^^^^^^ source.scala
+# ^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^ source.scala
+> else m.add(xs.head, sum(xs.tail))
+#^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+>
+> implicit def list2ordered[A](x: List[A])
+#^^^^ source.scala
+# ^^^^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^ source.scala entity.name.function.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.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
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+> (implicit elem2ordered: A => Ordered[A]): Ordered[List[A]]
+#^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^ source.scala storage.modifier.other
+# ^ source.scala
+# ^^^^^^^^^^^^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object PatternMatching {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> def f(x: Int, y: Int) = x match {
+#^^^^ 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 storage.type.primitive.scala
+# ^^ source.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^ source.scala
+# ^^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> case `y` =>
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^ source.scala
+> case s @ Seq(_, _, _) =>
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^^^^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^ source.scala
+> case Seq(first, tail @ _*) =>
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^^^^^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+> case first +: tail =>
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^^^^^^^ source.scala
+# ^ source.scala keyword.operator.arithmetic.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+> case 3 | 5 | 6 =>
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+> case y: Number => y.n
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.class
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^ source.scala
+> case Lit(n) => n
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^ source.scala
+> case IsZero(u) => eval(u) == 0
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala constant.numeric.scala
+> case _ => 15
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^^^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^ source.scala constant.numeric.scala
+> }
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>package p1 {
+#^^^^^^^ 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
+> package p2 {
+#^^^^ source.scala
+# ^^^^^^^ 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
+> object Kitten
+#^^^^^^^^ source.scala
+# ^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^ source.scala entity.name.class.declaration
+> }
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>package a.b {
+#^^^^^^^ 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
+> class A {
+#^^^^ source.scala
+# ^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> val x = new _root_.b.B
+#^^^^^^ source.scala
+# ^^^ source.scala keyword.declaration.stable.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^ source.scala entity.name.class
+> }
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object HelloWorld {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> def main(args: Array[String]) { println("Hello World") }
+#^^^^ 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 storage.type.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.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
+# ^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>object HelloWorld extends App {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^ source.scala entity.other.inherited-class.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> println("Hello World")
+#^^^^^^^^^^^ 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
+>}
+#^ source.scala punctuation.section.block.end.scala
+>
+>@SerialVersionUID(12345)
+#^ source.scala keyword.operator.scala
+# ^^^^^^^^^^^^^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^^^^^ source.scala constant.numeric.scala
+# ^ source.scala meta.bracket.scala
+>object Annotations {
+#^^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> @deprecated("Use D", "1.0") class C { }
+#^^^^ source.scala
+# ^ source.scala keyword.operator.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
+# ^ 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
+# ^ source.scala
+# ^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.class.declaration
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+# ^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+> @transient @volatile var m: Int
+#^^^^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^^^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^^ source.scala
+# ^^^ source.scala keyword.declaration.volatile.scala
+# ^ source.scala
+# ^ source.scala variable.other.declaration.scala
+# ^ source.scala keyword.operator.scala
+# ^ source.scala
+# ^^^ source.scala storage.type.primitive.scala
+# ^^^^^^^^ source.scala
+>
+> def f(x: Option[Int]) = (x: @unchecked) match {
+#^^^^ 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 storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala variable.parameter.scala
+# ^ source.scala meta.colon.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> case Some(y) => y
+#^^^^^^^^ source.scala
+# ^^^^ source.scala keyword.control.flow.scala
+# ^ source.scala
+# ^^^^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^ source.scala keyword.operator.comparison.scala
+# ^^^ source.scala
+> }
+#^^^^ source.scala
+# ^ source.scala punctuation.section.block.end.scala
+>
+> trait Function0[@specialized(Unit, Int, Double) T] {
+#^^^^ source.scala
+# ^^^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^^^^^^^^^ source.scala entity.name.class.declaration
+# ^ source.scala meta.bracket.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^^^^ source.scala
+# ^ source.scala meta.bracket.scala
+# ^^^^ source.scala storage.type.primitive.scala
+# ^^ source.scala
+# ^^^ source.scala storage.type.primitive.scala
+# ^^ source.scala
+# ^^^^^^ source.scala storage.type.primitive.scala
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala entity.name.class
+# ^ source.scala meta.bracket.scala
+# ^ source.scala
+# ^ source.scala punctuation.section.block.begin.scala
+> def apply: T
+#^^^^^^^^ 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 punctuation.section.block.end.scala
+>
+> @UserDefinedUpperCase def x
+#^^^^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^^^^^^^^^^^^^ source.scala entity.name.class
+# ^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.function.declaration
+> @userDefinedLowerCase def y
+#^^^^ source.scala
+# ^ source.scala keyword.operator.scala
+# ^^^^^^^^^^^^^^^^^^^^^ source.scala
+# ^^^ source.scala keyword.declaration.scala
+# ^ source.scala
+# ^ source.scala entity.name.function.declaration
+>}
+#^ source.scala punctuation.section.block.end.scala
\ No newline at end of file
diff --git a/tests/unit/basic.test.scala b/tests/unit/basic.test.scala
new file mode 100644
index 0000000..1cbb149
--- /dev/null
+++ b/tests/unit/basic.test.scala
@@ -0,0 +1,50 @@
+// SYNTAX TEST "source.scala"
+
+
+class Stack[A] {
+// <----- keyword.declaration.scala
+// ^ - keyword.declaration.scala entity.name.class.declaration
+// ^^^^^ entity.name.class.declaration
+// ^ source.scala meta.bracket.scala
+// ^ entity.name.class
+// ^ meta.bracket.scala
+// ^ punctuation.section.block.begin.scala
+ private var elements: List[A] = Nil
+//^^^^^^^ storage.modifier.access
+// ^^^ keyword.declaration.volatile.scala
+// ^^^^^^^^ variable.other.declaration.scala
+// ^ keyword.operator.scala
+// ^^^^ entity.name.class
+// ^ meta.bracket.scala
+// ^ entity.name.class
+// ^ meta.bracket.scala
+// ^ keyword.operator.comparison.scala
+// ^^^ constant.language.scala
+ def push(x: A) { elements = x :: elements }
+// ^^^ keyword.declaration.scala
+// ^^^^ entity.name.function.declaration
+// ^ meta.bracket.scala
+// ^ variable.parameter.scala
+// ^ meta.colon.scala
+// ^ entity.name.class
+// ^ meta.bracket.scala
+// ^ punctuation.section.block.begin.scala
+// ^^^^^^^^ source.scala
+// ^ keyword.operator.comparison.scala
+// ^ source.scala
+// ^^ keyword.operator.scala
+// ^^^^^^^^ source.scala
+// ^ punctuation.section.block.end.scala
+ def peek: A = elements.head
+ def pop(): A = {
+ val currentTop = peek
+// ^^^ keyword.declaration.stable.scala
+// ^^^^^^^^^^ variable.other.declaration.scala
+// ^ keyword.operator.comparison.scala
+// ^^^^ source.scala
+ elements = elements.tail
+ currentTop
+ }
+//^ punctuation.section.block.end.scala
+}
+// <- punctuation.section.block.end.scala
\ No newline at end of file
diff --git a/tests/unit/lexical.test.scala b/tests/unit/lexical.test.scala
new file mode 100644
index 0000000..2b3ccce
--- /dev/null
+++ b/tests/unit/lexical.test.scala
@@ -0,0 +1,172 @@
+// SYNTAX TEST "source.scala"
+
+object ExampleIdentifiers {
+ val x = 3
+// ^ variable.other.declaration.scala
+ val Object = 3
+ val maxIndex = 3
+// ^^^^^^^^ variable.other.declaration.scala
+ val p2p = 3
+// ^^^ variable.other.declaration.scala
+ val empty_? = 3
+// ^^^^^^^ variable.other.declaration.scala
+ val + = 3
+// ^ variable.other.declaration.scala
+ val `yield` = 3
+// ^^^^^^^ variable.other.declaration.scala
+ val αρετη = 3
+ val _y = 3
+// ^^ variable.other.declaration.scala
+ val dot_product_* = 3
+// ^^^^^^^^^^^^^ variable.other.declaration.scala
+ val __system = 3
+// ^^^^^^^^ variable.other.declaration.scala
+ val _MAX_LEN_ = 3
+// ^^^^^^^^^ variable.other.declaration.scala
+}
+
+object IntegerLiterals {
+ (0, 21, 0xFFFFFFFF, -42L)
+// ^ constant.numeric.scala
+// ^^ constant.numeric.scala
+// ^^^^^^^^^^ constant.numeric.scala
+// ^ keyword.operator.arithmetic.scala
+// ^^^ constant.numeric.scala
+}
+
+object FloatingPointLiterals {
+ ( 0.0, 1e30f, 3.14159f, 1.0e-100, .1 )
+// ^^^ constant.numeric.scala
+// ^^^^^^^^ constant.numeric.scala
+// ^^^^^^^^ constant.numeric.scala
+// ^ constant.numeric.scala
+}
+
+object Boolean {
+ (true, false)
+// ^^^^ constant.language.scala
+// ^^^^^ constant.language.scala
+}
+
+object CharacterLiterals {
+ ('a', '\u0041', '\n', '\t')
+// ^ punctuation.definition.character.begin.scala
+// ^^^ constant.character.literal.scala
+// ^ punctuation.definition.character.end.scala
+// ^^^^^^^^ constant.character.literal.scala
+// ^^^^^^ constant.character.escape.scala
+// ^^ constant.character.escape.scala
+// ^^ constant.character.escape.scala
+}
+
+object StringLiterals {
+ ("Hello,\nWorld!", "This string contains a \" character.")
+// ^ punctuation.definition.string.begin.scala
+// ^^^^^^^^^^^^^^^^ string.quoted.double.scala
+// ^^ constant.character.escape.scala
+// ^ punctuation.definition.string.end.scala
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double.scala
+ """the present string
+// ^^^ punctuation.definition.string.begin.scala
+// ^^^^^^^^^^^^^^^^^^^^^ string.quoted.triple.scala
+ spans three
+// ^^^^^^^^^^^ string.quoted.triple.scala
+ lines."""
+// ^^^^^^^^^ string.quoted.triple.scala
+// ^^^ punctuation.definition.string.end.scala
+
+ """the present string
+ |spans three
+ |lines.""".stripMargin
+
+
+ val escapeSequences = "\b\t\n\f\r\"\'\\"
+ // ^^^^^^^^^^^^^^^^^^ string.quoted.double.scala
+ // ^^^^^^^^^^^^^^^^ constant.character.escape.scala
+
+ s"$x plain ${val x = y}"
+//^ keyword.interpolation.scala
+// ^ punctuation.definition.string.begin.scala
+// ^ punctuation.definition.template-expression.begin.scala
+// ^ - string.quoted.double.interpolated.scala string.quoted.double.scala
+// ^^^^^^^ string.quoted.double.interpolated.scala
+// ^^ punctuation.definition.template-expression.begin.scala
+// ^^^ keyword.declaration.stable.scala
+// ^^^^^^^^^ - string.quoted.double.interpolated.scala string.quoted.double.scala
+// ^ punctuation.definition.template-expression.scala punctuation.definition.template-expression.end.scala
+// ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
+
+ custom"$x plain ${val x = y}"
+//^^^^^^ keyword.interpolation.scala
+// ^ punctuation.definition.string.begin.scala
+// ^ punctuation.definition.template-expression.begin.scala
+// ^ - string.quoted.double.interpolated.scala string.quoted.double.scala
+// ^^^^^^^ string.quoted.double.interpolated.scala
+// ^^ punctuation.definition.template-expression.begin.scala
+// ^^^ keyword.declaration.stable.scala
+// ^^^^^^^^^ - string.quoted.double.interpolated.scala string.quoted.double.scala
+// ^ punctuation.definition.template-expression.scala punctuation.definition.template-expression.end.scala
+// ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
+
+ s"""$x plain ${val x = y}"""
+//^ keyword.interpolation.scala
+// ^^^ punctuation.definition.string.begin.scala
+// ^ punctuation.definition.template-expression.begin.scala
+// ^ - string.quoted.triple.interpolated.scala string.quoted.triple.scala
+// ^^^^^^^ string.quoted.triple.interpolated.scala
+// ^^ punctuation.definition.template-expression.begin.scala
+// ^^^ keyword.declaration.stable.scala
+// ^^^^^^^^^ - string.quoted.triple.interpolated.scala string.quoted.triple.scala
+// ^ punctuation.definition.template-expression.scala punctuation.definition.template-expression.end.scala
+// ^^^ string.quoted.triple.interpolated.scala punctuation.definition.string.end.scala
+ custom"""$x plain ${val x = y}"""
+//^^^^^^ keyword.interpolation.scala
+// ^^^ punctuation.definition.string.begin.scala
+// ^ punctuation.definition.template-expression.begin.scala
+// ^ - string.quoted.triple.interpolated.scala string.quoted.triple.scala
+// ^^^^^^^ string.quoted.triple.interpolated.scala
+// ^^ punctuation.definition.template-expression.begin.scala
+// ^^^ keyword.declaration.stable.scala
+// ^^^^^^^^^ - string.quoted.triple.interpolated.scala string.quoted.triple.scala
+// ^ punctuation.definition.template-expression.scala punctuation.definition.template-expression.end.scala
+// ^^^ string.quoted.triple.interpolated.scala punctuation.definition.string.end.scala
+}
+
+object Symbols {
+ ('x, 'X, 'αρετη, '=, '+ )
+// ^^ constant.other.symbol.scala
+// ^^ constant.other.symbol.scala
+// ^^^^^^ constant.other.symbol.scala
+}
+
+ // single line comment
+// ^^ punctuation.definition.comment.scala
+// ^^^^^^^^^^^^^^^^^^^^^^ comment.line.double-slash.scala
+
+ /*
+// ^^ punctuation.definition.comment.scala
+ multiline comment*/
+// ^^^^^^^^^^^^^^^^^^^ comment.block.scala
+ /**
+ * Scaladoc comment
+ * @scaladoc @param
+ */
+
+ /* nested /* multi-line */ comment */
+
+
+object Xml {
+ val b =
+// ^ punctuation.definition.tag.xml
+// ^^^^ entity.name.tag.localname.xml
+// ^ punctuation.definition.tag.xml
+// ^^^^^^ meta.tag.xml
+ The Scala Language Specification
+// ^^^ entity.name.class
+// ^^^^^ entity.name.class
+// ^^^^^^^^ entity.name.class
+// ^^^^^^^^^^^^^ entity.name.class
+ {scalaBook.version}
+ {scalaBook.authors.mkList("", ", ", "")}
+
+}
diff --git a/yarn.lock b/yarn.lock
index ec4debc..7357bb6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -161,7 +161,7 @@ combined-stream@~0.0.4:
dependencies:
delayed-stream "0.0.5"
-commander@^2.8.1:
+commander@^2.20.0, commander@^2.8.1:
version "2.20.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
@@ -223,6 +223,11 @@ diff@^3.1.0:
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+diff@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff"
+ integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==
+
dom-serializer@0, dom-serializer@~0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0"
@@ -371,6 +376,18 @@ glob@^7.0.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
+glob@^7.1.4:
+ version "7.1.4"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
+ integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -552,6 +569,11 @@ mute-stream@~0.0.4:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+nan@^2.12.1:
+ version "2.14.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
+ integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
+
node-uuid@~1.4.0:
version "1.4.8"
resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907"
@@ -593,6 +615,13 @@ once@^1.3.0:
dependencies:
wrappy "1"
+oniguruma@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/oniguruma/-/oniguruma-7.1.0.tgz#106ddf7eb42507d0442ac68b187c4f7fdf052c83"
+ integrity sha512-mV+6HcDNQ38vM8HVKM+MJyXO4EtSigwIZhq023A4rA8Am4dMlGhUkPwudDykExYR45oLrssR/Ep7PZCQ1OM3pA==
+ dependencies:
+ nan "^2.12.1"
+
os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
@@ -890,6 +919,24 @@ vsce@^1.59.0:
yauzl "^2.3.1"
yazl "^2.2.2"
+vscode-textmate@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-4.1.1.tgz#857e836fbc13a376ec624242437e1747d79610a9"
+ integrity sha512-xBjq9LH6fMhWDhIVkbKlB1JeCu6lT3FI/QKN24Xi4RKPBUm16IhHTqs6Q6SUGewkNsFZGkb1tJdZsuMnlmVpgw==
+ dependencies:
+ oniguruma "^7.0.0"
+
+vscode-tmgrammar-test@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/vscode-tmgrammar-test/-/vscode-tmgrammar-test-0.0.5.tgz#1a8dea568519a56bda35b32d3bab56494481c904"
+ integrity sha512-iK5OEahJ9RTWmscD16f7z/TAH32iW8GDvHFIktlySP8XJM/n6Pi2GOwayDTo/teF70cEW0uhIQfhGuBQ08lfpQ==
+ dependencies:
+ chalk "^2.4.2"
+ commander "^2.20.0"
+ diff "^4.0.1"
+ glob "^7.1.4"
+ vscode-textmate "^4.1.1"
+
vso-node-api@6.1.2-preview:
version "6.1.2-preview"
resolved "https://registry.yarnpkg.com/vso-node-api/-/vso-node-api-6.1.2-preview.tgz#aab3546df2451ecd894e071bb99b5df19c5fa78f"