Repository: sharkdp/bat (language: rust)

Issue:
Dart syntax highlighting
<!-- Hey there, thank you for creating an issue! -->

**Describe the bug you encountered:**

Running `bat test.dart` with `test.dart` containing
```dart
return Object(
  Object(
    // Not highlighted as a comment
  )
)
```
does not highlight the third line as a comment (e.g. the `as` is highlighted as a keyword).

**What did you expect to happen instead?**

I expected the third line to be highlighted as a comment.

The Dart plugin currently used by bat hasn't been updated in a while (guillermooo/dart-sublime-bundle#586), so it might actually be time to find a new more complete and better maintained one, but I don't have much time to dive into it myself unfortunately.

**How did you install `bat`?**

With the Nix package manager under NixOS.

---

**bat version and environment**

#### Software version

bat 0.18.3

#### Operating system

Linux 5.15.3

#### Command-line

```bash
/nix/store/d0s6zszdslbd16ri50jn28fcc1jzdk2r-bat-0.18.3/bin/bat main.dart --diagnostic 
```

#### Environment variables

```bash
SHELL=/run/current-system/sw/bin/fish
PAGER='bat --plain'
LESS=<not set>
BAT_PAGER=<not set>
BAT_CACHE_PATH=<not set>
BAT_CONFIG_PATH=<not set>
BAT_OPTS=<not set>
BAT_STYLE=<not set>
BAT_TABS=<not set>
BAT_THEME=<not set>
XDG_CONFIG_HOME=<not set>
XDG_CACHE_HOME=<not set>
COLORTERM=truecolor
NO_COLOR=<not set>
MANPAGER=<not set>
```

#### Config file

```
--pager='less --RAW-CONTROL-CHARS --quit-if-one-screen'
```

#### Compile time information

- Profile: release
- Target triple: x86_64-unknown-linux-gnu
- Family: unix
- OS: linux
- Architecture: x86_64
- Pointer width: 64
- Endian: little
- CPU features: fxsr,sse,sse2
- Host: x86_64-unknown-linux-gnu

#### Less version

```
> less --version 
less 596 (POSIX regular expressions)
Copyright (C) 1984-2021  Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Home page: https://greenwoodsoftware.com/less
```


Discussion / hints:

Fix patch:
diff --git a/.gitmodules b/.gitmodules
index e97868e045..fda68b551b 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -67,9 +67,6 @@
 [submodule "assets/syntaxes/JavaScript (Babel)"]
 	path = assets/syntaxes/02_Extra/JavaScript (Babel)
 	url = https://github.com/babel/babel-sublime
-[submodule "assets/syntaxes/Dart"]
-	path = assets/syntaxes/02_Extra/Dart
-	url = https://github.com/guillermooo/dart-sublime-bundle
 [submodule "assets/syntaxes/FSharp"]
 	path = assets/syntaxes/02_Extra/FSharp
 	url = https://github.com/hoest/sublimetext-fsharp
@@ -236,3 +233,6 @@
 [submodule "assets/syntaxes/02_Extra/MediaWiki"]
 	path = assets/syntaxes/02_Extra/MediaWiki
 	url = https://github.com/tosher/Mediawiker.git
+[submodule "assets/syntaxes/02_Extra/Dart"]
+	path = assets/syntaxes/02_Extra/Dart
+	url = https://github.com/elMuso/Dartlight.git
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c91be47285..439cb11231 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -36,6 +36,7 @@
 - LiveScript, see #1915 (@Enselic)
 - MediaWiki, see #1925 (@sorairolake)
 - The `requirements.txt` syntax has been removed due to incompatible license requirements.
+- Dart, new highlighter, see #1959 (@Ersikan)
 
 ## New themes
 
diff --git a/assets/syntaxes/02_Extra/Dart b/assets/syntaxes/02_Extra/Dart
index d891fb36c9..2734901b01 160000
--- a/assets/syntaxes/02_Extra/Dart
+++ b/assets/syntaxes/02_Extra/Dart
@@ -1,1 +1,1 @@
-Subproject commit d891fb36c98ca0b111a35cba109b05a16b6c4b83
+Subproject commit 2734901b014191f5a7f71c3f48678adf31239098
diff --git a/assets/syntaxes/02_Extra/Dart.sublime-syntax b/assets/syntaxes/02_Extra/Dart.sublime-syntax
index 34ed01e930..1b0fb2db51 100644
--- a/assets/syntaxes/02_Extra/Dart.sublime-syntax
+++ b/assets/syntaxes/02_Extra/Dart.sublime-syntax
@@ -1,6 +1,6 @@
 %YAML 1.2
 ---
-# http://www.sublimetext.com/docs/3/syntax.html
+# http://www.sublimetext.com/docs/syntax.html
 name: Dart
 file_extensions:
   - dart
@@ -9,7 +9,7 @@ contexts:
   main:
     - match: ^(#!.*)$
       scope: meta.preprocessor.script.dart
-    - match: ^\s*\b(library|import|export|part of|part)\b
+    - match: ^\w*\b(library|import|part of|part|export)\b
       captures:
         0: keyword.other.import.dart
       push:
@@ -19,242 +19,114 @@ contexts:
             0: punctuation.terminator.dart
           pop: true
         - include: strings
-        - match: \b(as|show|hide|deferred)\b
+        - include: comments
+        - match: \b(as|show|hide)\b
           scope: keyword.other.import.dart
     - include: comments
-    - include: constants-and-special-vars
+    - include: punctuation
     - include: annotations
-    - include: decl-typedef
-    - include: decl-class
-    - include: decl-enum
-    - include: decl-function
     - include: keywords
+    - include: constants-and-special-vars
     - include: strings
   annotations:
-    - match: '^(?:\s*)((@)([a-zA-Z0-9_]+))'
-      captures:
-        1: annotation.dart
-        2: entity.name.function.annotation.dart
-        3: support.type.dart
+    - match: '@[a-zA-Z]+'
+      scope: storage.type.annotation.dart
   comments:
     - match: /\*\*/
       scope: comment.block.empty.dart
       captures:
         0: punctuation.definition.comment.dart
+    - include: comments-doc-oldschool
+    - include: comments-doc
     - include: comments-inline
-  comments-inline:
+  comments-block:
     - match: /\*
       push:
         - meta_scope: comment.block.dart
         - match: \*/
           pop: true
-        - include: scope:text.dart-doccomments
-    - match: (///)
-      captures:
-        1: marker.dart
+        - include: comments-block
+  comments-doc:
+    - match: ///
       push:
-        - meta_scope: comment.line.triple-slash.dart
-        - match: $
+        - meta_scope: comment.block.documentation.dart
+        - match: .*
           pop: true
-        - include: scope:text.dart-doccomments
-    - match: (//)
-      captures:
-        1: marker.dart
+        - include: dartdoc
+  comments-doc-oldschool:
+    - match: /\*\*
       push:
-        - meta_scope: comment.line.double-slash.dart
-        - match: $
+        - meta_scope: comment.block.documentation.dart
+        - match: \*/
           pop: true
-        - include: scope:text.dart-doccomments
+        - include: comments-doc-oldschool
+        - include: comments-block
+        - include: dartdoc
+  comments-inline:
+    - include: comments-block
+    - match: ((//).*)$
+      captures:
+        1: comment.line.double-slash.dart
   constants-and-special-vars:
-    - match: \b(true|false|null)\b
+    - match: (?<!\$)\b(true|false|null)\b(?!\$)
       scope: constant.language.dart
-    - match: \b(this|super)\b
+    - match: (?<!\$)\b(this|super)\b(?!\$)
       scope: variable.language.dart
-    - match: '\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b'
+    - match: '(?<!\$)\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b(?!\$)'
       scope: constant.numeric.dart
-  decl-class:
-    - match: \bclass\b
+    - match: '(?<![a-zA-Z0-9_$])([_$]*[A-Z][a-zA-Z0-9_$]*|bool\b|num\b|int\b|double\b|dynamic\b)'
+      scope: support.class.dart
+    - match: '([_$]*[a-z][a-zA-Z0-9_$]*)(<|\(|\s+=>)'
       captures:
-        0: keyword.control.new.dart
-      push:
-        - meta_scope: meta.declaration.class.dart
-        - match: "(?={)"
-          pop: true
-        - include: keywords
-        - match: "[A-Za-z_][A-Za-z0-9_]*"
-          scope: class.name.dart
-  decl-enum:
-    - match: \benum\b
-      captures:
-        0: keyword.declaration.dart
-      push:
-        - meta_scope: meta.declaration.enum.dart
-        - match: "(?={)"
-          pop: true
-        - include: keywords
-        - match: "[A-Za-z_][A-Za-z0-9_]*"
-          scope: enum.name.dart
-  decl-function:
-    - match: ^\s*(?:\b(void|bool|num|int|double|dynamic|var|String|List|Map)\b)\s+(get)\s+(\w+)\s+(?==>)
-      comment: A getter with a primitive return type.
-      scope: meta.declaration.function.dart
+        1: entity.name.function.dart
+  dartdoc:
+    - match: '(\[.*?\])'
       captures:
-        1: storage.type.primitive.dart
-        2: keyword.declaration.dart
-        3: function.name.dart
-    - match: ^\s*(?:\b(\w+)\b\s+)?(get)\s+(\w+)\s+(?==>)
-      comment: A getter with a user-defined return type or no return type.
-      scope: meta.declaration.function.dart
-      captures:
-        1: type.user-defined.dart
-        2: keyword.declaration.dart
-        3: function.name.dart
-    - match: ^\s*(set)\s+(\w+)(?=\()
-      comment: A setter.
-      captures:
-        1: keyword.declaration.dart
-        2: function.name.dart
-      push:
-        - meta_scope: meta.declaration.function.dart
-        - match: \)
-          pop: true
-        - include: comments-inline
-        - include: decl-function-parameter
-        - include: strings
-        - include: keywords
-    - match: ^\s*(?:\b(void|bool|num|int|double|dynamic|var|String|List|Map)\b)\s+(\w+)(?=\()
-      comment: A function with a primitive return type.
-      captures:
-        1: storage.type.primitive.dart
-        2: function.name.dart
-      push:
-        - meta_scope: meta.declaration.function.dart
-        - match: \)
-          pop: true
-        - include: comments-inline
-        - include: decl-function-parameter
-        - include: strings
-        - include: keywords
-    - match: ^\s*(?:\b(return)\b)\s+(\w+)(?=\()
-      comment: A function invocation after 'return'
-      captures:
-        1: keyword.control.dart
-        2: function.name.dart
-      push:
-        - meta_scope: meta.invocation.function.dart
-        - match: \)
-          pop: true
-        - include: comments-inline
-        - include: decl-function-parameter
-        - include: strings
-        - include: keywords
-    - match: ^\s*\b(new)\b\s+(\w+)(?=\()
-      comment: A class instantiation after 'new'
-      captures:
-        1: keyword.declaration.dart
-        2: function.name.dart
-      push:
-        - meta_scope: meta.invocation.function.dart
-        - match: \)
-          pop: true
-        - include: comments-inline
-        - include: decl-function-parameter
-        - include: strings
-        - include: keywords
-  decl-function-parameter:
-    - include: constants-and-special-vars
-    - match: (?:\b(void|bool|num|int|double|dynamic|var|String|List|Map)\b)\s+(\w+)(?=\()
-      comment: A function with a primitive return type.
-      captures:
-        1: storage.type.primitive.dart
-        2: function.name.dart
-      push:
-        - meta_scope: meta.parameter.function.dart
-        - match: \)
-          pop: true
-        - include: decl-function-parameter
-        - include: strings
-        - include: keywords
-    - match: \b(new)\b\s+(\w+)(?=\()
-      comment: A class instantiation after 'new'
+        0: variable.name.source.dart
+    - match: '^ {4,}(?![ \*]).*'
       captures:
-        1: keyword.declaration.dart
-        2: function.name.dart
+        0: variable.name.source.dart
+    - match: '```.*?$'
       push:
-        - meta_scope: meta.invocation.function.dart
-        - match: \)
+        - meta_content_scope: variable.other.source.dart
+        - match: '```'
           pop: true
-        - include: decl-function-parameter
-        - include: strings
-        - include: keywords
-    - match: (?:\b(\w+)\b)\s+(\w+)(?=\()
-      comment: A function with a user-defined return type.
+    - match: (`.*?`)
       captures:
-        1: type.user-defined.dart
-        2: function.name.dart
-      push:
-        - meta_scope: meta.parameter.function.dart
-        - match: \)
-          pop: true
-        - include: decl-function-parameter
-        - include: strings
-        - include: keywords
-    - match: (\w+)(?=\()
-      comment: A function with no return type.
+        0: variable.other.source.dart
+    - match: (`.*?`)
       captures:
-        1: function.name.dart
-      push:
-        - meta_scope: meta.parameter.function.dart
-        - match: \)
-          pop: true
-        - include: decl-function-parameter
-        - include: strings
-        - include: keywords
-  decl-typedef:
-    - match: typedef
+        0: variable.other.source.dart
+    - match: (\* ((    ).*))$
       captures:
-        0: keyword.control.new.dart
-      push:
-        - meta_scope: meta.declaration.typedef.dart
-        - match: ;
-          captures:
-            0: punctuation.terminator.dart
-          pop: true
-        - match: '(?:\b(void|bool|num|int|double|dynamic|var|String|List|Map)\b|([a-zA-Z_][a-zA-Z0-9_]*))\s+([a-zA-Z_][a-zA-Z0-9_]+)'
-          captures:
-            1: storage.type.primitive.dart
-            2: typedef.return.dart
-            3: typedef.name.dart
-        - match: \(
-          push:
-            - meta_scope: typedef.params.dart
-            - match: \)
-              pop: true
-            - include: keywords
+        2: variable.other.source.dart
+    - match: (\*    .*)$
   keywords:
-    - match: \bassert\b
-      scope: keyword.control.assert.dart
-    - match: \bas\b
+    - match: (?<!\$)\bas\b(?!\$)
       scope: keyword.cast.dart
-    - match: \b(try|catch|finally|throw|on|rethrow)\b
+    - match: (?<!\$)\b(try|on|catch|finally|throw|rethrow)\b(?!\$)
       scope: keyword.control.catch-exception.dart
-    - match: \s+\?\s+|\s+:\s+
-      scope: keyword.control.ternary.dart
-    - match: \b(break|case|continue|default|do|else|for|if|in|return|switch|while)\b
+    - match: (?<!\$)\b(break|case|continue|default|do|else|for|if|in|return|switch|while)\b(?!\$)
       scope: keyword.control.dart
-    - match: \b(async\*|async|await\*|await|yield)\b
-      scope: keyword.control.async.dart
-    - match: \b(new)\b
+    - match: (?<!\$)\b(sync(\*)?|async(\*)?|await|yield(\*)?)\b(?!\$)
+      scope: keyword.control.dart
+    - match: (?<!\$)\bassert\b(?!\$)
+      scope: keyword.control.dart
+    - match: (?<!\$)\b(new)\b(?!\$)
       scope: keyword.control.new.dart
-    - match: \b(abstract|extends|external|factory|implements|with|interface|get|native|operator|set|typedef)\b
+    - match: (?<!\$)\b(abstract|class|enum|extends|external|factory|implements|get|mixin|native|operator|set|typedef|with|covariant)\b(?!\$)
       scope: keyword.declaration.dart
-    - match: \b(is\!?)\b
+    - match: (?<!\$)\b(is\!?)\b(?!\$)
       scope: keyword.operator.dart
+    - match: '\?|:'
+      scope: keyword.operator.ternary.dart
     - match: (<<|>>>?|~|\^|\||&)
       scope: keyword.operator.bitwise.dart
     - match: ((&|\^|\||<<|>>>?)=)
       scope: keyword.operator.assignment.bitwise.dart
-    - match: (===?|!==?|<=?|>=?)
+    - match: (=>)
+      scope: keyword.operator.closure.dart
+    - match: (==|!=|<=?|>=?)
       scope: keyword.operator.comparison.dart
     - match: '(([+*/%-]|\~)=)'
       scope: keyword.operator.assignment.arithmetic.dart
@@ -266,56 +138,22 @@ contexts:
       scope: keyword.operator.arithmetic.dart
     - match: (!|&&|\|\|)
       scope: keyword.operator.logical.dart
-    - match: ;
-      scope: punctuation.terminator.dart
-    - match: \b(static|final|const)\b
+    - match: (?<!\$)\b(static|final|const)\b(?!\$)
       scope: storage.modifier.dart
-    - match: \b(?:void|bool|num|int|double|dynamic|var|String|List|Map)\b
+    - match: (?<!\$)\b(?:void|var)\b(?!\$)
       scope: storage.type.primitive.dart
-  regexp:
-    - match: '\\[^''"]'
-      scope: constant.character.escaped.regex.dart
-    - match: \(
-      push:
-        - meta_content_scope: meta.capture.regex.dart
-        - match: \)
-          pop: true
-        - match: \?(:|=|!)
-          scope: ignore.capture.regex.dart
-    - match: \*|\+|\?|\.|\|
-      scope: keyword.other.regex.dart
-    - match: \^|\$
-      scope: keyword.other.regex.dart
+  punctuation:
+    - match: ','
+      scope: punctuation.comma.dart
+    - match: ;
+      scope: punctuation.terminator.dart
     - match: \.
-      scope: constant.other.regex.dart
-    - match: '\[(\^)?'
-      captures:
-        1: keyword.other.negation.regex.dart
-      push:
-        - meta_scope: constant.character.range.regex.dart
-        - match: '\]'
-          pop: true
-        - match: '\\[^"'']'
-          scope: constant.character.escaped.regex.dart
-    - match: '\{(?:\d+)?,(?:\d+)?\}'
-      scope: keyword.other.regex.dart
+      scope: punctuation.dot.dart
   string-interp:
-    - match: '(\$)(\{)'
+    - match: '\$((\w+)|\{([^{}]+)\})'
       captures:
-        1: keyword.other.dart
-        2: keyword.other.dart
-      push:
-        - meta_scope: interpolation.dart
-        - meta_content_scope: source.dart
-        - match: '(\})'
-          captures:
-            1: keyword.other.dart
-          pop: true
-        - include: main
-    - match: (\$)(\w+)
-      captures:
-        1: keyword.other.dart
         2: variable.parameter.dart
+        3: variable.parameter.dart
     - match: \\.
       scope: constant.character.escape.dart
   strings:
@@ -328,7 +166,7 @@ contexts:
     - match: (?<!r)'''
       push:
         - meta_scope: string.interpolated.triple.single.dart
-        - match: "'''(?!')"
+        - match: '''''''(?!'')'
           pop: true
         - include: string-interp
     - match: r"""
@@ -339,9 +177,9 @@ contexts:
     - match: r'''
       push:
         - meta_scope: string.quoted.triple.single.dart
-        - match: "'''(?!')"
+        - match: '''''''(?!'')'
           pop: true
-    - match: (?<!\\|r)"
+    - match: (?<!\|r)"
       push:
         - meta_scope: string.interpolated.double.dart
         - match: '"'
@@ -354,16 +192,20 @@ contexts:
         - meta_scope: string.quoted.double.dart
         - match: '"'
           pop: true
-        - include: regexp
+        - match: \n
+          scope: invalid.string.newline
     - match: (?<!\|r)'
       push:
         - meta_scope: string.interpolated.single.dart
         - match: "'"
           pop: true
+        - match: \n
+          scope: invalid.string.newline
         - include: string-interp
     - match: r'
       push:
         - meta_scope: string.quoted.single.dart
         - match: "'"
           pop: true
-        - include: regexp
+        - match: \n
+          scope: invalid.string.newline


Test patch:
diff --git a/tests/syntax-tests/highlighted/Dart/inner_comment.dart b/tests/syntax-tests/highlighted/Dart/inner_comment.dart
new file mode 100644
index 0000000000..39a33f09e1
--- /dev/null
+++ b/tests/syntax-tests/highlighted/Dart/inner_comment.dart
@@ -0,0 +1,5 @@
+[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mObject[0m[38;2;248;248;242m([0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mObject[0m[38;2;248;248;242m([0m
+[38;2;248;248;242m    [0m[38;2;117;113;94m// Not highlighted as a comment[0m
+[38;2;248;248;242m  )[0m
+[38;2;248;248;242m)[0m
diff --git a/tests/syntax-tests/highlighted/Dart/test.dart b/tests/syntax-tests/highlighted/Dart/test.dart
index 4679641c13..2f0406fc3a 100644
--- a/tests/syntax-tests/highlighted/Dart/test.dart
+++ b/tests/syntax-tests/highlighted/Dart/test.dart
@@ -1,45 +1,45 @@
 [38;2;117;113;94m/* array sorting alogorithm */[0m
-[3;38;2;102;217;239mint[0m[38;2;248;248;242m [0m[38;2;248;248;242mpartition[0m[38;2;248;248;242m([0m[3;38;2;102;217;239mList[0m[38;2;248;248;242m list, [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m low, [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m high)[0m[38;2;248;248;242m {[0m
-[38;2;248;248;242m  [0m[38;2;249;38;114mif[0m[38;2;248;248;242m (list [0m[38;2;249;38;114m==[0m[38;2;248;248;242m [0m[38;2;190;132;255mnull[0m[38;2;248;248;242m [0m[38;2;249;38;114m|[0m[38;2;249;38;114m|[0m[38;2;248;248;242m list.length [0m[38;2;249;38;114m==[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m pivot [0m[38;2;249;38;114m=[0m[38;2;248;248;242m list[high][0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m i [0m[38;2;249;38;114m=[0m[38;2;248;248;242m low [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
+[3;38;2;166;226;46mint[0m[38;2;248;248;242m [0m[38;2;166;226;46mpartition[0m[38;2;248;248;242m([0m[3;38;2;166;226;46mList[0m[38;2;248;248;242m list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m low[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m high) {[0m
+[38;2;248;248;242m  [0m[38;2;249;38;114mif[0m[38;2;248;248;242m (list [0m[38;2;249;38;114m==[0m[38;2;248;248;242m [0m[38;2;190;132;255mnull[0m[38;2;248;248;242m [0m[38;2;249;38;114m|[0m[38;2;249;38;114m|[0m[38;2;248;248;242m list[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength [0m[38;2;249;38;114m==[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m pivot [0m[38;2;249;38;114m=[0m[38;2;248;248;242m list[high][0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m i [0m[38;2;249;38;114m=[0m[38;2;248;248;242m low [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
 
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mvoid[0m[38;2;248;248;242m [0m[38;2;248;248;242mswap[0m[38;2;248;248;242m([0m[3;38;2;102;217;239mList[0m[38;2;248;248;242m list, [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m i, [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m j)[0m[38;2;248;248;242m {[0m
-[38;2;248;248;242m    [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m temp [0m[38;2;249;38;114m=[0m[38;2;248;248;242m list[i][0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;102;217;239mvoid[0m[38;2;248;248;242m [0m[38;2;166;226;46mswap[0m[38;2;248;248;242m([0m[3;38;2;166;226;46mList[0m[38;2;248;248;242m list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m i[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m j) {[0m
+[38;2;248;248;242m    [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m temp [0m[38;2;249;38;114m=[0m[38;2;248;248;242m list[i][0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m    list[i] [0m[38;2;249;38;114m=[0m[38;2;248;248;242m list[j][0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m    list[j] [0m[38;2;249;38;114m=[0m[38;2;248;248;242m temp[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m  }[0m
 
-[38;2;248;248;242m  [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m ([0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m j [0m[38;2;249;38;114m=[0m[38;2;248;248;242m low[0m[38;2;248;248;242m;[0m[38;2;248;248;242m j [0m[38;2;249;38;114m<[0m[38;2;248;248;242m high[0m[38;2;248;248;242m;[0m[38;2;248;248;242m j[0m[38;2;249;38;114m++[0m[38;2;248;248;242m) {[0m
+[38;2;248;248;242m  [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m ([0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m j [0m[38;2;249;38;114m=[0m[38;2;248;248;242m low[0m[38;2;248;248;242m;[0m[38;2;248;248;242m j [0m[38;2;249;38;114m<[0m[38;2;248;248;242m high[0m[38;2;248;248;242m;[0m[38;2;248;248;242m j[0m[38;2;249;38;114m++[0m[38;2;248;248;242m) {[0m
 [38;2;248;248;242m    [0m[38;2;249;38;114mif[0m[38;2;248;248;242m (list[j] [0m[38;2;249;38;114m<=[0m[38;2;248;248;242m pivot) {[0m
 [38;2;248;248;242m      i[0m[38;2;249;38;114m++[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m      swap(list, i, j)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m      [0m[38;2;166;226;46mswap[0m[38;2;248;248;242m(list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m i[0m[38;2;248;248;242m,[0m[38;2;248;248;242m j)[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m    }[0m
-[38;2;248;248;242m    swap(list, i [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m, high)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;166;226;46mswap[0m[38;2;248;248;242m(list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m i [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m,[0m[38;2;248;248;242m high)[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m    [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m i [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m  }[0m
 [38;2;248;248;242m}[0m
 
-[3;38;2;102;217;239mvoid[0m[38;2;248;248;242m [0m[38;2;248;248;242mquickSort[0m[38;2;248;248;242m([0m[3;38;2;102;217;239mList[0m[38;2;248;248;242m list, [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m low, [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m high)[0m[38;2;248;248;242m {[0m
+[3;38;2;102;217;239mvoid[0m[38;2;248;248;242m [0m[38;2;166;226;46mquickSort[0m[38;2;248;248;242m([0m[3;38;2;166;226;46mList[0m[38;2;248;248;242m list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m low[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m high) {[0m
 [38;2;248;248;242m  [0m[38;2;249;38;114mif[0m[38;2;248;248;242m (low [0m[38;2;249;38;114m<[0m[38;2;248;248;242m high) {[0m
-[38;2;248;248;242m    [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m pi [0m[38;2;249;38;114m=[0m[38;2;248;248;242m partition(list, low, high)[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m    quickSort(list, low, pi [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m    quickSort(list, pi [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m, high)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m pi [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;166;226;46mpartition[0m[38;2;248;248;242m(list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m low[0m[38;2;248;248;242m,[0m[38;2;248;248;242m high)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;166;226;46mquickSort[0m[38;2;248;248;242m(list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m low[0m[38;2;248;248;242m,[0m[38;2;248;248;242m pi [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;166;226;46mquickSort[0m[38;2;248;248;242m(list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m pi [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m,[0m[38;2;248;248;242m high)[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m  }[0m
 [38;2;248;248;242m}[0m
 
-[3;38;2;102;217;239mvoid[0m[38;2;248;248;242m [0m[38;2;248;248;242mmerge[0m[38;2;248;248;242m([0m[3;38;2;102;217;239mList[0m[38;2;248;248;242m list, [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m leftIndex, [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m middleIndex, [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m rightIndex)[0m[38;2;248;248;242m {[0m
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m leftSize [0m[38;2;249;38;114m=[0m[38;2;248;248;242m middleIndex [0m[38;2;249;38;114m-[0m[38;2;248;248;242m leftIndex [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m rightSize [0m[38;2;249;38;114m=[0m[38;2;248;248;242m rightIndex [0m[38;2;249;38;114m-[0m[38;2;248;248;242m middleIndex[0m[38;2;248;248;242m;[0m
+[3;38;2;102;217;239mvoid[0m[38;2;248;248;242m [0m[38;2;166;226;46mmerge[0m[38;2;248;248;242m([0m[3;38;2;166;226;46mList[0m[38;2;248;248;242m list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m leftIndex[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m middleIndex[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m rightIndex) {[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m leftSize [0m[38;2;249;38;114m=[0m[38;2;248;248;242m middleIndex [0m[38;2;249;38;114m-[0m[38;2;248;248;242m leftIndex [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m rightSize [0m[38;2;249;38;114m=[0m[38;2;248;248;242m rightIndex [0m[38;2;249;38;114m-[0m[38;2;248;248;242m middleIndex[0m[38;2;248;248;242m;[0m
 
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mList[0m[38;2;248;248;242m leftList [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mList[0m[38;2;248;248;242m(leftSize)[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mList[0m[38;2;248;248;242m rightList [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mList[0m[38;2;248;248;242m(rightSize)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mList[0m[38;2;248;248;242m leftList [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mList[0m[38;2;248;248;242m(leftSize)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mList[0m[38;2;248;248;242m rightList [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mList[0m[38;2;248;248;242m(rightSize)[0m[38;2;248;248;242m;[0m
 
-[38;2;248;248;242m  [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m ([0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m i [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m[38;2;248;248;242m i [0m[38;2;249;38;114m<[0m[38;2;248;248;242m leftSize[0m[38;2;248;248;242m;[0m[38;2;248;248;242m i[0m[38;2;249;38;114m++[0m[38;2;248;248;242m) leftList[i] [0m[38;2;249;38;114m=[0m[38;2;248;248;242m list[leftIndex [0m[38;2;249;38;114m+[0m[38;2;248;248;242m i][0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m  [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m ([0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m j [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m[38;2;248;248;242m j [0m[38;2;249;38;114m<[0m[38;2;248;248;242m rightSize[0m[38;2;248;248;242m;[0m[38;2;248;248;242m j[0m[38;2;249;38;114m++[0m[38;2;248;248;242m) rightList[j] [0m[38;2;249;38;114m=[0m[38;2;248;248;242m list[middleIndex [0m[38;2;249;38;114m+[0m[38;2;248;248;242m j [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m][0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m ([0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m i [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m[38;2;248;248;242m i [0m[38;2;249;38;114m<[0m[38;2;248;248;242m leftSize[0m[38;2;248;248;242m;[0m[38;2;248;248;242m i[0m[38;2;249;38;114m++[0m[38;2;248;248;242m) leftList[i] [0m[38;2;249;38;114m=[0m[38;2;248;248;242m list[leftIndex [0m[38;2;249;38;114m+[0m[38;2;248;248;242m i][0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m ([0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m j [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m[38;2;248;248;242m j [0m[38;2;249;38;114m<[0m[38;2;248;248;242m rightSize[0m[38;2;248;248;242m;[0m[38;2;248;248;242m j[0m[38;2;249;38;114m++[0m[38;2;248;248;242m) rightList[j] [0m[38;2;249;38;114m=[0m[38;2;248;248;242m list[middleIndex [0m[38;2;249;38;114m+[0m[38;2;248;248;242m j [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m][0m[38;2;248;248;242m;[0m
 
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m i [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m, j [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m k [0m[38;2;249;38;114m=[0m[38;2;248;248;242m leftIndex[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m i [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m,[0m[38;2;248;248;242m j [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m k [0m[38;2;249;38;114m=[0m[38;2;248;248;242m leftIndex[0m[38;2;248;248;242m;[0m
 
 [38;2;248;248;242m  [0m[38;2;249;38;114mwhile[0m[38;2;248;248;242m (i [0m[38;2;249;38;114m<[0m[38;2;248;248;242m leftSize [0m[38;2;249;38;114m&[0m[38;2;249;38;114m&[0m[38;2;248;248;242m j [0m[38;2;249;38;114m<[0m[38;2;248;248;242m rightSize) {[0m
 [38;2;248;248;242m    [0m[38;2;249;38;114mif[0m[38;2;248;248;242m (leftList[i] [0m[38;2;249;38;114m<=[0m[38;2;248;248;242m rightList[j]) {[0m
@@ -65,14 +65,14 @@
 [38;2;248;248;242m  }[0m
 [38;2;248;248;242m}[0m
 
-[3;38;2;102;217;239mvoid[0m[38;2;248;248;242m [0m[38;2;248;248;242mmergeSort[0m[38;2;248;248;242m([0m[3;38;2;102;217;239mList[0m[38;2;248;248;242m list, [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m leftIndex, [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m rightIndex)[0m[38;2;248;248;242m {[0m
+[3;38;2;102;217;239mvoid[0m[38;2;248;248;242m [0m[38;2;166;226;46mmergeSort[0m[38;2;248;248;242m([0m[3;38;2;166;226;46mList[0m[38;2;248;248;242m list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m leftIndex[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m rightIndex) {[0m
 [38;2;248;248;242m  [0m[38;2;249;38;114mif[0m[38;2;248;248;242m (leftIndex [0m[38;2;249;38;114m<[0m[38;2;248;248;242m rightIndex) {[0m
-[38;2;248;248;242m    [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m middleIndex [0m[38;2;249;38;114m=[0m[38;2;248;248;242m (rightIndex [0m[38;2;249;38;114m+[0m[38;2;248;248;242m leftIndex) [0m[38;2;249;38;114m~[0m[38;2;249;38;114m/[0m[38;2;248;248;242m [0m[38;2;190;132;255m2[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m middleIndex [0m[38;2;249;38;114m=[0m[38;2;248;248;242m (rightIndex [0m[38;2;249;38;114m+[0m[38;2;248;248;242m leftIndex) [0m[38;2;249;38;114m~[0m[38;2;249;38;114m/[0m[38;2;248;248;242m [0m[38;2;190;132;255m2[0m[38;2;248;248;242m;[0m
 
-[38;2;248;248;242m    mergeSort(list, leftIndex, middleIndex)[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m    mergeSort(list, middleIndex [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m, rightIndex)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;166;226;46mmergeSort[0m[38;2;248;248;242m(list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m leftIndex[0m[38;2;248;248;242m,[0m[38;2;248;248;242m middleIndex)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;166;226;46mmergeSort[0m[38;2;248;248;242m(list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m middleIndex [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m,[0m[38;2;248;248;242m rightIndex)[0m[38;2;248;248;242m;[0m
 
-[38;2;248;248;242m    merge(list, leftIndex, middleIndex, rightIndex)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;166;226;46mmerge[0m[38;2;248;248;242m(list[0m[38;2;248;248;242m,[0m[38;2;248;248;242m leftIndex[0m[38;2;248;248;242m,[0m[38;2;248;248;242m middleIndex[0m[38;2;248;248;242m,[0m[38;2;248;248;242m rightIndex)[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m  }[0m
 [38;2;248;248;242m}[0m
 
@@ -80,54 +80,54 @@
 [3;38;2;102;217;239mvar[0m[38;2;248;248;242m name [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;230;219;116m'Voyager I'[0m[38;2;248;248;242m;[0m
 [3;38;2;102;217;239mvar[0m[38;2;248;248;242m year [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m1977[0m[38;2;248;248;242m;[0m
 [3;38;2;102;217;239mvar[0m[38;2;248;248;242m antennaDiameter [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m3.7[0m[38;2;248;248;242m;[0m
-[3;38;2;102;217;239mvar[0m[38;2;248;248;242m flybyObjects [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [[0m[38;2;230;219;116m'Jupiter'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'Saturn'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'Uranus'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'Neptune'[0m[38;2;248;248;242m][0m[38;2;248;248;242m;[0m
+[3;38;2;102;217;239mvar[0m[38;2;248;248;242m flybyObjects [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [[0m[38;2;230;219;116m'Jupiter'[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m'Saturn'[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m'Uranus'[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m'Neptune'[0m[38;2;248;248;242m][0m[38;2;248;248;242m;[0m
 [3;38;2;102;217;239mvar[0m[38;2;248;248;242m image [0m[38;2;249;38;114m=[0m[38;2;248;248;242m {[0m
-[38;2;248;248;242m  [0m[38;2;230;219;116m'tags'[0m[38;2;248;248;242m: [[0m[38;2;230;219;116m'saturn'[0m[38;2;248;248;242m],[0m
-[38;2;248;248;242m  [0m[38;2;230;219;116m'url'[0m[38;2;248;248;242m: [0m[38;2;230;219;116m'//path/to/saturn.jpg'[0m
+[38;2;248;248;242m  [0m[38;2;230;219;116m'tags'[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [[0m[38;2;230;219;116m'saturn'[0m[38;2;248;248;242m][0m[38;2;248;248;242m,[0m
+[38;2;248;248;242m  [0m[38;2;230;219;116m'url'[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;230;219;116m'//path/to/saturn.jpg'[0m
 [38;2;248;248;242m}[0m[38;2;248;248;242m;[0m
 
 [38;2;117;113;94m/*classes */[0m
-[38;2;249;38;114mclass[0m[38;2;248;248;242m [0m[38;2;248;248;242mSpacecraft[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mString[0m[38;2;248;248;242m name[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m  DateTime launchDate[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m  Spacecraft([0m[38;2;255;255;255mthis[0m[38;2;248;248;242m.name, [0m[38;2;255;255;255mthis[0m[38;2;248;248;242m.launchDate) {}[0m
+[38;2;249;38;114mclass[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mSpacecraft[0m[38;2;248;248;242m {[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mString[0m[38;2;248;248;242m name[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mDateTime[0m[38;2;248;248;242m launchDate[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mSpacecraft[0m[38;2;248;248;242m([0m[38;2;255;255;255mthis[0m[38;2;248;248;242m.[0m[38;2;248;248;242mname[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;255;255;255mthis[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlaunchDate) {}[0m
 
-[38;2;248;248;242m  [0m[38;2;117;113;94m//[0m[38;2;117;113;94m Named constructor that forwards to the default one.[0m
-[38;2;248;248;242m  Spacecraft.unlaunched([0m[3;38;2;102;217;239mString[0m[38;2;248;248;242m name)[0m[38;2;249;38;114m : [0m[38;2;255;255;255mthis[0m[38;2;248;248;242m(name, [0m[38;2;190;132;255mnull[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[38;2;117;113;94m// Named constructor that forwards to the default one.[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mSpacecraft[0m[38;2;248;248;242m.[0m[38;2;166;226;46munlaunched[0m[38;2;248;248;242m([0m[3;38;2;166;226;46mString[0m[38;2;248;248;242m name) [0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;255;255;255mthis[0m[38;2;248;248;242m(name[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;190;132;255mnull[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
 
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m [0m[38;2;249;38;114mget[0m[38;2;248;248;242m [0m[38;2;248;248;242mlaunchYear[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;249;38;114m>[0m[38;2;248;248;242m launchDate?.year[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m [0m[38;2;249;38;114mget[0m[38;2;248;248;242m [0m[38;2;166;226;46mlaunchYear[0m[38;2;248;248;242m => launchDate[0m[38;2;249;38;114m?[0m[38;2;248;248;242m.[0m[38;2;248;248;242myear[0m[38;2;248;248;242m;[0m
 
-[38;2;248;248;242m  [0m[3;38;2;102;217;239mvoid[0m[38;2;248;248;242m [0m[38;2;248;248;242mdescribe[0m[38;2;248;248;242m()[0m[38;2;248;248;242m {[0m
-[38;2;248;248;242m    print([0m[38;2;230;219;116m'Spacecraft: [0m[38;2;249;38;114m$[0m[3;38;2;253;151;31mname[0m[38;2;230;219;116m'[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m  [0m[3;38;2;102;217;239mvoid[0m[38;2;248;248;242m [0m[38;2;166;226;46mdescribe[0m[38;2;248;248;242m() {[0m
+[38;2;248;248;242m    [0m[38;2;166;226;46mprint[0m[38;2;248;248;242m([0m[38;2;230;219;116m'Spacecraft: $[0m[3;38;2;253;151;31mname[0m[38;2;230;219;116m'[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m    [0m[38;2;249;38;114mif[0m[38;2;248;248;242m (launchDate [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m [0m[38;2;190;132;255mnull[0m[38;2;248;248;242m) {[0m
-[38;2;248;248;242m      [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m years [0m[38;2;249;38;114m=[0m[38;2;248;248;242m DateTime.now().difference(launchDate).inDays [0m[38;2;249;38;114m~[0m[38;2;249;38;114m/[0m[38;2;248;248;242m [0m[38;2;190;132;255m365[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m      print([0m[38;2;230;219;116m'Launched: [0m[38;2;249;38;114m$[0m[3;38;2;253;151;31mlaunchYear[0m[38;2;230;219;116m ([0m[38;2;249;38;114m$[0m[3;38;2;253;151;31myears[0m[38;2;230;219;116m years ago)'[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m      [0m[3;38;2;166;226;46mint[0m[38;2;248;248;242m years [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mDateTime[0m[38;2;248;248;242m.[0m[38;2;166;226;46mnow[0m[38;2;248;248;242m()[0m[38;2;248;248;242m.[0m[38;2;166;226;46mdifference[0m[38;2;248;248;242m(launchDate)[0m[38;2;248;248;242m.[0m[38;2;248;248;242minDays [0m[38;2;249;38;114m~[0m[38;2;249;38;114m/[0m[38;2;248;248;242m [0m[38;2;190;132;255m365[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m      [0m[38;2;166;226;46mprint[0m[38;2;248;248;242m([0m[38;2;230;219;116m'Launched: $[0m[3;38;2;253;151;31mlaunchYear[0m[38;2;230;219;116m ($[0m[3;38;2;253;151;31myears[0m[38;2;230;219;116m years ago)'[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m    } [0m[38;2;249;38;114melse[0m[38;2;248;248;242m {[0m
-[38;2;248;248;242m      print([0m[38;2;230;219;116m'Unlaunched'[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m      [0m[38;2;166;226;46mprint[0m[38;2;248;248;242m([0m[38;2;230;219;116m'Unlaunched'[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m    }[0m
 [38;2;248;248;242m  }[0m
 [38;2;248;248;242m}[0m
 
 [38;2;117;113;94m/* Mixins */[0m
-[38;2;249;38;114mclass[0m[38;2;248;248;242m [0m[38;2;248;248;242mPilotedCraft[0m[38;2;248;248;242m [0m[38;2;249;38;114mextends[0m[38;2;248;248;242m [0m[38;2;248;248;242mSpacecraft[0m[38;2;248;248;242m [0m[38;2;249;38;114mwith[0m[38;2;248;248;242m [0m[38;2;248;248;242mPiloted[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
-[38;2;248;248;242m  [0m[38;2;117;113;94m//[0m[38;2;117;113;94m ···[0m
+[38;2;249;38;114mclass[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mPilotedCraft[0m[38;2;248;248;242m [0m[38;2;249;38;114mextends[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mSpacecraft[0m[38;2;248;248;242m [0m[38;2;249;38;114mwith[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mPiloted[0m[38;2;248;248;242m {[0m
+[38;2;248;248;242m  [0m[38;2;117;113;94m// ···[0m
 [38;2;248;248;242m}[0m
 
 [38;2;117;113;94m/* Interfaces and abstract classes */[0m
-[38;2;249;38;114mclass[0m[38;2;248;248;242m [0m[38;2;248;248;242mMockSpaceship[0m[38;2;248;248;242m [0m[38;2;249;38;114mimplements[0m[38;2;248;248;242m [0m[38;2;248;248;242mSpacecraft[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
-[38;2;248;248;242m  [0m[38;2;117;113;94m//[0m[38;2;117;113;94m ···[0m
+[38;2;249;38;114mclass[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mMockSpaceship[0m[38;2;248;248;242m [0m[38;2;249;38;114mimplements[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mSpacecraft[0m[38;2;248;248;242m {[0m
+[38;2;248;248;242m  [0m[38;2;117;113;94m// ···[0m
 [38;2;248;248;242m}[0m
 
 [38;2;117;113;94m/* async */[0m
-[38;2;248;248;242mFuture[0m[38;2;249;38;114m<[0m[3;38;2;102;217;239mvoid[0m[38;2;249;38;114m>[0m[38;2;248;248;242m printWithDelay([0m[3;38;2;102;217;239mString[0m[38;2;248;248;242m message) {[0m
-[38;2;248;248;242m  [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Future.delayed([0m[38;2;249;38;114mconst[0m[38;2;248;248;242m Duration(seconds: [0m[38;2;190;132;255m2[0m[38;2;248;248;242m)).then((_) {[0m
-[38;2;248;248;242m    print(message)[0m[38;2;248;248;242m;[0m
+[3;38;2;166;226;46mFuture[0m[38;2;249;38;114m<[0m[3;38;2;102;217;239mvoid[0m[38;2;249;38;114m>[0m[38;2;248;248;242m [0m[38;2;166;226;46mprintWithDelay[0m[38;2;248;248;242m([0m[3;38;2;166;226;46mString[0m[38;2;248;248;242m message) {[0m
+[38;2;248;248;242m  [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mFuture[0m[38;2;248;248;242m.[0m[38;2;166;226;46mdelayed[0m[38;2;248;248;242m([0m[38;2;249;38;114mconst[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mDuration[0m[38;2;248;248;242m(seconds[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;190;132;255m2[0m[38;2;248;248;242m))[0m[38;2;248;248;242m.[0m[38;2;166;226;46mthen[0m[38;2;248;248;242m((_) {[0m
+[38;2;248;248;242m    [0m[38;2;166;226;46mprint[0m[38;2;248;248;242m(message)[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m  })[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m}[0m
 
-[38;2;248;248;242mStream[0m[38;2;249;38;114m<[0m[3;38;2;102;217;239mString[0m[38;2;249;38;114m>[0m[38;2;248;248;242m report(Spacecraft craft, Iterable[0m[38;2;249;38;114m<[0m[3;38;2;102;217;239mString[0m[38;2;249;38;114m>[0m[38;2;248;248;242m objects) [0m[38;2;249;38;114masync[0m[38;2;249;38;114m*[0m[38;2;248;248;242m {[0m
+[3;38;2;166;226;46mStream[0m[38;2;249;38;114m<[0m[3;38;2;166;226;46mString[0m[38;2;249;38;114m>[0m[38;2;248;248;242m [0m[38;2;166;226;46mreport[0m[38;2;248;248;242m([0m[3;38;2;166;226;46mSpacecraft[0m[38;2;248;248;242m craft[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mIterable[0m[38;2;249;38;114m<[0m[3;38;2;166;226;46mString[0m[38;2;249;38;114m>[0m[38;2;248;248;242m objects) [0m[38;2;249;38;114masync[0m[38;2;249;38;114m*[0m[38;2;248;248;242m {[0m
 [38;2;248;248;242m  [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m ([0m[3;38;2;102;217;239mvar[0m[38;2;248;248;242m object [0m[38;2;249;38;114min[0m[38;2;248;248;242m objects) {[0m
-[38;2;248;248;242m    [0m[38;2;249;38;114mawait[0m[38;2;248;248;242m Future.delayed([0m[38;2;249;38;114mconst[0m[38;2;248;248;242m Duration(seconds: [0m[38;2;190;132;255m2[0m[38;2;248;248;242m))[0m[38;2;248;248;242m;[0m
-[38;2;248;248;242m    [0m[38;2;249;38;114myield[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;249;38;114m$[0m[38;2;249;38;114m{[0m[38;2;230;219;116mcraft.name[0m[38;2;249;38;114m}[0m[38;2;230;219;116m flies by [0m[38;2;249;38;114m$[0m[3;38;2;253;151;31mobject[0m[38;2;230;219;116m'[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;249;38;114mawait[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mFuture[0m[38;2;248;248;242m.[0m[38;2;166;226;46mdelayed[0m[38;2;248;248;242m([0m[38;2;249;38;114mconst[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mDuration[0m[38;2;248;248;242m(seconds[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;190;132;255m2[0m[38;2;248;248;242m))[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;249;38;114myield[0m[38;2;248;248;242m [0m[38;2;230;219;116m'${[0m[3;38;2;253;151;31mcraft.name[0m[38;2;230;219;116m} flies by $[0m[3;38;2;253;151;31mobject[0m[38;2;230;219;116m'[0m[38;2;248;248;242m;[0m
 [38;2;248;248;242m  }[0m
 [38;2;248;248;242m}[0m
diff --git a/tests/syntax-tests/source/Dart/inner_comment.dart b/tests/syntax-tests/source/Dart/inner_comment.dart
new file mode 100644
index 0000000000..b7aa348194
--- /dev/null
+++ b/tests/syntax-tests/source/Dart/inner_comment.dart
@@ -0,0 +1,5 @@
+return Object(
+  Object(
+    // Not highlighted as a comment
+  )
+)