on master help sign in
.github/ISSUE_TEMPLATE/bug_report.md+19−2
since splitsnapshots
unifiedsplit
@@ -7,9 +7,26 @@ assignees: ''
7
7
8---
8---
9
9
10+<!--
11+
10−<!-- Hey there, thank you for creating an issue! -->
12+Hey there, thank you for reporting a bug!
13+
14+Please note that the following bugs have already been reported:
15+
16+* dpkg: error processing archive /some/path/some-program.deb (--unpack):
17+ trying to overwrite '/usr/.crates2.json'
18+
19+ See https://github.com/sharkdp/bat/issues/938
20+
21+-->
22+
23+**What steps will reproduce the bug?**
24+
25+1. step 1
26+2. step 2
27+3. ...
11
28
12−**Describe the bug you encountered:**
29+**What happens?**
13
30
14...
31...
15
32
.github/ISSUE_TEMPLATE/question.md+2
@@ -7,3 +7,5 @@ assignees: ''
7
7
8---
8---
9
9
10+<!-- Using a normal ticket is still fine, but feel free to ask your
11+questions about bat on https://github.com/sharkdp/bat/discussions instead. -->
.github/workflows/CICD.yml+24−3
@@ -1,7 +1,7 @@
1name: CICD
1name: CICD
2
2
3env:
3env:
4− MIN_SUPPORTED_RUST_VERSION: "1.46.0"
4+ MIN_SUPPORTED_RUST_VERSION: "1.51.0"
5 CICD_INTERMEDIATES_DIR: "_cicd-intermediates"
5 CICD_INTERMEDIATES_DIR: "_cicd-intermediates"
6
6
7on:
7on:
@@ -27,6 +27,15 @@ jobs:
27 - uses: actions/checkout@v2
27 - uses: actions/checkout@v2
28 - run: cargo fmt -- --check
28 - run: cargo fmt -- --check
29
29
30+ license_checks:
31+ name: License checks
32+ runs-on: ubuntu-20.04
33+ steps:
34+ - uses: actions/checkout@v2
35+ with:
36+ submodules: true # we especially want to perform license checks on submodules
37+ - run: tests/scripts/license-checks.sh
38+
30 min_version:
39 min_version:
31 name: Minimum supported rust version
40 name: Minimum supported rust version
32 runs-on: ubuntu-20.04
41 runs-on: ubuntu-20.04
@@ -45,7 +54,7 @@ jobs:
45 uses: actions-rs/cargo@v1
54 uses: actions-rs/cargo@v1
46 with:
55 with:
47 command: clippy
56 command: clippy
48− args: --locked --all-targets --all-features -- --allow clippy::unknown_clippy_lints
57+ args: --locked --all-targets --all-features
49 - name: Run tests
58 - name: Run tests
50 uses: actions-rs/cargo@v1
59 uses: actions-rs/cargo@v1
51 with:
60 with:
@@ -109,6 +118,18 @@ jobs:
109 toolchain: stable
118 toolchain: stable
110 default: true
119 default: true
111 profile: minimal
120 profile: minimal
121+ - name: Print -h
122+ uses: actions-rs/cargo@v1
123+ with:
124+ command: run
125+ args: --locked -- -h
126+ - name: Print --help
127+ uses: actions-rs/cargo@v1
128+ with:
129+ command: run
130+ args: --locked -- --help
131+ - name: Show man page
132+ run: man $(find . -name bat.1)
112 - name: Check documentation
133 - name: Check documentation
113 env:
134 env:
114 RUSTDOCFLAGS: -D warnings
135 RUSTDOCFLAGS: -D warnings
@@ -133,7 +154,7 @@ jobs:
133 - { target: x86_64-apple-darwin , os: macos-10.15 }
154 - { target: x86_64-apple-darwin , os: macos-10.15 }
134 - { target: x86_64-pc-windows-gnu , os: windows-2019 }
155 - { target: x86_64-pc-windows-gnu , os: windows-2019 }
135 - { target: x86_64-pc-windows-msvc , os: windows-2019 }
156 - { target: x86_64-pc-windows-msvc , os: windows-2019 }
136− - { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04 }
157+ - { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
137 - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
158 - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
138 steps:
159 steps:
139 - name: Checkout source code
160 - name: Checkout source code
.gitmodules+11−6
@@ -67,9 +67,6 @@
67[submodule "assets/syntaxes/JavaScript (Babel)"]
67[submodule "assets/syntaxes/JavaScript (Babel)"]
68 path = assets/syntaxes/02_Extra/JavaScript (Babel)
68 path = assets/syntaxes/02_Extra/JavaScript (Babel)
69 url = https://github.com/babel/babel-sublime
69 url = https://github.com/babel/babel-sublime
70−[submodule "assets/syntaxes/Dart"]
71− path = assets/syntaxes/02_Extra/Dart
72− url = https://github.com/guillermooo/dart-sublime-bundle
73[submodule "assets/syntaxes/FSharp"]
70[submodule "assets/syntaxes/FSharp"]
74 path = assets/syntaxes/02_Extra/FSharp
71 path = assets/syntaxes/02_Extra/FSharp
75 url = https://github.com/hoest/sublimetext-fsharp
72 url = https://github.com/hoest/sublimetext-fsharp
@@ -113,9 +110,6 @@
113[submodule "assets/syntaxes/Org mode"]
110[submodule "assets/syntaxes/Org mode"]
114 path = assets/syntaxes/02_Extra/Org mode
111 path = assets/syntaxes/02_Extra/Org mode
115 url = https://github.com/jezcope/Org.tmbundle.git
112 url = https://github.com/jezcope/Org.tmbundle.git
116−[submodule "assets/syntaxes/requirementstxt"]
117− path = assets/syntaxes/02_Extra/requirementstxt
118− url = https://github.com/wuub/requirementstxt
119[submodule "assets/syntaxes/DotENV"]
113[submodule "assets/syntaxes/DotENV"]
120 path = assets/syntaxes/02_Extra/DotENV
114 path = assets/syntaxes/02_Extra/DotENV
121 url = https://github.com/zaynali53/DotENV
115 url = https://github.com/zaynali53/DotENV
@@ -239,3 +233,14 @@
239[submodule "assets/syntaxes/02_Extra/MediaWiki"]
233[submodule "assets/syntaxes/02_Extra/MediaWiki"]
240 path = assets/syntaxes/02_Extra/MediaWiki
234 path = assets/syntaxes/02_Extra/MediaWiki
241 url = https://github.com/tosher/Mediawiker.git
235 url = https://github.com/tosher/Mediawiker.git
236+[submodule "assets/syntaxes/02_Extra/Dart"]
237+ path = assets/syntaxes/02_Extra/Dart
238+ url = https://github.com/elMuso/Dartlight.git
239+[submodule "assets/syntaxes/02_Extra/SublimeJQ"]
240+ path = assets/syntaxes/02_Extra/SublimeJQ
241+ url = https://github.com/zogwarg/SublimeJQ.git
242+[submodule "assets/syntaxes/02_Extra/cmd-help"]
243+ path = assets/syntaxes/02_Extra/cmd-help
244+ url = https://github.com/victor-gp/cmd-help-sublime-syntax.git
245+ branch = main
246+ shallow = true
CHANGELOG.md+105−15
@@ -2,27 +2,117 @@
2
2
3## Features
3## Features
4
4
5+- Make the default macOS theme depend on Dark Mode. See #2197, #1746 (@Enselic)
6+
7+## Bugfixes
8+
9+## Other
10+
11+- Relaxed glibc requirements on amd64, see #2106 and #2194 (@sharkdp)
12+
13+## Syntaxes
14+
15+## Themes
16+
17+## `bat` as a library
18+
19+
20+# v0.21.0
21+
22+## Features
23+
24+- Correctly render tab stops in `--show-all`, see #2038 (@Synthetica9)
25+- Add a `--style=default` option and make it the default. It is less verbose than `full`, see #2061 (@IsaacHorvath)
26+- Enable BusyBox `less` as pager, see #2162 (@nfisher1226)
27+- File extensions are now matched case-insensitively. See #1854, #2181 (@Enselic)
28+
29+## Bugfixes
30+
31+- Bump `regex` dependency from 1.5.4 to 1.5.5 to fix [CVE-2022-24713](https://blog.rust-lang.org/2022/03/08/cve-2022-24713.html), see #2145, #2139 (@Enselic)
32+- `bat` no longer crashes when encountering files that references missing syntaxes. See #915, #2181 (@Enselic)
33+
34+## Performance
35+
36+- Skip syntax highlighting on long lines (> 16384 chars) to help improve performance. See #2165 (@keith-hall)
37+- Vastly improve startup time by lazy-loading syntaxes via syntect 5.0.0. This makes bat display small files ~75% faster than before. See #951, #2181 (@Enselic)
38+
39+## Other
40+
41+- Include info about custom assets in `--diagnostics` if used. See #2107, #2144 (@Enselic)
42+
43+## Syntaxes
44+
45+- Mapped clang-format config file (.clang-format) to YAML syntax (@TruncatedDinosour)
46+- log syntax: improved handling of escape characters in double quoted strings. See #2123 (@keith-hall)
47+- Associate `/var/spool/mail/*` and `/var/mail/*` with the `Email` syntax. See #2156 (@cyqsimon)
48+- Added cmd-help syntax to scope --help messages. See #2148 (@victor-gp)
49+- Slightly adjust Zig syntax. See #2136 (@Enselic)
50+- Associate `.inf` files with the `INI` syntax. See #2190 (@Enselic)
51+
52+## `bat` as a library
53+
54+- Allow configuration of `show_nonprintable` with `PrettyPrinter`, see #2142
55+- The binary format of syntaxes.bin has been changed due to syntaxes now being lazy-loaded via syntect 5.0.0. See #2181 (@Enselic)
56+- Mark `bat::error::Error` enum as `#[non_exhaustive]` to allow adding new variants without future semver breakage. See #2181 (@Enselic)
57+- Change `Error::SyntectError(syntect::LoadingError)` to `Error::SyntectError(syntect::Error)`. See #2181 (@Enselic)
58+- Add `Error::SyntectLoadingError(syntect::LoadingError)` enum variant. See #2181 (@Enselic)
59+
60+
61+# v0.20.0
62+
63+## Features
64+
65+- New style component `header-filesize` to show size of the displayed file in the header. See #1988 (@mdibaiee)
66+- Use underline for line highlighting on ANSI, see #1730 (@mdibaiee)
67+
68+## Bugfixes
69+
70+- Fix bash completion on bash 3.x and bash-completion 1.x. See #2066 (@joshpencheon)
71+
72+## Syntaxes
73+
74+- `GraphQL`: Add support for interfaces implementing interfaces and consider ampersand an operator. See #2000
75+- Associate `_vimrc` and `_gvimrc` files with the `VimL` syntax. See #2002
76+- Associate `poetry.lock` files with the `TOML` syntax. See #2049
77+- Associate `.mesh`, `.task`, `.rgen`, `.rint`, `.rahit`, `.rchit`, `.rmiss`, and `.rcall` with the `GLSL` syntax. See #2050
78+- Added support for `JQ` syntax, see #2072
79+- Properly associate global git config files rooted in `$XDG_CONFIG_HOME/git/` or `$HOME/.config/git/`. See #2067 (@cyqsimon)
80+
81+## `bat` as a library
82+
83+- Exposed `get_syntax_set` and `get_theme` methods on `HighlightingAssets`. See #2030 (@dandavison)
84+- Added `HeaderFilename` and `HeaderFilesize` to `StyleComponent` enum, and mark it `#[non_exhaustive]`. See #1988 (@mdibaiee)
85+
86+
87+# v0.19.0
88+
89+## Performance
90+
91+- Reduce startup time in loop-through mode (e.g. when redirecting output) by 90%. See #1747 (@Enselic)
92+- Load themes lazily to make bat start 25% faster when disregarding syntax load time. See #1969 (@Enselic)
93+- Python syntax highlighting no longer suffers from abysmal performance in specific scenarios. See #1688 (@keith-hall)
94+- Fix for poor performance when ANSI escape sequences are piped to `bat`, see #1596 (@eth-p)
95+- Fix for incorrect handling of ANSI escape sequences when using `--wrap=never`, see #1596 (@eth-p)
96+- Load custom assets as fast as integrated assets, see #1753 (@Enselic)
97+
98+## Features
99+
5- Support for `x:-delta` (minus) syntax in line ranges (e.g. `20:-10`). See #1901 (@bojan88)
100- Support for `x:-delta` (minus) syntax in line ranges (e.g. `20:-10`). See #1901 (@bojan88)
6- Support for `--ignored-suffix` argument. See #1892 (@bojan88)
101- Support for `--ignored-suffix` argument. See #1892 (@bojan88)
7- `$BAT_CONFIG_DIR` is now a recognized environment variable. It has precedence over `$XDG_CONFIG_HOME`, see #1727 (@billrisher)
102- `$BAT_CONFIG_DIR` is now a recognized environment variable. It has precedence over `$XDG_CONFIG_HOME`, see #1727 (@billrisher)
8- Support for `x:+delta` syntax in line ranges (e.g. `20:+10`). See #1810 (@bojan88)
103- Support for `x:+delta` syntax in line ranges (e.g. `20:+10`). See #1810 (@bojan88)
104+- Add new `--acknowledgements` option that gives credit to theme and syntax definition authors. See #1971 (@Enselic)
105+- Include git hash in `bat -V` and `bat --version` output if present. See #1921 (@Enselic)
9
106
10## Bugfixes
107## Bugfixes
11
108
12−- Python syntax highlighting no longer suffers from abysmal performance in specific scenarios. See #1688 (@keith-hall)
13- First line not shown in diff context. See #1891 (@divagant-martian)
109- First line not shown in diff context. See #1891 (@divagant-martian)
14- Do not ignore syntaxes that handle file names with a `*.conf` extension. See #1703 (@cbolgiano)
110- Do not ignore syntaxes that handle file names with a `*.conf` extension. See #1703 (@cbolgiano)
15
111
16−## Performance
17−
18−- Load cached assets as fast as integrated assets, see #1753 (@Enselic)
19−- Greatly reduce startup time in loop-through mode, e.g. when redirecting output. Instead of *50 ms* - *100 ms*, startup takes *5 ms* - *10 ms*. See #1747 (@Enselic)
20−
21## Other
112## Other
22
113
23- Add PowerShell completion, see #1826 (@rashil2000)
114- Add PowerShell completion, see #1826 (@rashil2000)
24−- Minimum supported Rust version (MSRV) bumped to 1.46
115+- Minimum supported Rust version (MSRV) bumped to 1.51, see #1994 (@mdibaiee)
25−- Include git hash in `bat -V` and `bat --version` output if present. See #1921 (@Enselic)
26
116
27## Syntaxes
117## Syntaxes
28
118
@@ -35,18 +125,18 @@
35- Racket, see #1884 (@jubnzv)
125- Racket, see #1884 (@jubnzv)
36- LiveScript, see #1915 (@Enselic)
126- LiveScript, see #1915 (@Enselic)
37- MediaWiki, see #1925 (@sorairolake)
127- MediaWiki, see #1925 (@sorairolake)
38−
128+- The `requirements.txt` syntax has been removed due to incompatible license requirements.
39−## New themes
129+- Dart, new highlighter, see #1959 (@Ersikan)
40−
130+- SCSS and Sass syntaxes updated, see #1766 (@Enselic)
131+- PowerShell syntax updated, see #1935 (@Enselic)
132+- TypeScript syntax updated, see #1834 (@Enselic)
41
133
42## `bat` as a library
134## `bat` as a library
43
135
44- Deprecate `HighlightingAssets::syntaxes()` and `HighlightingAssets::syntax_for_file_name()`. Use `HighlightingAssets::get_syntaxes()` and `HighlightingAssets::get_syntax_for_path()` instead. They return a `Result` which is needed for upcoming lazy-loading work to improve startup performance. They also return which `SyntaxSet` the returned `SyntaxReference` belongs to. See #1747, #1755, #1776, #1862 (@Enselic)
136- Deprecate `HighlightingAssets::syntaxes()` and `HighlightingAssets::syntax_for_file_name()`. Use `HighlightingAssets::get_syntaxes()` and `HighlightingAssets::get_syntax_for_path()` instead. They return a `Result` which is needed for upcoming lazy-loading work to improve startup performance. They also return which `SyntaxSet` the returned `SyntaxReference` belongs to. See #1747, #1755, #1776, #1862 (@Enselic)
45−- Remove `HighlightingAssets::from_files` and `HighlightingAssets::save_to_cache`. Instead of calling the former and then the latter you now make a single call to `bat::assets::build`. See #1802 (@Enselic)
137+- Remove `HighlightingAssets::from_files` and `HighlightingAssets::save_to_cache`. Instead of calling the former and then the latter you now make a single call to `bat::assets::build`. See #1802, #1971 (@Enselic)
46- Replace the `error::Error(error::ErrorKind, _)` struct and enum with an `error::Error` enum. `Error(ErrorKind::UnknownSyntax, _)` becomes `Error::UnknownSyntax`, etc. Also remove the `error::ResultExt` trait. These changes stem from replacing `error-chain` with `thiserror`. See #1820 (@Enselic)
138- Replace the `error::Error(error::ErrorKind, _)` struct and enum with an `error::Error` enum. `Error(ErrorKind::UnknownSyntax, _)` becomes `Error::UnknownSyntax`, etc. Also remove the `error::ResultExt` trait. These changes stem from replacing `error-chain` with `thiserror`. See #1820 (@Enselic)
47−- Add new `MappingTarget` enum variant `MapExtensionToUnknown`. Refer to its docummentation for more information. Clients are adviced to treat `MapExtensionToUnknown` the same as `MapToUnknown` in exhaustive matches. See #1703 (@cbolgiano)
139+- Add new `MappingTarget` enum variant `MapExtensionToUnknown`. Refer to its documentation for more information. Also mark `MappingTarget` as `#[non_exhaustive]` since more enum variants might be added in the future. See #1703 (@cbolgiano), #2012 (@Enselic)
48−
49−
50
140
51
141
52# v0.18.3
142# v0.18.3
CONTRIBUTING.md+22
@@ -46,3 +46,25 @@ If you really think that a particular syntax or theme should be added for all
46users, please read the corresponding
46users, please read the corresponding
47[documentation](https://github.com/sharkdp/bat/blob/master/doc/assets.md)
47[documentation](https://github.com/sharkdp/bat/blob/master/doc/assets.md)
48first.
48first.
49+
50+
51+## Regression tests
52+
53+You are strongly encouraged to add regression tests. Regression tests are great,
54+not least because they:
55+
56+* ensure that your contribution will never completely stop working,
57+
58+* makes code review easier, because it becomes very clear what the code is
59+ supposed to do.
60+
61+For functional changes, you most likely want to add a test to
62+[`tests/integration_tests.rs`](https://github.com/sharkdp/bat/blob/master/tests/integration_tests.rs).
63+Look at existing tests to know how to write a new test. In short, you will
64+invoke the `bat` binary with a certain set of arguments, and then assert on
65+stdout/stderr.
66+
67+To learn how to write regression tests for theme and syntax changes, read the
68+[Syntax
69+tests](https://github.com/sharkdp/bat/blob/master/doc/assets.md#syntax-tests)
70+section in `assets.md`.
Cargo.lock+221−244
@@ -19,20 +19,11 @@ dependencies = [
19
19
20[[package]]
20[[package]]
21name = "ansi_colours"
21name = "ansi_colours"
22−version = "1.0.4"
22+version = "1.1.1"
23source = "registry+https://github.com/rust-lang/crates.io-index"
23source = "registry+https://github.com/rust-lang/crates.io-index"
24−checksum = "60e2fb6138a49ad9f1cb3c6d8f8ccbdd5e62b4dab317c1b435a47ecd7da1d28f"
24+checksum = "32678233b67f9056b0c144b39d46dc3218637e8d84ad6038ded339e08b19620d"
25dependencies = [
25dependencies = [
26− "cc",
26+ "rgb",
27−]
28−
29−[[package]]
30−name = "ansi_term"
31−version = "0.11.0"
32−source = "registry+https://github.com/rust-lang/crates.io-index"
33−checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
34−dependencies = [
35− "winapi",
36]
27]
37
28
38[[package]]
29[[package]]
@@ -46,9 +37,9 @@ dependencies = [
46
37
47[[package]]
38[[package]]
48name = "assert_cmd"
39name = "assert_cmd"
49−version = "2.0.2"
40+version = "2.0.4"
50source = "registry+https://github.com/rust-lang/crates.io-index"
41source = "registry+https://github.com/rust-lang/crates.io-index"
51−checksum = "e996dc7940838b7ef1096b882e29ec30a3149a3a443cdc8dba19ed382eca1fe2"
42+checksum = "93ae1ddd39efd67689deb1979d80bad3bf7f2b09c6e6117c8d1f2443b5e2f83e"
52dependencies = [
43dependencies = [
53 "bstr",
44 "bstr",
54 "doc-comment",
45 "doc-comment",
@@ -83,14 +74,15 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
83
74
84[[package]]
75[[package]]
85name = "bat"
76name = "bat"
86−version = "0.18.3"
77+version = "0.21.0"
87dependencies = [
78dependencies = [
88 "ansi_colours",
79 "ansi_colours",
89− "ansi_term 0.12.1",
80+ "ansi_term",
90 "assert_cmd",
81 "assert_cmd",
91 "atty",
82 "atty",
92 "bincode",
83 "bincode",
93 "bugreport",
84 "bugreport",
85+ "bytesize",
94 "clap",
86 "clap",
95 "clircle",
87 "clircle",
96 "console",
88 "console",
@@ -105,6 +97,7 @@ dependencies = [
105 "once_cell",
97 "once_cell",
106 "path_abs",
98 "path_abs",
107 "predicates",
99 "predicates",
100+ "regex",
108 "semver",
101 "semver",
109 "serde",
102 "serde",
110 "serde_yaml",
103 "serde_yaml",
@@ -115,6 +108,7 @@ dependencies = [
115 "thiserror",
108 "thiserror",
116 "unicode-width",
109 "unicode-width",
117 "wait-timeout",
110 "wait-timeout",
111+ "walkdir",
118 "wild",
112 "wild",
119]
113]
120
114
@@ -150,9 +144,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
150
144
151[[package]]
145[[package]]
152name = "bstr"
146name = "bstr"
153−version = "0.2.16"
147+version = "0.2.17"
154source = "registry+https://github.com/rust-lang/crates.io-index"
148source = "registry+https://github.com/rust-lang/crates.io-index"
155−checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279"
149+checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
156dependencies = [
150dependencies = [
157 "lazy_static",
151 "lazy_static",
158 "memchr",
152 "memchr",
@@ -161,9 +155,9 @@ dependencies = [
161
155
162[[package]]
156[[package]]
163name = "bugreport"
157name = "bugreport"
164−version = "0.4.1"
158+version = "0.5.0"
165source = "registry+https://github.com/rust-lang/crates.io-index"
159source = "registry+https://github.com/rust-lang/crates.io-index"
166−checksum = "0014b4b2b4f63bfe69c3838470121290cc437fdc79785d408a761a21e8b2404c"
160+checksum = "535120b8182547808081a66f1f77a64533c780b23da26763e0ee34dfb94f98c9"
167dependencies = [
161dependencies = [
168 "git-version",
162 "git-version",
169 "shell-escape",
163 "shell-escape",
@@ -171,16 +165,22 @@ dependencies = [
171]
165]
172
166
173[[package]]
167[[package]]
174−name = "byteorder"
168+name = "bytemuck"
175−version = "1.4.3"
169+version = "1.7.3"
170+source = "registry+https://github.com/rust-lang/crates.io-index"
171+checksum = "439989e6b8c38d1b6570a384ef1e49c8848128f5a97f3914baef02920842712f"
172+
173+[[package]]
174+name = "bytesize"
175+version = "1.1.0"
176source = "registry+https://github.com/rust-lang/crates.io-index"
176source = "registry+https://github.com/rust-lang/crates.io-index"
177−checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
177+checksum = "6c58ec36aac5066d5ca17df51b3e70279f5670a72102f5752cb7e7c856adfc70"
178
178
179[[package]]
179[[package]]
180name = "cc"
180name = "cc"
181−version = "1.0.67"
181+version = "1.0.72"
182source = "registry+https://github.com/rust-lang/crates.io-index"
182source = "registry+https://github.com/rust-lang/crates.io-index"
183−checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd"
183+checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee"
184dependencies = [
184dependencies = [
185 "jobserver",
185 "jobserver",
186]
186]
@@ -191,23 +191,13 @@ version = "1.0.0"
191source = "registry+https://github.com/rust-lang/crates.io-index"
191source = "registry+https://github.com/rust-lang/crates.io-index"
192checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
192checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
193
193
194−[[package]]
195−name = "chrono"
196−version = "0.4.19"
197−source = "registry+https://github.com/rust-lang/crates.io-index"
198−checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
199−dependencies = [
200− "num-integer",
201− "num-traits",
202−]
203−
204[[package]]
194[[package]]
205name = "clap"
195name = "clap"
206−version = "2.33.3"
196+version = "2.34.0"
207source = "registry+https://github.com/rust-lang/crates.io-index"
197source = "registry+https://github.com/rust-lang/crates.io-index"
208−checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
198+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
209dependencies = [
199dependencies = [
210− "ansi_term 0.11.0",
200+ "ansi_term",
211 "atty",
201 "atty",
212 "bitflags",
202 "bitflags",
213 "strsim",
203 "strsim",
@@ -255,9 +245,9 @@ dependencies = [
255
245
256[[package]]
246[[package]]
257name = "crc32fast"
247name = "crc32fast"
258−version = "1.2.1"
248+version = "1.3.0"
259source = "registry+https://github.com/rust-lang/crates.io-index"
249source = "registry+https://github.com/rust-lang/crates.io-index"
260−checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
250+checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836"
261dependencies = [
251dependencies = [
262 "cfg-if",
252 "cfg-if",
263]
253]
@@ -295,12 +285,6 @@ version = "0.3.3"
295source = "registry+https://github.com/rust-lang/crates.io-index"
285source = "registry+https://github.com/rust-lang/crates.io-index"
296checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
286checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
297
287
298−[[package]]
299−name = "dtoa"
300−version = "0.4.8"
301−source = "registry+https://github.com/rust-lang/crates.io-index"
302−checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
303−
304[[package]]
288[[package]]
305name = "either"
289name = "either"
306version = "1.6.1"
290version = "1.6.1"
@@ -387,11 +371,20 @@ dependencies = [
387 "regex",
371 "regex",
388]
372]
389
373
374+[[package]]
375+name = "fastrand"
376+version = "1.7.0"
377+source = "registry+https://github.com/rust-lang/crates.io-index"
378+checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf"
379+dependencies = [
380+ "instant",
381+]
382+
390[[package]]
383[[package]]
391name = "flate2"
384name = "flate2"
392−version = "1.0.22"
385+version = "1.0.23"
393source = "registry+https://github.com/rust-lang/crates.io-index"
386source = "registry+https://github.com/rust-lang/crates.io-index"
394−checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f"
387+checksum = "b39522e96686d38f4bc984b9198e3a0613264abaebaff2c5c918bfa6b6da09af"
395dependencies = [
388dependencies = [
396 "cfg-if",
389 "cfg-if",
397 "crc32fast",
390 "crc32fast",
@@ -426,9 +419,9 @@ dependencies = [
426
419
427[[package]]
420[[package]]
428name = "getrandom"
421name = "getrandom"
429−version = "0.2.2"
422+version = "0.2.3"
430source = "registry+https://github.com/rust-lang/crates.io-index"
423source = "registry+https://github.com/rust-lang/crates.io-index"
431−checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
424+checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
432dependencies = [
425dependencies = [
433 "cfg-if",
426 "cfg-if",
434 "libc",
427 "libc",
@@ -437,9 +430,9 @@ dependencies = [
437
430
438[[package]]
431[[package]]
439name = "git-version"
432name = "git-version"
440−version = "0.3.4"
433+version = "0.3.5"
441source = "registry+https://github.com/rust-lang/crates.io-index"
434source = "registry+https://github.com/rust-lang/crates.io-index"
442−checksum = "94918e83f1e01dedc2e361d00ce9487b14c58c7f40bab148026fa39d42cb41e2"
435+checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899"
443dependencies = [
436dependencies = [
444 "git-version-macro",
437 "git-version-macro",
445 "proc-macro-hack",
438 "proc-macro-hack",
@@ -447,9 +440,9 @@ dependencies = [
447
440
448[[package]]
441[[package]]
449name = "git-version-macro"
442name = "git-version-macro"
450−version = "0.3.4"
443+version = "0.3.5"
451source = "registry+https://github.com/rust-lang/crates.io-index"
444source = "registry+https://github.com/rust-lang/crates.io-index"
452−checksum = "34a97a52fdee1870a34fa6e4b77570cba531b27d1838874fef4429a791a3d657"
445+checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f"
453dependencies = [
446dependencies = [
454 "proc-macro-hack",
447 "proc-macro-hack",
455 "proc-macro2",
448 "proc-macro2",
@@ -459,9 +452,9 @@ dependencies = [
459
452
460[[package]]
453[[package]]
461name = "git2"
454name = "git2"
462−version = "0.13.20"
455+version = "0.14.2"
463source = "registry+https://github.com/rust-lang/crates.io-index"
456source = "registry+https://github.com/rust-lang/crates.io-index"
464−checksum = "d9831e983241f8c5591ed53f17d874833e2fa82cac2625f3888c50cbfe136cba"
457+checksum = "3826a6e0e2215d7a41c2bfc7c9244123969273f3476b939a226aac0ab56e9e3c"
465dependencies = [
458dependencies = [
466 "bitflags",
459 "bitflags",
467 "libc",
460 "libc",
@@ -508,15 +501,15 @@ dependencies = [
508
501
509[[package]]
502[[package]]
510name = "hashbrown"
503name = "hashbrown"
511−version = "0.9.1"
504+version = "0.11.2"
512source = "registry+https://github.com/rust-lang/crates.io-index"
505source = "registry+https://github.com/rust-lang/crates.io-index"
513−checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
506+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
514
507
515[[package]]
508[[package]]
516name = "hermit-abi"
509name = "hermit-abi"
517−version = "0.1.18"
510+version = "0.1.19"
518source = "registry+https://github.com/rust-lang/crates.io-index"
511source = "registry+https://github.com/rust-lang/crates.io-index"
519−checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
512+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
520dependencies = [
513dependencies = [
521 "libc",
514 "libc",
522]
515]
@@ -534,9 +527,9 @@ dependencies = [
534
527
535[[package]]
528[[package]]
536name = "indexmap"
529name = "indexmap"
537−version = "1.6.2"
530+version = "1.7.0"
538source = "registry+https://github.com/rust-lang/crates.io-index"
531source = "registry+https://github.com/rust-lang/crates.io-index"
539−checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
532+checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5"
540dependencies = [
533dependencies = [
541 "autocfg",
534 "autocfg",
542 "hashbrown",
535 "hashbrown",
@@ -544,33 +537,39 @@ dependencies = [
544
537
545[[package]]
538[[package]]
546name = "instant"
539name = "instant"
547−version = "0.1.9"
540+version = "0.1.12"
548source = "registry+https://github.com/rust-lang/crates.io-index"
541source = "registry+https://github.com/rust-lang/crates.io-index"
549−checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
542+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
550dependencies = [
543dependencies = [
551 "cfg-if",
544 "cfg-if",
552]
545]
553
546
554[[package]]
547[[package]]
555name = "itertools"
548name = "itertools"
556−version = "0.10.1"
549+version = "0.10.3"
557source = "registry+https://github.com/rust-lang/crates.io-index"
550source = "registry+https://github.com/rust-lang/crates.io-index"
558−checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf"
551+checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3"
559dependencies = [
552dependencies = [
560 "either",
553 "either",
561]
554]
562
555
563[[package]]
556[[package]]
564name = "itoa"
557name = "itoa"
565−version = "0.4.7"
558+version = "0.4.8"
559+source = "registry+https://github.com/rust-lang/crates.io-index"
560+checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
561+
562+[[package]]
563+name = "itoa"
564+version = "1.0.1"
566source = "registry+https://github.com/rust-lang/crates.io-index"
565source = "registry+https://github.com/rust-lang/crates.io-index"
567−checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
566+checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
568
567
569[[package]]
568[[package]]
570name = "jobserver"
569name = "jobserver"
571−version = "0.1.22"
570+version = "0.1.24"
572source = "registry+https://github.com/rust-lang/crates.io-index"
571source = "registry+https://github.com/rust-lang/crates.io-index"
573−checksum = "972f5ae5d1cb9c6ae417789196c803205313edde988685da5e3aae0827b9e7fd"
572+checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa"
574dependencies = [
573dependencies = [
575 "libc",
574 "libc",
576]
575]
@@ -581,23 +580,17 @@ version = "1.4.0"
581source = "registry+https://github.com/rust-lang/crates.io-index"
580source = "registry+https://github.com/rust-lang/crates.io-index"
582checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
581checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
583
582
584−[[package]]
585−name = "lazycell"
586−version = "1.3.0"
587−source = "registry+https://github.com/rust-lang/crates.io-index"
588−checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
589−
590[[package]]
583[[package]]
591name = "libc"
584name = "libc"
592−version = "0.2.103"
585+version = "0.2.125"
593source = "registry+https://github.com/rust-lang/crates.io-index"
586source = "registry+https://github.com/rust-lang/crates.io-index"
594−checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6"
587+checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b"
595
588
596[[package]]
589[[package]]
597name = "libgit2-sys"
590name = "libgit2-sys"
598−version = "0.12.21+1.1.0"
591+version = "0.13.2+1.4.2"
599source = "registry+https://github.com/rust-lang/crates.io-index"
592source = "registry+https://github.com/rust-lang/crates.io-index"
600−checksum = "86271bacd72b2b9e854c3dcfb82efd538f15f870e4c11af66900effb462f6825"
593+checksum = "3a42de9a51a5c12e00fc0e4ca6bc2ea43582fc6418488e8f615e905d886f258b"
601dependencies = [
594dependencies = [
602 "cc",
595 "cc",
603 "libc",
596 "libc",
@@ -634,9 +627,9 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
634
627
635[[package]]
628[[package]]
636name = "lock_api"
629name = "lock_api"
637−version = "0.4.4"
630+version = "0.4.5"
638source = "registry+https://github.com/rust-lang/crates.io-index"
631source = "registry+https://github.com/rust-lang/crates.io-index"
639−checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb"
632+checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109"
640dependencies = [
633dependencies = [
641 "scopeguard",
634 "scopeguard",
642]
635]
@@ -652,46 +645,34 @@ dependencies = [
652
645
653[[package]]
646[[package]]
654name = "matches"
647name = "matches"
655−version = "0.1.8"
648+version = "0.1.9"
656source = "registry+https://github.com/rust-lang/crates.io-index"
649source = "registry+https://github.com/rust-lang/crates.io-index"
657−checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
650+checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
658
651
659[[package]]
652[[package]]
660name = "memchr"
653name = "memchr"
661−version = "2.4.0"
654+version = "2.4.1"
662−source = "registry+https://github.com/rust-lang/crates.io-index"
663−checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc"
664−
665−[[package]]
666−name = "memoffset"
667−version = "0.6.4"
668source = "registry+https://github.com/rust-lang/crates.io-index"
655source = "registry+https://github.com/rust-lang/crates.io-index"
669−checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9"
656+checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
670−dependencies = [
671− "autocfg",
672−]
673
657
674[[package]]
658[[package]]
675name = "miniz_oxide"
659name = "miniz_oxide"
676−version = "0.4.4"
660+version = "0.5.1"
677source = "registry+https://github.com/rust-lang/crates.io-index"
661source = "registry+https://github.com/rust-lang/crates.io-index"
678−checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
662+checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082"
679dependencies = [
663dependencies = [
680 "adler",
664 "adler",
681− "autocfg",
682]
665]
683
666
684[[package]]
667[[package]]
685name = "nix"
668name = "nix"
686−version = "0.23.0"
669+version = "0.24.1"
687source = "registry+https://github.com/rust-lang/crates.io-index"
670source = "registry+https://github.com/rust-lang/crates.io-index"
688−checksum = "f305c2c2e4c39a82f7bf0bf65fb557f9070ce06781d4f2454295cc34b1c43188"
671+checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9"
689dependencies = [
672dependencies = [
690 "bitflags",
673 "bitflags",
691− "cc",
692 "cfg-if",
674 "cfg-if",
693 "libc",
675 "libc",
694− "memoffset",
695]
676]
696
677
697[[package]]
678[[package]]
@@ -700,16 +681,6 @@ version = "0.3.0"
700source = "registry+https://github.com/rust-lang/crates.io-index"
681source = "registry+https://github.com/rust-lang/crates.io-index"
701checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
682checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
702
683
703−[[package]]
704−name = "num-integer"
705−version = "0.1.44"
706−source = "registry+https://github.com/rust-lang/crates.io-index"
707−checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
708−dependencies = [
709− "autocfg",
710− "num-traits",
711−]
712−
713[[package]]
684[[package]]
714name = "num-traits"
685name = "num-traits"
715version = "0.2.14"
686version = "0.2.14"
@@ -721,15 +692,15 @@ dependencies = [
721
692
722[[package]]
693[[package]]
723name = "once_cell"
694name = "once_cell"
724−version = "1.8.0"
695+version = "1.10.0"
725source = "registry+https://github.com/rust-lang/crates.io-index"
696source = "registry+https://github.com/rust-lang/crates.io-index"
726−checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56"
697+checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
727
698
728[[package]]
699[[package]]
729name = "onig"
700name = "onig"
730−version = "6.1.1"
701+version = "6.3.1"
731source = "registry+https://github.com/rust-lang/crates.io-index"
702source = "registry+https://github.com/rust-lang/crates.io-index"
732−checksum = "30b46fd9edbc018f0be4e366c24c46db44fac49cd01c039ae85308088b089dd5"
703+checksum = "67ddfe2c93bb389eea6e6d713306880c7f6dcc99a75b659ce145d962c861b225"
733dependencies = [
704dependencies = [
734 "bitflags",
705 "bitflags",
735 "lazy_static",
706 "lazy_static",
@@ -739,9 +710,9 @@ dependencies = [
739
710
740[[package]]
711[[package]]
741name = "onig_sys"
712name = "onig_sys"
742−version = "69.6.0"
713+version = "69.7.1"
743source = "registry+https://github.com/rust-lang/crates.io-index"
714source = "registry+https://github.com/rust-lang/crates.io-index"
744−checksum = "ed063c96cf4c0f2e5d09324409d158b38a0a85a7b90fbd68c8cad75c495d5775"
715+checksum = "5dd3eee045c84695b53b20255bb7317063df090b68e18bfac0abb6c39cf7f33e"
745dependencies = [
716dependencies = [
746 "cc",
717 "cc",
747 "pkg-config",
718 "pkg-config",
@@ -749,9 +720,9 @@ dependencies = [
749
720
750[[package]]
721[[package]]
751name = "parking_lot"
722name = "parking_lot"
752−version = "0.11.1"
723+version = "0.11.2"
753source = "registry+https://github.com/rust-lang/crates.io-index"
724source = "registry+https://github.com/rust-lang/crates.io-index"
754−checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb"
725+checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
755dependencies = [
726dependencies = [
756 "instant",
727 "instant",
757 "lock_api",
728 "lock_api",
@@ -760,9 +731,9 @@ dependencies = [
760
731
761[[package]]
732[[package]]
762name = "parking_lot_core"
733name = "parking_lot_core"
763−version = "0.8.3"
734+version = "0.8.5"
764source = "registry+https://github.com/rust-lang/crates.io-index"
735source = "registry+https://github.com/rust-lang/crates.io-index"
765−checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018"
736+checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
766dependencies = [
737dependencies = [
767 "cfg-if",
738 "cfg-if",
768 "instant",
739 "instant",
@@ -789,35 +760,29 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
789
760
790[[package]]
761[[package]]
791name = "pkg-config"
762name = "pkg-config"
792−version = "0.3.19"
763+version = "0.3.24"
793source = "registry+https://github.com/rust-lang/crates.io-index"
764source = "registry+https://github.com/rust-lang/crates.io-index"
794−checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
765+checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe"
795
766
796[[package]]
767[[package]]
797name = "plist"
768name = "plist"
798−version = "1.1.0"
769+version = "1.3.1"
799source = "registry+https://github.com/rust-lang/crates.io-index"
770source = "registry+https://github.com/rust-lang/crates.io-index"
800−checksum = "679104537029ed2287c216bfb942bbf723f48ee98f0aef15611634173a74ef21"
771+checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225"
801dependencies = [
772dependencies = [
802 "base64",
773 "base64",
803− "chrono",
804 "indexmap",
774 "indexmap",
805 "line-wrap",
775 "line-wrap",
806 "serde",
776 "serde",
777+ "time",
807 "xml-rs",
778 "xml-rs",
808]
779]
809
780
810−[[package]]
811−name = "ppv-lite86"
812−version = "0.2.10"
813−source = "registry+https://github.com/rust-lang/crates.io-index"
814−checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
815−
816[[package]]
781[[package]]
817name = "predicates"
782name = "predicates"
818−version = "2.0.3"
783+version = "2.1.1"
819source = "registry+https://github.com/rust-lang/crates.io-index"
784source = "registry+https://github.com/rust-lang/crates.io-index"
820−checksum = "5c6ce811d0b2e103743eec01db1c50612221f173084ce2f7941053e94b6bb474"
785+checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c"
821dependencies = [
786dependencies = [
822 "difflib",
787 "difflib",
823 "float-cmp",
788 "float-cmp",
@@ -835,83 +800,67 @@ checksum = "57e35a3326b75e49aa85f5dc6ec15b41108cf5aee58eabb1f274dd18b73c2451"
835
800
836[[package]]
801[[package]]
837name = "predicates-tree"
802name = "predicates-tree"
838−version = "1.0.2"
803+version = "1.0.4"
839source = "registry+https://github.com/rust-lang/crates.io-index"
804source = "registry+https://github.com/rust-lang/crates.io-index"
840−checksum = "15f553275e5721409451eb85e15fd9a860a6e5ab4496eb215987502b5f5391f2"
805+checksum = "338c7be2905b732ae3984a2f40032b5e94fd8f52505b186c7d4d68d193445df7"
841dependencies = [
806dependencies = [
842 "predicates-core",
807 "predicates-core",
843− "treeline",
808+ "termtree",
844−]
845−
846−[[package]]
847−name = "proc-macro-hack"
848−version = "0.5.19"
849−source = "registry+https://github.com/rust-lang/crates.io-index"
850−checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
851−
852−[[package]]
853−name = "proc-macro2"
854−version = "1.0.26"
855−source = "registry+https://github.com/rust-lang/crates.io-index"
856−checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec"
857−dependencies = [
858− "unicode-xid",
859]
809]
860
810
861[[package]]
811[[package]]
862−name = "quote"
812+name = "proc-macro-error"
863−version = "1.0.9"
813+version = "1.0.4"
864source = "registry+https://github.com/rust-lang/crates.io-index"
814source = "registry+https://github.com/rust-lang/crates.io-index"
865−checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
815+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
866dependencies = [
816dependencies = [
817+ "proc-macro-error-attr",
867 "proc-macro2",
818 "proc-macro2",
819+ "quote",
820+ "syn",
821+ "version_check",
868]
822]
869
823
870[[package]]
824[[package]]
871−name = "rand"
825+name = "proc-macro-error-attr"
872−version = "0.8.3"
826+version = "1.0.4"
873source = "registry+https://github.com/rust-lang/crates.io-index"
827source = "registry+https://github.com/rust-lang/crates.io-index"
874−checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"
828+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
875dependencies = [
829dependencies = [
876− "libc",
830+ "proc-macro2",
877− "rand_chacha",
831+ "quote",
878− "rand_core",
832+ "version_check",
879− "rand_hc",
880]
833]
881
834
882[[package]]
835[[package]]
883−name = "rand_chacha"
836+name = "proc-macro-hack"
884−version = "0.3.0"
837+version = "0.5.19"
885source = "registry+https://github.com/rust-lang/crates.io-index"
838source = "registry+https://github.com/rust-lang/crates.io-index"
886−checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"
839+checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
887−dependencies = [
888− "ppv-lite86",
889− "rand_core",
890−]
891
840
892[[package]]
841[[package]]
893−name = "rand_core"
842+name = "proc-macro2"
894−version = "0.6.2"
843+version = "1.0.36"
895source = "registry+https://github.com/rust-lang/crates.io-index"
844source = "registry+https://github.com/rust-lang/crates.io-index"
896−checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7"
845+checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029"
897dependencies = [
846dependencies = [
898− "getrandom",
847+ "unicode-xid",
899]
848]
900
849
901[[package]]
850[[package]]
902−name = "rand_hc"
851+name = "quote"
903−version = "0.3.0"
852+version = "1.0.14"
904source = "registry+https://github.com/rust-lang/crates.io-index"
853source = "registry+https://github.com/rust-lang/crates.io-index"
905−checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"
854+checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d"
906dependencies = [
855dependencies = [
907− "rand_core",
856+ "proc-macro2",
908]
857]
909
858
910[[package]]
859[[package]]
911name = "redox_syscall"
860name = "redox_syscall"
912−version = "0.2.8"
861+version = "0.2.10"
913source = "registry+https://github.com/rust-lang/crates.io-index"
862source = "registry+https://github.com/rust-lang/crates.io-index"
914−checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc"
863+checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
915dependencies = [
864dependencies = [
916 "bitflags",
865 "bitflags",
917]
866]
@@ -928,9 +877,9 @@ dependencies = [
928
877
929[[package]]
878[[package]]
930name = "regex"
879name = "regex"
931−version = "1.5.4"
880+version = "1.5.5"
932source = "registry+https://github.com/rust-lang/crates.io-index"
881source = "registry+https://github.com/rust-lang/crates.io-index"
933−checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
882+checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286"
934dependencies = [
883dependencies = [
935 "aho-corasick",
884 "aho-corasick",
936 "memchr",
885 "memchr",
@@ -939,12 +888,9 @@ dependencies = [
939
888
940[[package]]
889[[package]]
941name = "regex-automata"
890name = "regex-automata"
942−version = "0.1.9"
891+version = "0.1.10"
943source = "registry+https://github.com/rust-lang/crates.io-index"
892source = "registry+https://github.com/rust-lang/crates.io-index"
944−checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4"
893+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
945−dependencies = [
946− "byteorder",
947−]
948
894
949[[package]]
895[[package]]
950name = "regex-syntax"
896name = "regex-syntax"
@@ -961,11 +907,26 @@ dependencies = [
961 "winapi",
907 "winapi",
962]
908]
963
909
910+[[package]]
911+name = "rgb"
912+version = "0.8.31"
913+source = "registry+https://github.com/rust-lang/crates.io-index"
914+checksum = "9a374af9a0e5fdcdd98c1c7b64f05004f9ea2555b6c75f211daa81268a3c50f1"
915+dependencies = [
916+ "bytemuck",
917+]
918+
919+[[package]]
920+name = "rustversion"
921+version = "1.0.6"
922+source = "registry+https://github.com/rust-lang/crates.io-index"
923+checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f"
924+
964[[package]]
925[[package]]
965name = "ryu"
926name = "ryu"
966−version = "1.0.5"
927+version = "1.0.9"
967source = "registry+https://github.com/rust-lang/crates.io-index"
928source = "registry+https://github.com/rust-lang/crates.io-index"
968−checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
929+checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
969
930
970[[package]]
931[[package]]
971name = "safemem"
932name = "safemem"
@@ -990,24 +951,24 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
990
951
991[[package]]
952[[package]]
992name = "semver"
953name = "semver"
993−version = "1.0.4"
954+version = "1.0.7"
994source = "registry+https://github.com/rust-lang/crates.io-index"
955source = "registry+https://github.com/rust-lang/crates.io-index"
995−checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012"
956+checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4"
996
957
997[[package]]
958[[package]]
998name = "serde"
959name = "serde"
999−version = "1.0.130"
960+version = "1.0.136"
1000source = "registry+https://github.com/rust-lang/crates.io-index"
961source = "registry+https://github.com/rust-lang/crates.io-index"
1001−checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913"
962+checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789"
1002dependencies = [
963dependencies = [
1003 "serde_derive",
964 "serde_derive",
1004]
965]
1005
966
1006[[package]]
967[[package]]
1007name = "serde_derive"
968name = "serde_derive"
1008−version = "1.0.130"
969+version = "1.0.136"
1009source = "registry+https://github.com/rust-lang/crates.io-index"
970source = "registry+https://github.com/rust-lang/crates.io-index"
1010−checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b"
971+checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9"
1011dependencies = [
972dependencies = [
1012 "proc-macro2",
973 "proc-macro2",
1013 "quote",
974 "quote",
@@ -1016,32 +977,32 @@ dependencies = [
1016
977
1017[[package]]
978[[package]]
1018name = "serde_json"
979name = "serde_json"
1019−version = "1.0.64"
980+version = "1.0.74"
1020source = "registry+https://github.com/rust-lang/crates.io-index"
981source = "registry+https://github.com/rust-lang/crates.io-index"
1021−checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79"
982+checksum = "ee2bb9cd061c5865d345bb02ca49fcef1391741b672b54a0bf7b679badec3142"
1022dependencies = [
983dependencies = [
1023− "itoa",
984+ "itoa 1.0.1",
1024 "ryu",
985 "ryu",
1025 "serde",
986 "serde",
1026]
987]
1027
988
1028[[package]]
989[[package]]
1029name = "serde_yaml"
990name = "serde_yaml"
1030−version = "0.8.21"
991+version = "0.8.23"
1031source = "registry+https://github.com/rust-lang/crates.io-index"
992source = "registry+https://github.com/rust-lang/crates.io-index"
1032−checksum = "d8c608a35705a5d3cdc9fbe403147647ff34b921f8e833e49306df898f9b20af"
993+checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0"
1033dependencies = [
994dependencies = [
1034− "dtoa",
1035 "indexmap",
995 "indexmap",
996+ "ryu",
1036 "serde",
997 "serde",
1037 "yaml-rust",
998 "yaml-rust",
1038]
999]
1039
1000
1040[[package]]
1001[[package]]
1041name = "serial_test"
1002name = "serial_test"
1042−version = "0.5.1"
1003+version = "0.6.0"
1043source = "registry+https://github.com/rust-lang/crates.io-index"
1004source = "registry+https://github.com/rust-lang/crates.io-index"
1044−checksum = "e0bccbcf40c8938196944a3da0e133e031a33f4d6b72db3bda3cc556e361905d"
1005+checksum = "e5bcc41d18f7a1d50525d080fd3e953be87c4f9f1a974f3c21798ca00d54ec15"
1045dependencies = [
1006dependencies = [
1046 "lazy_static",
1007 "lazy_static",
1047 "parking_lot",
1008 "parking_lot",
@@ -1050,12 +1011,14 @@ dependencies = [
1050
1011
1051[[package]]
1012[[package]]
1052name = "serial_test_derive"
1013name = "serial_test_derive"
1053−version = "0.5.1"
1014+version = "0.6.0"
1054source = "registry+https://github.com/rust-lang/crates.io-index"
1015source = "registry+https://github.com/rust-lang/crates.io-index"
1055−checksum = "b2acd6defeddb41eb60bb468f8825d0cfd0c2a76bc03bfd235b6a1dc4f6a1ad5"
1016+checksum = "2881bccd7d60fb32dfa3d7b3136385312f8ad75e2674aab2852867a09790cae8"
1056dependencies = [
1017dependencies = [
1018+ "proc-macro-error",
1057 "proc-macro2",
1019 "proc-macro2",
1058 "quote",
1020 "quote",
1021+ "rustversion",
1059 "syn",
1022 "syn",
1060]
1023]
1061
1024
@@ -1067,15 +1030,15 @@ checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"
1067
1030
1068[[package]]
1031[[package]]
1069name = "shell-words"
1032name = "shell-words"
1070−version = "1.0.0"
1033+version = "1.1.0"
1071source = "registry+https://github.com/rust-lang/crates.io-index"
1034source = "registry+https://github.com/rust-lang/crates.io-index"
1072−checksum = "b6fa3938c99da4914afedd13bf3d79bcb6c277d1b2c398d23257a304d9e1b074"
1035+checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
1073
1036
1074[[package]]
1037[[package]]
1075name = "smallvec"
1038name = "smallvec"
1076−version = "1.6.1"
1039+version = "1.7.0"
1077source = "registry+https://github.com/rust-lang/crates.io-index"
1040source = "registry+https://github.com/rust-lang/crates.io-index"
1078−checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
1041+checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309"
1079
1042
1080[[package]]
1043[[package]]
1081name = "std_prelude"
1044name = "std_prelude"
@@ -1091,9 +1054,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
1091
1054
1092[[package]]
1055[[package]]
1093name = "syn"
1056name = "syn"
1094−version = "1.0.72"
1057+version = "1.0.85"
1095source = "registry+https://github.com/rust-lang/crates.io-index"
1058source = "registry+https://github.com/rust-lang/crates.io-index"
1096−checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82"
1059+checksum = "a684ac3dcd8913827e18cd09a68384ee66c1de24157e3c556c9ab16d85695fb7"
1097dependencies = [
1060dependencies = [
1098 "proc-macro2",
1061 "proc-macro2",
1099 "quote",
1062 "quote",
@@ -1102,9 +1065,9 @@ dependencies = [
1102
1065
1103[[package]]
1066[[package]]
1104name = "syntect"
1067name = "syntect"
1105−version = "4.6.0"
1068+version = "5.0.0"
1106source = "registry+https://github.com/rust-lang/crates.io-index"
1069source = "registry+https://github.com/rust-lang/crates.io-index"
1107−checksum = "8b20815bbe80ee0be06e6957450a841185fcf690fe0178f14d77a05ce2caa031"
1070+checksum = "c6c454c27d9d7d9a84c7803aaa3c50cd088d2906fe3c6e42da3209aa623576a8"
1108dependencies = [
1071dependencies = [
1109 "bincode",
1072 "bincode",
1110 "bitflags",
1073 "bitflags",
@@ -1112,22 +1075,23 @@ dependencies = [
1112 "flate2",
1075 "flate2",
1113 "fnv",
1076 "fnv",
1114 "lazy_static",
1077 "lazy_static",
1115− "lazycell",
1078+ "once_cell",
1116 "onig",
1079 "onig",
1117 "plist",
1080 "plist",
1118 "regex-syntax",
1081 "regex-syntax",
1119 "serde",
1082 "serde",
1120 "serde_derive",
1083 "serde_derive",
1121 "serde_json",
1084 "serde_json",
1085+ "thiserror",
1122 "walkdir",
1086 "walkdir",
1123 "yaml-rust",
1087 "yaml-rust",
1124]
1088]
1125
1089
1126[[package]]
1090[[package]]
1127name = "sys-info"
1091name = "sys-info"
1128−version = "0.9.0"
1092+version = "0.9.1"
1129source = "registry+https://github.com/rust-lang/crates.io-index"
1093source = "registry+https://github.com/rust-lang/crates.io-index"
1130−checksum = "33fcecee49339531cf6bd84ecf3ed94f9c8ef4a7e700f2a1cac9cc1ca485383a"
1094+checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c"
1131dependencies = [
1095dependencies = [
1132 "cc",
1096 "cc",
1133 "libc",
1097 "libc",
@@ -1135,13 +1099,13 @@ dependencies = [
1135
1099
1136[[package]]
1100[[package]]
1137name = "tempfile"
1101name = "tempfile"
1138−version = "3.2.0"
1102+version = "3.3.0"
1139source = "registry+https://github.com/rust-lang/crates.io-index"
1103source = "registry+https://github.com/rust-lang/crates.io-index"
1140−checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
1104+checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
1141dependencies = [
1105dependencies = [
1142 "cfg-if",
1106 "cfg-if",
1107+ "fastrand",
1143 "libc",
1108 "libc",
1144− "rand",
1145 "redox_syscall",
1109 "redox_syscall",
1146 "remove_dir_all",
1110 "remove_dir_all",
1147 "winapi",
1111 "winapi",
@@ -1168,14 +1132,20 @@ dependencies = [
1168
1132
1169[[package]]
1133[[package]]
1170name = "terminal_size"
1134name = "terminal_size"
1171−version = "0.1.16"
1135+version = "0.1.17"
1172source = "registry+https://github.com/rust-lang/crates.io-index"
1136source = "registry+https://github.com/rust-lang/crates.io-index"
1173−checksum = "86ca8ced750734db02076f44132d802af0b33b09942331f4459dde8636fd2406"
1137+checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
1174dependencies = [
1138dependencies = [
1175 "libc",
1139 "libc",
1176 "winapi",
1140 "winapi",
1177]
1141]
1178
1142
1143+[[package]]
1144+name = "termtree"
1145+version = "0.2.3"
1146+source = "registry+https://github.com/rust-lang/crates.io-index"
1147+checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16"
1148+
1179[[package]]
1149[[package]]
1180name = "textwrap"
1150name = "textwrap"
1181version = "0.11.0"
1151version = "0.11.0"
@@ -1188,29 +1158,39 @@ dependencies = [
1188
1158
1189[[package]]
1159[[package]]
1190name = "thiserror"
1160name = "thiserror"
1191−version = "1.0.30"
1161+version = "1.0.31"
1192source = "registry+https://github.com/rust-lang/crates.io-index"
1162source = "registry+https://github.com/rust-lang/crates.io-index"
1193−checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417"
1163+checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a"
1194dependencies = [
1164dependencies = [
1195 "thiserror-impl",
1165 "thiserror-impl",
1196]
1166]
1197
1167
1198[[package]]
1168[[package]]
1199name = "thiserror-impl"
1169name = "thiserror-impl"
1200−version = "1.0.30"
1170+version = "1.0.31"
1201source = "registry+https://github.com/rust-lang/crates.io-index"
1171source = "registry+https://github.com/rust-lang/crates.io-index"
1202−checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b"
1172+checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a"
1203dependencies = [
1173dependencies = [
1204 "proc-macro2",
1174 "proc-macro2",
1205 "quote",
1175 "quote",
1206 "syn",
1176 "syn",
1207]
1177]
1208
1178
1179+[[package]]
1180+name = "time"
1181+version = "0.3.5"
1182+source = "registry+https://github.com/rust-lang/crates.io-index"
1183+checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad"
1184+dependencies = [
1185+ "itoa 0.4.8",
1186+ "libc",
1187+]
1188+
1209[[package]]
1189[[package]]
1210name = "tinyvec"
1190name = "tinyvec"
1211−version = "1.2.0"
1191+version = "1.5.1"
1212source = "registry+https://github.com/rust-lang/crates.io-index"
1192source = "registry+https://github.com/rust-lang/crates.io-index"
1213−checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342"
1193+checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2"
1214dependencies = [
1194dependencies = [
1215 "tinyvec_macros",
1195 "tinyvec_macros",
1216]
1196]
@@ -1221,26 +1201,17 @@ version = "0.1.0"
1221source = "registry+https://github.com/rust-lang/crates.io-index"
1201source = "registry+https://github.com/rust-lang/crates.io-index"
1222checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
1202checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
1223
1203
1224−[[package]]
1225−name = "treeline"
1226−version = "0.1.0"
1227−source = "registry+https://github.com/rust-lang/crates.io-index"
1228−checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41"
1229−
1230[[package]]
1204[[package]]
1231name = "unicode-bidi"
1205name = "unicode-bidi"
1232−version = "0.3.5"
1206+version = "0.3.7"
1233source = "registry+https://github.com/rust-lang/crates.io-index"
1207source = "registry+https://github.com/rust-lang/crates.io-index"
1234−checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0"
1208+checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f"
1235−dependencies = [
1236− "matches",
1237−]
1238
1209
1239[[package]]
1210[[package]]
1240name = "unicode-normalization"
1211name = "unicode-normalization"
1241−version = "0.1.17"
1212+version = "0.1.19"
1242source = "registry+https://github.com/rust-lang/crates.io-index"
1213source = "registry+https://github.com/rust-lang/crates.io-index"
1243−checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef"
1214+checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9"
1244dependencies = [
1215dependencies = [
1245 "tinyvec",
1216 "tinyvec",
1246]
1217]
@@ -1271,9 +1242,9 @@ dependencies = [
1271
1242
1272[[package]]
1243[[package]]
1273name = "vcpkg"
1244name = "vcpkg"
1274−version = "0.2.12"
1245+version = "0.2.15"
1275source = "registry+https://github.com/rust-lang/crates.io-index"
1246source = "registry+https://github.com/rust-lang/crates.io-index"
1276−checksum = "cbdbff6266a24120518560b5dc983096efb98462e51d0d68169895b237be3e5d"
1247+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
1277
1248
1278[[package]]
1249[[package]]
1279name = "vec_map"
1250name = "vec_map"
@@ -1281,6 +1252,12 @@ version = "0.8.2"
1281source = "registry+https://github.com/rust-lang/crates.io-index"
1252source = "registry+https://github.com/rust-lang/crates.io-index"
1282checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
1253checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
1283
1254
1255+[[package]]
1256+name = "version_check"
1257+version = "0.9.4"
1258+source = "registry+https://github.com/rust-lang/crates.io-index"
1259+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
1260+
1284[[package]]
1261[[package]]
1285name = "wait-timeout"
1262name = "wait-timeout"
1286version = "0.2.0"
1263version = "0.2.0"
@@ -1349,9 +1326,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1349
1326
1350[[package]]
1327[[package]]
1351name = "xml-rs"
1328name = "xml-rs"
1352−version = "0.8.3"
1329+version = "0.8.4"
1353source = "registry+https://github.com/rust-lang/crates.io-index"
1330source = "registry+https://github.com/rust-lang/crates.io-index"
1354−checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a"
1331+checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
1355
1332
1356[[package]]
1333[[package]]
1357name = "yaml-rust"
1334name = "yaml-rust"
Cargo.toml+18−16
@@ -6,7 +6,7 @@ homepage = "https://github.com/sharkdp/bat"
6license = "MIT/Apache-2.0"
6license = "MIT/Apache-2.0"
7name = "bat"
7name = "bat"
8repository = "https://github.com/sharkdp/bat"
8repository = "https://github.com/sharkdp/bat"
9−version = "0.18.3"
9+version = "0.21.0"
10exclude = ["assets/syntaxes/*", "assets/themes/*"]
10exclude = ["assets/syntaxes/*", "assets/themes/*"]
11build = "build.rs"
11build = "build.rs"
12edition = '2018'
12edition = '2018'
@@ -33,8 +33,7 @@ minimal-application = [
33]
33]
34git = ["git2"] # Support indicating git modifications
34git = ["git2"] # Support indicating git modifications
35paging = ["shell-words", "grep-cli"] # Support applying a pager on the output
35paging = ["shell-words", "grep-cli"] # Support applying a pager on the output
36−# Add "syntect/plist-load" when https://github.com/trishume/syntect/pull/345 reaches us
37−build-assets = ["syntect/yaml-load", "syntect/dump-create"]
36+build-assets = ["syntect/yaml-load", "syntect/plist-load", "regex", "walkdir"]
38
37
39# You need to use one of these if you depend on bat as a library:
38# You need to use one of these if you depend on bat as a library:
40regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine
39regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine
@@ -43,16 +42,16 @@ regex-fancy = ["syntect/regex-fancy"] # Use the rust-only "fancy-regex" engine
43[dependencies]
42[dependencies]
44atty = { version = "0.2.14", optional = true }
43atty = { version = "0.2.14", optional = true }
45ansi_term = "^0.12.1"
44ansi_term = "^0.12.1"
46−ansi_colours = "^1.0"
45+ansi_colours = "^1.1"
47bincode = "1.0"
46bincode = "1.0"
48console = "0.15.0"
47console = "0.15.0"
49flate2 = "1.0"
48flate2 = "1.0"
50−once_cell = "1.8"
49+once_cell = "1.10"
51thiserror = "1.0"
50thiserror = "1.0"
52wild = { version = "2.0", optional = true }
51wild = { version = "2.0", optional = true }
53content_inspector = "0.2.4"
52content_inspector = "0.2.4"
54encoding = "0.2"
53encoding = "0.2"
55−shell-words = { version = "1.0.0", optional = true }
54+shell-words = { version = "1.1.0", optional = true }
56unicode-width = "0.1.9"
55unicode-width = "0.1.9"
57globset = "0.4"
56globset = "0.4"
58serde = { version = "1.0", features = ["derive"] }
57serde = { version = "1.0", features = ["derive"] }
@@ -60,38 +59,41 @@ serde_yaml = "0.8"
60semver = "1.0"
59semver = "1.0"
61path_abs = { version = "0.5", default-features = false }
60path_abs = { version = "0.5", default-features = false }
62clircle = "0.3"
61clircle = "0.3"
63−bugreport = { version = "0.4", optional = true }
62+bugreport = { version = "0.5.0", optional = true }
64dirs-next = { version = "2.0.0", optional = true }
63dirs-next = { version = "2.0.0", optional = true }
65grep-cli = { version = "0.1.6", optional = true }
64grep-cli = { version = "0.1.6", optional = true }
65+regex = { version = "1.5.5", optional = true }
66+walkdir = { version = "2.0", optional = true }
67+bytesize = { version = "1.1.0" }
66
68
67[dependencies.git2]
69[dependencies.git2]
68−version = "0.13"
70+version = "0.14"
69optional = true
71optional = true
70default-features = false
72default-features = false
71
73
72[dependencies.syntect]
74[dependencies.syntect]
73−version = "4.6.0"
75+version = "5.0.0"
74default-features = false
76default-features = false
75features = ["parsing"]
77features = ["parsing"]
76
78
77[dependencies.clap]
79[dependencies.clap]
78−version = "2.33"
80+version = "2.34"
79optional = true
81optional = true
80default-features = false
82default-features = false
81features = ["suggestions", "color", "wrap_help"]
83features = ["suggestions", "color", "wrap_help"]
82
84
83[dev-dependencies]
85[dev-dependencies]
84−assert_cmd = "2.0.2"
86+assert_cmd = "2.0.4"
85−serial_test = "0.5.1"
87+serial_test = "0.6.0"
86−predicates = "2.0.3"
88+predicates = "2.1.1"
87wait-timeout = "0.2.0"
89wait-timeout = "0.2.0"
88−tempfile = "3.2.0"
90+tempfile = "3.3.0"
89
91
90[target.'cfg(unix)'.dev-dependencies]
92[target.'cfg(unix)'.dev-dependencies]
91−nix = "0.23.0"
93+nix = { version = "0.24.1", default-features = false, features = ["term"] }
92
94
93[build-dependencies]
95[build-dependencies]
94−clap = { version = "2.33", optional = true }
96+clap = { version = "2.34", optional = true }
95
97
96[profile.release]
98[profile.release]
97lto = true
99lto = true
NOTICEnew file+6
@@ -0,0 +1,6 @@
1+Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat).
2+
3+bat is made available under the terms of either the MIT License or the Apache
4+License 2.0, at your option.
5+
6+See the LICENSE-APACHE and LICENSE-MIT files for license details.
README.md+38−6
@@ -13,12 +13,25 @@
13 <a href="#customization">Customization</a> •
13 <a href="#customization">Customization</a> •
14 <a href="#project-goals-and-alternatives">Project goals, alternatives</a><br>
14 <a href="#project-goals-and-alternatives">Project goals, alternatives</a><br>
15 [English]
15 [English]
16− [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>]
16+ [<a href="doc/README-zh.md">中文</a>]
17 [<a href="doc/README-ja.md">日本語</a>]
17 [<a href="doc/README-ja.md">日本語</a>]
18 [<a href="doc/README-ko.md">한국어</a>]
18 [<a href="doc/README-ko.md">한국어</a>]
19 [<a href="doc/README-ru.md">Русский</a>]
19 [<a href="doc/README-ru.md">Русский</a>]
20</p>
20</p>
21
21
22+### Sponsors
23+
24+A special *thank you* goes to our biggest <a href="doc/sponsors.md">sponsors</a>:<br>
25+<a href="https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=bat&utm_source=github">
26+ <img src="doc/sponsors/workos-logo-white-bg.svg" width="200" alt="WorkOS">
27+ <br>
28+ <strong>Your app, enterprise-ready.</strong>
29+ <br>
30+ <sub>Start selling to enterprise customers with just a few lines of code.</sub>
31+ <br>
32+ <sup>Add Single Sign-On (and more) in minutes instead of months.</sup>
33+</a>
34+
22### Syntax highlighting
35### Syntax highlighting
23
36
24`bat` supports syntax highlighting for a large number of programming and markup
37`bat` supports syntax highlighting for a large number of programming and markup
@@ -158,7 +171,7 @@ You can combine `bat` with `git diff` to view lines around code changes with pro
158highlighting:
171highlighting:
159```bash
172```bash
160batdiff() {
173batdiff() {
161− git diff --name-only --diff-filter=d | xargs bat --diff
174+ git diff --name-only --relative --diff-filter=d | xargs bat --diff
162}
175}
163```
176```
164If you prefer to use this as a separate tool, check out `batdiff` in [`bat-extras`](https://github.com/eth-p/bat-extras).
177If you prefer to use this as a separate tool, check out `batdiff` in [`bat-extras`](https://github.com/eth-p/bat-extras).
@@ -199,6 +212,24 @@ Also, note that this will [not work](https://github.com/sharkdp/bat/issues/1145)
199
212
200The [`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) script is a wrapper that will format code and print it with `bat`.
213The [`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) script is a wrapper that will format code and print it with `bat`.
201
214
215+#### Highlighting `--help` messages
216+
217+You can use `bat` to colorize help text: `$ cp --help | bat -plhelp`
218+
219+You can also use a wrapper around this:
220+
221+```bash
222+# in your .bashrc/.zshrc/*rc
223+alias bathelp='bat --plain --language=help'
224+help() {
225+ "$@" --help 2>&1 | bathelp
226+}
227+```
228+
229+Then you can do `$ help cp` or `$ help git commit`.
230+
231+Please report any issues with the help syntax in [this repository](https://github.com/victor-gp/cmd-help-sublime-syntax).
232+
202
233
203## Installation
234## Installation
204
235
@@ -387,7 +418,7 @@ binaries are also available: look for archives with `musl` in the file name.
387
418
388### From source
419### From source
389
420
390−If you want to build `bat` from source, you need Rust 1.46 or
421+If you want to build `bat` from source, you need Rust 1.51 or
391higher. You can then use `cargo` to build everything:
422higher. You can then use `cargo` to build everything:
392
423
393```bash
424```bash
@@ -515,8 +546,9 @@ command line option. The option takes an argument of the form `pattern:syntax` w
515the absolute file path. The `syntax` part is the full name of a supported language
546the absolute file path. The `syntax` part is the full name of a supported language
516(use `bat --list-languages` for an overview).
547(use `bat --list-languages` for an overview).
517
548
518−Note: You probably want to use this option as an entry in `bat`s configuration file instead
549+**Note:** You probably want to use this option as [an entry in `bat`'s configuration file](#configuration-file)
519−of passing it on the command line (see below).
550+for persistence instead of passing it on the command line as a one-off. Generally
551+you'd just use `-l` if you want to manually specify a language for a file.
520
552
521Example: To use "INI" syntax highlighting for all files with a `.conf` file extension, use
553Example: To use "INI" syntax highlighting for all files with a `.conf` file extension, use
522```bash
554```bash
@@ -676,7 +708,7 @@ bat() {
676
708
677### Garbled output
709### Garbled output
678
710
679−If an input file contains color codes or other ANSI escape sequences, `bat` will have problems
711+If an input file contains color codes or other ANSI escape sequences or control characters, `bat` will have problems
680performing syntax highlighting and text wrapping, and thus the output can become garbled.
712performing syntax highlighting and text wrapping, and thus the output can become garbled.
681When displaying such files it is recommended to disable both syntax highlighting and wrapping by
713When displaying such files it is recommended to disable both syntax highlighting and wrapping by
682passing the `--color=never --wrap=never` options to `bat`.
714passing the `--color=never --wrap=never` options to `bat`.
assets/acknowledgements.binnew file

Binary file not shown.

assets/completions/_bat.ps1.in+1−1
@@ -37,7 +37,7 @@ Register-ArgumentCompleter -Native -CommandName '{{PROJECT_EXECUTABLE}}' -Script
37 [CompletionResult]::new('-m', 'm', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
37 [CompletionResult]::new('-m', 'm', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
38 [CompletionResult]::new('--map-syntax', 'map-syntax', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
38 [CompletionResult]::new('--map-syntax', 'map-syntax', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
39 [CompletionResult]::new('--theme', 'theme', [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting.')
39 [CompletionResult]::new('--theme', 'theme', [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting.')
40− [CompletionResult]::new('--style', 'style', [CompletionResultType]::ParameterName, 'Comma-separated list of style elements to display (*auto*, full, plain, changes, header, grid, rule, numbers, snip).')
40+ [CompletionResult]::new('--style', 'style', [CompletionResultType]::ParameterName, 'Comma-separated list of style elements to display (*default*, auto, full, plain, changes, header, header-filename, header-filesize, grid, rule, numbers, snip).')
41 [CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
41 [CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
42 [CompletionResult]::new('--line-range', 'line-range', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
42 [CompletionResult]::new('--line-range', 'line-range', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
43 [CompletionResult]::new('-A', 'A', [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).')
43 [CompletionResult]::new('-A', 'A', [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).')
assets/completions/bat.bash.in+15−2
@@ -2,9 +2,22 @@
2
2
3# Requires https://github.com/scop/bash-completion
3# Requires https://github.com/scop/bash-completion
4
4
5+# Macs have bash3 for which the bash-completion package doesn't include
6+# _init_completion. This is a minimal version of that function.
7+__bat_init_completion()
8+{
9+ COMPREPLY=()
10+ _get_comp_words_by_ref "$@" cur prev words cword
11+}
12+
5_bat() {
13_bat() {
6− local cur prev words cword split
14+ local cur prev words cword split=false
15+ if declare -F _init_completion >/dev/null 2>&1; then
7− _init_completion -s || return 0
16+ _init_completion -s || return 0
17+ else
18+ __bat_init_completion -n "=" || return 0
19+ _split_longopt && split=true
20+ fi
8
21
9 if [[ ${words[1]-} == cache ]]; then
22 if [[ ${words[1]-} == cache ]]; then
10 case $prev in
23 case $prev in
assets/completions/bat.fish.in+1−1
@@ -56,7 +56,7 @@ complete -c {{PROJECT_EXECUTABLE}} -s P -d "Disable paging. Alias for '--paging=
56
56
57complete -c {{PROJECT_EXECUTABLE}} -s A -l show-all -d "Show non-printable characters like space/tab/newline" -n "not __fish_seen_subcommand_from cache"
57complete -c {{PROJECT_EXECUTABLE}} -s A -l show-all -d "Show non-printable characters like space/tab/newline" -n "not __fish_seen_subcommand_from cache"
58
58
59−complete -c {{PROJECT_EXECUTABLE}} -l style -xka "auto full plain changes header grid rule numbers snip" -d "Comma-separated list of style elements or presets to display with file contents" -n "not __fish_seen_subcommand_from cache"
59+complete -c {{PROJECT_EXECUTABLE}} -l style -xka "default auto full plain changes header header-filename header-filesize grid rule numbers snip" -d "Comma-separated list of style elements or presets to display with file contents" -n "not __fish_seen_subcommand_from cache"
60
60
61complete -c {{PROJECT_EXECUTABLE}} -l tabs -x -d "<T> Set the tab width to T spaces (width of 0 passes tabs through directly)" -n "not __fish_seen_subcommand_from cache"
61complete -c {{PROJECT_EXECUTABLE}} -l tabs -x -d "<T> Set the tab width to T spaces (width of 0 passes tabs through directly)" -n "not __fish_seen_subcommand_from cache"
62
62
assets/completions/bat.zsh.in+1−1
@@ -75,7 +75,7 @@ _{{PROJECT_EXECUTABLE}}_main() {
75 ;;
75 ;;
76
76
77 style)
77 style)
78− _values -s , 'style' auto full plain changes header grid rule numbers snip
78+ _values -s , 'style' default auto full plain changes header header-filename header-filesize grid rule numbers snip
79 ;;
79 ;;
80 esac
80 esac
81}
81}
assets/create.sh+13−7
@@ -46,6 +46,7 @@ bat cache --clear
46# - Remove the JavaDoc patch once https://github.com/trishume/syntect/issues/222 has been fixed
46# - Remove the JavaDoc patch once https://github.com/trishume/syntect/issues/222 has been fixed
47# - Remove the C# patch once https://github.com/sublimehq/Packages/pull/2331 has been merged
47# - Remove the C# patch once https://github.com/sublimehq/Packages/pull/2331 has been merged
48
48
49+# Apply patches
49(
50(
50 cd "$ASSET_DIR"
51 cd "$ASSET_DIR"
51 for patch in patches/*.patch; do
52 for patch in patches/*.patch; do
@@ -53,11 +54,16 @@ bat cache --clear
53 done
54 done
54)
55)
55
56
56−bat cache --build --blank --source="$ASSET_DIR" --target="$ASSET_DIR"
57+reverse_patches() {
58+ (
59+ cd "$ASSET_DIR"
60+ for patch in patches/*.patch; do
61+ patch --strip=0 --reverse <"$patch"
62+ done
63+ )
64+}
57
65
58−(
66+# Make sure to always reverse patches, even if the `bat cache` command fails or aborts
59− cd "$ASSET_DIR"
67+trap reverse_patches EXIT
60− for patch in patches/*.patch; do
68+
61− patch --strip=0 --reverse < "$patch"
69+bat cache --build --blank --acknowledgements --source="$ASSET_DIR" --target="$ASSET_DIR"
62− done
63−)
assets/manual/bat.1.in+4−1
@@ -118,6 +118,8 @@ which pager is used, see the '\-\-pager' option. Possible values: *auto*, never,
118Determine which pager is used. This option will override the PAGER and BAT_PAGER
118Determine which pager is used. This option will override the PAGER and BAT_PAGER
119environment variables. The default pager is 'less'. To control when the pager is used, see
119environment variables. The default pager is 'less'. To control when the pager is used, see
120the '\-\-paging' option. Example: '\-\-pager "less \fB\-RF\fR"'.
120the '\-\-paging' option. Example: '\-\-pager "less \fB\-RF\fR"'.
121+
122+Note: By default, if the pager is set to 'less' (and no command-line options are specified), 'bat' will pass the following command line options to the pager: '-R'/'--RAW-CONTROL-CHARS', '-F'/'--quit-if-one-screen' and '-X'/'--no-init'. The last option ('-X') is only used for 'less' versions older than 530. The '-R' option is needed to interpret ANSI colors correctly. The second option ('-F') instructs less to exit immediately if the output size is smaller than the vertical size of the terminal. This is convenient for small files because you do not have to press 'q' to quit the pager. The third option ('-X') is needed to fix a bug with the '--quit-if-one-screen' feature in old versions of 'less'. Unfortunately, it also breaks mouse-wheel support in 'less'. If you want to enable mouse-wheel scrolling on older versions of 'less', you can pass just '-R' (as in the example above, this will disable the quit-if-one-screen feature). For less 530 or newer, it should work out of the box.
121.HP
123.HP
122\fB\-m\fR, \fB\-\-map\-syntax\fR <glob-pattern:syntax-name>...
124\fB\-m\fR, \fB\-\-map\-syntax\fR <glob-pattern:syntax-name>...
123.IP
125.IP
@@ -144,7 +146,8 @@ Configure which elements (line numbers, file headers, grid borders, Git modifica
144of components to display (e.g. 'numbers,changes,grid') or a pre\-defined style ('full').
146of components to display (e.g. 'numbers,changes,grid') or a pre\-defined style ('full').
145To set a default style, add the '\-\-style=".."' option to the configuration file or
147To set a default style, add the '\-\-style=".."' option to the configuration file or
146export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible
148export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible
147−values: *full*, auto, plain, changes, header, grid, rule, numbers, snip.
149+values: *default*, full, auto, plain, changes, header, header-filename, header-filesize, grid,
150+rule, numbers, snip.
148.HP
151.HP
149\fB\-r\fR, \fB\-\-line\-range\fR <N:M>...
152\fB\-r\fR, \fB\-\-line\-range\fR <N:M>...
150.IP
153.IP
assets/syntaxes.bin

Binary file not shown.

assets/syntaxes/02_Extra/Dart+1−1

Submodule changed.

assets/syntaxes/02_Extra/Dart.sublime-syntax+85−243
@@ -1,6 +1,6 @@
1%YAML 1.2
1%YAML 1.2
2---
2---
3−# http://www.sublimetext.com/docs/3/syntax.html
3+# http://www.sublimetext.com/docs/syntax.html
4name: Dart
4name: Dart
5file_extensions:
5file_extensions:
6 - dart
6 - dart
@@ -9,7 +9,7 @@ contexts:
9 main:
9 main:
10 - match: ^(#!.*)$
10 - match: ^(#!.*)$
11 scope: meta.preprocessor.script.dart
11 scope: meta.preprocessor.script.dart
12− - match: ^\s*\b(library|import|export|part of|part)\b
12+ - match: ^\w*\b(library|import|part of|part|export)\b
13 captures:
13 captures:
14 0: keyword.other.import.dart
14 0: keyword.other.import.dart
15 push:
15 push:
@@ -19,242 +19,114 @@ contexts:
19 0: punctuation.terminator.dart
19 0: punctuation.terminator.dart
20 pop: true
20 pop: true
21 - include: strings
21 - include: strings
22+ - include: comments
22− - match: \b(as|show|hide|deferred)\b
23+ - match: \b(as|show|hide)\b
23 scope: keyword.other.import.dart
24 scope: keyword.other.import.dart
24 - include: comments
25 - include: comments
25− - include: constants-and-special-vars
26+ - include: punctuation
26 - include: annotations
27 - include: annotations
27− - include: decl-typedef
28− - include: decl-class
29− - include: decl-enum
30− - include: decl-function
31 - include: keywords
28 - include: keywords
29+ - include: constants-and-special-vars
32 - include: strings
30 - include: strings
33 annotations:
31 annotations:
34− - match: '^(?:\s*)((@)([a-zA-Z0-9_]+))'
32+ - match: '@[a-zA-Z]+'
35− captures:
33+ scope: storage.type.annotation.dart
36− 1: annotation.dart
37− 2: entity.name.function.annotation.dart
38− 3: support.type.dart
39 comments:
34 comments:
40 - match: /\*\*/
35 - match: /\*\*/
41 scope: comment.block.empty.dart
36 scope: comment.block.empty.dart
42 captures:
37 captures:
43 0: punctuation.definition.comment.dart
38 0: punctuation.definition.comment.dart
39+ - include: comments-doc-oldschool
40+ - include: comments-doc
44 - include: comments-inline
41 - include: comments-inline
45− comments-inline:
42+ comments-block:
46 - match: /\*
43 - match: /\*
47 push:
44 push:
48 - meta_scope: comment.block.dart
45 - meta_scope: comment.block.dart
49 - match: \*/
46 - match: \*/
50 pop: true
47 pop: true
51− - include: scope:text.dart-doccomments
48+ - include: comments-block
49+ comments-doc:
52− - match: (///)
50+ - match: ///
53− captures:
54− 1: marker.dart
55 push:
51 push:
56− - meta_scope: comment.line.triple-slash.dart
52+ - meta_scope: comment.block.documentation.dart
57− - match: $
53+ - match: .*
58 pop: true
54 pop: true
59− - include: scope:text.dart-doccomments
55+ - include: dartdoc
56+ comments-doc-oldschool:
60− - match: (//)
57+ - match: /\*\*
61− captures:
62− 1: marker.dart
63 push:
58 push:
64− - meta_scope: comment.line.double-slash.dart
59+ - meta_scope: comment.block.documentation.dart
65− - match: $
60+ - match: \*/
66 pop: true
61 pop: true
67− - include: scope:text.dart-doccomments
62+ - include: comments-doc-oldschool
63+ - include: comments-block
64+ - include: dartdoc
65+ comments-inline:
66+ - include: comments-block
67+ - match: ((//).*)$
68+ captures:
69+ 1: comment.line.double-slash.dart
68 constants-and-special-vars:
70 constants-and-special-vars:
69− - match: \b(true|false|null)\b
71+ - match: (?<!\$)\b(true|false|null)\b(?!\$)
70 scope: constant.language.dart
72 scope: constant.language.dart
71− - match: \b(this|super)\b
73+ - match: (?<!\$)\b(this|super)\b(?!\$)
72 scope: variable.language.dart
74 scope: variable.language.dart
73− - match: '\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b'
75+ - match: '(?<!\$)\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b(?!\$)'
74 scope: constant.numeric.dart
76 scope: constant.numeric.dart
75− decl-class:
77+ - match: '(?<![a-zA-Z0-9_$])([_$]*[A-Z][a-zA-Z0-9_$]*|bool\b|num\b|int\b|double\b|dynamic\b)'
76− - match: \bclass\b
78+ scope: support.class.dart
79+ - match: '([_$]*[a-z][a-zA-Z0-9_$]*)(<|\(|\s+=>)'
77 captures:
80 captures:
78− 0: keyword.control.new.dart
81+ 1: entity.name.function.dart
79− push:
82+ dartdoc:
80− - meta_scope: meta.declaration.class.dart
81− - match: "(?={)"
82− pop: true
83− - include: keywords
84− - match: "[A-Za-z_][A-Za-z0-9_]*"
85− scope: class.name.dart
86− decl-enum:
87− - match: \benum\b
83+ - match: '(\[.*?\])'
88− captures:
89− 0: keyword.declaration.dart
90− push:
91− - meta_scope: meta.declaration.enum.dart
92− - match: "(?={)"
93− pop: true
94− - include: keywords
95− - match: "[A-Za-z_][A-Za-z0-9_]*"
96− scope: enum.name.dart
97− decl-function:
98− - match: ^\s*(?:\b(void|bool|num|int|double|dynamic|var|String|List|Map)\b)\s+(get)\s+(\w+)\s+(?==>)
99− comment: A getter with a primitive return type.
100− scope: meta.declaration.function.dart
101 captures:
84 captures:
102− 1: storage.type.primitive.dart
85+ 0: variable.name.source.dart
103− 2: keyword.declaration.dart
104− 3: function.name.dart
105− - match: ^\s*(?:\b(\w+)\b\s+)?(get)\s+(\w+)\s+(?==>)
106− comment: A getter with a user-defined return type or no return type.
107− scope: meta.declaration.function.dart
108− captures:
109− 1: type.user-defined.dart
110− 2: keyword.declaration.dart
111− 3: function.name.dart
112− - match: ^\s*(set)\s+(\w+)(?=\()
86+ - match: '^ {4,}(?![ \*]).*'
113− comment: A setter.
114− captures:
115− 1: keyword.declaration.dart
116− 2: function.name.dart
117− push:
118− - meta_scope: meta.declaration.function.dart
119− - match: \)
120− pop: true
121− - include: comments-inline
122− - include: decl-function-parameter
123− - include: strings
124− - include: keywords
125− - match: ^\s*(?:\b(void|bool|num|int|double|dynamic|var|String|List|Map)\b)\s+(\w+)(?=\()
126− comment: A function with a primitive return type.
127− captures:
128− 1: storage.type.primitive.dart
129− 2: function.name.dart
130− push:
131− - meta_scope: meta.declaration.function.dart
132− - match: \)
133− pop: true
134− - include: comments-inline
135− - include: decl-function-parameter
136− - include: strings
137− - include: keywords
138− - match: ^\s*(?:\b(return)\b)\s+(\w+)(?=\()
139− comment: A function invocation after 'return'
140− captures:
141− 1: keyword.control.dart
142− 2: function.name.dart
143− push:
144− - meta_scope: meta.invocation.function.dart
145− - match: \)
146− pop: true
147− - include: comments-inline
148− - include: decl-function-parameter
149− - include: strings
150− - include: keywords
151− - match: ^\s*\b(new)\b\s+(\w+)(?=\()
152− comment: A class instantiation after 'new'
153− captures:
154− 1: keyword.declaration.dart
155− 2: function.name.dart
156− push:
157− - meta_scope: meta.invocation.function.dart
158− - match: \)
159− pop: true
160− - include: comments-inline
161− - include: decl-function-parameter
162− - include: strings
163− - include: keywords
164− decl-function-parameter:
165− - include: constants-and-special-vars
166− - match: (?:\b(void|bool|num|int|double|dynamic|var|String|List|Map)\b)\s+(\w+)(?=\()
167− comment: A function with a primitive return type.
168− captures:
169− 1: storage.type.primitive.dart
170− 2: function.name.dart
171− push:
172− - meta_scope: meta.parameter.function.dart
173− - match: \)
174− pop: true
175− - include: decl-function-parameter
176− - include: strings
177− - include: keywords
178− - match: \b(new)\b\s+(\w+)(?=\()
179− comment: A class instantiation after 'new'
180 captures:
87 captures:
181− 1: keyword.declaration.dart
182− 2: function.name.dart
88+ 0: variable.name.source.dart
89+ - match: '```.*?$'
183 push:
90 push:
184− - meta_scope: meta.invocation.function.dart
91+ - meta_content_scope: variable.other.source.dart
185− - match: \)
92+ - match: '```'
186 pop: true
93 pop: true
187− - include: decl-function-parameter
188− - include: strings
189− - include: keywords
190− - match: (?:\b(\w+)\b)\s+(\w+)(?=\()
94+ - match: (`.*?`)
191− comment: A function with a user-defined return type.
192 captures:
95 captures:
193− 1: type.user-defined.dart
96+ 0: variable.other.source.dart
194− 2: function.name.dart
195− push:
196− - meta_scope: meta.parameter.function.dart
197− - match: \)
198− pop: true
199− - include: decl-function-parameter
200− - include: strings
201− - include: keywords
202− - match: (\w+)(?=\()
97+ - match: (`.*?`)
203− comment: A function with no return type.
204 captures:
98 captures:
205− 1: function.name.dart
99+ 0: variable.other.source.dart
206− push:
207− - meta_scope: meta.parameter.function.dart
208− - match: \)
100+ - match: (\* (( ).*))$
209− pop: true
210− - include: decl-function-parameter
211− - include: strings
212− - include: keywords
213− decl-typedef:
214− - match: typedef
215 captures:
101 captures:
216− 0: keyword.control.new.dart
102+ 2: variable.other.source.dart
217− push:
218− - meta_scope: meta.declaration.typedef.dart
219− - match: ;
220− captures:
221− 0: punctuation.terminator.dart
222− pop: true
223− - 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_]+)'
224− captures:
225− 1: storage.type.primitive.dart
226− 2: typedef.return.dart
227− 3: typedef.name.dart
228− - match: \(
103+ - match: (\* .*)$
229− push:
230− - meta_scope: typedef.params.dart
231− - match: \)
232− pop: true
233− - include: keywords
234 keywords:
104 keywords:
235− - match: \bassert\b
105+ - match: (?<!\$)\bas\b(?!\$)
236− scope: keyword.control.assert.dart
237− - match: \bas\b
238 scope: keyword.cast.dart
106 scope: keyword.cast.dart
239− - match: \b(try|catch|finally|throw|on|rethrow)\b
107+ - match: (?<!\$)\b(try|on|catch|finally|throw|rethrow)\b(?!\$)
240 scope: keyword.control.catch-exception.dart
108 scope: keyword.control.catch-exception.dart
241− - match: \s+\?\s+|\s+:\s+
242− scope: keyword.control.ternary.dart
243− - match: \b(break|case|continue|default|do|else|for|if|in|return|switch|while)\b
109+ - match: (?<!\$)\b(break|case|continue|default|do|else|for|if|in|return|switch|while)\b(?!\$)
244 scope: keyword.control.dart
110 scope: keyword.control.dart
245− - match: \b(async\*|async|await\*|await|yield)\b
111+ - match: (?<!\$)\b(sync(\*)?|async(\*)?|await|yield(\*)?)\b(?!\$)
246− scope: keyword.control.async.dart
112+ scope: keyword.control.dart
113+ - match: (?<!\$)\bassert\b(?!\$)
114+ scope: keyword.control.dart
247− - match: \b(new)\b
115+ - match: (?<!\$)\b(new)\b(?!\$)
248 scope: keyword.control.new.dart
116 scope: keyword.control.new.dart
249− - match: \b(abstract|extends|external|factory|implements|with|interface|get|native|operator|set|typedef)\b
117+ - match: (?<!\$)\b(abstract|class|enum|extends|external|factory|implements|get|mixin|native|operator|set|typedef|with|covariant)\b(?!\$)
250 scope: keyword.declaration.dart
118 scope: keyword.declaration.dart
251− - match: \b(is\!?)\b
119+ - match: (?<!\$)\b(is\!?)\b(?!\$)
252 scope: keyword.operator.dart
120 scope: keyword.operator.dart
121+ - match: '\?|:'
122+ scope: keyword.operator.ternary.dart
253 - match: (<<|>>>?|~|\^|\||&)
123 - match: (<<|>>>?|~|\^|\||&)
254 scope: keyword.operator.bitwise.dart
124 scope: keyword.operator.bitwise.dart
255 - match: ((&|\^|\||<<|>>>?)=)
125 - match: ((&|\^|\||<<|>>>?)=)
256 scope: keyword.operator.assignment.bitwise.dart
126 scope: keyword.operator.assignment.bitwise.dart
257− - match: (===?|!==?|<=?|>=?)
127+ - match: (=>)
128+ scope: keyword.operator.closure.dart
129+ - match: (==|!=|<=?|>=?)
258 scope: keyword.operator.comparison.dart
130 scope: keyword.operator.comparison.dart
259 - match: '(([+*/%-]|\~)=)'
131 - match: '(([+*/%-]|\~)=)'
260 scope: keyword.operator.assignment.arithmetic.dart
132 scope: keyword.operator.assignment.arithmetic.dart
@@ -266,56 +138,22 @@ contexts:
266 scope: keyword.operator.arithmetic.dart
138 scope: keyword.operator.arithmetic.dart
267 - match: (!|&&|\|\|)
139 - match: (!|&&|\|\|)
268 scope: keyword.operator.logical.dart
140 scope: keyword.operator.logical.dart
269− - match: ;
270− scope: punctuation.terminator.dart
271− - match: \b(static|final|const)\b
141+ - match: (?<!\$)\b(static|final|const)\b(?!\$)
272 scope: storage.modifier.dart
142 scope: storage.modifier.dart
273− - match: \b(?:void|bool|num|int|double|dynamic|var|String|List|Map)\b
143+ - match: (?<!\$)\b(?:void|var)\b(?!\$)
274 scope: storage.type.primitive.dart
144 scope: storage.type.primitive.dart
275− regexp:
145+ punctuation:
276− - match: '\\[^''"]'
146+ - match: ','
277− scope: constant.character.escaped.regex.dart
147+ scope: punctuation.comma.dart
278− - match: \(
148+ - match: ;
279− push:
149+ scope: punctuation.terminator.dart
280− - meta_content_scope: meta.capture.regex.dart
281− - match: \)
282− pop: true
283− - match: \?(:|=|!)
284− scope: ignore.capture.regex.dart
285− - match: \*|\+|\?|\.|\|
286− scope: keyword.other.regex.dart
287− - match: \^|\$
288− scope: keyword.other.regex.dart
289 - match: \.
150 - match: \.
290− scope: constant.other.regex.dart
151+ scope: punctuation.dot.dart
291− - match: '\[(\^)?'
292− captures:
293− 1: keyword.other.negation.regex.dart
294− push:
295− - meta_scope: constant.character.range.regex.dart
296− - match: '\]'
297− pop: true
298− - match: '\\[^"'']'
299− scope: constant.character.escaped.regex.dart
300− - match: '\{(?:\d+)?,(?:\d+)?\}'
301− scope: keyword.other.regex.dart
302 string-interp:
152 string-interp:
303− - match: '(\$)(\{)'
153+ - match: '\$((\w+)|\{([^{}]+)\})'
304 captures:
154 captures:
305− 1: keyword.other.dart
306− 2: keyword.other.dart
307− push:
308− - meta_scope: interpolation.dart
309− - meta_content_scope: source.dart
310− - match: '(\})'
311− captures:
312− 1: keyword.other.dart
313− pop: true
314− - include: main
315− - match: (\$)(\w+)
316− captures:
317− 1: keyword.other.dart
318 2: variable.parameter.dart
155 2: variable.parameter.dart
156+ 3: variable.parameter.dart
319 - match: \\.
157 - match: \\.
320 scope: constant.character.escape.dart
158 scope: constant.character.escape.dart
321 strings:
159 strings:
@@ -328,7 +166,7 @@ contexts:
328 - match: (?<!r)'''
166 - match: (?<!r)'''
329 push:
167 push:
330 - meta_scope: string.interpolated.triple.single.dart
168 - meta_scope: string.interpolated.triple.single.dart
331− - match: "'''(?!')"
169+ - match: '''''''(?!'')'
332 pop: true
170 pop: true
333 - include: string-interp
171 - include: string-interp
334 - match: r"""
172 - match: r"""
@@ -339,9 +177,9 @@ contexts:
339 - match: r'''
177 - match: r'''
340 push:
178 push:
341 - meta_scope: string.quoted.triple.single.dart
179 - meta_scope: string.quoted.triple.single.dart
342− - match: "'''(?!')"
180+ - match: '''''''(?!'')'
343 pop: true
181 pop: true
344− - match: (?<!\\|r)"
182+ - match: (?<!\|r)"
345 push:
183 push:
346 - meta_scope: string.interpolated.double.dart
184 - meta_scope: string.interpolated.double.dart
347 - match: '"'
185 - match: '"'
@@ -354,16 +192,20 @@ contexts:
354 - meta_scope: string.quoted.double.dart
192 - meta_scope: string.quoted.double.dart
355 - match: '"'
193 - match: '"'
356 pop: true
194 pop: true
357− - include: regexp
195+ - match: \n
196+ scope: invalid.string.newline
358 - match: (?<!\|r)'
197 - match: (?<!\|r)'
359 push:
198 push:
360 - meta_scope: string.interpolated.single.dart
199 - meta_scope: string.interpolated.single.dart
361 - match: "'"
200 - match: "'"
362 pop: true
201 pop: true
202+ - match: \n
203+ scope: invalid.string.newline
363 - include: string-interp
204 - include: string-interp
364 - match: r'
205 - match: r'
365 push:
206 push:
366 - meta_scope: string.quoted.single.dart
207 - meta_scope: string.quoted.single.dart
367 - match: "'"
208 - match: "'"
368 pop: true
209 pop: true
369− - include: regexp
210+ - match: \n
211+ scope: invalid.string.newline
assets/syntaxes/02_Extra/Fish+1−1

Submodule changed.

assets/syntaxes/02_Extra/GLSL+1−1

Submodule changed.

assets/syntaxes/02_Extra/GraphQL+1−1

Submodule changed.

assets/syntaxes/02_Extra/INI.sublime-syntax+2−2
@@ -5,8 +5,8 @@ name: INI
5file_extensions:
5file_extensions:
6 - ini
6 - ini
7 - INI
7 - INI
8− - inf
8+ - "inf"
9− - INF
9+ - "INF"
10 - reg
10 - reg
11 - REG
11 - REG
12 - lng
12 - lng
assets/syntaxes/02_Extra/MediaWiki+1−1

Submodule changed.

assets/syntaxes/02_Extra/Nginx+1−1

Submodule changed.

assets/syntaxes/02_Extra/Nim.sublime-syntax+1
@@ -5,6 +5,7 @@ name: Nim
5file_extensions:
5file_extensions:
6 - nim
6 - nim
7 - nims
7 - nims
8+ - nimble
8scope: source.nim
9scope: source.nim
9contexts:
10contexts:
10 main:
11 main:
assets/syntaxes/02_Extra/PowerShell+1−1

Submodule changed.

assets/syntaxes/02_Extra/PowerShell.sublime-syntax+58−48
@@ -24,7 +24,7 @@ contexts:
24 - include: commands
24 - include: commands
25 - include: commentLine
25 - include: commentLine
26 - include: variable
26 - include: variable
27− - include: interpolatedStringContent
27+ - include: subexpression
28 - include: function
28 - include: function
29 - include: attribute
29 - include: attribute
30 - include: UsingDirective
30 - include: UsingDirective
@@ -33,32 +33,38 @@ contexts:
33 - include: doubleQuotedString
33 - include: doubleQuotedString
34 - include: scriptblock
34 - include: scriptblock
35 - include: doubleQuotedStringEscapes
35 - include: doubleQuotedStringEscapes
36− - match: (?<!')'
36+ - match: '[''\x{2018}-\x{201B}]'
37 captures:
37 captures:
38 0: punctuation.definition.string.begin.powershell
38 0: punctuation.definition.string.begin.powershell
39 push:
39 push:
40 - meta_scope: string.quoted.single.powershell
40 - meta_scope: string.quoted.single.powershell
41− - match: "'(?!')"
41+ - match: '[''\x{2018}-\x{201B}]{2}'
42+ scope: constant.character.escape.powershell
43+ - match: '[''\x{2018}-\x{201B}]'
42 captures:
44 captures:
43 0: punctuation.definition.string.end.powershell
45 0: punctuation.definition.string.end.powershell
44 pop: true
46 pop: true
45− - match: "''"
46− scope: constant.character.escape.powershell
47− - match: \@"(?=$)
47+ - match: '(@["\x{201C}-\x{201E}])\s*$'
48+ captures:
49+ 1: punctuation.definition.string.begin.powershell
48 push:
50 push:
49 - meta_scope: string.quoted.double.heredoc.powershell
51 - meta_scope: string.quoted.double.heredoc.powershell
50− - match: ^"@
52+ - match: '^["\x{201C}-\x{201E}]@'
53+ captures:
54+ 0: punctuation.definition.string.end.powershell
51 pop: true
55 pop: true
52 - include: variableNoProperty
56 - include: variableNoProperty
53 - include: doubleQuotedStringEscapes
57 - include: doubleQuotedStringEscapes
54 - include: interpolation
58 - include: interpolation
55− - match: \@'(?=$)
59+ - match: '(@[''\x{2018}-\x{201B}])\s*$'
60+ captures:
61+ 1: punctuation.definition.string.begin.powershell
56 push:
62 push:
57 - meta_scope: string.quoted.single.heredoc.powershell
63 - meta_scope: string.quoted.single.heredoc.powershell
58− - match: ^'@
64+ - match: '^[''\x{2018}-\x{201B}]@'
65+ captures:
66+ 0: punctuation.definition.string.end.powershell
59 pop: true
67 pop: true
60− - match: "''"
61− scope: constant.character.escape.powershell
62 - include: numericConstant
68 - include: numericConstant
63 - match: (@)(\()
69 - match: (@)(\()
64 captures:
70 captures:
@@ -71,11 +77,12 @@ contexts:
71 0: punctuation.section.group.end.powershell
77 0: punctuation.section.group.end.powershell
72 pop: true
78 pop: true
73 - include: main
79 - include: main
74− - match: (\$)(\()
80+ - match: ((\$))(\()
75 comment: "TODO: move to repo; make recursive."
81 comment: "TODO: move to repo; make recursive."
76 captures:
82 captures:
77− 1: punctuation.definition.variable.powershell
83+ 1: keyword.other.substatement.powershell
84+ 2: punctuation.definition.subexpression.powershell
78− 2: punctuation.section.group.begin.powershell
85+ 3: punctuation.section.group.begin.powershell
79 push:
86 push:
80 - meta_scope: meta.group.complex.subexpression.powershell
87 - meta_scope: meta.group.complex.subexpression.powershell
81 - match: \)
88 - match: \)
@@ -85,7 +92,7 @@ contexts:
85 - include: main
92 - include: main
86 - match: '(\b(([A-Za-z0-9\-_\.]+)\.(?i:exe|com|cmd|bat))\b)'
93 - match: '(\b(([A-Za-z0-9\-_\.]+)\.(?i:exe|com|cmd|bat))\b)'
87 scope: support.function.powershell
94 scope: support.function.powershell
88− - match: (?<!\w|-|\.)((?i:begin|break|catch|continue|data|default|define|do|dynamicparam|else|elseif|end|exit|finally|for|from|if|in|inlinescript|parallel|param|process|return|sequence|switch|throw|trap|try|until|var|while)|%|\?)(?!\w)
95+ - match: (?<!\w|-|\.)((?i:begin|break|catch|clean|continue|data|default|define|do|dynamicparam|else|elseif|end|exit|finally|for|from|if|in|inlinescript|parallel|param|process|return|sequence|switch|throw|trap|try|until|var|while)|%|\?)(?!\w)
89 scope: keyword.control.powershell
96 scope: keyword.control.powershell
90 - match: '(?<!\w|-|[^\)]\.)((?i:(foreach|where)(?!-object))|%|\?)(?!\w)'
97 - match: '(?<!\w|-|[^\)]\.)((?i:(foreach|where)(?!-object))|%|\?)(?!\w)'
91 scope: keyword.control.powershell
98 scope: keyword.control.powershell
@@ -135,7 +142,7 @@ contexts:
135 - meta_scope: meta.requires.powershell
142 - meta_scope: meta.requires.powershell
136 - match: $
143 - match: $
137 pop: true
144 pop: true
138− - match: \-(?i:Modules|PSSnapin|RunAsAdministrator|ShellId|Version)
145+ - match: \-(?i:Modules|PSSnapin|RunAsAdministrator|ShellId|Version|Assembly|PSEdition)
139 scope: keyword.other.powershell
146 scope: keyword.other.powershell
140 - match: '(?<!-)\b\p{L}+|\d+(?:\.\d+)*'
147 - match: '(?<!-)\b\p{L}+|\d+(?:\.\d+)*'
141 scope: variable.parameter.powershell
148 scope: variable.parameter.powershell
@@ -187,51 +194,53 @@ contexts:
187 comment: Builtin cmdlets with reserved verbs
194 comment: Builtin cmdlets with reserved verbs
188 scope: support.function.powershell
195 scope: support.function.powershell
189 commentEmbeddedDocs:
196 commentEmbeddedDocs:
190− - match: ^(?i:(?:\s?|#)+(\.)(COMPONENT|DESCRIPTION|EXAMPLE|EXTERNALHELP|FORWARDHELPCATEGORY|FORWARDHELPTARGETNAME|FUNCTIONALITY|INPUTS|LINK|NOTES|OUTPUTS|REMOTEHELPRUNSPACE|ROLE|SYNOPSIS))
197+ - match: (?:^|\G)(?i:\s*(\.)(COMPONENT|DESCRIPTION|EXAMPLE|FUNCTIONALITY|INPUTS|LINK|NOTES|OUTPUTS|ROLE|SYNOPSIS))\s*$
198+ comment: these embedded doc keywords do not support arguments, must be the only thing on the line
191 scope: comment.documentation.embedded.powershell
199 scope: comment.documentation.embedded.powershell
192 captures:
200 captures:
193 1: constant.string.documentation.powershell
201 1: constant.string.documentation.powershell
194 2: keyword.operator.documentation.powershell
202 2: keyword.operator.documentation.powershell
195− - match: '(?i:\s?(\.)(PARAMETER|FORWARDHELPTARGETNAME|FORWARDHELPCATEGORY|REMOTEHELPRUNSPACE|EXTERNALHELP)\s+([a-z0-9-_]+))'
203+ - match: (?:^|\G)(?i:\s*(\.)(EXTERNALHELP|FORWARDHELP(?:CATEGORY|TARGETNAME)|PARAMETER|REMOTEHELPRUNSPACE))\s+(.+?)\s*$
204+ comment: these embedded doc keywords require arguments though the type required may be inconsistent, they may not all be able to use the same argument match
196 scope: comment.documentation.embedded.powershell
205 scope: comment.documentation.embedded.powershell
197 captures:
206 captures:
198 1: constant.string.documentation.powershell
207 1: constant.string.documentation.powershell
199 2: keyword.operator.documentation.powershell
208 2: keyword.operator.documentation.powershell
200 3: keyword.operator.documentation.powershell
209 3: keyword.operator.documentation.powershell
201 commentLine:
210 commentLine:
202− - match: '(?<![`\\-])#'
211+ - match: '(?<![`\\-])(#)#*'
203 captures:
212 captures:
204− 0: punctuation.definition.comment.powershell
213+ 1: punctuation.definition.comment.powershell
205 push:
214 push:
206 - meta_scope: comment.line.powershell
215 - meta_scope: comment.line.powershell
207 - match: $\n?
216 - match: $\n?
208 captures:
217 captures:
209− 0: punctuation.definition.comment.powershell
218+ 1: punctuation.definition.comment.powershell
210 pop: true
219 pop: true
211 - include: commentEmbeddedDocs
220 - include: commentEmbeddedDocs
212 - include: RequiresDirective
221 - include: RequiresDirective
213 doubleQuotedString:
222 doubleQuotedString:
214− - match: (?<!(?<!`)")"
223+ - match: '["\x{201C}-\x{201E}]'
215 captures:
224 captures:
216 0: punctuation.definition.string.begin.powershell
225 0: punctuation.definition.string.begin.powershell
217 push:
226 push:
218 - meta_scope: string.quoted.double.powershell
227 - meta_scope: string.quoted.double.powershell
219− - match: '"(?!")'
220− captures:
221− 0: punctuation.definition.string.end.powershell
222− pop: true
223 - match: '(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,64}\b'
228 - match: '(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,64}\b'
224 - include: variableNoProperty
229 - include: variableNoProperty
225 - include: doubleQuotedStringEscapes
230 - include: doubleQuotedStringEscapes
231+ - match: '["\x{201C}-\x{201E}]{2}'
232+ scope: constant.character.escape.powershell
226 - include: interpolation
233 - include: interpolation
227 - match: '`\s*$'
234 - match: '`\s*$'
228 scope: keyword.other.powershell
235 scope: keyword.other.powershell
236+ - match: '["\x{201C}-\x{201E}]'
237+ captures:
238+ 0: punctuation.definition.string.end.powershell
239+ pop: true
229 doubleQuotedStringEscapes:
240 doubleQuotedStringEscapes:
230− - match: '`[`0abefnrtv"''$]'
241+ - match: '`[`0abefnrtv''"\x{2018}-\x{201E}$]'
231 scope: constant.character.escape.powershell
242 scope: constant.character.escape.powershell
232 - include: unicodeEscape
243 - include: unicodeEscape
233− - match: '""'
234− scope: constant.character.escape.powershell
235 function:
244 function:
236 - match: '^(?:\s*+)(?i)(function|filter|configuration|workflow)\s+(?:(global|local|script|private):)?((?:\p{L}|\d|_|-|\.)+)'
245 - match: '^(?:\s*+)(?i)(function|filter|configuration|workflow)\s+(?:(global|local|script|private):)?((?:\p{L}|\d|_|-|\.)+)'
237 captures:
246 captures:
@@ -263,33 +272,23 @@ contexts:
263 4: keyword.operator.assignment.powershell
272 4: keyword.operator.assignment.powershell
264 - include: scriptblock
273 - include: scriptblock
265 - include: main
274 - include: main
266− interpolatedStringContent:
267− - match: \(
268− captures:
269− 0: punctuation.section.group.begin.powershell
270− push:
271− - meta_content_scope: interpolated.simple.source.powershell
272− - match: \)
273− captures:
274− 0: punctuation.section.group.end.powershell
275− pop: true
276− - include: main
277− - include: interpolation
278− - include: interpolatedStringContent
279 interpolation:
275 interpolation:
280− - match: (\$)(\()
276+ - match: (((\$)))((\())
281 captures:
277 captures:
282− 1: punctuation.definition.variable.powershell
278+ 1: keyword.other.substatement.powershell
279+ 2: punctuation.definition.substatement.powershell
280+ 3: punctuation.section.embedded.substatement.begin.powershell
283− 2: punctuation.section.group.begin.powershell
281+ 4: punctuation.section.group.begin.powershell
282+ 5: punctuation.section.embedded.substatement.begin.powershell
284 push:
283 push:
284+ - meta_scope: meta.embedded.substatement.powershell
285 - meta_content_scope: interpolated.complex.source.powershell
285 - meta_content_scope: interpolated.complex.source.powershell
286− - match: \)
286+ - match: (\))
287 captures:
287 captures:
288 0: punctuation.section.group.end.powershell
288 0: punctuation.section.group.end.powershell
289+ 1: punctuation.section.embedded.substatement.end.powershell
289 pop: true
290 pop: true
290 - include: main
291 - include: main
291− - include: interpolation
292− - include: interpolatedStringContent
293 numericConstant:
292 numericConstant:
294 - match: '(?<!\w)([-+]?0(?:x|X)[0-9a-fA-F_]+(?:U|u|L|l|UL|Ul|uL|ul|LU|Lu|lU|lu)?)((?i:[kmgtp]b)?)\b'
293 - match: '(?<!\w)([-+]?0(?:x|X)[0-9a-fA-F_]+(?:U|u|L|l|UL|Ul|uL|ul|LU|Lu|lU|lu)?)((?i:[kmgtp]b)?)\b'
295 captures:
294 captures:
@@ -330,6 +329,17 @@ contexts:
330 0: punctuation.section.braces.end.powershell
329 0: punctuation.section.braces.end.powershell
331 pop: true
330 pop: true
332 - include: main
331 - include: main
332+ subexpression:
333+ - match: \(
334+ captures:
335+ 0: punctuation.section.group.begin.powershell
336+ push:
337+ - meta_scope: meta.group.simple.subexpression.powershell
338+ - match: \)
339+ captures:
340+ 0: punctuation.section.group.end.powershell
341+ pop: true
342+ - include: main
333 type:
343 type:
334 - match: '\['
344 - match: '\['
335 captures:
345 captures:
assets/syntaxes/02_Extra/SCSS_Sass+1−1

Submodule changed.

assets/syntaxes/02_Extra/Stylus.sublime-syntax+2−2
@@ -197,7 +197,7 @@ contexts:
197 scope: entity.other.attribute-name.stylus
197 scope: entity.other.attribute-name.stylus
198 - match: |-
198 - match: |-
199 (?x) # multi-line regex definition mode
199 (?x) # multi-line regex definition mode
200− (?<=^|;|{)\s* # starts after begining of line, '{' or ';''
200+ (?<=^|;|{)\s* # starts after beginning of line, '{' or ';''
201 (?= # lookahead for
201 (?= # lookahead for
202 (
202 (
203 [a-zA-Z0-9_-] # then a letter
203 [a-zA-Z0-9_-] # then a letter
@@ -207,7 +207,7 @@ contexts:
207 (/\*.*?\*/) # comment
207 (/\*.*?\*/) # comment
208 )+
208 )+
209
209
210− \s*[:\s]\s* # value is separted by colon or space
210+ \s*[:\s]\s* # value is separated by colon or space
211
211
212 (?!(\s*\{)) # if there are only spaces afterwards
212 (?!(\s*\{)) # if there are only spaces afterwards
213
213
assets/syntaxes/02_Extra/SublimeJQnew file+1

Submodule changed.

assets/syntaxes/02_Extra/TOML+1−1

Submodule changed.

assets/syntaxes/02_Extra/TypeScript+1−1

Submodule changed.

assets/syntaxes/02_Extra/TypeScript.sublime-syntax+206−148
@@ -44,7 +44,7 @@ contexts:
44 - match: (?=$)
44 - match: (?=$)
45 pop: true
45 pop: true
46 access-modifier:
46 access-modifier:
47− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(abstract|public|protected|private|readonly|static|declare)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
47+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(abstract|declare|override|public|protected|private|readonly|static)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
48 scope: storage.modifier.ts
48 scope: storage.modifier.ts
49 after-operator-block-as-object-literal:
49 after-operator-block-as-object-literal:
50 - match: '(?<!\+\+|--)(?<=[:=(,\[?+!>]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&&|\|\||\*)\s*(\{)'
50 - match: '(?<!\+\+|--)(?<=[:=(,\[?+!>]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&&|\|\||\*)\s*(\{)'
@@ -106,7 +106,7 @@ contexts:
106 (?=
106 (?=
107 # sure shot arrow functions even if => is on new line
107 # sure shot arrow functions even if => is on new line
108 (
108 (
109− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
109+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
110 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
110 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
111 (
111 (
112 ([)]\s*:) | # ():
112 ([)]\s*:) | # ():
@@ -116,9 +116,9 @@ contexts:
116
116
117 # arrow function possible to detect only with => on same line
117 # arrow function possible to detect only with => on same line
118 (
118 (
119− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
119+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
120− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
120+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
121− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
121+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
122 \s*=> # arrow operator
122 \s*=> # arrow operator
123 )
123 )
124 )
124 )
@@ -268,7 +268,7 @@ contexts:
268 - include: decorator
268 - include: decorator
269 - match: (?<=:)\s*
269 - match: (?<=:)\s*
270 push:
270 push:
271− - match: '(?=\s|[;),}\]:\-\+]|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
271+ - match: '(?=\s|[;),}\]:\-\+]|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
272 pop: true
272 pop: true
273 - include: expression
273 - include: expression
274 - include: method-declaration
274 - include: method-declaration
@@ -317,7 +317,12 @@ contexts:
317 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(break|continue|do|goto|while)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
317 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(break|continue|do|goto|while)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
318 scope: keyword.control.loop.ts
318 scope: keyword.control.loop.ts
319 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(return)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
319 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(return)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
320+ captures:
320− scope: keyword.control.flow.ts
321+ 0: keyword.control.flow.ts
322+ push:
323+ - match: '(?=[;}]|$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
324+ pop: true
325+ - include: expression
321 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(case|default|switch)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
326 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(case|default|switch)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
322 scope: keyword.control.switch.ts
327 scope: keyword.control.switch.ts
323 - include: if-statement
328 - include: if-statement
@@ -762,7 +767,7 @@ contexts:
762 4: keyword.control.default.ts
767 4: keyword.control.default.ts
763 push:
768 push:
764 - meta_scope: meta.export.default.ts
769 - meta_scope: meta.export.default.ts
765− - match: (?=$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
770+ - match: (?=$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
766 pop: true
771 pop: true
767 - include: interface-declaration
772 - include: interface-declaration
768 - include: expression
773 - include: expression
@@ -772,7 +777,7 @@ contexts:
772 2: keyword.control.type.ts
777 2: keyword.control.type.ts
773 push:
778 push:
774 - meta_scope: meta.export.ts
779 - meta_scope: meta.export.ts
775− - match: (?=$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
780+ - match: (?=$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
776 pop: true
781 pop: true
777 - include: import-export-declaration
782 - include: import-export-declaration
778 expression:
783 expression:
@@ -785,11 +790,11 @@ contexts:
785 - include: string
790 - include: string
786 - include: decorator
791 - include: decorator
787 - include: destructuring-parameter
792 - include: destructuring-parameter
788− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|protected|private|readonly)\s+(?=(public|protected|private|readonly)\s+)'
793+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|protected|private|readonly)\s+(?=(override|public|protected|private|readonly)\s+)'
789 captures:
794 captures:
790 1: storage.modifier.ts
795 1: storage.modifier.ts
791 - match: |-
796 - match: |-
792− (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
797+ (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
793 # function assignment |
798 # function assignment |
794 (=\s*(
799 (=\s*(
795 ((async\s+)?(
800 ((async\s+)?(
@@ -798,10 +803,10 @@ contexts:
798 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
803 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
799 )) |
804 )) |
800 ((async\s*)?(
805 ((async\s*)?(
801− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
806+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
802 # sure shot arrow functions even if => is on new line
807 # sure shot arrow functions even if => is on new line
803 (
808 (
804− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
809+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
805 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
810 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
806 (
811 (
807 ([)]\s*:) | # ():
812 ([)]\s*:) | # ():
@@ -811,9 +816,9 @@ contexts:
811
816
812 # arrow function possible to detect only with => on same line
817 # arrow function possible to detect only with => on same line
813 (
818 (
814− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
819+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
815− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
820+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
816− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
821+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
817 \s*=> # arrow operator
822 \s*=> # arrow operator
818 )
823 )
819 ))
824 ))
@@ -831,18 +836,18 @@ contexts:
831 ))
836 ))
832 )) |
837 )) |
833 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
838 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
834− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
839+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
835− (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
840+ (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
836 ((async\s+)?(
841 ((async\s+)?(
837 (function\s*[(<*]) |
842 (function\s*[(<*]) |
838 (function\s+) |
843 (function\s+) |
839 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
844 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
840 )) |
845 )) |
841 ((async\s*)?(
846 ((async\s*)?(
842− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
847+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
843 # sure shot arrow functions even if => is on new line
848 # sure shot arrow functions even if => is on new line
844 (
849 (
845− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
850+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
846 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
851 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
847 (
852 (
848 ([)]\s*:) | # ():
853 ([)]\s*:) | # ():
@@ -852,9 +857,9 @@ contexts:
852
857
853 # arrow function possible to detect only with => on same line
858 # arrow function possible to detect only with => on same line
854 (
859 (
855− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
860+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
856− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
861+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
857− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
862+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
858 \s*=> # arrow operator
863 \s*=> # arrow operator
859 )
864 )
860 ))
865 ))
@@ -865,7 +870,7 @@ contexts:
865 3: entity.name.function.ts variable.language.this.ts
870 3: entity.name.function.ts variable.language.this.ts
866 4: entity.name.function.ts
871 4: entity.name.function.ts
867 5: keyword.operator.optional.ts
872 5: keyword.operator.optional.ts
868− - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*[:,]|$)'
873+ - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*[:,]|$)'
869 captures:
874 captures:
870 1: storage.modifier.ts
875 1: storage.modifier.ts
871 2: keyword.operator.rest.ts
876 2: keyword.operator.rest.ts
@@ -930,10 +935,11 @@ contexts:
930 scope: keyword.operator.comparison.ts
935 scope: keyword.operator.comparison.ts
931 - match: <=|>=|<>|<|>
936 - match: <=|>=|<>|<|>
932 scope: keyword.operator.relational.ts
937 scope: keyword.operator.relational.ts
933− - match: '(?<=[_$[:alnum:]])(\!)\s*(/)(?![/*])'
938+ - match: '(?<=[_$[:alnum:]])(\!)\s*(?:(/=)|(?:(/)(?![/*])))'
934 captures:
939 captures:
935 1: keyword.operator.logical.ts
940 1: keyword.operator.logical.ts
936− 2: keyword.operator.arithmetic.ts
941+ 2: keyword.operator.assignment.compound.ts
942+ 3: keyword.operator.arithmetic.ts
937 - match: \!|&&|\|\||\?\?
943 - match: \!|&&|\|\||\?\?
938 scope: keyword.operator.logical.ts
944 scope: keyword.operator.logical.ts
939 - match: \&|~|\^|\|
945 - match: \&|~|\^|\|
@@ -946,16 +952,18 @@ contexts:
946 scope: keyword.operator.increment.ts
952 scope: keyword.operator.increment.ts
947 - match: '%|\*|/|-|\+'
953 - match: '%|\*|/|-|\+'
948 scope: keyword.operator.arithmetic.ts
954 scope: keyword.operator.arithmetic.ts
949− - match: '(?<=[_$[:alnum:])\]])\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)+(/)(?![/*]))'
955+ - match: '(?<=[_$[:alnum:])\]])\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)+(?:(/=)|(?:(/)(?![/*]))))'
950 push:
956 push:
951− - match: '(/)(?!\*([^\*]|(\*[^\/]))*\*\/)'
957+ - match: '(?:(/=)|(?:(/)(?!\*([^\*]|(\*[^\/]))*\*\/)))'
952 captures:
958 captures:
953− 1: keyword.operator.arithmetic.ts
959+ 1: keyword.operator.assignment.compound.ts
960+ 2: keyword.operator.arithmetic.ts
954 pop: true
961 pop: true
955 - include: comment
962 - include: comment
956− - match: '(?<=[_$[:alnum:])\]])\s*(/)(?![/*])'
963+ - match: '(?<=[_$[:alnum:])\]])\s*(?:(/=)|(?:(/)(?![/*])))'
957 captures:
964 captures:
958− 1: keyword.operator.arithmetic.ts
965+ 1: keyword.operator.assignment.compound.ts
966+ 2: keyword.operator.arithmetic.ts
959 expressionPunctuations:
967 expressionPunctuations:
960 - include: punctuation-comma
968 - include: punctuation-comma
961 - include: punctuation-accessor
969 - include: punctuation-accessor
@@ -1021,10 +1029,10 @@ contexts:
1021 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1029 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1022 )) |
1030 )) |
1023 ((async\s*)?(
1031 ((async\s*)?(
1024− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1032+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1025 # sure shot arrow functions even if => is on new line
1033 # sure shot arrow functions even if => is on new line
1026 (
1034 (
1027− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1035+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1028 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1036 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1029 (
1037 (
1030 ([)]\s*:) | # ():
1038 ([)]\s*:) | # ():
@@ -1034,9 +1042,9 @@ contexts:
1034
1042
1035 # arrow function possible to detect only with => on same line
1043 # arrow function possible to detect only with => on same line
1036 (
1044 (
1037− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1045+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1038− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1046+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1039− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1047+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1040 \s*=> # arrow operator
1048 \s*=> # arrow operator
1041 )
1049 )
1042 ))
1050 ))
@@ -1054,18 +1062,18 @@ contexts:
1054 ))
1062 ))
1055 )) |
1063 )) |
1056 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
1064 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
1057− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
1065+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
1058− (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
1066+ (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
1059 ((async\s+)?(
1067 ((async\s+)?(
1060 (function\s*[(<*]) |
1068 (function\s*[(<*]) |
1061 (function\s+) |
1069 (function\s+) |
1062 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1070 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1063 )) |
1071 )) |
1064 ((async\s*)?(
1072 ((async\s*)?(
1065− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1073+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1066 # sure shot arrow functions even if => is on new line
1074 # sure shot arrow functions even if => is on new line
1067 (
1075 (
1068− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1076+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1069 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1077 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1070 (
1078 (
1071 ([)]\s*:) | # ():
1079 ([)]\s*:) | # ():
@@ -1075,9 +1083,9 @@ contexts:
1075
1083
1076 # arrow function possible to detect only with => on same line
1084 # arrow function possible to detect only with => on same line
1077 (
1085 (
1078− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1086+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1079− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1087+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1080− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1088+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1081 \s*=> # arrow operator
1089 \s*=> # arrow operator
1082 )
1090 )
1083 ))
1091 ))
@@ -1118,18 +1126,19 @@ contexts:
1118 - include: type-parameters
1126 - include: type-parameters
1119 - include: function-parameters
1127 - include: function-parameters
1120 - include: return-type
1128 - include: return-type
1129+ - include: type-function-return-type
1121 - include: decl-block
1130 - include: decl-block
1122 - match: \*
1131 - match: \*
1123 scope: keyword.generator.asterisk.ts
1132 scope: keyword.generator.asterisk.ts
1124 function-call:
1133 function-call:
1125− - match: '(?=(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1134+ - match: '(?=(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1126 push:
1135 push:
1127− - match: '(?<=\))(?!(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1136+ - match: '(?<=\))(?!(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1128 pop: true
1137 pop: true
1129 - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))'
1138 - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))'
1130 push:
1139 push:
1131 - meta_scope: meta.function-call.ts
1140 - meta_scope: meta.function-call.ts
1132− - match: '(?=\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1141+ - match: '(?=\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1133 pop: true
1142 pop: true
1134 - include: function-call-target
1143 - include: function-call-target
1135 - include: comment
1144 - include: comment
@@ -1169,7 +1178,7 @@ contexts:
1169 6: meta.definition.function.ts entity.name.function.ts
1178 6: meta.definition.function.ts entity.name.function.ts
1170 push:
1179 push:
1171 - meta_scope: meta.function.ts
1180 - meta_scope: meta.function.ts
1172− - match: '(?=;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|(?<=\})'
1181+ - match: '(?=;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|(?<=\})'
1173 pop: true
1182 pop: true
1174 - include: function-name
1183 - include: function-name
1175 - include: function-body
1184 - include: function-body
@@ -1221,10 +1230,10 @@ contexts:
1221 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1230 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1222 )) |
1231 )) |
1223 ((async\s*)?(
1232 ((async\s*)?(
1224− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1233+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1225 # sure shot arrow functions even if => is on new line
1234 # sure shot arrow functions even if => is on new line
1226 (
1235 (
1227− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1236+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1228 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1237 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1229 (
1238 (
1230 ([)]\s*:) | # ():
1239 ([)]\s*:) | # ():
@@ -1234,9 +1243,9 @@ contexts:
1234
1243
1235 # arrow function possible to detect only with => on same line
1244 # arrow function possible to detect only with => on same line
1236 (
1245 (
1237− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1246+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1238− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1247+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1239− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1248+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1240 \s*=> # arrow operator
1249 \s*=> # arrow operator
1241 )
1250 )
1242 ))
1251 ))
@@ -1260,7 +1269,7 @@ contexts:
1260 - match: "[_$[:alpha:]][_$[:alnum:]]*"
1269 - match: "[_$[:alpha:]][_$[:alnum:]]*"
1261 scope: variable.other.readwrite.ts
1270 scope: variable.other.readwrite.ts
1262 if-statement:
1271 if-statement:
1263− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?=\bif\s*(\(([^\(\)]|(\([^\(\)]*\)))*\))\s*(?!\{))'
1272+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?=\bif\s*(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))\s*(?!\{))'
1264 push:
1273 push:
1265 - match: '(?=;|$|\})'
1274 - match: '(?=;|$|\})'
1266 pop: true
1275 pop: true
@@ -1275,12 +1284,12 @@ contexts:
1275 0: meta.brace.round.ts
1284 0: meta.brace.round.ts
1276 pop: true
1285 pop: true
1277 - include: expression
1286 - include: expression
1278− - match: '(?<=\))\s*\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/([gimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
1287+ - match: '(?<=\))\s*\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)*\])+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
1279 captures:
1288 captures:
1280 0: punctuation.definition.string.begin.ts
1289 0: punctuation.definition.string.begin.ts
1281 push:
1290 push:
1282 - meta_scope: string.regexp.ts
1291 - meta_scope: string.regexp.ts
1283− - match: "(/)([gimsuy]*)"
1292+ - match: "(/)([dgimsuy]*)"
1284 captures:
1293 captures:
1285 1: punctuation.definition.string.end.ts
1294 1: punctuation.definition.string.end.ts
1286 2: keyword.other.ts
1295 2: keyword.other.ts
@@ -1414,6 +1423,9 @@ contexts:
1414 2: keyword.operator.type.modifier.ts
1423 2: keyword.operator.type.modifier.ts
1415 3: keyword.operator.optional.ts
1424 3: keyword.operator.optional.ts
1416 pop: true
1425 pop: true
1426+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+'
1427+ captures:
1428+ 1: keyword.control.as.ts
1417 - include: type
1429 - include: type
1418 inline-tags:
1430 inline-tags:
1419 - match: '(\[)[^\]]+(\])(?={@(?:link|linkcode|linkplain|tutorial))'
1431 - match: '(\[)[^\]]+(\])(?={@(?:link|linkcode|linkplain|tutorial))'
@@ -1504,25 +1516,27 @@ contexts:
1504 - include: this-literal
1516 - include: this-literal
1505 - include: super-literal
1517 - include: super-literal
1506 method-declaration:
1518 method-declaration:
1507− - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?\s*\b(constructor)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1519+ - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?\s*\b(constructor)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1508 captures:
1520 captures:
1509 1: storage.modifier.ts
1521 1: storage.modifier.ts
1510 2: storage.modifier.ts
1522 2: storage.modifier.ts
1511− 3: storage.modifier.async.ts
1523+ 3: storage.modifier.ts
1512− 4: storage.type.ts
1524+ 4: storage.modifier.async.ts
1525+ 5: storage.type.ts
1513 push:
1526 push:
1514 - meta_scope: meta.method.declaration.ts
1527 - meta_scope: meta.method.declaration.ts
1515 - match: '(?=\}|;|,|$)|(?<=\})'
1528 - match: '(?=\}|;|,|$)|(?<=\})'
1516 pop: true
1529 pop: true
1517 - include: method-declaration-name
1530 - include: method-declaration-name
1518 - include: function-body
1531 - include: function-body
1519− - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:(?:\s*\b(new)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|(?:(\*)\s*)?)(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])'
1532+ - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:(?:\s*\b(new)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|(?:(\*)\s*)?)(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])'
1520 captures:
1533 captures:
1521 1: storage.modifier.ts
1534 1: storage.modifier.ts
1522 2: storage.modifier.ts
1535 2: storage.modifier.ts
1523− 3: storage.modifier.async.ts
1536+ 3: storage.modifier.ts
1537+ 4: storage.modifier.async.ts
1524− 4: keyword.operator.new.ts
1538+ 5: keyword.operator.new.ts
1525− 5: keyword.generator.asterisk.ts
1539+ 6: keyword.generator.asterisk.ts
1526 push:
1540 push:
1527 - meta_scope: meta.method.declaration.ts
1541 - meta_scope: meta.method.declaration.ts
1528 - match: '(?=\}|;|,|$)|(?<=\})'
1542 - match: '(?=\}|;|,|$)|(?<=\})'
@@ -1530,7 +1544,7 @@ contexts:
1530 - include: method-declaration-name
1544 - include: method-declaration-name
1531 - include: function-body
1545 - include: function-body
1532 - match: |-
1546 - match: |-
1533− (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1547+ (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1534 (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1548 (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1535 (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1549 (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1536 (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1550 (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
@@ -1539,13 +1553,14 @@ contexts:
1539 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1553 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1540 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1554 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1541 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1555 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1542− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1556+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1543 captures:
1557 captures:
1544 1: storage.modifier.ts
1558 1: storage.modifier.ts
1545 2: storage.modifier.ts
1559 2: storage.modifier.ts
1546− 3: storage.modifier.async.ts
1560+ 3: storage.modifier.ts
1561+ 4: storage.modifier.async.ts
1547− 4: storage.type.property.ts
1562+ 5: storage.type.property.ts
1548− 5: keyword.generator.asterisk.ts
1563+ 6: keyword.generator.asterisk.ts
1549 push:
1564 push:
1550 - meta_scope: meta.method.declaration.ts
1565 - meta_scope: meta.method.declaration.ts
1551 - match: '(?=\}|;|,|$)|(?<=\})'
1566 - match: '(?=\}|;|,|$)|(?<=\})'
@@ -1582,7 +1597,7 @@ contexts:
1582 3: storage.type.namespace.ts
1597 3: storage.type.namespace.ts
1583 push:
1598 push:
1584 - meta_scope: meta.namespace.declaration.ts
1599 - meta_scope: meta.namespace.declaration.ts
1585− - match: '(?<=\})|(?=;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
1600+ - match: '(?<=\})|(?=;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
1586 pop: true
1601 pop: true
1587 - include: comment
1602 - include: comment
1588 - include: string
1603 - include: string
@@ -1598,9 +1613,7 @@ contexts:
1598 - meta_scope: new.expr.ts
1613 - meta_scope: new.expr.ts
1599 - match: '(?<=\))|(?=[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))new(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1614 - match: '(?<=\))|(?=[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))new(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1600 pop: true
1615 pop: true
1601− - include: paren-expression
1616+ - include: expression
1602− - include: class-declaration
1603− - include: type
1604 null-literal:
1617 null-literal:
1605 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))null(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1618 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))null(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1606 scope: constant.language.null.ts
1619 scope: constant.language.null.ts
@@ -1781,7 +1794,7 @@ contexts:
1781 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1794 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1782 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1795 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1783 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1796 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1784− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1797+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1785 captures:
1798 captures:
1786 1: storage.modifier.async.ts
1799 1: storage.modifier.async.ts
1787 2: storage.type.property.ts
1800 2: storage.type.property.ts
@@ -1802,7 +1815,7 @@ contexts:
1802 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1815 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1803 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1816 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1804 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1817 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1805− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1818+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1806 captures:
1819 captures:
1807 1: storage.modifier.async.ts
1820 1: storage.modifier.async.ts
1808 2: storage.type.property.ts
1821 2: storage.type.property.ts
@@ -1864,10 +1877,10 @@ contexts:
1864 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1877 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1865 )) |
1878 )) |
1866 ((async\s*)?(
1879 ((async\s*)?(
1867− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1880+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1868 # sure shot arrow functions even if => is on new line
1881 # sure shot arrow functions even if => is on new line
1869 (
1882 (
1870− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1883+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1871 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1884 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1872 (
1885 (
1873 ([)]\s*:) | # ():
1886 ([)]\s*:) | # ():
@@ -1877,9 +1890,9 @@ contexts:
1877
1890
1878 # arrow function possible to detect only with => on same line
1891 # arrow function possible to detect only with => on same line
1879 (
1892 (
1880− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1893+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1881− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1894+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1882− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1895+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1883 \s*=> # arrow operator
1896 \s*=> # arrow operator
1884 )
1897 )
1885 ))
1898 ))
@@ -1930,7 +1943,7 @@ contexts:
1930 - meta_scope: meta.object.member.ts
1943 - meta_scope: meta.object.member.ts
1931 - match: '(?=,|\})'
1944 - match: '(?=,|\})'
1932 pop: true
1945 pop: true
1933− - match: '(?<=:)\s*(async)?(?=\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1946+ - match: '(?<=:)\s*(async)?(?=\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1934 captures:
1947 captures:
1935 1: storage.modifier.async.ts
1948 1: storage.modifier.async.ts
1936 push:
1949 push:
@@ -1946,7 +1959,7 @@ contexts:
1946 0: meta.brace.round.ts
1959 0: meta.brace.round.ts
1947 pop: true
1960 pop: true
1948 - include: expression-inside-possibly-arrow-parens
1961 - include: expression-inside-possibly-arrow-parens
1949− - match: '(?<=:)\s*(async)?\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1962+ - match: '(?<=:)\s*(async)?\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1950 captures:
1963 captures:
1951 1: storage.modifier.async.ts
1964 1: storage.modifier.async.ts
1952 2: meta.brace.round.ts
1965 2: meta.brace.round.ts
@@ -1963,7 +1976,7 @@ contexts:
1963 - match: (?<=\>)
1976 - match: (?<=\>)
1964 pop: true
1977 pop: true
1965 - include: type-parameters
1978 - include: type-parameters
1966− - match: '(?<=\>)\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1979+ - match: '(?<=\>)\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1967 captures:
1980 captures:
1968 1: meta.brace.round.ts
1981 1: meta.brace.round.ts
1969 push:
1982 push:
@@ -1997,11 +2010,11 @@ contexts:
1997 - include: destructuring-parameter-rest
2010 - include: destructuring-parameter-rest
1998 - include: variable-initializer
2011 - include: variable-initializer
1999 parameter-name:
2012 parameter-name:
2000− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|protected|private|readonly)\s+(?=(public|protected|private|readonly)\s+)'
2013+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|protected|private|readonly)\s+(?=(override|public|protected|private|readonly)\s+)'
2001 captures:
2014 captures:
2002 1: storage.modifier.ts
2015 1: storage.modifier.ts
2003 - match: |-
2016 - match: |-
2004− (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
2017+ (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
2005 # function assignment |
2018 # function assignment |
2006 (=\s*(
2019 (=\s*(
2007 ((async\s+)?(
2020 ((async\s+)?(
@@ -2010,10 +2023,10 @@ contexts:
2010 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2023 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2011 )) |
2024 )) |
2012 ((async\s*)?(
2025 ((async\s*)?(
2013− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
2026+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
2014 # sure shot arrow functions even if => is on new line
2027 # sure shot arrow functions even if => is on new line
2015 (
2028 (
2016− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
2029+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
2017 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
2030 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
2018 (
2031 (
2019 ([)]\s*:) | # ():
2032 ([)]\s*:) | # ():
@@ -2023,9 +2036,9 @@ contexts:
2023
2036
2024 # arrow function possible to detect only with => on same line
2037 # arrow function possible to detect only with => on same line
2025 (
2038 (
2026− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
2039+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
2027− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
2040+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
2028− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
2041+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
2029 \s*=> # arrow operator
2042 \s*=> # arrow operator
2030 )
2043 )
2031 ))
2044 ))
@@ -2043,18 +2056,18 @@ contexts:
2043 ))
2056 ))
2044 )) |
2057 )) |
2045 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
2058 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
2046− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
2059+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
2047− (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
2060+ (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
2048 ((async\s+)?(
2061 ((async\s+)?(
2049 (function\s*[(<*]) |
2062 (function\s*[(<*]) |
2050 (function\s+) |
2063 (function\s+) |
2051 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2064 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2052 )) |
2065 )) |
2053 ((async\s*)?(
2066 ((async\s*)?(
2054− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
2067+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
2055 # sure shot arrow functions even if => is on new line
2068 # sure shot arrow functions even if => is on new line
2056 (
2069 (
2057− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
2070+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
2058 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
2071 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
2059 (
2072 (
2060 ([)]\s*:) | # ():
2073 ([)]\s*:) | # ():
@@ -2064,9 +2077,9 @@ contexts:
2064
2077
2065 # arrow function possible to detect only with => on same line
2078 # arrow function possible to detect only with => on same line
2066 (
2079 (
2067− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
2080+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
2068− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
2081+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
2069− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
2082+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
2070 \s*=> # arrow operator
2083 \s*=> # arrow operator
2071 )
2084 )
2072 ))
2085 ))
@@ -2077,7 +2090,7 @@ contexts:
2077 3: entity.name.function.ts variable.language.this.ts
2090 3: entity.name.function.ts variable.language.this.ts
2078 4: entity.name.function.ts
2091 4: entity.name.function.ts
2079 5: keyword.operator.optional.ts
2092 5: keyword.operator.optional.ts
2080− - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)'
2093+ - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)'
2081 captures:
2094 captures:
2082 1: storage.modifier.ts
2095 1: storage.modifier.ts
2083 2: keyword.operator.rest.ts
2096 2: keyword.operator.rest.ts
@@ -2137,14 +2150,14 @@ contexts:
2137 pop: true
2150 pop: true
2138 - include: expression
2151 - include: expression
2139 paren-expression-possibly-arrow:
2152 paren-expression-possibly-arrow:
2140− - match: '(?<=[(=,])\s*(async)?(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
2153+ - match: '(?<=[(=,])\s*(async)?(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
2141 captures:
2154 captures:
2142 1: storage.modifier.async.ts
2155 1: storage.modifier.async.ts
2143 push:
2156 push:
2144 - match: (?<=\))
2157 - match: (?<=\))
2145 pop: true
2158 pop: true
2146 - include: paren-expression-possibly-arrow-with-typeparameters
2159 - include: paren-expression-possibly-arrow-with-typeparameters
2147− - match: '(?<=[(=,]|=>|^return|[^\._$[:alnum:]]return)\s*(async)?(?=\s*((((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\()|(<))\s*$)'
2160+ - match: '(?<=[(=,]|=>|^return|[^\._$[:alnum:]]return)\s*(async)?(?=\s*((((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\()|(<))\s*$)'
2148 captures:
2161 captures:
2149 1: storage.modifier.async.ts
2162 1: storage.modifier.async.ts
2150 push:
2163 push:
@@ -2164,7 +2177,7 @@ contexts:
2164 pop: true
2177 pop: true
2165 - include: expression-inside-possibly-arrow-parens
2178 - include: expression-inside-possibly-arrow-parens
2166 possibly-arrow-return-type:
2179 possibly-arrow-return-type:
2167− - match: '(?<=\)|^)\s*(:)(?=\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*=>)'
2180+ - match: '(?<=\)|^)\s*(:)(?=\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*=>)'
2168 captures:
2181 captures:
2169 1: meta.arrow.ts meta.return.type.arrow.ts keyword.operator.type.annotation.ts
2182 1: meta.arrow.ts meta.return.type.arrow.ts keyword.operator.type.annotation.ts
2170 push:
2183 push:
@@ -2211,23 +2224,23 @@ contexts:
2211 pop: true
2224 pop: true
2212 - include: string-character-escape
2225 - include: string-character-escape
2213 regex:
2226 regex:
2214− - match: '(?<!\+\+|--|})(?<=[=(:,\[?+!]|^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case|=>|&&|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[\()]|\\.|\[([^\]\\]|\\.)+\]|\(([^\)\\]|\\.)+\))+\/([gimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2227+ - match: '(?<!\+\+|--|})(?<=[=(:,\[?+!]|^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case|=>|&&|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[\()]|\\.|\[([^\]\\]|\\.)+\]|\(([^\)\\]|\\.)+\))+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2215 captures:
2228 captures:
2216 1: punctuation.definition.string.begin.ts
2229 1: punctuation.definition.string.begin.ts
2217 push:
2230 push:
2218 - meta_scope: string.regexp.ts
2231 - meta_scope: string.regexp.ts
2219− - match: "(/)([gimsuy]*)"
2232+ - match: "(/)([dgimsuy]*)"
2220 captures:
2233 captures:
2221 1: punctuation.definition.string.end.ts
2234 1: punctuation.definition.string.end.ts
2222 2: keyword.other.ts
2235 2: keyword.other.ts
2223 pop: true
2236 pop: true
2224 - include: regexp
2237 - include: regexp
2225− - match: '((?<![_$[:alnum:])\]]|\+\+|--|}|\*\/)|((?<=^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case))\s*)\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/([gimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2238+ - match: '((?<![_$[:alnum:])\]]|\+\+|--|}|\*\/)|((?<=^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case))\s*)\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)*\])+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2226 captures:
2239 captures:
2227 0: punctuation.definition.string.begin.ts
2240 0: punctuation.definition.string.begin.ts
2228 push:
2241 push:
2229 - meta_scope: string.regexp.ts
2242 - meta_scope: string.regexp.ts
2230− - match: "(/)([gimsuy]*)"
2243+ - match: "(/)([dgimsuy]*)"
2231 captures:
2244 captures:
2232 1: punctuation.definition.string.end.ts
2245 1: punctuation.definition.string.end.ts
2233 2: keyword.other.ts
2246 2: keyword.other.ts
@@ -2430,7 +2443,7 @@ contexts:
2430 4: support.variable.property.target.ts
2443 4: support.variable.property.target.ts
2431 - match: |-
2444 - match: |-
2432 (?x) (?:(\.)|(\?\.(?!\s*[[:digit:]]))) \s* (?:
2445 (?x) (?:(\.)|(\?\.(?!\s*[[:digit:]]))) \s* (?:
2433− (?:(constructor|length|prototype|__proto__)\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\())
2446+ (?:(constructor|length|prototype|__proto__)\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\())
2434 |
2447 |
2435 (?:(EPSILON|MAX_SAFE_INTEGER|MAX_VALUE|MIN_SAFE_INTEGER|MIN_VALUE|NEGATIVE_INFINITY|POSITIVE_INFINITY)\b(?!\$)))
2448 (?:(EPSILON|MAX_SAFE_INTEGER|MAX_VALUE|MIN_SAFE_INTEGER|MIN_VALUE|NEGATIVE_INFINITY|POSITIVE_INFINITY)\b(?!\$)))
2436 captures:
2449 captures:
@@ -2536,7 +2549,7 @@ contexts:
2536 |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary
2549 |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary
2537 |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead
2550 |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead
2538 |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile
2551 |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile
2539− |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\()
2552+ |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\()
2540 captures:
2553 captures:
2541 1: punctuation.accessor.ts
2554 1: punctuation.accessor.ts
2542 2: punctuation.accessor.optional.ts
2555 2: punctuation.accessor.optional.ts
@@ -2703,20 +2716,34 @@ contexts:
2703 0: case-clause.expr.ts punctuation.definition.section.case-statement.ts
2716 0: case-clause.expr.ts punctuation.definition.section.case-statement.ts
2704 - include: statements
2717 - include: statements
2705 template:
2718 template:
2719+ - include: template-call
2720+ - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2721+ captures:
2722+ 1: entity.name.function.tagged-template.ts
2723+ 2: punctuation.definition.string.template.begin.ts
2724+ push:
2725+ - meta_scope: string.template.ts
2726+ - match: "`"
2727+ captures:
2728+ 0: punctuation.definition.string.template.end.ts
2729+ pop: true
2730+ - include: template-substitution-element
2731+ - include: string-character-escape
2732+ template-call:
2706− - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*)(<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2733+ - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*)(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2707 push:
2734 push:
2708 - meta_scope: string.template.ts
2735 - meta_scope: string.template.ts
2709 - match: (?=`)
2736 - match: (?=`)
2710 pop: true
2737 pop: true
2711 - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*))'
2738 - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*))'
2712 push:
2739 push:
2713− - match: '(?=(<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2740+ - match: '(?=(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2714 pop: true
2741 pop: true
2715 - include: support-function-call-identifiers
2742 - include: support-function-call-identifiers
2716 - match: "([_$[:alpha:]][_$[:alnum:]]*)"
2743 - match: "([_$[:alpha:]][_$[:alnum:]]*)"
2717 scope: entity.name.function.tagged-template.ts
2744 scope: entity.name.function.tagged-template.ts
2718 - include: type-arguments
2745 - include: type-arguments
2719− - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?=(<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)`)'
2746+ - match: '([_$[:alpha:]][_$[:alnum:]]*)?\s*(?=(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)`)'
2720 captures:
2747 captures:
2721 1: entity.name.function.tagged-template.ts
2748 1: entity.name.function.tagged-template.ts
2722 push:
2749 push:
@@ -2724,6 +2751,20 @@ contexts:
2724 - match: (?=`)
2751 - match: (?=`)
2725 pop: true
2752 pop: true
2726 - include: type-arguments
2753 - include: type-arguments
2754+ template-substitution-element:
2755+ - match: '\$\{'
2756+ captures:
2757+ 0: punctuation.definition.template-expression.begin.ts
2758+ push:
2759+ - meta_scope: meta.template.expression.ts
2760+ - meta_content_scope: meta.embedded.line.ts
2761+ - match: '\}'
2762+ captures:
2763+ 0: punctuation.definition.template-expression.end.ts
2764+ pop: true
2765+ - include: expression
2766+ template-type:
2767+ - include: template-call
2727 - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2768 - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2728 captures:
2769 captures:
2729 1: entity.name.function.tagged-template.ts
2770 1: entity.name.function.tagged-template.ts
@@ -2734,9 +2775,9 @@ contexts:
2734 captures:
2775 captures:
2735 0: punctuation.definition.string.template.end.ts
2776 0: punctuation.definition.string.template.end.ts
2736 pop: true
2777 pop: true
2737− - include: template-substitution-element
2778+ - include: template-type-substitution-element
2738 - include: string-character-escape
2779 - include: string-character-escape
2739− template-substitution-element:
2780+ template-type-substitution-element:
2740 - match: '\$\{'
2781 - match: '\$\{'
2741 captures:
2782 captures:
2742 0: punctuation.definition.template-expression.begin.ts
2783 0: punctuation.definition.template-expression.begin.ts
@@ -2747,7 +2788,7 @@ contexts:
2747 captures:
2788 captures:
2748 0: punctuation.definition.template-expression.end.ts
2789 0: punctuation.definition.template-expression.end.ts
2749 pop: true
2790 pop: true
2750− - include: expression
2791+ - include: type
2751 ternary-expression:
2792 ternary-expression:
2752 - match: '(?!\?\.\s*[^[:digit:]])(\?)(?!\?)'
2793 - match: '(?!\?\.\s*[^[:digit:]])(\?)(?!\?)'
2753 captures:
2794 captures:
@@ -2763,7 +2804,7 @@ contexts:
2763 scope: variable.language.this.ts
2804 scope: variable.language.this.ts
2764 type:
2805 type:
2765 - include: comment
2806 - include: comment
2766− - include: string
2807+ - include: type-string
2767 - include: numeric-literal
2808 - include: numeric-literal
2768 - include: type-primitive
2809 - include: type-primitive
2769 - include: type-builtin-literals
2810 - include: type-builtin-literals
@@ -2788,15 +2829,23 @@ contexts:
2788 4: entity.name.type.alias.ts
2829 4: entity.name.type.alias.ts
2789 push:
2830 push:
2790 - meta_scope: meta.type.declaration.ts
2831 - meta_scope: meta.type.declaration.ts
2791− - match: '(?=\}|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2832+ - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2792 pop: true
2833 pop: true
2793 - include: comment
2834 - include: comment
2794 - include: type-parameters
2835 - include: type-parameters
2836+ - match: '(=)\s*(intrinsic)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2837+ captures:
2838+ 1: keyword.operator.assignment.ts
2839+ 2: keyword.control.intrinsic.ts
2840+ push:
2841+ - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2842+ pop: true
2843+ - include: type
2795 - match: (=)\s*
2844 - match: (=)\s*
2796 captures:
2845 captures:
2797 1: keyword.operator.assignment.ts
2846 1: keyword.operator.assignment.ts
2798 push:
2847 push:
2799− - match: '(?=\}|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2848+ - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2800 pop: true
2849 pop: true
2801 - include: type
2850 - include: type
2802 type-annotation:
2851 type-annotation:
@@ -2854,17 +2903,19 @@ contexts:
2854 - include: type
2903 - include: type
2855 - include: type
2904 - include: type
2856 type-fn-type-parameters:
2905 type-fn-type-parameters:
2857− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(new)\b(?=\s*\<)'
2906+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(abstract)\s+)?(new)\b(?=\s*\<)'
2858 captures:
2907 captures:
2859− 1: meta.type.constructor.ts keyword.control.new.ts
2908+ 1: meta.type.constructor.ts storage.modifier.ts
2909+ 2: meta.type.constructor.ts keyword.control.new.ts
2860 push:
2910 push:
2861 - match: (?<=>)
2911 - match: (?<=>)
2862 pop: true
2912 pop: true
2863 - include: comment
2913 - include: comment
2864 - include: type-parameters
2914 - include: type-parameters
2865− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(new)\b\s*(?=\()'
2915+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(abstract)\s+)?(new)\b\s*(?=\()'
2866 captures:
2916 captures:
2917+ 1: storage.modifier.ts
2867− 1: keyword.control.new.ts
2918+ 2: keyword.control.new.ts
2868 push:
2919 push:
2869 - meta_scope: meta.type.constructor.ts
2920 - meta_scope: meta.type.constructor.ts
2870 - match: (?<=\))
2921 - match: (?<=\))
@@ -2993,8 +3044,6 @@ contexts:
2993 scope: keyword.operator.ternary.ts
3044 scope: keyword.operator.ternary.ts
2994 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))infer(?=\s+[_$[:alpha:]])'
3045 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))infer(?=\s+[_$[:alpha:]])'
2995 scope: keyword.operator.expression.infer.ts
3046 scope: keyword.operator.expression.infer.ts
2996− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))awaited(?=\s+[_$[:alpha:]])'
2997− scope: keyword.operator.expression.awaited.ts
2998 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))import(?=\s*\()'
3047 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))import(?=\s*\()'
2999 scope: keyword.operator.expression.import.ts
3048 scope: keyword.operator.expression.import.ts
3000 type-parameters:
3049 type-parameters:
@@ -3037,7 +3086,7 @@ contexts:
3037 ))
3086 ))
3038 )) |
3087 )) |
3039 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3088 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3040− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))))
3089+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))))
3041 captures:
3090 captures:
3042 1: storage.modifier.ts
3091 1: storage.modifier.ts
3043 2: keyword.operator.rest.ts
3092 2: keyword.operator.rest.ts
@@ -3074,6 +3123,10 @@ contexts:
3074 type-primitive:
3123 type-primitive:
3075 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(string|number|bigint|boolean|symbol|any|void|never|unknown)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3124 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(string|number|bigint|boolean|symbol|any|void|never|unknown)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3076 scope: support.type.primitive.ts
3125 scope: support.type.primitive.ts
3126+ type-string:
3127+ - include: qstring-single
3128+ - include: qstring-double
3129+ - include: template-type
3077 type-tuple:
3130 type-tuple:
3078 - match: '\['
3131 - match: '\['
3079 captures:
3132 captures:
@@ -3095,7 +3148,12 @@ contexts:
3095 - include: punctuation-comma
3148 - include: punctuation-comma
3096 typeof-operator:
3149 typeof-operator:
3097 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))typeof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3150 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))typeof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3151+ captures:
3098− scope: keyword.operator.expression.typeof.ts
3152+ 0: keyword.operator.expression.typeof.ts
3153+ push:
3154+ - match: '(?=[,);}\]=>:&|{\?]|$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
3155+ pop: true
3156+ - include: expression
3099 undefined-literal:
3157 undefined-literal:
3100 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))undefined(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3158 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))undefined(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3101 scope: constant.language.undefined.ts
3159 scope: constant.language.undefined.ts
@@ -3103,7 +3161,7 @@ contexts:
3103 - match: '(?=(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))'
3161 - match: '(?=(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))'
3104 push:
3162 push:
3105 - meta_scope: meta.var.expr.ts
3163 - meta_scope: meta.var.expr.ts
3106− - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|^\s*$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^let|[^\._$[:alnum:]]let|^var|[^\._$[:alnum:]]var)(?=\s*$)))'
3164+ - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^let|[^\._$[:alnum:]]let|^var|[^\._$[:alnum:]]var)(?=\s*$)))'
3107 pop: true
3165 pop: true
3108 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3166 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3109 captures:
3167 captures:
@@ -3136,7 +3194,7 @@ contexts:
3136 3: storage.type.ts
3194 3: storage.type.ts
3137 push:
3195 push:
3138 - meta_scope: meta.var.expr.ts
3196 - meta_scope: meta.var.expr.ts
3139− - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|^\s*$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^const|[^\._$[:alnum:]]const)(?=\s*$)))'
3197+ - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^const|[^\._$[:alnum:]]const)(?=\s*$)))'
3140 pop: true
3198 pop: true
3141 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3199 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3142 captures:
3200 captures:
@@ -3173,10 +3231,10 @@ contexts:
3173 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3231 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3174 )) |
3232 )) |
3175 ((async\s*)?(
3233 ((async\s*)?(
3176− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3234+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3177 # sure shot arrow functions even if => is on new line
3235 # sure shot arrow functions even if => is on new line
3178 (
3236 (
3179− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3237+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3180 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3238 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3181 (
3239 (
3182 ([)]\s*:) | # ():
3240 ([)]\s*:) | # ():
@@ -3186,9 +3244,9 @@ contexts:
3186
3244
3187 # arrow function possible to detect only with => on same line
3245 # arrow function possible to detect only with => on same line
3188 (
3246 (
3189− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3247+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3190− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3248+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3191− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3249+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3192 \s*=> # arrow operator
3250 \s*=> # arrow operator
3193 )
3251 )
3194 ))
3252 ))
@@ -3206,18 +3264,18 @@ contexts:
3206 ))
3264 ))
3207 )) |
3265 )) |
3208 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3266 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3209− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3267+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3210− (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3268+ (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3211 ((async\s+)?(
3269 ((async\s+)?(
3212 (function\s*[(<*]) |
3270 (function\s*[(<*]) |
3213 (function\s+) |
3271 (function\s+) |
3214 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3272 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3215 )) |
3273 )) |
3216 ((async\s*)?(
3274 ((async\s*)?(
3217− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3275+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3218 # sure shot arrow functions even if => is on new line
3276 # sure shot arrow functions even if => is on new line
3219 (
3277 (
3220− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3278+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3221 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3279 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3222 (
3280 (
3223 ([)]\s*:) | # ():
3281 ([)]\s*:) | # ():
@@ -3227,9 +3285,9 @@ contexts:
3227
3285
3228 # arrow function possible to detect only with => on same line
3286 # arrow function possible to detect only with => on same line
3229 (
3287 (
3230− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3288+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3231− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3289+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3232− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3290+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3233 \s*=> # arrow operator
3291 \s*=> # arrow operator
3234 )
3292 )
3235 ))
3293 ))
@@ -3260,10 +3318,10 @@ contexts:
3260 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3318 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3261 )) |
3319 )) |
3262 ((async\s*)?(
3320 ((async\s*)?(
3263− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3321+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3264 # sure shot arrow functions even if => is on new line
3322 # sure shot arrow functions even if => is on new line
3265 (
3323 (
3266− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3324+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3267 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3325 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3268 (
3326 (
3269 ([)]\s*:) | # ():
3327 ([)]\s*:) | # ():
@@ -3273,9 +3331,9 @@ contexts:
3273
3331
3274 # arrow function possible to detect only with => on same line
3332 # arrow function possible to detect only with => on same line
3275 (
3333 (
3276− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3334+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3277− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3335+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3278− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3336+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3279 \s*=> # arrow operator
3337 \s*=> # arrow operator
3280 )
3338 )
3281 ))
3339 ))
@@ -3293,18 +3351,18 @@ contexts:
3293 ))
3351 ))
3294 )) |
3352 )) |
3295 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3353 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3296− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3354+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3297− (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3355+ (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3298 ((async\s+)?(
3356 ((async\s+)?(
3299 (function\s*[(<*]) |
3357 (function\s*[(<*]) |
3300 (function\s+) |
3358 (function\s+) |
3301 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3359 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3302 )) |
3360 )) |
3303 ((async\s*)?(
3361 ((async\s*)?(
3304− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3362+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3305 # sure shot arrow functions even if => is on new line
3363 # sure shot arrow functions even if => is on new line
3306 (
3364 (
3307− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3365+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3308 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3366 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3309 (
3367 (
3310 ([)]\s*:) | # ():
3368 ([)]\s*:) | # ():
@@ -3314,9 +3372,9 @@ contexts:
3314
3372
3315 # arrow function possible to detect only with => on same line
3373 # arrow function possible to detect only with => on same line
3316 (
3374 (
3317− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3375+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3318− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3376+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3319− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3377+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3320 \s*=> # arrow operator
3378 \s*=> # arrow operator
3321 )
3379 )
3322 ))
3380 ))
assets/syntaxes/02_Extra/TypsecriptReact.sublime-syntax+896−477
@@ -9,10 +9,7 @@ contexts:
9 main:
9 main:
10 - include: directives
10 - include: directives
11 - include: statements
11 - include: statements
12− - match: \A(#!).*(?=$)
12+ - include: shebang
13− scope: comment.line.shebang.ts
14− captures:
15− 1: punctuation.definition.comment.ts
16 comment:
13 comment:
17 - match: /\*\*(?!/)
14 - match: /\*\*(?!/)
18 captures:
15 captures:
@@ -44,10 +41,10 @@ contexts:
44 5: punctuation.decorator.internaldeclaration.tsx
41 5: punctuation.decorator.internaldeclaration.tsx
45 push:
42 push:
46 - meta_content_scope: comment.line.double-slash.tsx
43 - meta_content_scope: comment.line.double-slash.tsx
47− - match: (?=^)
44+ - match: (?=$)
48 pop: true
45 pop: true
49 access-modifier:
46 access-modifier:
50− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(abstract|public|protected|private|readonly|static)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
47+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(abstract|declare|override|public|protected|private|readonly|static)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
51 scope: storage.modifier.tsx
48 scope: storage.modifier.tsx
52 after-operator-block-as-object-literal:
49 after-operator-block-as-object-literal:
53 - match: '(?<!\+\+|--)(?<=[:=(,\[?+!>]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&&|\|\||\*)\s*(\{)'
50 - match: '(?<!\+\+|--)(?<=[:=(,\[?+!>]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&&|\|\||\*)\s*(\{)'
@@ -109,8 +106,8 @@ contexts:
109 (?=
106 (?=
110 # sure shot arrow functions even if => is on new line
107 # sure shot arrow functions even if => is on new line
111 (
108 (
112− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
109+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
113− [(]\s*
110+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
114 (
111 (
115 ([)]\s*:) | # ():
112 ([)]\s*:) | # ():
116 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
113 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -121,9 +118,9 @@ contexts:
121 ) |
118 ) |
122 # arrow function possible to detect only with => on same line
119 # arrow function possible to detect only with => on same line
123 (
120 (
124− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
121+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
125− \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
122+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
126− (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
123+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
127 \s*=> # arrow operator
124 \s*=> # arrow operator
128 )
125 )
129 )
126 )
@@ -138,13 +135,15 @@ contexts:
138 - include: type-parameters
135 - include: type-parameters
139 - include: function-parameters
136 - include: function-parameters
140 - include: arrow-return-type
137 - include: arrow-return-type
138+ - include: possibly-arrow-return-type
141 - match: "=>"
139 - match: "=>"
142 captures:
140 captures:
143 0: storage.type.function.arrow.tsx
141 0: storage.type.function.arrow.tsx
144 push:
142 push:
145 - meta_scope: meta.arrow.tsx
143 - meta_scope: meta.arrow.tsx
146− - match: '(?<=\}|\S)(?<!=>)|((?!\{)(?=\S))'
144+ - match: '((?<=\}|\S)(?<!=>)|((?!\{)(?=\S)))(?!\/[\/\*])'
147 pop: true
145 pop: true
146+ - include: single-line-comment-consuming-line-ending
148 - include: decl-block
147 - include: decl-block
149 - include: expression
148 - include: expression
150 arrow-return-type:
149 arrow-return-type:
@@ -170,6 +169,8 @@ contexts:
170 binding-element:
169 binding-element:
171 - include: comment
170 - include: comment
172 - include: string
171 - include: string
172+ - include: numeric-literal
173+ - include: regex
173 - include: object-binding-pattern
174 - include: object-binding-pattern
174 - include: array-binding-pattern
175 - include: array-binding-pattern
175 - include: destructuring-variable-rest
176 - include: destructuring-variable-rest
@@ -177,6 +178,8 @@ contexts:
177 binding-element-const:
178 binding-element-const:
178 - include: comment
179 - include: comment
179 - include: string
180 - include: string
181+ - include: numeric-literal
182+ - include: regex
180 - include: object-binding-pattern-const
183 - include: object-binding-pattern-const
181 - include: array-binding-pattern-const
184 - include: array-binding-pattern-const
182 - include: destructuring-variable-rest-const
185 - include: destructuring-variable-rest-const
@@ -200,11 +203,12 @@ contexts:
200 cast:
203 cast:
201 - include: jsx
204 - include: jsx
202 class-declaration:
205 class-declaration:
203− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(export)\s+)?\b(?:(abstract)\s+)?\b(class)\b(?=\s+|/[/*])'
206+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(?:(abstract)\s+)?\b(class)\b(?=\s+|/[/*])'
204 captures:
207 captures:
205 1: keyword.control.export.tsx
208 1: keyword.control.export.tsx
206 2: storage.modifier.tsx
209 2: storage.modifier.tsx
210+ 3: storage.modifier.tsx
207− 3: storage.type.class.tsx
211+ 4: storage.type.class.tsx
208 push:
212 push:
209 - meta_scope: meta.class.tsx
213 - meta_scope: meta.class.tsx
210 - match: '(?<=\})'
214 - match: '(?<=\})'
@@ -219,9 +223,10 @@ contexts:
219 - include: type-parameters
223 - include: type-parameters
220 - include: class-or-interface-body
224 - include: class-or-interface-body
221 class-expression:
225 class-expression:
222− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(class)\b(?=\s+|[<{]|\/[\/*])'
226+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(abstract)\s+)?(class)\b(?=\s+|[<{]|\/[\/*])'
223 captures:
227 captures:
228+ 1: storage.modifier.tsx
224− 1: storage.type.class.tsx
229+ 2: storage.type.class.tsx
225 push:
230 push:
226 - meta_scope: meta.class.tsx
231 - meta_scope: meta.class.tsx
227 - match: '(?<=\})'
232 - match: '(?<=\})'
@@ -238,6 +243,11 @@ contexts:
238 pop: true
243 pop: true
239 - include: comment
244 - include: comment
240 - include: decorator
245 - include: decorator
246+ - match: (?<=:)\s*
247+ push:
248+ - match: '(?=\s|[;),}\]:\-\+]|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
249+ pop: true
250+ - include: expression
241 - include: method-declaration
251 - include: method-declaration
242 - include: indexer-declaration
252 - include: indexer-declaration
243 - include: field-declaration
253 - include: field-declaration
@@ -284,9 +294,15 @@ contexts:
284 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(break|continue|do|goto|while)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
294 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(break|continue|do|goto|while)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
285 scope: keyword.control.loop.tsx
295 scope: keyword.control.loop.tsx
286 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(return)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
296 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(return)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
297+ captures:
287− scope: keyword.control.flow.tsx
298+ 0: keyword.control.flow.tsx
299+ push:
300+ - match: '(?=[;}]|$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
301+ pop: true
302+ - include: expression
288 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(case|default|switch)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
303 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(case|default|switch)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
289 scope: keyword.control.switch.tsx
304 scope: keyword.control.switch.tsx
305+ - include: if-statement
290 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(else|if)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
306 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(else|if)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
291 scope: keyword.control.conditional.tsx
307 scope: keyword.control.conditional.tsx
292 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(with)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
308 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(with)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
@@ -295,8 +311,6 @@ contexts:
295 scope: keyword.control.tsx
311 scope: keyword.control.tsx
296 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(debugger)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
312 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(debugger)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
297 scope: keyword.other.debugger.tsx
313 scope: keyword.other.debugger.tsx
298− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(declare)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
299− scope: storage.modifier.tsx
300 decl-block:
314 decl-block:
301 - match: '\{'
315 - match: '\{'
302 captures:
316 captures:
@@ -320,6 +334,8 @@ contexts:
320 - include: import-equals-declaration
334 - include: import-equals-declaration
321 - include: import-declaration
335 - include: import-declaration
322 - include: export-declaration
336 - include: export-declaration
337+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(declare|export)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
338+ scope: storage.modifier.tsx
323 decorator:
339 decorator:
324 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))\@'
340 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))\@'
325 captures:
341 captures:
@@ -333,7 +349,7 @@ contexts:
333 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\{)'
349 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\{)'
334 push:
350 push:
335 - meta_scope: meta.object-binding-pattern-variable.tsx
351 - meta_scope: meta.object-binding-pattern-variable.tsx
336− - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
352+ - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
337 pop: true
353 pop: true
338 - include: object-binding-pattern-const
354 - include: object-binding-pattern-const
339 - include: type-annotation
355 - include: type-annotation
@@ -341,15 +357,16 @@ contexts:
341 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\[)'
357 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\[)'
342 push:
358 push:
343 - meta_scope: meta.array-binding-pattern-variable.tsx
359 - meta_scope: meta.array-binding-pattern-variable.tsx
344− - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
360+ - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
345 pop: true
361 pop: true
346 - include: array-binding-pattern-const
362 - include: array-binding-pattern-const
347 - include: type-annotation
363 - include: type-annotation
348 - include: comment
364 - include: comment
349 destructuring-parameter:
365 destructuring-parameter:
350− - match: '(?<!=|:)\s*(\{)'
366+ - match: '(?<!=|:)\s*(?:(\.\.\.)\s*)?(\{)'
351 captures:
367 captures:
368+ 1: keyword.operator.rest.tsx
352− 1: punctuation.definition.binding-pattern.object.tsx
369+ 2: punctuation.definition.binding-pattern.object.tsx
353 push:
370 push:
354 - meta_scope: meta.parameter.object-binding-pattern.tsx
371 - meta_scope: meta.parameter.object-binding-pattern.tsx
355 - match: '\}'
372 - match: '\}'
@@ -357,9 +374,10 @@ contexts:
357 0: punctuation.definition.binding-pattern.object.tsx
374 0: punctuation.definition.binding-pattern.object.tsx
358 pop: true
375 pop: true
359 - include: parameter-object-binding-element
376 - include: parameter-object-binding-element
360− - match: '(?<!=|:)\s*(\[)'
377+ - match: '(?<!=|:)\s*(?:(\.\.\.)\s*)?(\[)'
361 captures:
378 captures:
379+ 1: keyword.operator.rest.tsx
362− 1: punctuation.definition.binding-pattern.array.tsx
380+ 2: punctuation.definition.binding-pattern.array.tsx
363 push:
381 push:
364 - meta_scope: meta.paramter.array-binding-pattern.tsx
382 - meta_scope: meta.paramter.array-binding-pattern.tsx
365 - match: '\]'
383 - match: '\]'
@@ -377,7 +395,7 @@ contexts:
377 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\{)'
395 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\{)'
378 push:
396 push:
379 - meta_scope: meta.object-binding-pattern-variable.tsx
397 - meta_scope: meta.object-binding-pattern-variable.tsx
380− - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
398+ - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
381 pop: true
399 pop: true
382 - include: object-binding-pattern
400 - include: object-binding-pattern
383 - include: type-annotation
401 - include: type-annotation
@@ -385,7 +403,7 @@ contexts:
385 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\[)'
403 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\[)'
386 push:
404 push:
387 - meta_scope: meta.array-binding-pattern-variable.tsx
405 - meta_scope: meta.array-binding-pattern-variable.tsx
388− - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
406+ - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
389 pop: true
407 pop: true
390 - include: array-binding-pattern
408 - include: array-binding-pattern
391 - include: type-annotation
409 - include: type-annotation
@@ -401,12 +419,12 @@ contexts:
401 1: keyword.operator.rest.tsx
419 1: keyword.operator.rest.tsx
402 2: meta.definition.variable.tsx variable.other.constant.tsx
420 2: meta.definition.variable.tsx variable.other.constant.tsx
403 directives:
421 directives:
404− - match: '^(///)\s*(?=<(reference|amd-dependency|amd-module)(\s+(path|types|no-default-lib|lib|name)\s*=\s*((\''([^\''\\]|\\\''|\\)*\'')|(\"([^\"\\]|\\\"|\\)*\")))+\s*/>\s*$)'
422+ - match: '^(///)\s*(?=<(reference|amd-dependency|amd-module)(\s+(path|types|no-default-lib|lib|name)\s*=\s*((\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)))+\s*/>\s*$)'
405 captures:
423 captures:
406 1: punctuation.definition.comment.tsx
424 1: punctuation.definition.comment.tsx
407 push:
425 push:
408 - meta_scope: comment.line.triple-slash.directive.tsx
426 - meta_scope: comment.line.triple-slash.directive.tsx
409− - match: (?=^)
427+ - match: (?=$)
410 pop: true
428 pop: true
411 - match: (<)(reference|amd-dependency|amd-module)
429 - match: (<)(reference|amd-dependency|amd-module)
412 captures:
430 captures:
@@ -668,13 +686,18 @@ contexts:
668 captures:
686 captures:
669 1: punctuation.definition.block.tag.jsdoc
687 1: punctuation.definition.block.tag.jsdoc
670 - include: inline-tags
688 - include: inline-tags
689+ - match: '((@)(?:[_$[:alpha:]][_$[:alnum:]]*))(?=\s+)'
690+ captures:
691+ 1: storage.type.class.jsdoc
692+ 2: punctuation.definition.block.tag.jsdoc
671 enum-declaration:
693 enum-declaration:
672− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:\b(const)\s+)?\b(enum)\s+([_$[:alpha:]][_$[:alnum:]]*)'
694+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?(?:\b(const)\s+)?\b(enum)\s+([_$[:alpha:]][_$[:alnum:]]*)'
673 captures:
695 captures:
674 1: keyword.control.export.tsx
696 1: keyword.control.export.tsx
675 2: storage.modifier.tsx
697 2: storage.modifier.tsx
676− 3: storage.type.enum.tsx
698+ 3: storage.modifier.tsx
699+ 4: storage.type.enum.tsx
677− 4: entity.name.type.enum.tsx
700+ 5: entity.name.type.enum.tsx
678 push:
701 push:
679 - meta_scope: meta.enum.declaration.tsx
702 - meta_scope: meta.enum.declaration.tsx
680 - match: '(?<=\})'
703 - match: '(?<=\})'
@@ -697,7 +720,7 @@ contexts:
697 pop: true
720 pop: true
698 - include: comment
721 - include: comment
699 - include: variable-initializer
722 - include: variable-initializer
700− - match: '(?=((\''([^\''\\]|\\\''|\\)*\'')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\])))'
723+ - match: '(?=((\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\])))'
701 push:
724 push:
702 - match: '(?=,|\}|$)'
725 - match: '(?=,|\}|$)'
703 pop: true
726 pop: true
@@ -713,22 +736,25 @@ contexts:
713 2: keyword.control.as.tsx
736 2: keyword.control.as.tsx
714 3: storage.type.namespace.tsx
737 3: storage.type.namespace.tsx
715 4: entity.name.type.module.tsx
738 4: entity.name.type.module.tsx
716− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?:(?:\s*(=))|(?:\s+(default)(?=\s+)))'
739+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?:\s+(type))?(?:(?:\s*(=))|(?:\s+(default)(?=\s+)))'
717 captures:
740 captures:
718 1: keyword.control.export.tsx
741 1: keyword.control.export.tsx
742+ 2: keyword.control.type.tsx
719− 2: keyword.operator.assignment.tsx
743+ 3: keyword.operator.assignment.tsx
720− 3: keyword.control.default.tsx
744+ 4: keyword.control.default.tsx
721 push:
745 push:
722 - meta_scope: meta.export.default.tsx
746 - meta_scope: meta.export.default.tsx
723− - match: (?=$|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)
747+ - match: (?=$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
724 pop: true
748 pop: true
749+ - include: interface-declaration
725 - include: expression
750 - include: expression
726− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?!\s*:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
751+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?:\s+(type))?\b(?!(\$)|(\s*:))((?=\s*[\{*])|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b)))'
727 captures:
752 captures:
728− 0: keyword.control.export.tsx
753+ 1: keyword.control.export.tsx
754+ 2: keyword.control.type.tsx
729 push:
755 push:
730 - meta_scope: meta.export.tsx
756 - meta_scope: meta.export.tsx
731− - match: (?=$|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)
757+ - match: (?=$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
732 pop: true
758 pop: true
733 - include: import-export-declaration
759 - include: import-export-declaration
734 expression:
760 expression:
@@ -737,7 +763,105 @@ contexts:
737 - include: expressionPunctuations
763 - include: expressionPunctuations
738 expression-inside-possibly-arrow-parens:
764 expression-inside-possibly-arrow-parens:
739 - include: expressionWithoutIdentifiers
765 - include: expressionWithoutIdentifiers
740− - include: function-parameters-body
766+ - include: comment
767+ - include: string
768+ - include: decorator
769+ - include: destructuring-parameter
770+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|protected|private|readonly)\s+(?=(override|public|protected|private|readonly)\s+)'
771+ captures:
772+ 1: storage.modifier.tsx
773+ - match: |-
774+ (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
775+ # function assignment |
776+ (=\s*(
777+ ((async\s+)?(
778+ (function\s*[(<*]) |
779+ (function\s+) |
780+ ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
781+ )) |
782+ ((async\s*)?(
783+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
784+ # sure shot arrow functions even if => is on new line
785+ (
786+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
787+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
788+ (
789+ ([)]\s*:) | # ():
790+ ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
791+ )
792+ ) |
793+ (
794+ [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
795+ ) |
796+ # arrow function possible to detect only with => on same line
797+ (
798+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
799+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
800+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
801+ \s*=> # arrow operator
802+ )
803+ ))
804+ )) |
805+ # typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>
806+ (:\s*(
807+ (<) |
808+ ([(]\s*(
809+ ([)]) |
810+ (\.\.\.) |
811+ ([_$[:alnum:]]+\s*(
812+ ([:,?=])|
813+ ([)]\s*=>)
814+ ))
815+ ))
816+ )) |
817+ (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
818+ (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
819+ (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
820+ ((async\s+)?(
821+ (function\s*[(<*]) |
822+ (function\s+) |
823+ ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
824+ )) |
825+ ((async\s*)?(
826+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
827+ # sure shot arrow functions even if => is on new line
828+ (
829+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
830+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
831+ (
832+ ([)]\s*:) | # ():
833+ ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
834+ )
835+ ) |
836+ (
837+ [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
838+ ) |
839+ # arrow function possible to detect only with => on same line
840+ (
841+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
842+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
843+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
844+ \s*=> # arrow operator
845+ )
846+ ))
847+ )))
848+ captures:
849+ 1: storage.modifier.tsx
850+ 2: keyword.operator.rest.tsx
851+ 3: entity.name.function.tsx variable.language.this.tsx
852+ 4: entity.name.function.tsx
853+ 5: keyword.operator.optional.tsx
854+ - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*[:,]|$)'
855+ captures:
856+ 1: storage.modifier.tsx
857+ 2: keyword.operator.rest.tsx
858+ 3: variable.parameter.tsx variable.language.this.tsx
859+ 4: variable.parameter.tsx
860+ 5: keyword.operator.optional.tsx
861+ - include: type-annotation
862+ - include: variable-initializer
863+ - match: ","
864+ scope: punctuation.separator.parameter.tsx
741 - include: identifiers
865 - include: identifiers
742 - include: expressionPunctuations
866 - include: expressionPunctuations
743 expression-operators:
867 expression-operators:
@@ -769,11 +893,15 @@ contexts:
769 - include: typeof-operator
893 - include: typeof-operator
770 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))void(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
894 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))void(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
771 scope: keyword.operator.expression.void.tsx
895 scope: keyword.operator.expression.void.tsx
896+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+(const)(?=\s*($|[;,:})\]]))'
897+ captures:
898+ 1: keyword.control.as.tsx
899+ 2: storage.modifier.tsx
772 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+'
900 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+'
773 captures:
901 captures:
774 1: keyword.control.as.tsx
902 1: keyword.control.as.tsx
775 push:
903 push:
776− - match: '(?=$|^|[;,:})\]]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+))'
904+ - match: '(?=^|[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+)|(\s+\<))'
777 pop: true
905 pop: true
778 - include: type
906 - include: type
779 - match: \.\.\.
907 - match: \.\.\.
@@ -788,7 +916,12 @@ contexts:
788 scope: keyword.operator.comparison.tsx
916 scope: keyword.operator.comparison.tsx
789 - match: <=|>=|<>|<|>
917 - match: <=|>=|<>|<|>
790 scope: keyword.operator.relational.tsx
918 scope: keyword.operator.relational.tsx
791− - match: \!|&&|\|\|
919+ - match: '(?<=[_$[:alnum:]])(\!)\s*(?:(/=)|(?:(/)(?![/*])))'
920+ captures:
921+ 1: keyword.operator.logical.tsx
922+ 2: keyword.operator.assignment.compound.tsx
923+ 3: keyword.operator.arithmetic.tsx
924+ - match: \!|&&|\|\||\?\?
792 scope: keyword.operator.logical.tsx
925 scope: keyword.operator.logical.tsx
793 - match: \&|~|\^|\|
926 - match: \&|~|\^|\|
794 scope: keyword.operator.bitwise.tsx
927 scope: keyword.operator.bitwise.tsx
@@ -800,9 +933,18 @@ contexts:
800 scope: keyword.operator.increment.tsx
933 scope: keyword.operator.increment.tsx
801 - match: '%|\*|/|-|\+'
934 - match: '%|\*|/|-|\+'
802 scope: keyword.operator.arithmetic.tsx
935 scope: keyword.operator.arithmetic.tsx
803− - match: '(?<=[_$[:alnum:])\]])\s*(/)(?![/*])'
936+ - match: '(?<=[_$[:alnum:])\]])\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)+(?:(/=)|(?:(/)(?![/*]))))'
937+ push:
938+ - match: '(?:(/=)|(?:(/)(?!\*([^\*]|(\*[^\/]))*\*\/)))'
939+ captures:
940+ 1: keyword.operator.assignment.compound.tsx
941+ 2: keyword.operator.arithmetic.tsx
942+ pop: true
943+ - include: comment
944+ - match: '(?<=[_$[:alnum:])\]])\s*(?:(/=)|(?:(/)(?![/*])))'
804 captures:
945 captures:
805− 1: keyword.operator.arithmetic.tsx
946+ 1: keyword.operator.assignment.compound.tsx
947+ 2: keyword.operator.arithmetic.tsx
806 expressionPunctuations:
948 expressionPunctuations:
807 - include: punctuation-comma
949 - include: punctuation-comma
808 - include: punctuation-accessor
950 - include: punctuation-accessor
@@ -810,7 +952,6 @@ contexts:
810 - include: jsx
952 - include: jsx
811 - include: string
953 - include: string
812 - include: regex
954 - include: regex
813− - include: template
814 - include: comment
955 - include: comment
815 - include: function-expression
956 - include: function-expression
816 - include: class-expression
957 - include: class-expression
@@ -828,143 +969,123 @@ contexts:
828 - include: paren-expression
969 - include: paren-expression
829 field-declaration:
970 field-declaration:
830 - match: |-
971 - match: |-
831− (?x)(?<!\()(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(readonly)\s+)?(?=\s*((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
972+ (?x)(?<!\()(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(readonly)\s+)?(?=\s*((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
832− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
973+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
833− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
974+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
834− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
975+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
835− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
976+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
836− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
977+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
837− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
978+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
838− (?:\B(\.)[0-9][0-9_]*\b)| # .1
979+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
839− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
980+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
840− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:))
981+ )(?!\$))|(\#?[_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(?:(?:(\?)|(\!))\s*)?(=|:|;|,|\}|$))
841 captures:
982 captures:
842 1: storage.modifier.tsx
983 1: storage.modifier.tsx
843 push:
984 push:
844 - meta_scope: meta.field.declaration.tsx
985 - meta_scope: meta.field.declaration.tsx
845 - match: |-
986 - match: |-
846− (?x)(?=\}|;|,|$|(^(?!\s*((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
987+ (?x)(?=\}|;|,|$|(^(?!\s*((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
847− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
988+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
848− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
989+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
849− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
990+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
850− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
991+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
851− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
992+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
852− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
993+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
853− (?:\B(\.)[0-9][0-9_]*\b)| # .1
994+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
854− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
995+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
855− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:))))|(?<=\})
996+ )(?!\$))|(\#?[_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(?:(?:(\?)|(\!))\s*)?(=|:|;|,|$))))|(?<=\})
856 pop: true
997 pop: true
857 - include: variable-initializer
998 - include: variable-initializer
999+ - include: type-annotation
1000+ - include: string
1001+ - include: array-literal
1002+ - include: numeric-literal
1003+ - include: comment
858 - match: |-
1004 - match: |-
859− (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
860− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
861− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
862− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
863− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
864− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
865− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
866− (?:\B(\.)[0-9][0-9_]*\b)| # .1
867− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
868− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:))
1005+ (?x)(\#?[_$[:alpha:]][_$[:alnum:]]*)(?:(\?)|(\!))?(?=\s*\s*
869− push:
870− - match: |-
871− (?x)(?=[};,=]|$|(^(?!\s*((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
872− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
873− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
874− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
875− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
876− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
877− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
878− (?:\B(\.)[0-9][0-9_]*\b)| # .1
879− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
880− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:))))|(?<=\})
881− pop: true
882− - include: type-annotation
883− - include: string
884− - include: array-literal
885− - include: numeric-literal
886− - include: comment
887− - match: |-
888− (?x)([_$[:alpha:]][_$[:alnum:]]*)(\?)?(?=(\?\s*)?\s*
889− # function assignment |
1006+ # function assignment |
890− (=\s*(
1007+ (=\s*(
891− ((async\s+)?(
1008+ ((async\s+)?(
892− (function\s*[(<*]) |
1009+ (function\s*[(<*]) |
893− (function\s+) |
1010+ (function\s+) |
894− ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1011+ ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
895− )) |
1012+ )) |
896− ((async\s*)?(
1013+ ((async\s*)?(
897− ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
1014+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
898− # sure shot arrow functions even if => is on new line
1015+ # sure shot arrow functions even if => is on new line
899− (
1016+ (
900− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
1017+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
901− [(]\s*
1018+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
902− (
1019+ (
903− ([)]\s*:) | # ():
1020+ ([)]\s*:) | # ():
904− ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
1021+ ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
905− )
1022+ )
906− ) |
1023+ ) |
907− (
1024+ (
908− [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
1025+ [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
909− ) |
1026+ ) |
910− # arrow function possible to detect only with => on same line
1027+ # arrow function possible to detect only with => on same line
911− (
1028+ (
912− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
1029+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
913− \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
1030+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
914− (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
1031+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
915− \s*=> # arrow operator
1032+ \s*=> # arrow operator
916− )
1033+ )
917− ))
1034+ ))
918− )) |
1035+ )) |
919− # typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>
1036+ # typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>
920− (:\s*(
1037+ (:\s*(
921− (<) |
1038+ (<) |
922− ([(]\s*(
1039+ ([(]\s*(
923− ([)]) |
1040+ ([)]) |
924− (\.\.\.) |
1041+ (\.\.\.) |
925− ([_$[:alnum:]]+\s*(
1042+ ([_$[:alnum:]]+\s*(
926− ([:,?=])|
1043+ ([:,?=])|
927− ([)]\s*=>)
1044+ ([)]\s*=>)
1045+ ))
928− ))
1046+ ))
929− ))
1047+ )) |
930− )) |
1048+ (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
931− (:\s*((<\s*$)|([\(]\s*([\{\[]\s*)?$))) |
1049+ (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
932− (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
1050+ (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
933− ((async\s+)?(
1051+ ((async\s+)?(
934− (function\s*[(<*]) |
1052+ (function\s*[(<*]) |
935− (function\s+) |
1053+ (function\s+) |
936− ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1054+ ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
937− )) |
1055+ )) |
938− ((async\s*)?(
1056+ ((async\s*)?(
939− ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
1057+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
940− # sure shot arrow functions even if => is on new line
1058+ # sure shot arrow functions even if => is on new line
941− (
1059+ (
942− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
1060+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
943− [(]\s*
1061+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
944− (
1062+ (
945− ([)]\s*:) | # ():
1063+ ([)]\s*:) | # ():
946− ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
1064+ ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
947− )
1065+ )
948− ) |
1066+ ) |
949− (
1067+ (
950− [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
1068+ [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
951− ) |
1069+ ) |
952− # arrow function possible to detect only with => on same line
1070+ # arrow function possible to detect only with => on same line
953− (
1071+ (
954− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
1072+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
955− \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
1073+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
956− (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
1074+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
957− \s*=> # arrow operator
1075+ \s*=> # arrow operator
958− )
1076+ )
959− ))
1077+ ))
960− )))
1078+ )))
961− captures:
1079+ captures:
962− 1: meta.definition.property.tsx entity.name.function.tsx
1080+ 1: meta.definition.property.tsx entity.name.function.tsx
963− 2: keyword.operator.optional.tsx
1081+ 2: keyword.operator.optional.tsx
1082+ 3: keyword.operator.definiteassignment.tsx
964− - match: "[_$[:alpha:]][_$[:alnum:]]*"
1083+ - match: '\#?[_$[:alpha:]][_$[:alnum:]]*'
965− scope: meta.definition.property.tsx variable.object.property.tsx
1084+ scope: meta.definition.property.tsx variable.object.property.tsx
966− - match: \?
1085+ - match: \?
967− scope: keyword.operator.optional.tsx
1086+ scope: keyword.operator.optional.tsx
1087+ - match: \!
1088+ scope: keyword.operator.definiteassignment.tsx
968 for-loop:
1089 for-loop:
969 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))for(?=((\s+|(\s*\/\*([^\*]|(\*[^\/]))*\*\/\s*))await)?\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)?(\())'
1090 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))for(?=((\s+|(\s*\/\*([^\*]|(\*[^\/]))*\*\/\s*))await)?\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)?(\())'
970 captures:
1091 captures:
@@ -991,43 +1112,59 @@ contexts:
991 - include: type-parameters
1112 - include: type-parameters
992 - include: function-parameters
1113 - include: function-parameters
993 - include: return-type
1114 - include: return-type
1115+ - include: type-function-return-type
994 - include: decl-block
1116 - include: decl-block
995 - match: \*
1117 - match: \*
996 scope: keyword.generator.asterisk.tsx
1118 scope: keyword.generator.asterisk.tsx
997 function-call:
1119 function-call:
998− - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\s*(\?\.\s*)?(<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?!=)\>)*(?!=)>\s*)?\()'
1120+ - match: '(?=(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
999 push:
1121 push:
1000− - match: '(?<=\))(?!(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\s*(\?\.\s*)?(<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?!=)\>)*(?!=)>\s*)?\()'
1122+ - match: '(?<=\))(?!(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1001 pop: true
1123 pop: true
1002− - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*))'
1124+ - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))'
1003 push:
1125 push:
1004 - meta_scope: meta.function-call.tsx
1126 - meta_scope: meta.function-call.tsx
1005− - match: '(?=\s*(\?\.\s*)?(<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?!=)\>)*(?!=)>\s*)?\()'
1127+ - match: '(?=\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1006 pop: true
1128 pop: true
1007− - include: literal
1129+ - include: function-call-target
1008− - include: support-objects
1009− - include: object-identifiers
1010− - include: punctuation-accessor
1011− - match: '(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))import(?=\s*[\(]\s*[\"\''\`]))'
1012− scope: keyword.operator.expression.import.tsx
1013− - match: "([_$[:alpha:]][_$[:alnum:]]*)"
1014− scope: entity.name.function.tsx
1015 - include: comment
1130 - include: comment
1016− - match: \?\.
1131+ - include: function-call-optionals
1017− scope: meta.function-call.tsx punctuation.accessor.optional.tsx
1018 - include: type-arguments
1132 - include: type-arguments
1019 - include: paren-expression
1133 - include: paren-expression
1134+ - match: '(?=(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))(<\s*[\{\[\(]\s*$))'
1135+ push:
1136+ - match: '(?<=\>)(?!(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))(<\s*[\{\[\(]\s*$))'
1137+ pop: true
1138+ - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))'
1139+ push:
1140+ - meta_scope: meta.function-call.tsx
1141+ - match: '(?=(<\s*[\{\[\(]\s*$))'
1142+ pop: true
1143+ - include: function-call-target
1144+ - include: comment
1145+ - include: function-call-optionals
1146+ - include: type-arguments
1147+ function-call-optionals:
1148+ - match: \?\.
1149+ scope: meta.function-call.tsx punctuation.accessor.optional.tsx
1150+ - match: \!
1151+ scope: meta.function-call.tsx keyword.operator.definiteassignment.tsx
1152+ function-call-target:
1153+ - include: support-function-call-identifiers
1154+ - match: '(\#?[_$[:alpha:]][_$[:alnum:]]*)'
1155+ scope: entity.name.function.tsx
1020 function-declaration:
1156 function-declaration:
1021− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(export)\s+)?(?:(async)\s+)?(function\b)(?:\s*(\*))?(?:(?:\s+|(?<=\*))([_$[:alpha:]][_$[:alnum:]]*))?\s*'
1157+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?(?:(async)\s+)?(function\b)(?:\s*(\*))?(?:(?:\s+|(?<=\*))([_$[:alpha:]][_$[:alnum:]]*))?\s*'
1022 captures:
1158 captures:
1023 1: keyword.control.export.tsx
1159 1: keyword.control.export.tsx
1024− 2: storage.modifier.async.tsx
1160+ 2: storage.modifier.tsx
1161+ 3: storage.modifier.async.tsx
1025− 3: storage.type.function.tsx
1162+ 4: storage.type.function.tsx
1026− 4: keyword.generator.asterisk.tsx
1163+ 5: keyword.generator.asterisk.tsx
1027− 5: meta.definition.function.tsx entity.name.function.tsx
1164+ 6: meta.definition.function.tsx entity.name.function.tsx
1028 push:
1165 push:
1029 - meta_scope: meta.function.tsx
1166 - meta_scope: meta.function.tsx
1030− - match: '(?=$|^|;)|(?<=\})'
1167+ - match: '(?=;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|(?<=\})'
1031 pop: true
1168 pop: true
1032 - include: function-name
1169 - include: function-name
1033 - include: function-body
1170 - include: function-body
@@ -1040,9 +1177,10 @@ contexts:
1040 4: meta.definition.function.tsx entity.name.function.tsx
1177 4: meta.definition.function.tsx entity.name.function.tsx
1041 push:
1178 push:
1042 - meta_scope: meta.function.expression.tsx
1179 - meta_scope: meta.function.expression.tsx
1043− - match: '(?<=\})'
1180+ - match: '(?=;)|(?<=\})'
1044 pop: true
1181 pop: true
1045 - include: function-name
1182 - include: function-name
1183+ - include: single-line-comment-consuming-line-ending
1046 - include: function-body
1184 - include: function-body
1047 function-name:
1185 function-name:
1048 - match: "[_$[:alpha:]][_$[:alnum:]]*"
1186 - match: "[_$[:alpha:]][_$[:alnum:]]*"
@@ -1060,10 +1198,11 @@ contexts:
1060 - include: function-parameters-body
1198 - include: function-parameters-body
1061 function-parameters-body:
1199 function-parameters-body:
1062 - include: comment
1200 - include: comment
1201+ - include: string
1063 - include: decorator
1202 - include: decorator
1064 - include: destructuring-parameter
1203 - include: destructuring-parameter
1065 - include: parameter-name
1204 - include: parameter-name
1066− - include: type-annotation
1205+ - include: parameter-type-annotation
1067 - include: variable-initializer
1206 - include: variable-initializer
1068 - match: ","
1207 - match: ","
1069 scope: punctuation.separator.parameter.tsx
1208 scope: punctuation.separator.parameter.tsx
@@ -1077,11 +1216,11 @@ contexts:
1077 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1216 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1078 )) |
1217 )) |
1079 ((async\s*)?(
1218 ((async\s*)?(
1080− ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
1219+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1081 # sure shot arrow functions even if => is on new line
1220 # sure shot arrow functions even if => is on new line
1082 (
1221 (
1083− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
1222+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1084− [(]\s*
1223+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1085 (
1224 (
1086 ([)]\s*:) | # ():
1225 ([)]\s*:) | # ():
1087 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
1226 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -1092,9 +1231,9 @@ contexts:
1092 ) |
1231 ) |
1093 # arrow function possible to detect only with => on same line
1232 # arrow function possible to detect only with => on same line
1094 (
1233 (
1095− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
1234+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1096− \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
1235+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1097− (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
1236+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1098 \s*=> # arrow operator
1237 \s*=> # arrow operator
1099 )
1238 )
1100 ))
1239 ))
@@ -1103,12 +1242,12 @@ contexts:
1103 1: punctuation.accessor.tsx
1242 1: punctuation.accessor.tsx
1104 2: punctuation.accessor.optional.tsx
1243 2: punctuation.accessor.optional.tsx
1105 3: entity.name.function.tsx
1244 3: entity.name.function.tsx
1106− - match: '(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])'
1245+ - match: '(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*(\#?[[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])'
1107 captures:
1246 captures:
1108 1: punctuation.accessor.tsx
1247 1: punctuation.accessor.tsx
1109 2: punctuation.accessor.optional.tsx
1248 2: punctuation.accessor.optional.tsx
1110 3: variable.other.constant.property.tsx
1249 3: variable.other.constant.property.tsx
1111− - match: '(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*([_$[:alpha:]][_$[:alnum:]]*)'
1250+ - match: '(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*(\#?[_$[:alpha:]][_$[:alnum:]]*)'
1112 captures:
1251 captures:
1113 1: punctuation.accessor.tsx
1252 1: punctuation.accessor.tsx
1114 2: punctuation.accessor.optional.tsx
1253 2: punctuation.accessor.optional.tsx
@@ -1117,15 +1256,46 @@ contexts:
1117 scope: variable.other.constant.tsx
1256 scope: variable.other.constant.tsx
1118 - match: "[_$[:alpha:]][_$[:alnum:]]*"
1257 - match: "[_$[:alpha:]][_$[:alnum:]]*"
1119 scope: variable.other.readwrite.tsx
1258 scope: variable.other.readwrite.tsx
1259+ if-statement:
1260+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?=\bif\s*(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))\s*(?!\{))'
1261+ push:
1262+ - match: '(?=;|$|\})'
1263+ pop: true
1264+ - include: comment
1265+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(if)\s*(\()'
1266+ captures:
1267+ 1: keyword.control.conditional.tsx
1268+ 2: meta.brace.round.tsx
1269+ push:
1270+ - match: \)
1271+ captures:
1272+ 0: meta.brace.round.tsx
1273+ pop: true
1274+ - include: expression
1275+ - match: '(?<=\))\s*\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)*\])+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
1276+ captures:
1277+ 0: punctuation.definition.string.begin.tsx
1278+ push:
1279+ - meta_scope: string.regexp.tsx
1280+ - match: "(/)([dgimsuy]*)"
1281+ captures:
1282+ 1: punctuation.definition.string.end.tsx
1283+ 2: keyword.other.tsx
1284+ pop: true
1285+ - include: regexp
1286+ - include: statements
1120 import-declaration:
1287 import-declaration:
1121− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(import)(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1288+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type)(?!\s+from))?(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1122 captures:
1289 captures:
1123 1: keyword.control.export.tsx
1290 1: keyword.control.export.tsx
1291+ 2: storage.modifier.tsx
1124− 2: keyword.control.import.tsx
1292+ 3: keyword.control.import.tsx
1293+ 4: keyword.control.type.tsx
1125 push:
1294 push:
1126 - meta_scope: meta.import.tsx
1295 - meta_scope: meta.import.tsx
1127 - match: '(?<!^import|[^\._$[:alnum:]]import)(?=;|$|^)'
1296 - match: '(?<!^import|[^\._$[:alnum:]]import)(?=;|$|^)'
1128 pop: true
1297 pop: true
1298+ - include: single-line-comment-consuming-line-ending
1129 - include: comment
1299 - include: comment
1130 - include: string
1300 - include: string
1131 - match: '(?<=^import|[^\._$[:alnum:]]import)(?!\s*["''])'
1301 - match: '(?<=^import|[^\._$[:alnum:]]import)(?!\s*["''])'
@@ -1137,14 +1307,16 @@ contexts:
1137 - include: import-export-declaration
1307 - include: import-export-declaration
1138 - include: import-export-declaration
1308 - include: import-export-declaration
1139 import-equals-declaration:
1309 import-equals-declaration:
1140− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\()'
1310+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\()'
1141 captures:
1311 captures:
1142 1: keyword.control.export.tsx
1312 1: keyword.control.export.tsx
1313+ 2: storage.modifier.tsx
1143− 2: keyword.control.import.tsx
1314+ 3: keyword.control.import.tsx
1315+ 4: keyword.control.type.tsx
1144− 3: variable.other.readwrite.alias.tsx
1316+ 5: variable.other.readwrite.alias.tsx
1145− 4: keyword.operator.assignment.tsx
1317+ 6: keyword.operator.assignment.tsx
1146− 5: keyword.control.require.tsx
1318+ 7: keyword.control.require.tsx
1147− 6: meta.brace.round.tsx
1319+ 8: meta.brace.round.tsx
1148 push:
1320 push:
1149 - meta_scope: meta.import-equals.external.tsx
1321 - meta_scope: meta.import-equals.external.tsx
1150 - match: \)
1322 - match: \)
@@ -1153,16 +1325,19 @@ contexts:
1153 pop: true
1325 pop: true
1154 - include: comment
1326 - include: comment
1155 - include: string
1327 - include: string
1156− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b)'
1328+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b)'
1157 captures:
1329 captures:
1158 1: keyword.control.export.tsx
1330 1: keyword.control.export.tsx
1331+ 2: storage.modifier.tsx
1159− 2: keyword.control.import.tsx
1332+ 3: keyword.control.import.tsx
1333+ 4: keyword.control.type.tsx
1160− 3: variable.other.readwrite.alias.tsx
1334+ 5: variable.other.readwrite.alias.tsx
1161− 4: keyword.operator.assignment.tsx
1335+ 6: keyword.operator.assignment.tsx
1162 push:
1336 push:
1163 - meta_scope: meta.import-equals.internal.tsx
1337 - meta_scope: meta.import-equals.internal.tsx
1164 - match: (?=;|$|^)
1338 - match: (?=;|$|^)
1165 pop: true
1339 pop: true
1340+ - include: single-line-comment-consuming-line-ending
1166 - include: comment
1341 - include: comment
1167 - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?:(\.)|(\?\.(?!\s*[[:digit:]])))'
1342 - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?:(\.)|(\?\.(?!\s*[[:digit:]])))'
1168 captures:
1343 captures:
@@ -1184,7 +1359,7 @@ contexts:
1184 - include: import-export-clause
1359 - include: import-export-clause
1185 import-export-clause:
1360 import-export-clause:
1186 - include: comment
1361 - include: comment
1187− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bdefault)|(\*)|(\b[_$[:alpha:]][_$[:alnum:]]*))\s+(as)\s+(?:(\bdefault(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|(\b[_$[:alpha:]][_$[:alnum:]]*))'
1362+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bdefault)|(\*)|(\b[_$[:alpha:]][_$[:alnum:]]*))\s+(as)\s+(?:(default(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|([_$[:alpha:]][_$[:alnum:]]*))'
1188 captures:
1363 captures:
1189 1: keyword.control.default.tsx
1364 1: keyword.control.default.tsx
1190 2: constant.language.import-export-all.tsx
1365 2: constant.language.import-export-all.tsx
@@ -1236,6 +1411,9 @@ contexts:
1236 2: keyword.operator.type.modifier.tsx
1411 2: keyword.operator.type.modifier.tsx
1237 3: keyword.operator.optional.tsx
1412 3: keyword.operator.optional.tsx
1238 pop: true
1413 pop: true
1414+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+'
1415+ captures:
1416+ 1: keyword.control.as.tsx
1239 - include: type
1417 - include: type
1240 inline-tags:
1418 inline-tags:
1241 - match: '(\[)[^\]]+(\])(?={@(?:link|linkcode|linkplain|tutorial))'
1419 - match: '(\[)[^\]]+(\])(?={@(?:link|linkcode|linkplain|tutorial))'
@@ -1267,15 +1445,16 @@ contexts:
1267 captures:
1445 captures:
1268 1: keyword.operator.expression.instanceof.tsx
1446 1: keyword.operator.expression.instanceof.tsx
1269 push:
1447 push:
1270− - match: '(?<=\))|(?=[;),}\]:?]|\|\||\&\&|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1448+ - match: '(?<=\))|(?=[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|(([\&\~\^\|]\s*)?[_$[:alpha:]][_$[:alnum:]]*\s+instanceof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1271 pop: true
1449 pop: true
1272 - include: type
1450 - include: type
1273 interface-declaration:
1451 interface-declaration:
1274− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(export)\s+)?\b(?:(abstract)\s+)?\b(interface)\b(?=\s+|/[/*])'
1452+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(?:(abstract)\s+)?\b(interface)\b(?=\s+|/[/*])'
1275 captures:
1453 captures:
1276 1: keyword.control.export.tsx
1454 1: keyword.control.export.tsx
1277 2: storage.modifier.tsx
1455 2: storage.modifier.tsx
1456+ 3: storage.modifier.tsx
1278− 3: storage.type.interface.tsx
1457+ 4: storage.type.interface.tsx
1279 push:
1458 push:
1280 - meta_scope: meta.interface.tsx
1459 - meta_scope: meta.interface.tsx
1281 - match: '(?<=\})'
1460 - match: '(?<=\})'
@@ -1323,7 +1502,7 @@ contexts:
1323 captures:
1502 captures:
1324 0: punctuation.section.embedded.begin.tsx
1503 0: punctuation.section.embedded.begin.tsx
1325 push:
1504 push:
1326− - meta_scope: meta.embedded.expression.tsx
1505+ - meta_content_scope: meta.embedded.expression.tsx
1327 - match: '\}'
1506 - match: '\}'
1328 captures:
1507 captures:
1329 0: punctuation.section.embedded.end.tsx
1508 0: punctuation.section.embedded.end.tsx
@@ -1352,10 +1531,10 @@ contexts:
1352 pop: true
1531 pop: true
1353 - include: jsx-entities
1532 - include: jsx-entities
1354 jsx-tag:
1533 jsx-tag:
1355− - match: '(?=(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))'
1534+ - match: '(?=(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))'
1356 push:
1535 push:
1357 - meta_scope: meta.tag.tsx
1536 - meta_scope: meta.tag.tsx
1358− - match: '(/>)|(?:(</)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1537+ - match: '(/>)|(?:(</)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1359 captures:
1538 captures:
1360 1: punctuation.definition.tag.end.tsx
1539 1: punctuation.definition.tag.end.tsx
1361 2: punctuation.definition.tag.begin.tsx
1540 2: punctuation.definition.tag.begin.tsx
@@ -1365,7 +1544,7 @@ contexts:
1365 6: support.class.component.tsx
1544 6: support.class.component.tsx
1366 7: punctuation.definition.tag.end.tsx
1545 7: punctuation.definition.tag.end.tsx
1367 pop: true
1546 pop: true
1368− - match: '(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>)'
1547+ - match: '(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>)'
1369 captures:
1548 captures:
1370 1: punctuation.definition.tag.begin.tsx
1549 1: punctuation.definition.tag.begin.tsx
1371 2: entity.name.tag.namespace.tsx
1550 2: entity.name.tag.namespace.tsx
@@ -1393,8 +1572,8 @@ contexts:
1393 - match: |-
1572 - match: |-
1394 (?x)
1573 (?x)
1395 \s*
1574 \s*
1396− (?:([_$[:alpha:]][-$[:alnum:].]*)(:))?
1575+ (?:([_$[:alpha:]][-_$[:alnum:].]*)(:))?
1397− ([_$[:alpha:]][-$[:alnum:]]*)
1576+ ([_$[:alpha:]][-_$[:alnum:]]*)
1398 (?=\s|=|/?>|/\*|//)
1577 (?=\s|=|/?>|/\*|//)
1399 captures:
1578 captures:
1400 1: entity.other.attribute-name.namespace.tsx
1579 1: entity.other.attribute-name.namespace.tsx
@@ -1419,15 +1598,15 @@ contexts:
1419 jsx-tag-in-expression:
1598 jsx-tag-in-expression:
1420 - match: |-
1599 - match: |-
1421 (?x)
1600 (?x)
1422− (?<!\+\+|--)(?<=[({\[,?=>:*]|&&|\|\||\?|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^yield|[^\._$[:alnum:]]yield|^)\s*
1601+ (?<!\+\+|--)(?<=[({\[,?=>:*]|&&|\|\||\?|\*\/|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^yield|[^\._$[:alnum:]]yield|^)\s*
1423 (?!<\s*[_$[:alpha:]][_$[:alnum:]]*((\s+extends\s+[^=>])|,)) # look ahead is not type parameter of arrow
1602 (?!<\s*[_$[:alpha:]][_$[:alnum:]]*((\s+extends\s+[^=>])|,)) # look ahead is not type parameter of arrow
1424− (?=(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))
1603+ (?=(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))
1425 push:
1604 push:
1426− - match: '(?!(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))'
1605+ - match: '(?!(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))'
1427 pop: true
1606 pop: true
1428 - include: jsx-tag
1607 - include: jsx-tag
1429 jsx-tag-without-attributes:
1608 jsx-tag-without-attributes:
1430− - match: '(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))?\s*(>)'
1609+ - match: '(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))?\s*(>)'
1431 captures:
1610 captures:
1432 1: punctuation.definition.tag.begin.tsx
1611 1: punctuation.definition.tag.begin.tsx
1433 2: entity.name.tag.namespace.tsx
1612 2: entity.name.tag.namespace.tsx
@@ -1438,7 +1617,7 @@ contexts:
1438 push:
1617 push:
1439 - meta_scope: meta.tag.without-attributes.tsx
1618 - meta_scope: meta.tag.without-attributes.tsx
1440 - meta_content_scope: meta.jsx.children.tsx
1619 - meta_content_scope: meta.jsx.children.tsx
1441− - match: '(</)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))?\s*(>)'
1620+ - match: '(</)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))?\s*(>)'
1442 captures:
1621 captures:
1443 1: punctuation.definition.tag.begin.tsx
1622 1: punctuation.definition.tag.begin.tsx
1444 2: entity.name.tag.namespace.tsx
1623 2: entity.name.tag.namespace.tsx
@@ -1449,9 +1628,9 @@ contexts:
1449 pop: true
1628 pop: true
1450 - include: jsx-children
1629 - include: jsx-children
1451 jsx-tag-without-attributes-in-expression:
1630 jsx-tag-without-attributes-in-expression:
1452− - match: '(?<!\+\+|--)(?<=[({\[,?=>:*]|&&|\|\||\?|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^yield|[^\._$[:alnum:]]yield|^)\s*(?=(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1631+ - match: '(?<!\+\+|--)(?<=[({\[,?=>:*]|&&|\|\||\?|\*\/|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^yield|[^\._$[:alnum:]]yield|^)\s*(?=(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1453 push:
1632 push:
1454− - match: '(?!(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1633+ - match: '(?!(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1455 pop: true
1634 pop: true
1456 - include: jsx-tag-without-attributes
1635 - include: jsx-tag-without-attributes
1457 label:
1636 label:
@@ -1477,25 +1656,27 @@ contexts:
1477 - include: this-literal
1656 - include: this-literal
1478 - include: super-literal
1657 - include: super-literal
1479 method-declaration:
1658 method-declaration:
1480− - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?\s*\b(constructor)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1659+ - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?\s*\b(constructor)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1481 captures:
1660 captures:
1482 1: storage.modifier.tsx
1661 1: storage.modifier.tsx
1483 2: storage.modifier.tsx
1662 2: storage.modifier.tsx
1484− 3: storage.modifier.async.tsx
1663+ 3: storage.modifier.tsx
1664+ 4: storage.modifier.async.tsx
1485− 4: storage.type.tsx
1665+ 5: storage.type.tsx
1486 push:
1666 push:
1487 - meta_scope: meta.method.declaration.tsx
1667 - meta_scope: meta.method.declaration.tsx
1488 - match: '(?=\}|;|,|$)|(?<=\})'
1668 - match: '(?=\}|;|,|$)|(?<=\})'
1489 pop: true
1669 pop: true
1490 - include: method-declaration-name
1670 - include: method-declaration-name
1491 - include: function-body
1671 - include: function-body
1492− - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:(?:\s*\b(new)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|(?:(\*)\s*)?)(?=\s*[\(\<])'
1672+ - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:(?:\s*\b(new)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|(?:(\*)\s*)?)(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])'
1493 captures:
1673 captures:
1494 1: storage.modifier.tsx
1674 1: storage.modifier.tsx
1495 2: storage.modifier.tsx
1675 2: storage.modifier.tsx
1496− 3: storage.modifier.async.tsx
1676+ 3: storage.modifier.tsx
1677+ 4: storage.modifier.async.tsx
1497− 4: keyword.operator.new.tsx
1678+ 5: keyword.operator.new.tsx
1498− 5: keyword.generator.asterisk.tsx
1679+ 6: keyword.generator.asterisk.tsx
1499 push:
1680 push:
1500 - meta_scope: meta.method.declaration.tsx
1681 - meta_scope: meta.method.declaration.tsx
1501 - match: '(?=\}|;|,|$)|(?<=\})'
1682 - match: '(?=\}|;|,|$)|(?<=\})'
@@ -1503,22 +1684,23 @@ contexts:
1503 - include: method-declaration-name
1684 - include: method-declaration-name
1504 - include: function-body
1685 - include: function-body
1505 - match: |-
1686 - match: |-
1506− (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1687+ (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1507− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1688+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1508− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1689+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1509− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1690+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1510− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1691+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1511− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1692+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1512− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1693+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1513− (?:\B(\.)[0-9][0-9_]*\b)| # .1
1694+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1514− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1695+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1515− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*[\(\<])
1696+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1516 captures:
1697 captures:
1517 1: storage.modifier.tsx
1698 1: storage.modifier.tsx
1518 2: storage.modifier.tsx
1699 2: storage.modifier.tsx
1519− 3: storage.modifier.async.tsx
1700+ 3: storage.modifier.tsx
1701+ 4: storage.modifier.async.tsx
1520− 4: storage.type.property.tsx
1702+ 5: storage.type.property.tsx
1521− 5: keyword.generator.asterisk.tsx
1703+ 6: keyword.generator.asterisk.tsx
1522 push:
1704 push:
1523 - meta_scope: meta.method.declaration.tsx
1705 - meta_scope: meta.method.declaration.tsx
1524 - match: '(?=\}|;|,|$)|(?<=\})'
1706 - match: '(?=\}|;|,|$)|(?<=\})'
@@ -1527,16 +1709,16 @@ contexts:
1527 - include: function-body
1709 - include: function-body
1528 method-declaration-name:
1710 method-declaration-name:
1529 - match: |-
1711 - match: |-
1530− (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1712+ (?x)(?=((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1531− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1713+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1532− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1714+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1533− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1715+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1534− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1716+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1535− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1717+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1536− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1718+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1537− (?:\B(\.)[0-9][0-9_]*\b)| # .1
1719+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1538− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1720+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1539− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??)\s*[\(\<])
1721+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??)\s*[\(\<])
1540 push:
1722 push:
1541 - match: (?=\(|\<)
1723 - match: (?=\(|\<)
1542 pop: true
1724 pop: true
@@ -1548,13 +1730,14 @@ contexts:
1548 - match: \?
1730 - match: \?
1549 scope: keyword.operator.optional.tsx
1731 scope: keyword.operator.optional.tsx
1550 namespace-declaration:
1732 namespace-declaration:
1551− - match: '(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(namespace|module)\s+(?=[_$[:alpha:]"''`]))'
1733+ - match: '(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(namespace|module)\s+(?=[_$[:alpha:]"''`]))'
1552 captures:
1734 captures:
1553 1: keyword.control.export.tsx
1735 1: keyword.control.export.tsx
1736+ 2: storage.modifier.tsx
1554− 2: storage.type.namespace.tsx
1737+ 3: storage.type.namespace.tsx
1555 push:
1738 push:
1556 - meta_scope: meta.namespace.declaration.tsx
1739 - meta_scope: meta.namespace.declaration.tsx
1557− - match: '(?<=\})|(?=;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)'
1740+ - match: '(?<=\})|(?=;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
1558 pop: true
1741 pop: true
1559 - include: comment
1742 - include: comment
1560 - include: string
1743 - include: string
@@ -1568,41 +1751,53 @@ contexts:
1568 1: keyword.operator.new.tsx
1751 1: keyword.operator.new.tsx
1569 push:
1752 push:
1570 - meta_scope: new.expr.tsx
1753 - meta_scope: new.expr.tsx
1571− - match: '(?<=\))|(?=[;),}\]:]|\|\||\&\&|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))new(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1754+ - match: '(?<=\))|(?=[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))new(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1572 pop: true
1755 pop: true
1573− - include: paren-expression
1756+ - include: expression
1574− - include: class-declaration
1575− - include: type
1576 null-literal:
1757 null-literal:
1577 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))null(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1758 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))null(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1578 scope: constant.language.null.tsx
1759 scope: constant.language.null.tsx
1579 numeric-literal:
1760 numeric-literal:
1580− - match: '\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$)'
1761+ - match: '\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$)'
1581 scope: constant.numeric.hex.tsx
1762 scope: constant.numeric.hex.tsx
1763+ captures:
1764+ 1: storage.type.numeric.bigint.tsx
1582− - match: '\b(?<!\$)0(b|B)[01][01_]*\b(?!\$)'
1765+ - match: '\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$)'
1583 scope: constant.numeric.binary.tsx
1766 scope: constant.numeric.binary.tsx
1767+ captures:
1768+ 1: storage.type.numeric.bigint.tsx
1584− - match: '\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$)'
1769+ - match: '\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$)'
1585 scope: constant.numeric.octal.tsx
1770 scope: constant.numeric.octal.tsx
1771+ captures:
1772+ 1: storage.type.numeric.bigint.tsx
1586 - match: |-
1773 - match: |-
1587 (?x)
1774 (?x)
1588 (?<!\$)(?:
1775 (?<!\$)(?:
1589− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1776+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1590− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1777+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1591− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1778+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1592− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1779+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1593− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1780+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1594− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1781+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1595− (?:\B(\.)[0-9][0-9_]*\b)| # .1
1782+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1596− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1783+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1597 )(?!\$)
1784 )(?!\$)
1598 captures:
1785 captures:
1599 0: constant.numeric.decimal.tsx
1786 0: constant.numeric.decimal.tsx
1600 1: meta.delimiter.decimal.period.tsx
1787 1: meta.delimiter.decimal.period.tsx
1601− 2: meta.delimiter.decimal.period.tsx
1788+ 2: storage.type.numeric.bigint.tsx
1602 3: meta.delimiter.decimal.period.tsx
1789 3: meta.delimiter.decimal.period.tsx
1603− 4: meta.delimiter.decimal.period.tsx
1790+ 4: storage.type.numeric.bigint.tsx
1604 5: meta.delimiter.decimal.period.tsx
1791 5: meta.delimiter.decimal.period.tsx
1792+ 6: storage.type.numeric.bigint.tsx
1793+ 7: storage.type.numeric.bigint.tsx
1794+ 8: meta.delimiter.decimal.period.tsx
1795+ 9: storage.type.numeric.bigint.tsx
1605− 6: meta.delimiter.decimal.period.tsx
1796+ 10: meta.delimiter.decimal.period.tsx
1797+ 11: storage.type.numeric.bigint.tsx
1798+ 12: meta.delimiter.decimal.period.tsx
1799+ 13: storage.type.numeric.bigint.tsx
1800+ 14: storage.type.numeric.bigint.tsx
1606 numericConstant-literal:
1801 numericConstant-literal:
1607 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))NaN(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1802 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))NaN(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1608 scope: constant.language.nan.tsx
1803 scope: constant.language.nan.tsx
@@ -1611,16 +1806,16 @@ contexts:
1611 object-binding-element:
1806 object-binding-element:
1612 - include: comment
1807 - include: comment
1613 - match: |-
1808 - match: |-
1614− (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1809+ (?x)(?=((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1615− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1810+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1616− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1811+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1617− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1812+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1618− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1813+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1619− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1814+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1620− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1815+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1621− (?:\B(\.)[0-9][0-9_]*\b)| # .1
1816+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1622− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1817+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1623− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1818+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1624 push:
1819 push:
1625 - match: '(?=,|\})'
1820 - match: '(?=,|\})'
1626 pop: true
1821 pop: true
@@ -1633,16 +1828,16 @@ contexts:
1633 object-binding-element-const:
1828 object-binding-element-const:
1634 - include: comment
1829 - include: comment
1635 - match: |-
1830 - match: |-
1636− (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1831+ (?x)(?=((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1637− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1832+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1638− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1833+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1639− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1834+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1640− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1835+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1641− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1836+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1642− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1837+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1643− (?:\B(\.)[0-9][0-9_]*\b)| # .1
1838+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1644− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1839+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1645− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1840+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1646 push:
1841 push:
1647 - match: '(?=,|\})'
1842 - match: '(?=,|\})'
1648 pop: true
1843 pop: true
@@ -1654,16 +1849,16 @@ contexts:
1654 - include: punctuation-comma
1849 - include: punctuation-comma
1655 object-binding-element-propertyName:
1850 object-binding-element-propertyName:
1656 - match: |-
1851 - match: |-
1657− (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1852+ (?x)(?=((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1658− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1853+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1659− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1854+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1660− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1855+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1661− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1856+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1662− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1857+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1663− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1858+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1664− (?:\B(\.)[0-9][0-9_]*\b)| # .1
1859+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1665− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1860+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1666− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1861+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1667 push:
1862 push:
1668 - match: (:)
1863 - match: (:)
1669 captures:
1864 captures:
@@ -1701,9 +1896,9 @@ contexts:
1701 scope: support.class.tsx
1896 scope: support.class.tsx
1702 - match: |-
1897 - match: |-
1703 (?x)(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*(?:
1898 (?x)(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*(?:
1704− ([[:upper:]][_$[:digit:][:upper:]]*) |
1899+ (\#?[[:upper:]][_$[:digit:][:upper:]]*) |
1705− ([_$[:alpha:]][_$[:alnum:]]*)
1900+ (\#?[_$[:alpha:]][_$[:alnum:]]*)
1706− )(?=\s*\??\.\s*[_$[:alpha:]][_$[:alnum:]]*)
1901+ )(?=\s*\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*)
1707 captures:
1902 captures:
1708 1: punctuation.accessor.tsx
1903 1: punctuation.accessor.tsx
1709 2: punctuation.accessor.optional.tsx
1904 2: punctuation.accessor.optional.tsx
@@ -1713,7 +1908,7 @@ contexts:
1713 (?x)(?:
1908 (?x)(?:
1714 ([[:upper:]][_$[:digit:][:upper:]]*) |
1909 ([[:upper:]][_$[:digit:][:upper:]]*) |
1715 ([_$[:alpha:]][_$[:alnum:]]*)
1910 ([_$[:alpha:]][_$[:alnum:]]*)
1716− )(?=\s*\??\.\s*[_$[:alpha:]][_$[:alnum:]]*)
1911+ )(?=\s*\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*)
1717 captures:
1912 captures:
1718 1: variable.other.constant.object.tsx
1913 1: variable.other.constant.object.tsx
1719 2: variable.other.object.tsx
1914 2: variable.other.object.tsx
@@ -1730,16 +1925,16 @@ contexts:
1730 - include: object-member
1925 - include: object-member
1731 object-literal-method-declaration:
1926 object-literal-method-declaration:
1732 - match: |-
1927 - match: |-
1733− (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1928+ (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1734− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1929+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1735− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1930+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1736− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1931+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1737− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1932+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1738− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1933+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1739− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1934+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1740− (?:\B(\.)[0-9][0-9_]*\b)| # .1
1935+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1741− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1936+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1742− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*[\(\<])
1937+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1743 captures:
1938 captures:
1744 1: storage.modifier.async.tsx
1939 1: storage.modifier.async.tsx
1745 2: storage.type.property.tsx
1940 2: storage.type.property.tsx
@@ -1751,16 +1946,16 @@ contexts:
1751 - include: method-declaration-name
1946 - include: method-declaration-name
1752 - include: function-body
1947 - include: function-body
1753 - match: |-
1948 - match: |-
1754− (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1949+ (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1755− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1950+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1756− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1951+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1757− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1952+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1758− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1953+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1759− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1954+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1760− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1955+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1761− (?:\B(\.)[0-9][0-9_]*\b)| # .1
1956+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1762− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1957+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1763− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*[\(\<])
1958+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1764 captures:
1959 captures:
1765 1: storage.modifier.async.tsx
1960 1: storage.modifier.async.tsx
1766 2: storage.type.property.tsx
1961 2: storage.type.property.tsx
@@ -1777,37 +1972,56 @@ contexts:
1777 - meta_scope: meta.object.member.tsx meta.object-literal.key.tsx
1972 - meta_scope: meta.object.member.tsx meta.object-literal.key.tsx
1778 - match: '(?=:)|((?<=[\]])(?=\s*[\(\<]))'
1973 - match: '(?=:)|((?<=[\]])(?=\s*[\(\<]))'
1779 pop: true
1974 pop: true
1975+ - include: comment
1780 - include: array-literal
1976 - include: array-literal
1781− - match: '(?=[\''\"])'
1977+ - match: '(?=[\''\"\`])'
1782 push:
1978 push:
1783 - meta_scope: meta.object.member.tsx meta.object-literal.key.tsx
1979 - meta_scope: meta.object.member.tsx meta.object-literal.key.tsx
1784− - match: '(?=:)|((?<=[\''\"])(?=\s*[\(\<]))'
1980+ - match: '(?=:)|((?<=[\''\"\`])(?=((\s*[\(\<,}])|(\s+(as)\s+))))'
1785 pop: true
1981 pop: true
1982+ - include: comment
1786 - include: string
1983 - include: string
1787− - match: '(?<=[\]\''\"])(?=\s*[\(\<])'
1984+ - match: |-
1985+ (?x)(?=(\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1986+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1987+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1988+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1989+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1990+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1991+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1992+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1993+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1994+ )(?!\$)))
1995+ push:
1996+ - meta_scope: meta.object.member.tsx meta.object-literal.key.tsx
1997+ - match: '(?=:)|(?=\s*([\(\<,}])|(\s+as\s+))'
1998+ pop: true
1999+ - include: comment
2000+ - include: numeric-literal
2001+ - match: '(?<=[\]\''\"\`])(?=\s*[\(\<])'
1788 push:
2002 push:
1789 - meta_scope: meta.method.declaration.tsx
2003 - meta_scope: meta.method.declaration.tsx
1790 - match: '(?=\}|;|,)|(?<=\})'
2004 - match: '(?=\}|;|,)|(?<=\})'
1791 pop: true
2005 pop: true
1792 - include: function-body
2006 - include: function-body
1793− - match: '(?![_$[:alpha:]])([[:digit:]]+)\s*(?=:)'
2007+ - match: '(?![_$[:alpha:]])([[:digit:]]+)\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*:)'
1794 scope: meta.object.member.tsx
2008 scope: meta.object.member.tsx
1795 captures:
2009 captures:
1796 0: meta.object-literal.key.tsx
2010 0: meta.object-literal.key.tsx
1797 1: constant.numeric.decimal.tsx
2011 1: constant.numeric.decimal.tsx
1798 - match: |-
2012 - match: |-
1799− (?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\s*(?=:\s*(
2013+ (?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*:(\s*\/\*([^\*]|(\*[^\/]))*\*\/)*\s*(
1800 ((async\s+)?(
2014 ((async\s+)?(
1801 (function\s*[(<*]) |
2015 (function\s*[(<*]) |
1802 (function\s+) |
2016 (function\s+) |
1803 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2017 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1804 )) |
2018 )) |
1805 ((async\s*)?(
2019 ((async\s*)?(
1806− ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
2020+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1807 # sure shot arrow functions even if => is on new line
2021 # sure shot arrow functions even if => is on new line
1808 (
2022 (
1809− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
2023+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1810− [(]\s*
2024+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1811 (
2025 (
1812 ([)]\s*:) | # ():
2026 ([)]\s*:) | # ():
1813 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
2027 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -1818,9 +2032,9 @@ contexts:
1818 ) |
2032 ) |
1819 # arrow function possible to detect only with => on same line
2033 # arrow function possible to detect only with => on same line
1820 (
2034 (
1821− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
2035+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1822− \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
2036+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1823− (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
2037+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1824 \s*=> # arrow operator
2038 \s*=> # arrow operator
1825 )
2039 )
1826 ))
2040 ))
@@ -1829,7 +2043,7 @@ contexts:
1829 captures:
2043 captures:
1830 0: meta.object-literal.key.tsx
2044 0: meta.object-literal.key.tsx
1831 1: entity.name.function.tsx
2045 1: entity.name.function.tsx
1832− - match: '(?:[_$[:alpha:]][_$[:alnum:]]*)\s*(?=:)'
2046+ - match: '(?:[_$[:alpha:]][_$[:alnum:]]*)\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*:)'
1833 scope: meta.object.member.tsx
2047 scope: meta.object.member.tsx
1834 captures:
2048 captures:
1835 0: meta.object-literal.key.tsx
2049 0: meta.object-literal.key.tsx
@@ -1841,14 +2055,27 @@ contexts:
1841 - match: '(?=,|\})'
2055 - match: '(?=,|\})'
1842 pop: true
2056 pop: true
1843 - include: expression
2057 - include: expression
1844− - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?=,|\}|$)'
2058+ - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?=,|\}|$|\/\/|\/\*)'
1845 scope: meta.object.member.tsx
2059 scope: meta.object.member.tsx
1846 captures:
2060 captures:
1847 1: variable.other.readwrite.tsx
2061 1: variable.other.readwrite.tsx
2062+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+(const)(?=\s*([,}]|$))'
2063+ scope: meta.object.member.tsx
2064+ captures:
2065+ 1: keyword.control.as.tsx
2066+ 2: storage.modifier.tsx
2067+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+'
2068+ captures:
2069+ 1: keyword.control.as.tsx
2070+ push:
2071+ - meta_scope: meta.object.member.tsx
2072+ - match: '(?=[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|^|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+))'
2073+ pop: true
2074+ - include: type
1848 - match: '(?=[_$[:alpha:]][_$[:alnum:]]*\s*=)'
2075 - match: '(?=[_$[:alpha:]][_$[:alnum:]]*\s*=)'
1849 push:
2076 push:
1850 - meta_scope: meta.object.member.tsx
2077 - meta_scope: meta.object.member.tsx
1851− - match: '(?=,|\}|$)'
2078+ - match: '(?=,|\}|$|\/\/|\/\*)'
1852 pop: true
2079 pop: true
1853 - include: expression
2080 - include: expression
1854 - match: ":"
2081 - match: ":"
@@ -1858,7 +2085,7 @@ contexts:
1858 - meta_scope: meta.object.member.tsx
2085 - meta_scope: meta.object.member.tsx
1859 - match: '(?=,|\})'
2086 - match: '(?=,|\})'
1860 pop: true
2087 pop: true
1861− - match: '(?<=:)\s*(async)?(?=\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)\(\s*([\{\[]\s*)?$)'
2088+ - match: '(?<=:)\s*(async)?(?=\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1862 captures:
2089 captures:
1863 1: storage.modifier.async.tsx
2090 1: storage.modifier.async.tsx
1864 push:
2091 push:
@@ -1874,7 +2101,7 @@ contexts:
1874 0: meta.brace.round.tsx
2101 0: meta.brace.round.tsx
1875 pop: true
2102 pop: true
1876 - include: expression-inside-possibly-arrow-parens
2103 - include: expression-inside-possibly-arrow-parens
1877− - match: '(?<=:)\s*(async)?\s*(\()(?=\s*([\{\[]\s*)?$)'
2104+ - match: '(?<=:)\s*(async)?\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1878 captures:
2105 captures:
1879 1: storage.modifier.async.tsx
2106 1: storage.modifier.async.tsx
1880 2: meta.brace.round.tsx
2107 2: meta.brace.round.tsx
@@ -1884,6 +2111,23 @@ contexts:
1884 0: meta.brace.round.tsx
2111 0: meta.brace.round.tsx
1885 pop: true
2112 pop: true
1886 - include: expression-inside-possibly-arrow-parens
2113 - include: expression-inside-possibly-arrow-parens
2114+ - match: (?<=:)\s*(async)?\s*(?=\<\s*$)
2115+ captures:
2116+ 1: storage.modifier.async.tsx
2117+ push:
2118+ - match: (?<=\>)
2119+ pop: true
2120+ - include: type-parameters
2121+ - match: '(?<=\>)\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
2122+ captures:
2123+ 1: meta.brace.round.tsx
2124+ push:
2125+ - match: \)
2126+ captures:
2127+ 0: meta.brace.round.tsx
2128+ pop: true
2129+ - include: expression-inside-possibly-arrow-parens
2130+ - include: possibly-arrow-return-type
1887 - include: expression
2131 - include: expression
1888 - include: punctuation-comma
2132 - include: punctuation-comma
1889 parameter-array-binding-pattern:
2133 parameter-array-binding-pattern:
@@ -1901,16 +2145,18 @@ contexts:
1901 parameter-binding-element:
2145 parameter-binding-element:
1902 - include: comment
2146 - include: comment
1903 - include: string
2147 - include: string
2148+ - include: numeric-literal
2149+ - include: regex
1904 - include: parameter-object-binding-pattern
2150 - include: parameter-object-binding-pattern
1905 - include: parameter-array-binding-pattern
2151 - include: parameter-array-binding-pattern
1906 - include: destructuring-parameter-rest
2152 - include: destructuring-parameter-rest
1907 - include: variable-initializer
2153 - include: variable-initializer
1908 parameter-name:
2154 parameter-name:
1909− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|protected|private|readonly)\s+(?=(public|protected|private|readonly)\s+)'
2155+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|protected|private|readonly)\s+(?=(override|public|protected|private|readonly)\s+)'
1910 captures:
2156 captures:
1911 1: storage.modifier.tsx
2157 1: storage.modifier.tsx
1912 - match: |-
2158 - match: |-
1913− (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
2159+ (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
1914 # function assignment |
2160 # function assignment |
1915 (=\s*(
2161 (=\s*(
1916 ((async\s+)?(
2162 ((async\s+)?(
@@ -1919,11 +2165,11 @@ contexts:
1919 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2165 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1920 )) |
2166 )) |
1921 ((async\s*)?(
2167 ((async\s*)?(
1922− ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
2168+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1923 # sure shot arrow functions even if => is on new line
2169 # sure shot arrow functions even if => is on new line
1924 (
2170 (
1925− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
2171+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1926− [(]\s*
2172+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1927 (
2173 (
1928 ([)]\s*:) | # ():
2174 ([)]\s*:) | # ():
1929 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
2175 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -1934,9 +2180,9 @@ contexts:
1934 ) |
2180 ) |
1935 # arrow function possible to detect only with => on same line
2181 # arrow function possible to detect only with => on same line
1936 (
2182 (
1937− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
2183+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1938− \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
2184+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1939− (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
2185+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1940 \s*=> # arrow operator
2186 \s*=> # arrow operator
1941 )
2187 )
1942 ))
2188 ))
@@ -1953,19 +2199,20 @@ contexts:
1953 ))
2199 ))
1954 ))
2200 ))
1955 )) |
2201 )) |
1956− (:\s*((<\s*$)|([\(]\s*([\{\[]\s*)?$))) |
2202+ (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
1957− (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
2203+ (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
2204+ (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
1958 ((async\s+)?(
2205 ((async\s+)?(
1959 (function\s*[(<*]) |
2206 (function\s*[(<*]) |
1960 (function\s+) |
2207 (function\s+) |
1961 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2208 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1962 )) |
2209 )) |
1963 ((async\s*)?(
2210 ((async\s*)?(
1964− ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
2211+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1965 # sure shot arrow functions even if => is on new line
2212 # sure shot arrow functions even if => is on new line
1966 (
2213 (
1967− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
2214+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1968− [(]\s*
2215+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1969 (
2216 (
1970 ([)]\s*:) | # ():
2217 ([)]\s*:) | # ():
1971 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
2218 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -1976,9 +2223,9 @@ contexts:
1976 ) |
2223 ) |
1977 # arrow function possible to detect only with => on same line
2224 # arrow function possible to detect only with => on same line
1978 (
2225 (
1979− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
2226+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1980− \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
2227+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1981− (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
2228+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1982 \s*=> # arrow operator
2229 \s*=> # arrow operator
1983 )
2230 )
1984 ))
2231 ))
@@ -1989,7 +2236,7 @@ contexts:
1989 3: entity.name.function.tsx variable.language.this.tsx
2236 3: entity.name.function.tsx variable.language.this.tsx
1990 4: entity.name.function.tsx
2237 4: entity.name.function.tsx
1991 5: keyword.operator.optional.tsx
2238 5: keyword.operator.optional.tsx
1992− - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)'
2239+ - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)'
1993 captures:
2240 captures:
1994 1: storage.modifier.tsx
2241 1: storage.modifier.tsx
1995 2: keyword.operator.rest.tsx
2242 2: keyword.operator.rest.tsx
@@ -1999,16 +2246,16 @@ contexts:
1999 parameter-object-binding-element:
2246 parameter-object-binding-element:
2000 - include: comment
2247 - include: comment
2001 - match: |-
2248 - match: |-
2002− (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
2249+ (?x)(?=((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
2003− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
2250+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
2004− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
2251+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
2005− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
2252+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
2006− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
2253+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
2007− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
2254+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
2008− (?:\b[0-9][0-9_]*(\.)\B)| # 1.
2255+ (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
2009− (?:\B(\.)[0-9][0-9_]*\b)| # .1
2256+ (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
2010− (?:\b[0-9][0-9_]*\b(?!\.)) # 1
2257+ (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
2011− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
2258+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
2012 push:
2259 push:
2013 - match: '(?=,|\})'
2260 - match: '(?=,|\})'
2014 pop: true
2261 pop: true
@@ -2029,6 +2276,15 @@ contexts:
2029 0: punctuation.definition.binding-pattern.object.tsx
2276 0: punctuation.definition.binding-pattern.object.tsx
2030 pop: true
2277 pop: true
2031 - include: parameter-object-binding-element
2278 - include: parameter-object-binding-element
2279+ parameter-type-annotation:
2280+ - match: (:)
2281+ captures:
2282+ 1: keyword.operator.type.annotation.tsx
2283+ push:
2284+ - meta_scope: meta.type.annotation.tsx
2285+ - match: "(?=[,)])|(?==[^>])"
2286+ pop: true
2287+ - include: type
2032 paren-expression:
2288 paren-expression:
2033 - match: \(
2289 - match: \(
2034 captures:
2290 captures:
@@ -2040,14 +2296,14 @@ contexts:
2040 pop: true
2296 pop: true
2041 - include: expression
2297 - include: expression
2042 paren-expression-possibly-arrow:
2298 paren-expression-possibly-arrow:
2043− - match: '(?<=[(=,])\s*(async)?(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*))?\(\s*[\{\[]\s*$)'
2299+ - match: '(?<=[(=,])\s*(async)?(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
2044 captures:
2300 captures:
2045 1: storage.modifier.async.tsx
2301 1: storage.modifier.async.tsx
2046 push:
2302 push:
2047 - match: (?<=\))
2303 - match: (?<=\))
2048 pop: true
2304 pop: true
2049 - include: paren-expression-possibly-arrow-with-typeparameters
2305 - include: paren-expression-possibly-arrow-with-typeparameters
2050− - match: '(?<=[(=,]|=>)\s*(async)?(?=\s*((((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*))?\()|(<))\s*$)'
2306+ - match: '(?<=[(=,]|=>|^return|[^\._$[:alnum:]]return)\s*(async)?(?=\s*((((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\()|(<))\s*$)'
2051 captures:
2307 captures:
2052 1: storage.modifier.async.tsx
2308 1: storage.modifier.async.tsx
2053 push:
2309 push:
@@ -2067,7 +2323,7 @@ contexts:
2067 pop: true
2323 pop: true
2068 - include: expression-inside-possibly-arrow-parens
2324 - include: expression-inside-possibly-arrow-parens
2069 possibly-arrow-return-type:
2325 possibly-arrow-return-type:
2070− - match: '(?<=\))\s*(:)(?=\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+\s*=>)'
2326+ - match: '(?<=\)|^)\s*(:)(?=\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*=>)'
2071 captures:
2327 captures:
2072 1: meta.arrow.tsx meta.return.type.arrow.tsx keyword.operator.type.annotation.tsx
2328 1: meta.arrow.tsx meta.return.type.arrow.tsx keyword.operator.type.annotation.tsx
2073 push:
2329 push:
@@ -2114,23 +2370,23 @@ contexts:
2114 pop: true
2370 pop: true
2115 - include: string-character-escape
2371 - include: string-character-escape
2116 regex:
2372 regex:
2117− - match: '(?<!\+\+|--|})(?<=[=(:,\[?+!]|^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case|=>|&&|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/[gimsuy]*(?!\s*[a-zA-Z0-9_$]))'
2373+ - match: '(?<!\+\+|--|})(?<=[=(:,\[?+!]|^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case|=>|&&|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[\()]|\\.|\[([^\]\\]|\\.)+\]|\(([^\)\\]|\\.)+\))+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2118 captures:
2374 captures:
2119 1: punctuation.definition.string.begin.tsx
2375 1: punctuation.definition.string.begin.tsx
2120 push:
2376 push:
2121 - meta_scope: string.regexp.tsx
2377 - meta_scope: string.regexp.tsx
2122− - match: "(/)([gimsuy]*)"
2378+ - match: "(/)([dgimsuy]*)"
2123 captures:
2379 captures:
2124 1: punctuation.definition.string.end.tsx
2380 1: punctuation.definition.string.end.tsx
2125 2: keyword.other.tsx
2381 2: keyword.other.tsx
2126 pop: true
2382 pop: true
2127 - include: regexp
2383 - include: regexp
2128− - match: '(?<![_$[:alnum:])\]]|\+\+|--|})\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/[gimsuy]*(?!\s*[a-zA-Z0-9_$]))'
2384+ - match: '((?<![_$[:alnum:])\]]|\+\+|--|}|\*\/)|((?<=^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case))\s*)\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)*\])+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2129 captures:
2385 captures:
2130 0: punctuation.definition.string.begin.tsx
2386 0: punctuation.definition.string.begin.tsx
2131 push:
2387 push:
2132 - meta_scope: string.regexp.tsx
2388 - meta_scope: string.regexp.tsx
2133− - match: "(/)([gimsuy]*)"
2389+ - match: "(/)([dgimsuy]*)"
2134 captures:
2390 captures:
2135 1: punctuation.definition.string.end.tsx
2391 1: punctuation.definition.string.end.tsx
2136 2: keyword.other.tsx
2392 2: keyword.other.tsx
@@ -2230,10 +2486,24 @@ contexts:
2230 - include: type-object
2486 - include: type-object
2231 - include: type-predicate-operator
2487 - include: type-predicate-operator
2232 - include: type
2488 - include: type
2489+ shebang:
2490+ - match: \A(#!).*(?=$)
2491+ scope: comment.line.shebang.tsx
2492+ captures:
2493+ 1: punctuation.definition.comment.tsx
2494+ single-line-comment-consuming-line-ending:
2495+ - match: '(^[ \t]+)?((//)(?:\s*((@)internal)(?=\s|$))?)'
2496+ captures:
2497+ 1: punctuation.whitespace.comment.leading.tsx
2498+ 2: comment.line.double-slash.tsx
2499+ 3: punctuation.definition.comment.tsx
2500+ 4: storage.type.internaldeclaration.tsx
2501+ 5: punctuation.decorator.internaldeclaration.tsx
2502+ push:
2503+ - meta_content_scope: comment.line.double-slash.tsx
2504+ - match: (?=^)
2505+ pop: true
2233 statements:
2506 statements:
2234− - include: string
2235− - include: template
2236− - include: comment
2237 - include: declaration
2507 - include: declaration
2238 - include: control-statement
2508 - include: control-statement
2239 - include: after-operator-block-as-object-literal
2509 - include: after-operator-block-as-object-literal
@@ -2241,21 +2511,31 @@ contexts:
2241 - include: label
2511 - include: label
2242 - include: expression
2512 - include: expression
2243 - include: punctuation-semicolon
2513 - include: punctuation-semicolon
2514+ - include: string
2515+ - include: comment
2244 string:
2516 string:
2245 - include: qstring-single
2517 - include: qstring-single
2246 - include: qstring-double
2518 - include: qstring-double
2519+ - include: template
2247 string-character-escape:
2520 string-character-escape:
2248− - match: '\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)'
2521+ - match: '\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u\{[0-9A-Fa-f]+\}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)'
2249 scope: constant.character.escape.tsx
2522 scope: constant.character.escape.tsx
2250 super-literal:
2523 super-literal:
2251 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))super\b(?!\$)'
2524 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))super\b(?!\$)'
2252 scope: variable.language.super.tsx
2525 scope: variable.language.super.tsx
2526+ support-function-call-identifiers:
2527+ - include: literal
2528+ - include: support-objects
2529+ - include: object-identifiers
2530+ - include: punctuation-accessor
2531+ - match: '(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))import(?=\s*[\(]\s*[\"\''\`]))'
2532+ scope: keyword.operator.expression.import.tsx
2253 support-objects:
2533 support-objects:
2254 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(arguments)\b(?!\$)'
2534 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(arguments)\b(?!\$)'
2255 scope: variable.language.arguments.tsx
2535 scope: variable.language.arguments.tsx
2256 - match: |-
2536 - match: |-
2257− (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(Array|ArrayBuffer|Atomics|Boolean|DataView|Date|Float32Array|Float64Array|Function|Generator
2537+ (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(Array|ArrayBuffer|Atomics|BigInt|BigInt64Array|BigUint64Array|Boolean|DataView|Date|Float32Array
2258− |GeneratorFunction|Int8Array|Int16Array|Int32Array|Intl|Map|Number|Object|Proxy
2538+ |Float64Array|Function|Generator|GeneratorFunction|Int8Array|Int16Array|Int32Array|Intl|Map|Number|Object|Proxy
2259 |Reflect|RegExp|Set|SharedArrayBuffer|SIMD|String|Symbol|TypedArray
2539 |Reflect|RegExp|Set|SharedArrayBuffer|SIMD|String|Symbol|TypedArray
2260 |Uint8Array|Uint16Array|Uint32Array|Uint8ClampedArray|WeakMap|WeakSet)\b(?!\$)
2540 |Uint8Array|Uint16Array|Uint32Array|Uint8ClampedArray|WeakMap|WeakSet)\b(?!\$)
2261 scope: support.class.builtin.tsx
2541 scope: support.class.builtin.tsx
@@ -2309,9 +2589,9 @@ contexts:
2309 4: support.variable.property.target.tsx
2589 4: support.variable.property.target.tsx
2310 - match: |-
2590 - match: |-
2311 (?x) (?:(\.)|(\?\.(?!\s*[[:digit:]]))) \s* (?:
2591 (?x) (?:(\.)|(\?\.(?!\s*[[:digit:]]))) \s* (?:
2312− (constructor|length|prototype|__proto__)
2592+ (?:(constructor|length|prototype|__proto__)\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\())
2313 |
2593 |
2314− (EPSILON|MAX_SAFE_INTEGER|MAX_VALUE|MIN_SAFE_INTEGER|MIN_VALUE|NEGATIVE_INFINITY|POSITIVE_INFINITY))\b(?!\$)
2594+ (?:(EPSILON|MAX_SAFE_INTEGER|MAX_VALUE|MIN_SAFE_INTEGER|MIN_VALUE|NEGATIVE_INFINITY|POSITIVE_INFINITY)\b(?!\$)))
2315 captures:
2595 captures:
2316 1: punctuation.accessor.tsx
2596 1: punctuation.accessor.tsx
2317 2: punctuation.accessor.optional.tsx
2597 2: punctuation.accessor.optional.tsx
@@ -2415,7 +2695,7 @@ contexts:
2415 |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary
2695 |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary
2416 |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead
2696 |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead
2417 |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile
2697 |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile
2418− |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?\()
2698+ |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\()
2419 captures:
2699 captures:
2420 1: punctuation.accessor.tsx
2700 1: punctuation.accessor.tsx
2421 2: punctuation.accessor.optional.tsx
2701 2: punctuation.accessor.optional.tsx
@@ -2539,6 +2819,7 @@ contexts:
2539 captures:
2819 captures:
2540 0: punctuation.definition.block.tsx
2820 0: punctuation.definition.block.tsx
2541 pop: true
2821 pop: true
2822+ - include: comment
2542 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(switch)\s*(\()'
2823 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(switch)\s*(\()'
2543 captures:
2824 captures:
2544 1: keyword.control.switch.tsx
2825 1: keyword.control.switch.tsx
@@ -2581,7 +2862,34 @@ contexts:
2581 0: case-clause.expr.tsx punctuation.definition.section.case-statement.tsx
2862 0: case-clause.expr.tsx punctuation.definition.section.case-statement.tsx
2582 - include: statements
2863 - include: statements
2583 template:
2864 template:
2584− - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?=(<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?!=)\>)*(?!=)>\s*)`)'
2865+ - include: template-call
2866+ - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2867+ captures:
2868+ 1: entity.name.function.tagged-template.tsx
2869+ 2: punctuation.definition.string.template.begin.tsx
2870+ push:
2871+ - meta_scope: string.template.tsx
2872+ - match: "`"
2873+ captures:
2874+ 0: punctuation.definition.string.template.end.tsx
2875+ pop: true
2876+ - include: template-substitution-element
2877+ - include: string-character-escape
2878+ template-call:
2879+ - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*)(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2880+ push:
2881+ - meta_scope: string.template.tsx
2882+ - match: (?=`)
2883+ pop: true
2884+ - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*))'
2885+ push:
2886+ - match: '(?=(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2887+ pop: true
2888+ - include: support-function-call-identifiers
2889+ - match: "([_$[:alpha:]][_$[:alnum:]]*)"
2890+ scope: entity.name.function.tagged-template.tsx
2891+ - include: type-arguments
2892+ - match: '([_$[:alpha:]][_$[:alnum:]]*)?\s*(?=(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)`)'
2585 captures:
2893 captures:
2586 1: entity.name.function.tagged-template.tsx
2894 1: entity.name.function.tagged-template.tsx
2587 push:
2895 push:
@@ -2589,6 +2897,20 @@ contexts:
2589 - match: (?=`)
2897 - match: (?=`)
2590 pop: true
2898 pop: true
2591 - include: type-arguments
2899 - include: type-arguments
2900+ template-substitution-element:
2901+ - match: '\$\{'
2902+ captures:
2903+ 0: punctuation.definition.template-expression.begin.tsx
2904+ push:
2905+ - meta_scope: meta.template.expression.tsx
2906+ - meta_content_scope: meta.embedded.line.tsx
2907+ - match: '\}'
2908+ captures:
2909+ 0: punctuation.definition.template-expression.end.tsx
2910+ pop: true
2911+ - include: expression
2912+ template-type:
2913+ - include: template-call
2592 - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2914 - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2593 captures:
2915 captures:
2594 1: entity.name.function.tagged-template.tsx
2916 1: entity.name.function.tagged-template.tsx
@@ -2599,9 +2921,9 @@ contexts:
2599 captures:
2921 captures:
2600 0: punctuation.definition.string.template.end.tsx
2922 0: punctuation.definition.string.template.end.tsx
2601 pop: true
2923 pop: true
2602− - include: template-substitution-element
2924+ - include: template-type-substitution-element
2603 - include: string-character-escape
2925 - include: string-character-escape
2604− template-substitution-element:
2926+ template-type-substitution-element:
2605 - match: '\$\{'
2927 - match: '\$\{'
2606 captures:
2928 captures:
2607 0: punctuation.definition.template-expression.begin.tsx
2929 0: punctuation.definition.template-expression.begin.tsx
@@ -2612,9 +2934,9 @@ contexts:
2612 captures:
2934 captures:
2613 0: punctuation.definition.template-expression.end.tsx
2935 0: punctuation.definition.template-expression.end.tsx
2614 pop: true
2936 pop: true
2615− - include: expression
2937+ - include: type
2616 ternary-expression:
2938 ternary-expression:
2617− - match: '(?!\?\.\s*[^[:digit:]])(\?)'
2939+ - match: '(?!\?\.\s*[^[:digit:]])(\?)(?!\?)'
2618 captures:
2940 captures:
2619 1: keyword.operator.ternary.tsx
2941 1: keyword.operator.ternary.tsx
2620 push:
2942 push:
@@ -2628,7 +2950,7 @@ contexts:
2628 scope: variable.language.this.tsx
2950 scope: variable.language.this.tsx
2629 type:
2951 type:
2630 - include: comment
2952 - include: comment
2631− - include: string
2953+ - include: type-string
2632 - include: numeric-literal
2954 - include: numeric-literal
2633 - include: type-primitive
2955 - include: type-primitive
2634 - include: type-builtin-literals
2956 - include: type-builtin-literals
@@ -2640,24 +2962,36 @@ contexts:
2640 - include: type-fn-type-parameters
2962 - include: type-fn-type-parameters
2641 - include: type-paren-or-function-parameters
2963 - include: type-paren-or-function-parameters
2642 - include: type-function-return-type
2964 - include: type-function-return-type
2965+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(readonly)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
2966+ captures:
2967+ 1: storage.modifier.tsx
2643 - include: type-name
2968 - include: type-name
2644 type-alias-declaration:
2969 type-alias-declaration:
2645− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(type)\b\s+([_$[:alpha:]][_$[:alnum:]]*)\s*'
2970+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(type)\b\s+([_$[:alpha:]][_$[:alnum:]]*)\s*'
2646 captures:
2971 captures:
2647 1: keyword.control.export.tsx
2972 1: keyword.control.export.tsx
2648− 2: storage.type.type.tsx
2973+ 2: storage.modifier.tsx
2649− 3: entity.name.type.alias.tsx
2974+ 3: storage.type.type.tsx
2975+ 4: entity.name.type.alias.tsx
2650 push:
2976 push:
2651 - meta_scope: meta.type.declaration.tsx
2977 - meta_scope: meta.type.declaration.tsx
2652− - match: '(?=\}|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)'
2978+ - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2653 pop: true
2979 pop: true
2654 - include: comment
2980 - include: comment
2655 - include: type-parameters
2981 - include: type-parameters
2982+ - match: '(=)\s*(intrinsic)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2983+ captures:
2984+ 1: keyword.operator.assignment.tsx
2985+ 2: keyword.control.intrinsic.tsx
2986+ push:
2987+ - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2988+ pop: true
2989+ - include: type
2656 - match: (=)\s*
2990 - match: (=)\s*
2657 captures:
2991 captures:
2658 1: keyword.operator.assignment.tsx
2992 1: keyword.operator.assignment.tsx
2659 push:
2993 push:
2660− - match: '(?=\}|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)'
2994+ - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2661 pop: true
2995 pop: true
2662 - include: type
2996 - include: type
2663 type-annotation:
2997 type-annotation:
@@ -2687,8 +3021,13 @@ contexts:
2687 captures:
3021 captures:
2688 0: punctuation.definition.typeparameters.end.tsx
3022 0: punctuation.definition.typeparameters.end.tsx
2689 pop: true
3023 pop: true
2690− - include: type
3024+ - include: type-arguments-body
2691− - include: punctuation-comma
3025+ type-arguments-body:
3026+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(_)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3027+ captures:
3028+ 0: keyword.operator.type.tsx
3029+ - include: type
3030+ - include: punctuation-comma
2692 type-builtin-literals:
3031 type-builtin-literals:
2693 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(this|true|false|undefined|null|object)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3032 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(this|true|false|undefined|null|object)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2694 scope: support.type.builtin.tsx
3033 scope: support.type.builtin.tsx
@@ -2710,13 +3049,19 @@ contexts:
2710 - include: type
3049 - include: type
2711 - include: type
3050 - include: type
2712 type-fn-type-parameters:
3051 type-fn-type-parameters:
2713− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(new)\b(?=\s*\<)'
3052+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(abstract)\s+)?(new)\b(?=\s*\<)'
2714− scope: meta.type.constructor.tsx
2715 captures:
3053 captures:
2716− 1: keyword.control.new.tsx
3054+ 1: meta.type.constructor.tsx storage.modifier.tsx
2717− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(new)\b\s*(?=\()'
3055+ 2: meta.type.constructor.tsx keyword.control.new.tsx
3056+ push:
3057+ - match: (?<=>)
3058+ pop: true
3059+ - include: comment
3060+ - include: type-parameters
3061+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(abstract)\s+)?(new)\b\s*(?=\()'
2718 captures:
3062 captures:
2719− 1: keyword.control.new.tsx
3063+ 1: storage.modifier.tsx
3064+ 2: keyword.control.new.tsx
2720 push:
3065 push:
2721 - meta_scope: meta.type.constructor.tsx
3066 - meta_scope: meta.type.constructor.tsx
2722 - match: (?<=\))
3067 - match: (?<=\))
@@ -2767,6 +3112,30 @@ contexts:
2767 - include: type-predicate-operator
3112 - include: type-predicate-operator
2768 - include: type
3113 - include: type
2769 type-name:
3114 type-name:
3115+ - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*(<)'
3116+ captures:
3117+ 1: entity.name.type.module.tsx
3118+ 2: punctuation.accessor.tsx
3119+ 3: punctuation.accessor.optional.tsx
3120+ 4: meta.type.parameters.tsx punctuation.definition.typeparameters.begin.tsx
3121+ push:
3122+ - meta_content_scope: meta.type.parameters.tsx
3123+ - match: (>)
3124+ captures:
3125+ 1: meta.type.parameters.tsx punctuation.definition.typeparameters.end.tsx
3126+ pop: true
3127+ - include: type-arguments-body
3128+ - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(<)'
3129+ captures:
3130+ 1: entity.name.type.tsx
3131+ 2: meta.type.parameters.tsx punctuation.definition.typeparameters.begin.tsx
3132+ push:
3133+ - meta_content_scope: meta.type.parameters.tsx
3134+ - match: (>)
3135+ captures:
3136+ 1: meta.type.parameters.tsx punctuation.definition.typeparameters.end.tsx
3137+ pop: true
3138+ - include: type-arguments-body
2770 - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?:(\.)|(\?\.(?!\s*[[:digit:]])))'
3139 - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?:(\.)|(\?\.(?!\s*[[:digit:]])))'
2771 captures:
3140 captures:
2772 1: entity.name.type.module.tsx
3141 1: entity.name.type.module.tsx
@@ -2802,18 +3171,16 @@ contexts:
2802 - include: type
3171 - include: type
2803 type-operators:
3172 type-operators:
2804 - include: typeof-operator
3173 - include: typeof-operator
2805− - match: '(?:([&|])|(=(?!>)))(?=\s*\{)'
3174+ - match: '([&|])(?=\s*\{)'
2806 captures:
3175 captures:
2807− 1: keyword.operator.type.tsx
3176+ 0: keyword.operator.type.tsx
2808− 2: keyword.operator.assignment.tsx
2809 push:
3177 push:
2810 - match: '(?<=\})'
3178 - match: '(?<=\})'
2811 pop: true
3179 pop: true
2812 - include: type-object
3180 - include: type-object
2813− - match: "([&|])|(=(?!>))"
3181+ - match: "[&|]"
2814 captures:
3182 captures:
2815− 1: keyword.operator.type.tsx
3183+ 0: keyword.operator.type.tsx
2816− 2: keyword.operator.assignment.tsx
2817 push:
3184 push:
2818 - match: (?=\S)
3185 - match: (?=\S)
2819 pop: true
3186 pop: true
@@ -2840,6 +3207,8 @@ contexts:
2840 scope: storage.modifier.tsx
3207 scope: storage.modifier.tsx
2841 - include: type
3208 - include: type
2842 - include: punctuation-comma
3209 - include: punctuation-comma
3210+ - match: (=)(?!>)
3211+ scope: keyword.operator.assignment.tsx
2843 type-paren-or-function-parameters:
3212 type-paren-or-function-parameters:
2844 - match: \(
3213 - match: \(
2845 captures:
3214 captures:
@@ -2850,7 +3219,6 @@ contexts:
2850 captures:
3219 captures:
2851 0: meta.brace.round.tsx
3220 0: meta.brace.round.tsx
2852 pop: true
3221 pop: true
2853− - include: destructuring-parameter
2854 - match: |-
3222 - match: |-
2855 (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))\s*(\??)(?=\s*(:\s*(
3223 (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))\s*(\??)(?=\s*(:\s*(
2856 (<) |
3224 (<) |
@@ -2863,7 +3231,8 @@ contexts:
2863 ))
3231 ))
2864 ))
3232 ))
2865 )) |
3233 )) |
2866− (:\s*((<\s*$)|([\(]\s*([\{\[]\s*)?$))))
3234+ (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3235+ (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))))
2867 captures:
3236 captures:
2868 1: storage.modifier.tsx
3237 1: storage.modifier.tsx
2869 2: keyword.operator.rest.tsx
3238 2: keyword.operator.rest.tsx
@@ -2882,11 +3251,28 @@ contexts:
2882 scope: punctuation.separator.parameter.tsx
3251 scope: punctuation.separator.parameter.tsx
2883 - include: type
3252 - include: type
2884 type-predicate-operator:
3253 type-predicate-operator:
3254+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(asserts)\s+)?(?!asserts)(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))\s(is)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3255+ captures:
3256+ 1: keyword.operator.type.asserts.tsx
3257+ 2: variable.parameter.tsx variable.language.this.tsx
3258+ 3: variable.parameter.tsx
3259+ 4: keyword.operator.expression.is.tsx
3260+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(asserts)\s+(?!is)(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3261+ captures:
3262+ 1: keyword.operator.type.asserts.tsx
3263+ 2: variable.parameter.tsx variable.language.this.tsx
3264+ 3: variable.parameter.tsx
3265+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))asserts(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3266+ scope: keyword.operator.type.asserts.tsx
2885 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))is(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3267 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))is(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2886 scope: keyword.operator.expression.is.tsx
3268 scope: keyword.operator.expression.is.tsx
2887 type-primitive:
3269 type-primitive:
2888− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(string|number|boolean|symbol|any|void|never)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3270+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(string|number|bigint|boolean|symbol|any|void|never|unknown)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2889 scope: support.type.primitive.tsx
3271 scope: support.type.primitive.tsx
3272+ type-string:
3273+ - include: qstring-single
3274+ - include: qstring-double
3275+ - include: template-type
2890 type-tuple:
3276 type-tuple:
2891 - match: '\['
3277 - match: '\['
2892 captures:
3278 captures:
@@ -2897,56 +3283,84 @@ contexts:
2897 captures:
3283 captures:
2898 0: meta.brace.square.tsx
3284 0: meta.brace.square.tsx
2899 pop: true
3285 pop: true
3286+ - match: \.\.\.
3287+ scope: keyword.operator.rest.tsx
3288+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))([_$[:alpha:]][_$[:alnum:]]*)\s*(\?)?\s*(:)'
3289+ captures:
3290+ 1: entity.name.label.tsx
3291+ 2: keyword.operator.optional.tsx
3292+ 3: punctuation.separator.label.tsx
2900 - include: type
3293 - include: type
2901 - include: punctuation-comma
3294 - include: punctuation-comma
2902 typeof-operator:
3295 typeof-operator:
2903 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))typeof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3296 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))typeof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2904− scope: keyword.operator.expression.typeof.tsx
3297+ captures:
3298+ 0: keyword.operator.expression.typeof.tsx
3299+ push:
3300+ - match: '(?=[,);}\]=>:&|{\?]|$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
3301+ pop: true
3302+ - include: expression
2905 undefined-literal:
3303 undefined-literal:
2906 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))undefined(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3304 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))undefined(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2907 scope: constant.language.undefined.tsx
3305 scope: constant.language.undefined.tsx
2908 var-expr:
3306 var-expr:
2909− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3307+ - match: '(?=(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))'
2910− captures:
2911− 1: keyword.control.export.tsx
2912− 2: storage.type.tsx
2913 push:
3308 push:
2914 - meta_scope: meta.var.expr.tsx
3309 - meta_scope: meta.var.expr.tsx
2915− - match: '((?=;|}|(\s+(of|in)\s+)|^\s*$|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)|((?<=\S)(?<!^let|[^\._$[:alnum:]]let|^var|[^\._$[:alnum:]]var)(?=\s*$)))'
3310+ - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^let|[^\._$[:alnum:]]let|^var|[^\._$[:alnum:]]var)(?=\s*$)))'
2916 pop: true
3311 pop: true
3312+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3313+ captures:
3314+ 1: keyword.control.export.tsx
3315+ 2: storage.modifier.tsx
3316+ 3: storage.type.tsx
3317+ push:
3318+ - match: (?=\S)
3319+ pop: true
2917 - include: destructuring-variable
3320 - include: destructuring-variable
2918 - include: var-single-variable
3321 - include: var-single-variable
2919 - include: variable-initializer
3322 - include: variable-initializer
2920 - include: comment
3323 - include: comment
2921− - match: (,)\s*(?!\S)
3324+ - match: (,)\s*((?!\S)|(?=\/\/))
2922 captures:
3325 captures:
2923 1: punctuation.separator.comma.tsx
3326 1: punctuation.separator.comma.tsx
2924 push:
3327 push:
2925− - match: '(?<!,)(((?==|;|}|(\s+(of|in)\s+)|^\s*$))|((?<=\S)(?=\s*$)))'
3328+ - match: '(?<!,)(((?==|;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|^\s*$))|((?<=\S)(?=\s*$)))'
2926 pop: true
3329 pop: true
3330+ - include: single-line-comment-consuming-line-ending
2927 - include: comment
3331 - include: comment
2928 - include: destructuring-variable
3332 - include: destructuring-variable
2929 - include: var-single-variable
3333 - include: var-single-variable
2930 - include: punctuation-comma
3334 - include: punctuation-comma
2931 - include: punctuation-comma
3335 - include: punctuation-comma
2932− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3336+ - match: '(?=(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))'
2933 captures:
3337 captures:
2934 1: keyword.control.export.tsx
3338 1: keyword.control.export.tsx
2935− 2: storage.type.tsx
3339+ 2: storage.modifier.tsx
3340+ 3: storage.type.tsx
2936 push:
3341 push:
2937 - meta_scope: meta.var.expr.tsx
3342 - meta_scope: meta.var.expr.tsx
2938− - match: '((?=;|}|(\s+(of|in)\s+)|^\s*$|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)|((?<=\S)(?<!^const|[^\._$[:alnum:]]const)(?=\s*$)))'
3343+ - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^const|[^\._$[:alnum:]]const)(?=\s*$)))'
2939 pop: true
3344 pop: true
3345+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3346+ captures:
3347+ 1: keyword.control.export.tsx
3348+ 2: storage.modifier.tsx
3349+ 3: storage.type.tsx
3350+ push:
3351+ - match: (?=\S)
3352+ pop: true
2940 - include: destructuring-const
3353 - include: destructuring-const
2941 - include: var-single-const
3354 - include: var-single-const
2942 - include: variable-initializer
3355 - include: variable-initializer
2943 - include: comment
3356 - include: comment
2944− - match: (,)\s*(?!\S)
3357+ - match: (,)\s*((?!\S)|(?=\/\/))
2945 captures:
3358 captures:
2946 1: punctuation.separator.comma.tsx
3359 1: punctuation.separator.comma.tsx
2947 push:
3360 push:
2948− - match: '(?<!,)(((?==|;|}|(\s+(of|in)\s+)|^\s*$))|((?<=\S)(?=\s*$)))'
3361+ - match: '(?<!,)(((?==|;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|^\s*$))|((?<=\S)(?=\s*$)))'
2949 pop: true
3362 pop: true
3363+ - include: single-line-comment-consuming-line-ending
2950 - include: comment
3364 - include: comment
2951 - include: destructuring-const
3365 - include: destructuring-const
2952 - include: var-single-const
3366 - include: var-single-const
@@ -2963,11 +3377,11 @@ contexts:
2963 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3377 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2964 )) |
3378 )) |
2965 ((async\s*)?(
3379 ((async\s*)?(
2966− ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
3380+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
2967 # sure shot arrow functions even if => is on new line
3381 # sure shot arrow functions even if => is on new line
2968 (
3382 (
2969− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
3383+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
2970− [(]\s*
3384+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
2971 (
3385 (
2972 ([)]\s*:) | # ():
3386 ([)]\s*:) | # ():
2973 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
3387 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -2978,9 +3392,9 @@ contexts:
2978 ) |
3392 ) |
2979 # arrow function possible to detect only with => on same line
3393 # arrow function possible to detect only with => on same line
2980 (
3394 (
2981− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
3395+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
2982− \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
3396+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
2983− (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
3397+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
2984 \s*=> # arrow operator
3398 \s*=> # arrow operator
2985 )
3399 )
2986 ))
3400 ))
@@ -2997,19 +3411,20 @@ contexts:
2997 ))
3411 ))
2998 ))
3412 ))
2999 )) |
3413 )) |
3000− (:\s*((<\s*$)|([\(]\s*([\{\[]\s*)?$))) |
3414+ (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3001− (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3415+ (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3416+ (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3002 ((async\s+)?(
3417 ((async\s+)?(
3003 (function\s*[(<*]) |
3418 (function\s*[(<*]) |
3004 (function\s+) |
3419 (function\s+) |
3005 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3420 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3006 )) |
3421 )) |
3007 ((async\s*)?(
3422 ((async\s*)?(
3008− ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
3423+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3009 # sure shot arrow functions even if => is on new line
3424 # sure shot arrow functions even if => is on new line
3010 (
3425 (
3011− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
3426+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3012− [(]\s*
3427+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3013 (
3428 (
3014 ([)]\s*:) | # ():
3429 ([)]\s*:) | # ():
3015 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
3430 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -3020,9 +3435,9 @@ contexts:
3020 ) |
3435 ) |
3021 # arrow function possible to detect only with => on same line
3436 # arrow function possible to detect only with => on same line
3022 (
3437 (
3023− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
3438+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3024− \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
3439+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3025− (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
3440+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3026 \s*=> # arrow operator
3441 \s*=> # arrow operator
3027 )
3442 )
3028 ))
3443 ))
@@ -3031,7 +3446,7 @@ contexts:
3031 1: meta.definition.variable.tsx variable.other.constant.tsx entity.name.function.tsx
3446 1: meta.definition.variable.tsx variable.other.constant.tsx entity.name.function.tsx
3032 push:
3447 push:
3033 - meta_scope: meta.var-single-variable.expr.tsx
3448 - meta_scope: meta.var-single-variable.expr.tsx
3034− - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
3449+ - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3035 pop: true
3450 pop: true
3036 - include: var-single-variable-type-annotation
3451 - include: var-single-variable-type-annotation
3037 - match: "([_$[:alpha:]][_$[:alnum:]]*)"
3452 - match: "([_$[:alpha:]][_$[:alnum:]]*)"
@@ -3039,12 +3454,12 @@ contexts:
3039 1: meta.definition.variable.tsx variable.other.constant.tsx
3454 1: meta.definition.variable.tsx variable.other.constant.tsx
3040 push:
3455 push:
3041 - meta_scope: meta.var-single-variable.expr.tsx
3456 - meta_scope: meta.var-single-variable.expr.tsx
3042− - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
3457+ - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3043 pop: true
3458 pop: true
3044 - include: var-single-variable-type-annotation
3459 - include: var-single-variable-type-annotation
3045 var-single-variable:
3460 var-single-variable:
3046 - match: |-
3461 - match: |-
3047− (?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\s*
3462+ (?x)([_$[:alpha:]][_$[:alnum:]]*)(\!)?(?=\s*
3048 # function assignment |
3463 # function assignment |
3049 (=\s*(
3464 (=\s*(
3050 ((async\s+)?(
3465 ((async\s+)?(
@@ -3053,11 +3468,11 @@ contexts:
3053 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3468 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3054 )) |
3469 )) |
3055 ((async\s*)?(
3470 ((async\s*)?(
3056− ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
3471+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3057 # sure shot arrow functions even if => is on new line
3472 # sure shot arrow functions even if => is on new line
3058 (
3473 (
3059− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
3474+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3060− [(]\s*
3475+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3061 (
3476 (
3062 ([)]\s*:) | # ():
3477 ([)]\s*:) | # ():
3063 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
3478 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -3068,9 +3483,9 @@ contexts:
3068 ) |
3483 ) |
3069 # arrow function possible to detect only with => on same line
3484 # arrow function possible to detect only with => on same line
3070 (
3485 (
3071− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
3486+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3072− \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
3487+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3073− (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
3488+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3074 \s*=> # arrow operator
3489 \s*=> # arrow operator
3075 )
3490 )
3076 ))
3491 ))
@@ -3087,19 +3502,20 @@ contexts:
3087 ))
3502 ))
3088 ))
3503 ))
3089 )) |
3504 )) |
3090− (:\s*((<\s*$)|([\(]\s*([\{\[]\s*)?$))) |
3505+ (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3091− (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3506+ (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3507+ (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3092 ((async\s+)?(
3508 ((async\s+)?(
3093 (function\s*[(<*]) |
3509 (function\s*[(<*]) |
3094 (function\s+) |
3510 (function\s+) |
3095 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3511 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3096 )) |
3512 )) |
3097 ((async\s*)?(
3513 ((async\s*)?(
3098− ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
3514+ ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3099 # sure shot arrow functions even if => is on new line
3515 # sure shot arrow functions even if => is on new line
3100 (
3516 (
3101− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
3517+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3102− [(]\s*
3518+ [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3103 (
3519 (
3104 ([)]\s*:) | # ():
3520 ([)]\s*:) | # ():
3105 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
3521 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -3110,34 +3526,37 @@ contexts:
3110 ) |
3526 ) |
3111 # arrow function possible to detect only with => on same line
3527 # arrow function possible to detect only with => on same line
3112 (
3528 (
3113− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
3529+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3114− \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
3530+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3115− (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
3531+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3116 \s*=> # arrow operator
3532 \s*=> # arrow operator
3117 )
3533 )
3118 ))
3534 ))
3119 )))
3535 )))
3120 captures:
3536 captures:
3121 1: meta.definition.variable.tsx entity.name.function.tsx
3537 1: meta.definition.variable.tsx entity.name.function.tsx
3538+ 2: keyword.operator.definiteassignment.tsx
3122 push:
3539 push:
3123 - meta_scope: meta.var-single-variable.expr.tsx
3540 - meta_scope: meta.var-single-variable.expr.tsx
3124− - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
3541+ - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3125 pop: true
3542 pop: true
3126 - include: var-single-variable-type-annotation
3543 - include: var-single-variable-type-annotation
3127− - match: "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])"
3544+ - match: '([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])(\!)?'
3128 captures:
3545 captures:
3129 1: meta.definition.variable.tsx variable.other.constant.tsx
3546 1: meta.definition.variable.tsx variable.other.constant.tsx
3547+ 2: keyword.operator.definiteassignment.tsx
3130 push:
3548 push:
3131 - meta_scope: meta.var-single-variable.expr.tsx
3549 - meta_scope: meta.var-single-variable.expr.tsx
3132− - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
3550+ - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3133 pop: true
3551 pop: true
3134 - include: var-single-variable-type-annotation
3552 - include: var-single-variable-type-annotation
3135− - match: "([_$[:alpha:]][_$[:alnum:]]*)"
3553+ - match: '([_$[:alpha:]][_$[:alnum:]]*)(\!)?'
3136 captures:
3554 captures:
3137 1: meta.definition.variable.tsx variable.other.readwrite.tsx
3555 1: meta.definition.variable.tsx variable.other.readwrite.tsx
3556+ 2: keyword.operator.definiteassignment.tsx
3138 push:
3557 push:
3139 - meta_scope: meta.var-single-variable.expr.tsx
3558 - meta_scope: meta.var-single-variable.expr.tsx
3140− - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
3559+ - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3141 pop: true
3560 pop: true
3142 - include: var-single-variable-type-annotation
3561 - include: var-single-variable-type-annotation
3143 var-single-variable-type-annotation:
3562 var-single-variable-type-annotation:
@@ -3145,17 +3564,17 @@ contexts:
3145 - include: string
3564 - include: string
3146 - include: comment
3565 - include: comment
3147 variable-initializer:
3566 variable-initializer:
3148− - match: (?<!=|!)(=)(?!=)(?=\s*\S)
3567+ - match: (?<!=|!)(=)(?!=)(?=\s*\S)(?!\s*.*=>\s*$)
3149 captures:
3568 captures:
3150 1: keyword.operator.assignment.tsx
3569 1: keyword.operator.assignment.tsx
3151 push:
3570 push:
3152− - match: '(?=$|^|[,);}\]])'
3571+ - match: '(?=$|^|[,);}\]]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3153 pop: true
3572 pop: true
3154 - include: expression
3573 - include: expression
3155 - match: (?<!=|!)(=)(?!=)
3574 - match: (?<!=|!)(=)(?!=)
3156 captures:
3575 captures:
3157 1: keyword.operator.assignment.tsx
3576 1: keyword.operator.assignment.tsx
3158 push:
3577 push:
3159− - match: '(?=[,);}\]])|(?=^\s*$)|(?<=\S)(?<!=)(?=\s*$)'
3578+ - match: '(?=[,);}\]]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))|(?=^\s*$)|(?<=\S)(?<!=)(?=\s*$)'
3160 pop: true
3579 pop: true
3161 - include: expression
3580 - include: expression
assets/syntaxes/02_Extra/VimL+1−1

Submodule changed.

assets/syntaxes/02_Extra/Zig+1−1

Submodule changed.

assets/syntaxes/02_Extra/cmd-helpnew file+1

Submodule changed.

assets/syntaxes/02_Extra/log.sublime-syntax+30−6
@@ -6,6 +6,7 @@ file_extensions:
6scope: text.log
6scope: text.log
7variables:
7variables:
8 ipv4_part: (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
8 ipv4_part: (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
9+ hours_minutes_seconds: (?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)
9contexts:
10contexts:
10 main:
11 main:
11 - match: (\w+)(=)
12 - match: (\w+)(=)
@@ -17,11 +18,10 @@ contexts:
17 captures:
18 captures:
18 1: punctuation.definition.string.begin.log
19 1: punctuation.definition.string.begin.log
19 3: punctuation.definition.string.end.log
20 3: punctuation.definition.string.end.log
20− - match: (")([^"]*)(")
21+ - match: \"
21− scope: string.quoted.double.log
22 captures:
22 captures:
23 1: punctuation.definition.string.begin.log
23 1: punctuation.definition.string.begin.log
24− 3: punctuation.definition.string.end.log
24+ push: double_quoted_string
25 - include: dates
25 - include: dates
26 - include: ip_addresses
26 - include: ip_addresses
27 - include: numbers
27 - include: numbers
@@ -29,19 +29,34 @@ contexts:
29 scope: markup.error.log
29 scope: markup.error.log
30 - match: \b(?i:warn(?:ing)?)\b
30 - match: \b(?i:warn(?:ing)?)\b
31 scope: markup.warning.log
31 scope: markup.warning.log
32+ - match: \b(?i:debug)\b
33+ scope: markup.info.log
32 #- include: scope:text.html.markdown#autolink-inet
34 #- include: scope:text.html.markdown#autolink-inet
33 - match: \b\w+:/{2,3}
35 - match: \b\w+:/{2,3}
34 scope: markup.underline.link.scheme.log
36 scope: markup.underline.link.scheme.log
35 push: url-host
37 push: url-host
36 dates:
38 dates:
37− - match: \b\d{4}-\d{2}-\d{2}\b
39+ - match: \b\d{4}-\d{2}-\d{2}(?=\b|T)
38 scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
40 scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
39− - match: \b\d{4}/\d{2}/\d{2}\b
41+ push: maybe_date_time_separator
42+ - match: \b\d{4}/\d{2}/\d{2}(?=\b|T)
40 scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
43 scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
41− - match: \b(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)(?:(\.)\d{3})?\b
44+ push: maybe_date_time_separator
45+ - match: \b(?={{hours_minutes_seconds}})
46+ push: time
47+ time:
48+ - match: (?:{{hours_minutes_seconds}})(?:(\.)\d{3})?\b
42 scope: meta.time.log meta.number.integer.decimal.log constant.numeric.value.log
49 scope: meta.time.log meta.number.integer.decimal.log constant.numeric.value.log
43 captures:
50 captures:
44 1: punctuation.separator.decimal.log
51 1: punctuation.separator.decimal.log
52+ - match: ''
53+ pop: true
54+ maybe_date_time_separator:
55+ - match: T(?={{hours_minutes_seconds}})
56+ scope: meta.date.log meta.time.log keyword.other.log
57+ set: time
58+ - match: ''
59+ pop: true
45 ip_addresses:
60 ip_addresses:
46 - match: \b(?=(?:{{ipv4_part}}\.){3}{{ipv4_part}}\b)
61 - match: \b(?=(?:{{ipv4_part}}\.){3}{{ipv4_part}}\b)
47 push:
62 push:
@@ -114,3 +129,12 @@ contexts:
114 scope: markup.underline.link.path.log
129 scope: markup.underline.link.path.log
115 - match: ''
130 - match: ''
116 pop: true
131 pop: true
132+ double_quoted_string:
133+ - meta_scope: string.quoted.double.log
134+ - match: \\"
135+ scope: constant.character.escape.log
136+ - match: \\n
137+ scope: constant.character.escape.log
138+ - match: \"
139+ scope: punctuation.definition.string.end.log
140+ pop: true
assets/syntaxes/02_Extra/requirementstxtdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/requirementstxt.sublime-syntaxdeleted−19
@@ -1,19 +0,0 @@
1−%YAML 1.2
2−---
3−# http://www.sublimetext.com/docs/3/syntax.html
4−name: requirements.txt
5−file_extensions:
6− - requirements.txt
7−scope: source.requirementstxt
8−contexts:
9− main:
10− - match: (#).*$\n?
11− scope: comment.line.requirementstxt
12− captures:
13− 1: punctuation.definition.comment.requirementstxt
14− - match: '(?i)^[a-z0-9_\-\.]+'
15− scope: string.package_name.requirementstxt
16− - match: (?i)==|<|<=|>=|>
17− scope: keyword.operator.logical.punctuation.requirementstxt
18− - match: '(?i)\d+\.[\da-z\-_\.]*'
19− scope: constant.numeric.verions.requirementstxt
assets/syntaxes/02_Extra/ssh-config+1−1

Submodule changed.

assets/themes.bin

Binary file not shown.

doc/README-ja.md+3−3
@@ -13,7 +13,7 @@
13 <a href="#カスタマイズ">カスタマイズ</a> •
13 <a href="#カスタマイズ">カスタマイズ</a> •
14 <a href="#プロジェクトの目標と既存の類似したOSS">プロジェクトの目標と既存の類似したOSS</a><br>
14 <a href="#プロジェクトの目標と既存の類似したOSS">プロジェクトの目標と既存の類似したOSS</a><br>
15 [<a href="../README.md">English</a>]
15 [<a href="../README.md">English</a>]
16− [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>]
16+ [<a href="README-zh.md">中文</a>]
17 [日本語]
17 [日本語]
18 [<a href="README-ko.md">한국어</a>]
18 [<a href="README-ko.md">한국어</a>]
19 [<a href="README-ru.md">Русский</a>]
19 [<a href="README-ru.md">Русский</a>]
@@ -181,7 +181,7 @@ man 2 select
181
181
182## インストール
182## インストール
183
183
184−[![Packaging status](https://repology.org/badge/vertical-allrepos/bat.svg)](https://repology.org/project/bat/versions)
184+[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg)](https://repology.org/project/bat-cat/versions)
185
185
186### On Ubuntu (`apt` を使用)
186### On Ubuntu (`apt` を使用)
187*... や他のDebianベースのLinuxディストリビューション*
187*... や他のDebianベースのLinuxディストリビューション*
@@ -366,7 +366,7 @@ ansible-galaxy install aeimer.install_bat
366### From source
366### From source
367
367
368
368
369−`bat` をソースからビルドしたいならば、Rust 1.36 以上の環境が必要です。
369+`bat` をソースからビルドしたいならば、Rust 1.51 以上の環境が必要です。
370`cargo` を使用してビルドすることができます:
370`cargo` を使用してビルドすることができます:
371
371
372```bash
372```bash
doc/README-ko.md+3−3
@@ -13,7 +13,7 @@
13 <a href="#사용자화">사용자화</a> •
13 <a href="#사용자화">사용자화</a> •
14 <a href="#프로젝트-목표와-대안들">프로젝트 목표와 대안들</a><br>
14 <a href="#프로젝트-목표와-대안들">프로젝트 목표와 대안들</a><br>
15 [<a href="../README.md">English</a>]
15 [<a href="../README.md">English</a>]
16− [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>]
16+ [<a href="README-zh.md">中文</a>]
17 [<a href="README-ja.md">日本語</a>]
17 [<a href="README-ja.md">日本語</a>]
18 [한국어]
18 [한국어]
19 [<a href="README-ru.md">Русский</a>]
19 [<a href="README-ru.md">Русский</a>]
@@ -222,7 +222,7 @@ man 2 select
222`bat`은 [Ubuntu](https://packages.ubuntu.com/eoan/bat)와
222`bat`은 [Ubuntu](https://packages.ubuntu.com/eoan/bat)와
223[Debian](https://packages.debian.org/sid/bat) 패키지 배포 과정에 도입되는 중이며,
223[Debian](https://packages.debian.org/sid/bat) 패키지 배포 과정에 도입되는 중이며,
224Eoan 19.10 버전의 Ubuntu에서부터 제공됩니다.
224Eoan 19.10 버전의 Ubuntu에서부터 제공됩니다.
225−현재 Debain에서는 불안정한 "Sid" 브랜치에서만 `bat`이 제공됩니다.
225+현재 Debian에서는 불안정한 "Sid" 브랜치에서만 `bat`이 제공됩니다.
226
226
227만약 충분히 최신 버전의 Ubuntu/Debian이 설치되어 있다면 간단히 다음을 실행하세요:
227만약 충분히 최신 버전의 Ubuntu/Debian이 설치되어 있다면 간단히 다음을 실행하세요:
228
228
@@ -416,7 +416,7 @@ scoop install bat
416
416
417### 소스에서
417### 소스에서
418
418
419−`bat`의 소스를 빌드하기 위해서는, Rust 1.46 이상이 필요합니다.
419+`bat`의 소스를 빌드하기 위해서는, Rust 1.51 이상이 필요합니다.
420`cargo`를 이용해 전부 빌드할 수 있습니다:
420`cargo`를 이용해 전부 빌드할 수 있습니다:
421
421
422```bash
422```bash
doc/README-ru.md+3−3
@@ -13,7 +13,7 @@
13 <a href="#кастомизация">Кастомизация</a> •
13 <a href="#кастомизация">Кастомизация</a> •
14 <a href="#цели-и-альтернативы">Цели и альтернативы </a><br>
14 <a href="#цели-и-альтернативы">Цели и альтернативы </a><br>
15 [<a href="../README.md">English]
15 [<a href="../README.md">English]
16− [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>]
16+ [<a href="README-zh.md">中文</a>]
17 [<a href="README-ja.md">日本語</a>]
17 [<a href="README-ja.md">日本語</a>]
18 [<a href="README-ko.md">한국어</a>]
18 [<a href="README-ko.md">한국어</a>]
19 [Русский]
19 [Русский]
@@ -160,7 +160,7 @@ man 2 select
160
160
161## Установка
161## Установка
162
162
163−[![Packaging status](https://repology.org/badge/vertical-allrepos/bat.svg)](https://repology.org/project/bat/versions)
163+[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg)](https://repology.org/project/bat-cat/versions)
164
164
165### Ubuntu (с помощью `apt`)
165### Ubuntu (с помощью `apt`)
166*... и другие дистрибутивы основанные на Debian.*
166*... и другие дистрибутивы основанные на Debian.*
@@ -344,7 +344,7 @@ ansible-galaxy install aeimer.install_bat
344
344
345### Из исходников
345### Из исходников
346
346
347−Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.46 или выше. После этого используйте `cargo`, чтобы все скомпилировать:
347+Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.51 или выше. После этого используйте `cargo`, чтобы все скомпилировать:
348
348
349```bash
349```bash
350cargo install --locked bat
350cargo install --locked bat
doc/README-zh.mdnew file+678
@@ -0,0 +1,678 @@
1+<p align="center">
2+ <img src="logo-header.svg" alt="bat - a cat clone with wings"><br>
3+ <a href="https://github.com/sharkdp/bat/actions?query=workflow%3ACICD"><img src="https://github.com/sharkdp/bat/workflows/CICD/badge.svg" alt="Build Status"></a>
4+ <img src="https://img.shields.io/crates/l/bat.svg" alt="license">
5+ <a href="https://crates.io/crates/bat"><img src="https://img.shields.io/crates/v/bat.svg?colorB=319e8c" alt="Version info"></a><br>
6+ 类似 <i>cat(1)</i>,但带有 git 集成和语法高亮.
7+</p>
8+
9+<p align="center">
10+ <a href="#语法高亮">主要功能</a> •
11+ <a href="#如何使用">使用方法</a> •
12+ <a href="#安装">安装</a> •
13+ <a href="#自定义">自定义</a> •
14+ <a href="#project-goals-and-alternatives">项目目标和替代方案</a><br>
15+ [<a href="../README.md">English</a>]
16+ [中文]
17+ [<a href="README-ja.md">日本語</a>]
18+ [<a href="README-ko.md">한국어</a>]
19+ [<a href="README-ru.md">Русский</a>]
20+</p>
21+
22+### 语法高亮
23+
24+`bat` 对大部分编程语言和标记语言提供语法高亮:
25+
26+![Syntax highlighting example](https://imgur.com/rGsdnDe.png)
27+
28+### Git 集成
29+
30+`bat` 能从 git 中获取文件的修改并展示在边栏(见下图):
31+
32+![Git integration example](https://i.imgur.com/2lSW4RE.png)
33+
34+### 不可打印(non-printable)字符可视化
35+
36+添加`-A`/`--show-all`参数可以文件文件中的不可打印字符:
37+
38+![Non-printable character example](https://i.imgur.com/WndGp9H.png)
39+
40+### 自动分页
41+
42+`bat`会在一般情况下将大于屏幕可显示范围的内容输出到分页器(pager, e.g. `less`)。
43+
44+你可以在调用时添加`--paging=never`参数来使`bat`不使用分页器(就像`cat`一样)。如果你想要用为`cat`使用`bat`别名,可以在 shell 配置文件(shell configuration)中添加`alias cat='bat --paging=never'`。
45+
46+#### 智能输出
47+
48+`bat`能够在设置了分页器选项的同时进行管道:wink:。
49+当`bat`检测到当前环境为非可交互终端或管道时(例如使用`bat`并将内容用管道输出到文件),`bat`会像`cat`一样,一次输出文件内容为纯文本且无视`--paging`参数。
50+
51+## 如何使用
52+
53+在终端中查看一个文件
54+
55+```bash
56+> bat README.md
57+```
58+
59+一次性展示多个文件
60+
61+```bash
62+> bat src/*.rs
63+```
64+
65+从`stdin`读入流,自动为内容添加语法高亮(前提是输入内容的语言可以被正确识别,通常根据内容第一行的 shebang 标记,形如`#!bin/sh`)
66+
67+```bash
68+> curl -s https://sh.rustup.rs | bat
69+```
70+
71+显式指定`stdin`输入的语言
72+
73+```bash
74+> yaml2json .travis.yml | json_pp | bat -l json
75+```
76+
77+显示不可打印字符
78+
79+```bash
80+> bat -A /etc/hosts
81+```
82+
83+与`cat`的兼容性
84+
85+```bash
86+bat > note.md # 创建一个空文件
87+
88+bat header.md content.md footer.md > document.md
89+
90+bat -n main.rs # 只显示行号
91+
92+bat f - g # 输出 f,接着是标准输入流,最后 g
93+```
94+
95+### 第三方工具交互
96+
97+#### `fzf`
98+
99+你可以使用`bat`作为`fzf`的预览器。这需要在`bat`后添加`--color=always`选项,以及`--line-range` 选项来限制大文件的加载次数。
100+
101+```bash
102+fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'
103+```
104+
105+更多信息请参阅[`fzf`的说明](https://github.com/junegunn/fzf#preview-window)。
106+
107+#### `find` 或 `fd`
108+
109+你可以使用`find`的`-exec`选项来用`bat`预览搜索结果:
110+
111+```bash
112+find … -exec bat {} +
113+```
114+
115+亦或者在用`fd`时添加`-X`/`--exec-batch`选项:
116+
117+```bash
118+fd … -X bat
119+```
120+
121+#### `ripgrep`
122+
123+`bat`也能用`batgrep`来显示`ripgrep`的搜索结果。
124+
125+```bash
126+batgrep needle src/
127+```
128+
129+#### `tail -f`
130+
131+当与`tail -f`一起使用,`bat`可以持续监视文件内容并为其添加语法高亮。
132+
133+```bash
134+tail -f /var/log/pacman.log | bat --paging=never -l log
135+```
136+
137+注意:这项功能需要在关闭分页时使用,同时要手动指定输入的内容语法(通过`-l log`)。
138+
139+#### `git`
140+
141+`bat`也能直接接受来自`git show`的输出并为其添加语法高亮(当然也需要手动指定语法):
142+
143+```bash
144+git show v0.6.0:src/main.rs | bat -l rs
145+```
146+
147+#### `git diff`
148+
149+`bat`也可以和`git diff`一起使用:
150+
151+```bash
152+batdiff() {
153+ git diff --name-only --diff-filter=d | xargs bat --diff
154+}
155+```
156+
157+该功能也作为一个独立工具提供,你可以在[`bat-extras`](https://github.com/eth-p/bat-extras)中找到`batdiff`。
158+
159+如果你想了解更多 git 和 diff 的信息,参阅[`delta`](https://github.com/dandavison/delta)。
160+
161+#### `xclip`
162+
163+当需要拷贝文件内容时,行号以及 git 标记会影响输出,此时可以使用`-p`/`--plain`参数来把纯文本传递给`xclip`。
164+
165+```bash
166+bat main.cpp | xclip
167+```
168+
169+`bat`会检测输出是否是管道重定向来决定是否使用纯文本输出。
170+
171+#### `man`
172+
173+`bat`也能给`man`的输出上色。这需要设置`MANPAGER`环境变量:
174+
175+```bash
176+export MANPAGER="sh -c 'col -bx | bat -l man -p'"
177+man 2 select
178+```
179+
180+(如果你使用的是 Debian 或者 Ubuntu,使用`batcat`替换`bat`)
181+
182+如果你遇到格式化问题,设置`MANROFFOPT="-c"`也许会有帮助。
183+
184+`batman`能提供类似功能——作为一个独立的命令。
185+
186+注意:[man page 语法](assets/syntaxes/02_Extra/Manpage.sublime-syntax) 还需要完善。在使用特定的`man`实现时该功能[无法正常工作](https://github.com/sharkdp/bat/issues/1145)。
187+
188+#### `prettier` / `shfmt` / `rustfmt`
189+
190+`prettybat`脚本能够格式化代码并用`bat`输出。
191+
192+## 安装
193+
194+[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg)](https://repology.org/project/bat-cat/versions)
195+
196+### Ubuntu (使用 `apt`)
197+
198+*... 以及其他基于 Debian的发行版.*
199+
200+`bat` 要求的版本: [Ubuntu 高于 20.04 ("Focal")](https://packages.ubuntu.com/search?keywords=bat&exact=1) 和 [Debian 高于 August 2021 (Debian 11 - "Bullseye")](https://packages.debian.org/bullseye/bat).
201+
202+当你的发行版满足条件那么直接在终端运执行:
203+
204+```bash
205+sudo apt install bat
206+```
207+
208+重要:如果你通过这种方法安装`bat`,请留意你所安装的可执行文件是否为`batcat`(由[其他包的可执行文件名冲突](https://github.com/sharkdp/bat/issues/982)造成)。你可以创建一个`bat -> batcat`的符号链接(symlink)或别名来避免因为可执行文件不同带来的问题并与其他发行版保持一致性。
209+
210+```bash
211+mkdir -p ~/.local/bin
212+ln -s /usr/bin/batcat ~/.local/bin/bat
213+```
214+
215+### Ubuntu (使用`.deb`包)
216+
217+*... 以及其他基于 Debian的发行版.*
218+
219+如果你无法使用上一种方法安装,或需要用最新版的`bat`,你可以从[release 页面](https://github.com/sharkdp/bat/releases)下载最新的`.deb`包并通过下述方法安装:
220+
221+```bash
222+sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture
223+```
224+
225+### Alpine Linux
226+
227+你可以用下面下列命令从官方源中安装[`bat 包`](https://pkgs.alpinelinux.org/packages?name=bat):
228+
229+```bash
230+apk add bat
231+```
232+
233+### Arch Linux
234+
235+你可以用下面下列命令从官方源中安装[`bat`包](https://www.archlinux.org/packages/community/x86_64/bat/):
236+
237+```bash
238+pacman -S bat
239+```
240+
241+### Fedora
242+
243+你可以使用下列命令从官方[Fedora Modular](https://docs.fedoraproject.org/en-US/modularity/using-modules/)仓库安装[`bat` 包](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506):
244+
245+```bash
246+dnf install bat
247+```
248+
249+### Funtoo Linux
250+
251+你可以从 dev-kit 中安装[`bat` 包](https://github.com/funtoo/dev-kit/tree/1.4-release/sys-apps/bat):
252+
253+```bash
254+emerge sys-apps/bat
255+```
256+
257+### Gentoo Linux
258+
259+你可以使用下列命令从官方源中安装 [`bat` 包](https://packages.gentoo.org/packages/sys-apps/bat):
260+
261+
262+```bash
263+emerge sys-apps/bat
264+```
265+
266+### Void Linux
267+
268+你可以用 xbps-install 安装`bat`:
269+
270+```bash
271+xbps-install -S bat
272+```
273+
274+### Termux:
275+
276+你可以用 pkg 安装`bat:
277+
278+```bash
279+pkg install bat
280+```
281+
282+### FreeBSD
283+
284+你可以用 pkg 来安装一份预编译的[`bat` 包](https://www.freshports.org/textproc/bat):
285+
286+```bash
287+pkg install bat
288+```
289+
290+或从 FreeBSD ports 自己编译一份:
291+
292+```bash
293+cd /usr/ports/textproc/bat
294+make install
295+```
296+
297+### OpenBSD
298+
299+你可以用`pkg——add`安装`bat`包
300+
301+```bash
302+pkg_add bat
303+```
304+
305+### 通过 nix
306+
307+你可以用[nix 包管理器](https://nixos.org/nix)安装`bat`:
308+
309+```bash
310+nix-env -i bat
311+```
312+
313+### openSUSE
314+
315+你可以用 zypper 安装`bat`:
316+
317+```bash
318+zypper install bat
319+```
320+
321+### 通过 snap
322+
323+目前还没有推荐的 snap 包可用。可以使用其他现存的包但不会受到官方支持且可能会遇到[问题](https://github.com/sharkdp/bat/issues/1519)。
324+
325+### macOS (或 Linux) 通过 Homebrew
326+
327+你可以用 [Homebrew on MacOS](https://formulae.brew.sh/formula/bat) 或者 [Homebrew on Linux](https://formulae.brew.sh/formula-linux/bat) 安装`bat`:
328+
329+```bash
330+brew install bat
331+```
332+
333+### macOS 通过 MacPorts
334+
335+或用 [MacPorts](https://ports.macports.org/port/bat/summary) 安装`bat`:
336+
337+```bash
338+port install bat
339+```
340+
341+### Windows
342+
343+在 Windows 上具有多种安装`bat`的方法。若你已完成安装,记得看看 ["在 Windows 上使用`bat`"](#在-Windows-中使用-bat) 。
344+
345+#### 前置条件
346+
347+你必须已安装 [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) 包。
348+
349+#### 使用 Chocolatey
350+
351+你可以用[Chocolatey](https://chocolatey.org/packages/Bat) 安装`bat`:
352+
353+```bash
354+choco install bat
355+```
356+
357+#### 使用 Scoop
358+
359+你可以用 [scoop](https://scoop.sh/) 安装`bat`:
360+
361+```bash
362+scoop install bat
363+```
364+
365+#### 使用预编译二进制版本
366+
367+直接从 [Release 发布页](https://github.com/sharkdp/bat/releases) 下载已经编译好的二进制包,前提是你安装了 [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) 包。
368+
369+### 使用二进制版本
370+
371+在 [Release 发布页](https://github.com/sharkdp/bat/releases) 中可以找到为多种架构构建的`bat`版本和静态编译的二进制文件(文件名带有`musl`)。
372+
373+### 从源码编译
374+
375+如果你想要自己构建`bat`,那么你需要安装有高于1.51版本的 Rust。
376+
377+使用以下命令编译。
378+
379+```bash
380+cargo install --locked bat
381+```
382+
383+注意:man page或 shell 自动补全所需要的额外文件无法通过该方法安装。但你可以在`cargo`的生成目录找到这些文件(`build`目录下)。
384+
385+## 自定义
386+
387+### 语法高亮主题
388+
389+使用 `bat --list-themes` 一份语法高亮主题的清单,然后用`--theme=TwoDark`来指定主题为`TwoDark`,也可以通过设置`BAT_THEME`环境变量来选定主题。把`export BAT_THEME="TwoDark"`添加到 shell 的启动脚本(shell startup file)来取得永久效果。或者使用`bat`的[配置文件](#c配置文件)
390+
391+若想要查看所有主题在一个文件上的显示效果可以用一下命令(需要安装`fzf`):
392+
393+```bash
394+bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
395+```
396+
397+`bat`在默认情况下能够在黑色主题背景下获得较好的效果,如果你的终端使用亮色背景,可以试试`GitHub`或`OneHalfLight`。想要添加自定义主题可以参考[添加主题](#添加主题)。
398+
399+### 8-bit 主题
400+
401+`bat` 自带三个 [8-bit 色彩](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 主题:
402+
403+- `ansi` 适应于大部分终端。它使用 3-bit 色彩:黑红绿黄蓝洋红靛青白。
404+- `base16`专为 [base16](https://github.com/chriskempson/base16) 终端设计。它使用 4-bit 色彩(带有亮度的 3-bit 色彩)。根据 [base16 styling guidelines](https://github.com/chriskempson/base16/blob/master/styling.md) 制作。
405+- `base16-25`专为 [base16-shell](https://github.com/chriskempson/base16-shell) 设计。它把部分亮色替换为 8-bit 色彩。请不要直接使用该主题,除非你清楚你的256色终端是否使用 base16-shell。
406+
407+尽管这些主题具有诸多限制,但具有一些 truecolor 主题不具有的三个优点:
408+
409+- 享有最佳兼容性。并不是所有终端工具都支持高于 3-bit 的色彩。
410+- 适应终端主题。
411+- 视觉上和其他的终端工具更协调。
412+
413+### 输出样式
414+
415+你可以用`--style`参数来控制`bat`输出的样式。使用`--style=numbers,chanegs`可以只开启 Git 修改和行号显示而不添加其他内容。`BAT_STYLE`环境变量具有相同功能。
416+
417+### 添加新的语言和语法
418+
419+当现有的`bat`不支持某个语言或语法时你可以自己添加。
420+
421+`bat`使用`syntect`库来支持语法高亮,该库使用 [Sublime Text `.sublime-syntax` 语法文件](https://www.sublimetext.com/docs/3/syntax.html)和主题。而后者中的大部分可以在 [Package Control](https://packagecontrol.io/) 找到。
422+
423+当你找到一份语法文件,按照下列方法:
424+
425+1. 创建包含语法描述文件的目录:
426+
427+ ```bash
428+ mkdir -p "$(bat --config-dir)/syntaxes"
429+ cd "$(bat --config-dir)/syntaxes"
430+
431+ # Put new '.sublime-syntax' language definition files
432+ # in this folder (or its subdirectories), for example:
433+ git clone https://github.com/tellnobody1/sublime-purescript-syntax
434+ ```
435+
436+2. 调用下面指令把文件转换为二进制缓存:
437+
438+ ```bash
439+ bat cache --build
440+ ```
441+
442+3. 最后用`bat --list-languages`来检查新的语法是否被成功导入。如果想要回滚到最初状态,执行:
443+
444+ ```bash
445+ bat cache --clear
446+ ```
447+
448+4. 如果你觉得`bat`有必要自带该语法支持,请在阅读[指导](doc/assets.md)后向仓库提交 [Syntax Request](https://github.com/sharkdp/bat/issues/new?labels=syntax-request&template=syntax_request.md)。
449+
450+### 添加主题
451+
452+类似添加语法支持,第一步也是创建一个带有语法高亮的目录
453+
454+```bash
455+mkdir -p "$(bat --config-dir)/themes"
456+cd "$(bat --config-dir)/themes"
457+
458+# 下载一个主题
459+git clone https://github.com/greggb/sublime-snazzy
460+
461+# 更新二进制缓存
462+bat cache --build
463+```
464+
465+然后用`bat --list-themes`检查添加是否成功。
466+
467+### 添加或修改文件关联
468+
469+你可以用`--map-syntax`参数添加或修改文件名模板。它需要一个类似`pattern:syntax`的参数来指定,其中`pattern`是 glob 文件匹配模板,`syntax`则是支持的语法的完整名(使用`bat --list-languages`来查看获取一份清单)。
470+
471+注意:方便起见,你可能需要把参数添加到配置文件,而不是每次都在命令行中传递该参数。
472+
473+以下展示了把“INI”关联到具有`.conf`扩展名的文件
474+
475+```bash
476+--map-syntax='*.conf:INI'
477+```
478+
479+把`.ignore`文件与“Git Ignore”关联
480+
481+```bash
482+--map-syntax='.ignore:Git Ignore'
483+```
484+
485+把`/etc/apache2`内的`.conf`文件关联到“Apache Conf”语法(`bat`已默认绑定)
486+
487+```bash
488+--map-syntax='/etc/apache2/**/*.conf:Apache Conf'
489+```
490+
491+### 使用自定义分页器
492+
493+`bat`默认使用`PAGER`环境变量定义的分页器,如果没有定义则使用`less`。`bat`提供了`BAT_PAGER`环境变量来专为`bat`选择分页器(优先级高于`PAGER`)。
494+
495+注意:当`PAGER`设置为`more`或`most`时,`bat`会使用`less`来代替以确保能提供色彩支持。
496+
497+```bash
498+export BAT_PAGER="less -RF"
499+```
500+
501+除了使用环境变量来改变`bat`使用的的分页器,也可以在配置文件中提供`--pager`参数。
502+
503+注意:`bat`会把部分命令行参数直接传递给分页器:`-R`/`--RAW-CONTROL-CHARS`,`-F`/`--quit-if-one-screen`以及`-X`/`--no-init`(该参数仅适用于高于530版本的`less`)。其中`-R` 参数需要在解释 ANSI 标准颜色时起作用。`-F`则指示`less`在输出内容的垂直尺寸小于终端尺寸时立即退出。当文件内容可以在一个屏幕里完全显示时,就不需要按`q`键退出阅读模式,很方便就是了。`-X`则能修复`-F`在`less`的老版本中的一些bug(代价是不支持鼠标滚轮,但可以用`-R`来取消`quit-if-one-screen`功能。)。
504+
505+### 缩进
506+
507+`bat` 使用四个空格宽的制表符,而不受分页器影响,同时也可以用`--tabs`参数来自定义。
508+
509+注意:通过其他方法针对分页器的制表符设置不会生效(例如通过`bat`的`--pager`参数传递或`less`使用的`LESS`环境变量)。因为在输出提交给分页器之前,内容中的制表符就已经被`bat`替换为了特定长度的空格以避免由于边栏导致的缩进问题。你可以用给`bat`传递`--tabs=0`参数来取消该设定并让分页器自己处理制表符。
510+
511+### 暗色模式
512+
513+如果你用的 macOS 处于暗色模式,你可以为`bat`启用基于系统主题的主题。如下所示操作会让`bat`在系统处于亮色模式时加载`GitHub`主题和暗色模式时加载`default`主题。
514+
515+```bash
516+alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)"
517+```
518+
519+## 配置文件
520+
521+```bash
522+bat --config-file
523+```
524+
525+你也可以用`BAT_CONFIG_PATH`来为`bat`指定自定义位置的配置文件:
526+
527+```bash
528+export BAT_CONFIG_PATH="/path/to/bat.conf"
529+```
530+
531+使用`--generate-config-file`参数调用`bat`会在指定位置生成一份默认的`bat`配置文件:
532+
533+```bash
534+bat --generate-config-file
535+```
536+
537+### 格式
538+
539+配置文件其实是一份按行分割的命令行参数列表。你可以用`bat --help`来查看所有可用的参数和适用的值。配置文件中`#`打头的行会被视为注释而不生效。
540+
541+以下是一份示例:
542+
543+```bash
544+# 设置主题为 TwoDark
545+--theme="TwoDark"
546+
547+# 显示行号和 Git 修改信息, 但没有边框
548+--style="numbers,changes,header"
549+
550+# 在终端中以斜体输出文本(不是所有终端都支持)
551+--italic-text=always
552+
553+# 使用 C++ 语法来给 Ardiuno 的 .ino 文件提供高亮
554+--map-syntax "*.ino:C++"
555+```
556+
557+## 在 Windows 中使用 `bat`
558+
559+`bat` 在 Windows 上开箱即用,除了部分功能需要额外配置。
560+
561+### 前置条件
562+
563+你需要先安装 [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) 包。
564+
565+### 分页
566+
567+Windows 只有一个提供有限功能的分页器,你可以从[这里下载](http://www.greenwoodsoftware.com/less/download.html)或用 [Chocolatey 安装](https://chocolatey.org/packages/Less) Windows 版本的`less`。第一种方法需要你把它所在目录加入`PATH`环境变量或[定义分页器变量](#使用自定义分页器)
568+
569+### 色彩
570+
571+Windows 10 从 [v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update)) 开始 shell(`conhost.exe`,命令提示符或 Powershell)原生支持色彩。在早些版本的 Windows 中你可以用第三方终端如 [Cmder](http://cmder.net/) (使用[ConEmu](https://conemu.github.io/))。
572+
573+注意:Git 和 MSYS 版本的 `less` 没法正确在 Windows 表达色彩。如果你没有安装其他分页器,你可以直接用`--paging=never`或设置`BAT_PAGER`为空字符串来关闭分页功能。
574+
575+### Cygwin
576+
577+Windows 上的`bat`原生不支持 Cygwin' unix-style 路径(`/cygdrive/*`)。当传递一个绝对 cygwin 路径作为参数值时,`bat`会产生`The system cannot find the path specified. (os error 3)`的错误。你可以`.bash_profile`文件中添加以下函数来解决这个问题。
578+
579+```bash
580+bat() {
581+ local index
582+ local args=("$@")
583+ for index in $(seq 0 ${#args[@]}) ; do
584+ case "${args[index]}" in
585+ -*) continue;;
586+ *) [ -e "${args[index]}" ] && args[index]="$(cygpath --windows "${args[index]}")";;
587+ esac
588+ done
589+ command bat "${args[@]}"
590+}
591+```
592+
593+## 疑难解答
594+
595+### 输出内容含糊不清
596+
597+当输入文件包含颜色代码和其他 ANSI 转义符号时,`bat`会产生错误的语法高亮和文本,导致输出看起来令人无法理解。当你需要输出该文件时,请使用`--color=never --wrap=never`参数来关闭上色和文字包裹。
598+
599+### 终端与色彩
600+
601+`bat`会区分支持 truecolor 和不支持 truecolor 的终端。但是大部分语法高亮主题都是用了没有为 8-bit 色彩支持的颜色,因此强烈推荐使用一个支持 24-bit 色彩的终端(`terminator`,`konsole`,`iTerm2`...),或使用一个 [8-bit 主题](#8-bit-主题)来限制一些颜色。查看[这篇文章使用自定义分页器](https://gist.github.com/XVilka/8346728)了解更多支持 truecolor 的终端。你需要定义`COLORTERM`变量为`truecolor`或`24bit`来确保`bat`能够识别终端的对颜色的支持,否则会使用 8 bit 模式。
602+
603+### 行号和边框很难看清
604+
605+试试其他主题,说不定能有所改善(用`bat --list-themes`查看主题列表)。
606+
607+### 文件编码
608+
609+`bat`原生支持 UTF-8 和 UTF-16。至于其他文件你可能需要在使用`bat`之前先把编码转换到UTF-8。
610+
611+这里展示了使用`iconv`来把 Latin-1(ISO-8859-1) 编码的 PHP 文件转换到 UTF-8:
612+
613+```bash
614+iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat
615+```
616+
617+注意: 当`bat`无法识别语言时你可能会需要`-l`/`--language`参数。
618+
619+## Development
620+
621+```bash
622+# Recursive clone to retrieve all submodules
623+git clone --recursive https://github.com/sharkdp/bat
624+
625+# Build (debug version)
626+cd bat
627+cargo build --bins
628+
629+# Run unit tests and integration tests
630+cargo test
631+
632+# Install (release version)
633+cargo install --path . --locked
634+
635+# Build a bat binary with modified syntaxes and themes
636+bash assets/create.sh
637+cargo install --path . --locked --force
638+```
639+
640+If you want to build an application that uses `bat`s pretty-printing
641+features as a library, check out the [the API documentation](https://docs.rs/bat/).
642+Note that you have to use either `regex-onig` or `regex-fancy` as a feature
643+when you depend on `bat` as a library.
644+
645+## Contributing
646+
647+Take a look at the [`CONTRIBUTING.md`](CONTRIBUTING.md) guide.
648+
649+## Maintainers
650+
651+- [sharkdp](https://github.com/sharkdp)
652+- [eth-p](https://github.com/eth-p)
653+- [keith-hall](https://github.com/keith-hall)
654+- [Enselic](https://github.com/Enselic)
655+
656+## Security vulnerabilities
657+
658+Please contact [David Peter](https://david-peter.de/) via email if you want to report a vulnerability in `bat`.
659+
660+## Project goals and alternatives
661+
662+`bat` tries to achieve the following goals:
663+
664+- Provide beautiful, advanced syntax highlighting
665+- Integrate with Git to show file modifications
666+- Be a drop-in replacement for (POSIX) `cat`
667+- Offer a user-friendly command-line interface
668+
669+There are a lot of alternatives, if you are looking for similar programs. See
670+[this document](doc/alternatives.md) for a comparison.
671+
672+## License
673+
674+Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat).
675+
676+`bat` is made available under the terms of either the MIT License or the Apache License 2.0, at your option.
677+
678+See the [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT) files for license details.
doc/release-checklist.md+33−18
@@ -1,15 +1,5 @@
1# Release checklist
1# Release checklist
2
2
3−## Dependencies
4−
5−See this page for a good overview: https://deps.rs/repo/github/sharkdp/bat
6−
7−- [ ] Optional: update dependencies with `cargo update`. This is also done by
8− dependabot, so it is not strictly necessary.
9−- [ ] Check for outdated dependencies (`cargo outdated`) and decide for each of
10− them whether we want to (manually) upgrade. This will require changes to
11− `Cargo.toml`.
12−
13## Version bump
3## Version bump
14
4
15- [ ] Update version in `Cargo.toml`. Run `cargo build` to update `Cargo.lock`.
5- [ ] Update version in `Cargo.toml`. Run `cargo build` to update `Cargo.lock`.
@@ -17,36 +7,38 @@ See this page for a good overview: https://deps.rs/repo/github/sharkdp/bat
17- [ ] Find the current min. supported Rust version by running
7- [ ] Find the current min. supported Rust version by running
18 `grep '^\s*MIN_SUPPORTED_RUST_VERSION' .github/workflows/CICD.yml`.
8 `grep '^\s*MIN_SUPPORTED_RUST_VERSION' .github/workflows/CICD.yml`.
19- [ ] Update the version and the min. supported Rust version in `README.md` and
9- [ ] Update the version and the min. supported Rust version in `README.md` and
20− `doc/README-*.md`.
10+ `doc/README-*.md`. Check with
21−- [ ] Update `CHANGELOG.md`. Introduce a section for the new release and
11+ `git grep -i -e 'rust.*1\.' -e '1\..*rust' | grep README | grep -v tests/`.
22− prepare a new (empty) "unreleased" section at the top.
12+- [ ] Update `CHANGELOG.md`. Introduce a section for the new release.
23
13
24## Update syntaxes and themes (build assets)
14## Update syntaxes and themes (build assets)
25
15
26−- [ ] Install the latest master version (`cargo install -f --path .`) and make
16+- [ ] Install the latest master version (`cargo clean && cargo install --locked -f --path .`) and make
27 sure that it is available on the `PATH` (`bat --version` should show the
17 sure that it is available on the `PATH` (`bat --version` should show the
28 new version).
18 new version).
29- [ ] Run `assets/create.sh` and check in the binary asset files.
19- [ ] Run `assets/create.sh` and check in the binary asset files.
30
20
31## Documentation
21## Documentation
32
22
33−- [ ] Review the `-h` and `--help` texts
23+- [ ] Review `-h`, `--help`, and the `man` page. All of these are shown in
34−- [ ] Review the `man` page
24+ the output of the CI job called *Documentation*, so look there.
25+ The CI workflow corresponding to the tip of the master branch is a good place to look.
35
26
36## Pre-release checks
27## Pre-release checks
37
28
38- [ ] Push all changes and wait for CI to succeed (before continuing with the
29- [ ] Push all changes and wait for CI to succeed (before continuing with the
39 next section).
30 next section).
40- [ ] Optional: manually test the new features and command-line options. To do
31- [ ] Optional: manually test the new features and command-line options. To do
41− this, install the latest `bat` version again (to include the new synaxes
32+ this, install the latest `bat` version again (to include the new syntaxes
42 and themes).
33 and themes).
43−- [ ] Run `cargo publish --dry-run --allow-dirty` to make sure that it will
34+- [ ] Run `cargo publish --dry-run` to make sure that it will
44 succeed later (after creating the GitHub release).
35 succeed later (after creating the GitHub release).
45
36
46## Release
37## Release
47
38
48- [ ] Create a tag and push it: `git tag vX.Y.Z; git push origin tag vX.Y.Z`.
39- [ ] Create a tag and push it: `git tag vX.Y.Z; git push origin tag vX.Y.Z`.
49 This will trigger the deployment via GitHub Actions.
40 This will trigger the deployment via GitHub Actions.
41+ REMINDER: If your `origin` is a fork, don't forget to push to e.g. `upstream` instead!
50- [ ] Go to https://github.com/sharkdp/bat/releases/new to create the new
42- [ ] Go to https://github.com/sharkdp/bat/releases/new to create the new
51 release. Select the new tag and also use it as the release title. For the
43 release. Select the new tag and also use it as the release title. For the
52 release notes, copy the corresponding section from `CHANGELOG.md` and
44 release notes, copy the corresponding section from `CHANGELOG.md` and
@@ -56,3 +48,26 @@ See this page for a good overview: https://deps.rs/repo/github/sharkdp/bat
56 appear when the CI run for the Git tag has finished).
48 appear when the CI run for the Git tag has finished).
57- [ ] Publish to crates.io by running `cargo publish` in a *clean* repository.
49- [ ] Publish to crates.io by running `cargo publish` in a *clean* repository.
58 The safest way to do this is to clone a fresh copy.
50 The safest way to do this is to clone a fresh copy.
51+
52+## Post-release
53+
54+- [ ] Prepare a new "unreleased" section at the top of `CHANGELOG.md`.
55+ Put this at the top:
56+
57+```
58+# unreleased
59+
60+## Features
61+
62+## Bugfixes
63+
64+## Other
65+
66+## Syntaxes
67+
68+## Themes
69+
70+## `bat` as a library
71+
72+
73+```
doc/sponsors.mdnew file+14
@@ -0,0 +1,14 @@
1+## Sponsors
2+
3+`bat` development is sponsored by many individuals and companies. Thank you very much!
4+
5+Please note, that being sponsored does not affect the individuality of the `bat`
6+project or affect the maintainers' actions in any way.
7+We remain impartial and continue to assess pull requests solely on merit - the
8+features added, bugs solved, and effect on the overall complexity of the code.
9+No issue will have a different priority based on sponsorship status of the
10+reporter.
11+
12+Contributions from anybody are most welcomed, please see our [`CONTRIBUTING.md`](../CONTRIBUTING.md) guide.
13+
14+If you want to see our biggest sponsors, check the top of [`README.md`](../README.md#sponsors).
doc/sponsors/workos-logo-white-bg.svgnew file+11
@@ -0,0 +1,11 @@
1+<svg width="1354" height="420" viewBox="0 0 1354 420" fill="none" xmlns="http://www.w3.org/2000/svg">
2+<rect width="1354" height="420" rx="20" fill="white"/>
3+<path d="M434.751 133.122H466.637L489.595 227.729C493.852 245.585 494.697 256.219 494.697 256.219H495.128C495.128 256.219 496.61 245.808 500.867 227.729L522.757 133.122H558.9L582.066 227.729C586.53 246.223 587.598 256.219 587.598 256.219H588.236C588.236 256.219 588.666 246.223 592.907 227.729L615.02 133.122H646.907L606.523 288.313H571.017L546.576 194.344C541.474 173.936 541.044 164.801 541.044 164.801H540.614C540.614 164.801 540.183 173.936 535.512 194.344L512.553 288.313H475.996L434.751 133.122Z" fill="black"/>
4+<path d="M641.583 231.934C641.583 196.428 664.541 173.47 699.202 173.47C733.639 173.47 756.597 196.428 756.597 231.934C756.597 267.647 733.639 290.828 699.202 290.828C664.557 290.812 641.583 267.647 641.583 231.934ZM726.832 231.934C726.832 208.976 715.783 195.998 699.202 195.998C681.346 195.998 671.349 210.458 671.349 231.934C671.349 255.323 682.398 268.284 699.202 268.284C717.058 268.284 726.832 253.824 726.832 231.934Z" fill="black"/>
5+<path d="M770.836 175.21H799.103V196.048H799.741C804.635 185.207 816.322 174.365 836.299 174.365C839.695 174.365 841.831 174.796 843.314 175.21V203.478H842.469C842.469 203.478 839.918 202.633 832.903 202.633C811.013 202.633 799.103 215.594 799.103 239.828V288.295H770.836V175.21Z" fill="black"/>
6+<path d="M856.5 133.122H884.767V182.865C884.767 212.2 884.336 217.509 884.336 217.509H884.767L926.857 175.212H962.139L912.843 224.11L970.031 288.313H936.646L895.401 241.536L884.767 251.946V288.297H856.5V133.122Z" fill="black"/>
7+<path d="M970.444 211.285C970.444 163.455 1000.21 131.569 1044.85 131.569C1089.49 131.569 1119.26 163.455 1119.26 211.285C1119.26 259.114 1089.49 291.001 1044.85 291.001C1000.21 291.001 970.444 259.114 970.444 211.285ZM1088.42 211.285C1088.42 178.761 1071 156.855 1044.84 156.855C1018.67 156.855 1001.26 178.761 1001.26 211.285C1001.26 243.809 1018.69 265.715 1044.84 265.715C1070.98 265.715 1088.42 243.809 1088.42 211.285Z" fill="black"/>
8+<path d="M1130.08 236.656H1162.4C1162.4 254.943 1174.95 265.146 1194.08 265.146C1210.23 265.146 1221.29 257.063 1221.29 245.584C1221.29 232.622 1212.79 229.21 1185.79 223.901C1161.12 219.007 1134.98 210.716 1134.98 178.399C1134.98 151.408 1157.93 131 1193.01 131C1229.57 131 1252.11 150.132 1252.11 179.037H1219.79C1219.79 165.007 1208.95 156.286 1193.01 156.286C1176.86 156.286 1166.86 164.146 1166.86 175.625C1166.86 187.742 1173.88 192.413 1195.56 196.878C1227.65 203.685 1254.02 207.288 1254.02 243.001C1254.02 271.3 1229.36 290.432 1193.01 290.432C1156.02 290.432 1130.08 268.957 1130.08 236.656Z" fill="black"/>
9+<path d="M100 210C100 214.824 101.269 219.647 103.723 223.793L148.231 300.878C152.8 308.747 159.739 315.178 168.369 318.055C185.377 323.724 202.977 316.447 211.354 301.893L222.1 283.278L179.708 210L224.47 132.408L235.216 113.792C238.431 108.208 242.747 103.638 247.824 100H243.17H178.777C166.677 100 155.508 106.431 149.5 116.923L103.723 196.208C101.269 200.354 100 205.177 100 210Z" fill="#6363F1"/>
10+<path d="M353.847 210C353.847 205.177 352.578 200.353 350.124 196.207L305.024 118.107C296.647 103.638 279.047 96.3608 262.039 101.945C253.409 104.822 246.47 111.253 241.901 119.122L231.747 136.638L274.139 210L229.378 287.592L218.632 306.208C215.416 311.708 211.101 316.362 206.024 320H210.678H275.07C287.17 320 298.34 313.569 304.347 303.077L350.124 223.792C352.578 219.646 353.847 214.823 353.847 210Z" fill="#6363F1"/>
11+</svg>
rustfmt.tomlnew file+1
@@ -0,0 +1 @@
1+# Defaults are used
src/assets.rs+106−17
@@ -4,7 +4,7 @@ use std::path::Path;
4
4
5use once_cell::unsync::OnceCell;
5use once_cell::unsync::OnceCell;
6
6
7−use syntect::highlighting::{Theme, ThemeSet};
7+use syntect::highlighting::Theme;
8use syntect::parsing::{SyntaxReference, SyntaxSet};
8use syntect::parsing::{SyntaxReference, SyntaxSet};
9
9
10use path_abs::PathAbs;
10use path_abs::PathAbs;
@@ -15,6 +15,8 @@ use crate::syntax_mapping::ignored_suffixes::IgnoredSuffixes;
15use crate::syntax_mapping::MappingTarget;
15use crate::syntax_mapping::MappingTarget;
16use crate::{bat_warning, SyntaxMapping};
16use crate::{bat_warning, SyntaxMapping};
17
17
18+use lazy_theme_set::LazyThemeSet;
19+
18use serialized_syntax_set::*;
20use serialized_syntax_set::*;
19
21
20#[cfg(feature = "build-assets")]
22#[cfg(feature = "build-assets")]
@@ -23,6 +25,7 @@ pub use crate::assets::build_assets::*;
23pub(crate) mod assets_metadata;
25pub(crate) mod assets_metadata;
24#[cfg(feature = "build-assets")]
26#[cfg(feature = "build-assets")]
25mod build_assets;
27mod build_assets;
28+mod lazy_theme_set;
26mod serialized_syntax_set;
29mod serialized_syntax_set;
27
30
28#[derive(Debug)]
31#[derive(Debug)]
@@ -30,7 +33,7 @@ pub struct HighlightingAssets {
30 syntax_set_cell: OnceCell<SyntaxSet>,
33 syntax_set_cell: OnceCell<SyntaxSet>,
31 serialized_syntax_set: SerializedSyntaxSet,
34 serialized_syntax_set: SerializedSyntaxSet,
32
35
33− theme_set: ThemeSet,
36+ theme_set: LazyThemeSet,
34 fallback_theme: Option<&'static str>,
37 fallback_theme: Option<&'static str>,
35}
38}
36
39
@@ -40,14 +43,24 @@ pub struct SyntaxReferenceInSet<'a> {
40 pub syntax_set: &'a SyntaxSet,
43 pub syntax_set: &'a SyntaxSet,
41}
44}
42
45
43−/// Compress for size of ~700 kB instead of ~4600 kB at the cost of ~30% longer deserialization time
46+/// Lazy-loaded syntaxes are already compressed, and we don't want to compress
44−pub(crate) const COMPRESS_SYNTAXES: bool = true;
47+/// already compressed data.
48+pub(crate) const COMPRESS_SYNTAXES: bool = false;
49+
50+/// We don't want to compress our [LazyThemeSet] since the lazy-loaded themes
51+/// within it are already compressed, and compressing another time just makes
52+/// performance suffer
53+pub(crate) const COMPRESS_THEMES: bool = false;
45
54
46−/// Compress for size of ~20 kB instead of ~200 kB at the cost of ~30% longer deserialization time
55+/// Compress for size of ~40 kB instead of ~200 kB without much difference in
47−pub(crate) const COMPRESS_THEMES: bool = true;
56+/// performance due to lazy-loading
57+pub(crate) const COMPRESS_LAZY_THEMES: bool = true;
58+
59+/// Compress for size of ~10 kB instead of ~120 kB
60+pub(crate) const COMPRESS_ACKNOWLEDGEMENTS: bool = true;
48
61
49impl HighlightingAssets {
62impl HighlightingAssets {
50− fn new(serialized_syntax_set: SerializedSyntaxSet, theme_set: ThemeSet) -> Self {
63+ fn new(serialized_syntax_set: SerializedSyntaxSet, theme_set: LazyThemeSet) -> Self {
51 HighlightingAssets {
64 HighlightingAssets {
52 syntax_set_cell: OnceCell::new(),
65 syntax_set_cell: OnceCell::new(),
53 serialized_syntax_set,
66 serialized_syntax_set,
@@ -56,10 +69,57 @@ impl HighlightingAssets {
56 }
69 }
57 }
70 }
58
71
72+ /// The default theme.
73+ ///
74+ /// ### Windows and Linux
75+ ///
76+ /// Windows and most Linux distributions has a dark terminal theme by
77+ /// default. On these platforms, this function always returns a theme that
78+ /// looks good on a dark background.
79+ ///
80+ /// ### macOS
81+ ///
82+ /// On macOS the default terminal background is light, but it is common that
83+ /// Dark Mode is active, which makes the terminal background dark. On this
84+ /// platform, the default theme depends on
85+ /// ```bash
86+ /// defaults read -globalDomain AppleInterfaceStyle
87+ /// ````
88+ /// To avoid the overhead of the check on macOS, simply specify a theme
89+ /// explicitly via `--theme`, `BAT_THEME`, or `~/.config/bat`.
90+ ///
91+ /// See <https://github.com/sharkdp/bat/issues/1746> and
92+ /// <https://github.com/sharkdp/bat/issues/1928> for more context.
59 pub fn default_theme() -> &'static str {
93 pub fn default_theme() -> &'static str {
94+ #[cfg(not(target_os = "macos"))]
95+ {
96+ Self::default_dark_theme()
97+ }
98+ #[cfg(target_os = "macos")]
99+ {
100+ if macos_dark_mode_active() {
101+ Self::default_dark_theme()
102+ } else {
103+ Self::default_light_theme()
104+ }
105+ }
106+ }
107+
108+ /**
109+ * The default theme that looks good on a dark background.
110+ */
111+ fn default_dark_theme() -> &'static str {
60 "Monokai Extended"
112 "Monokai Extended"
61 }
113 }
62
114
115+ /**
116+ * The default theme that looks good on a light background.
117+ */
118+ #[cfg(target_os = "macos")]
119+ fn default_light_theme() -> &'static str {
120+ "Monokai Extended Light"
121+ }
122+
63 pub fn from_cache(cache_path: &Path) -> Result<Self> {
123 pub fn from_cache(cache_path: &Path) -> Result<Self> {
64 Ok(HighlightingAssets::new(
124 Ok(HighlightingAssets::new(
65 SerializedSyntaxSet::FromFile(cache_path.join("syntaxes.bin")),
125 SerializedSyntaxSet::FromFile(cache_path.join("syntaxes.bin")),
@@ -78,7 +138,8 @@ impl HighlightingAssets {
78 self.fallback_theme = Some(theme);
138 self.fallback_theme = Some(theme);
79 }
139 }
80
140
81− fn get_syntax_set(&self) -> Result<&SyntaxSet> {
141+ /// Return the collection of syntect syntax definitions.
142+ pub fn get_syntax_set(&self) -> Result<&SyntaxSet> {
82 self.syntax_set_cell
143 self.syntax_set_cell
83 .get_or_try_init(|| self.serialized_syntax_set.deserialize())
144 .get_or_try_init(|| self.serialized_syntax_set.deserialize())
84 }
145 }
@@ -95,12 +156,12 @@ impl HighlightingAssets {
95 Ok(self.get_syntax_set()?.syntaxes())
156 Ok(self.get_syntax_set()?.syntaxes())
96 }
157 }
97
158
98− fn get_theme_set(&self) -> &ThemeSet {
159+ fn get_theme_set(&self) -> &LazyThemeSet {
99 &self.theme_set
160 &self.theme_set
100 }
161 }
101
162
102 pub fn themes(&self) -> impl Iterator<Item = &str> {
163 pub fn themes(&self) -> impl Iterator<Item = &str> {
103− self.get_theme_set().themes.keys().map(|s| s.as_ref())
164+ self.get_theme_set().themes()
104 }
165 }
105
166
106 /// Use [Self::get_syntax_for_path] instead
167 /// Use [Self::get_syntax_for_path] instead
@@ -174,8 +235,9 @@ impl HighlightingAssets {
174 }
235 }
175 }
236 }
176
237
177− pub(crate) fn get_theme(&self, theme: &str) -> &Theme {
238+ /// Look up a syntect theme by name.
178− match self.get_theme_set().themes.get(theme) {
239+ pub fn get_theme(&self, theme: &str) -> &Theme {
240+ match self.get_theme_set().get(theme) {
179 Some(theme) => theme,
241 Some(theme) => theme,
180 None => {
242 None => {
181 if theme == "ansi-light" || theme == "ansi-dark" {
243 if theme == "ansi-light" || theme == "ansi-dark" {
@@ -185,8 +247,9 @@ impl HighlightingAssets {
185 if !theme.is_empty() {
247 if !theme.is_empty() {
186 bat_warning!("Unknown theme '{}', using default.", theme)
248 bat_warning!("Unknown theme '{}', using default.", theme)
187 }
249 }
188− &self.get_theme_set().themes
250+ self.get_theme_set()
189− [self.fallback_theme.unwrap_or_else(|| Self::default_theme())]
251+ .get(self.fallback_theme.unwrap_or_else(Self::default_theme))
252+ .expect("something is very wrong if the default theme is missing")
190 }
253 }
191 }
254 }
192 }
255 }
@@ -291,10 +354,17 @@ pub(crate) fn get_serialized_integrated_syntaxset() -> &'static [u8] {
291 include_bytes!("../assets/syntaxes.bin")
354 include_bytes!("../assets/syntaxes.bin")
292}
355}
293
356
294−pub(crate) fn get_integrated_themeset() -> ThemeSet {
357+pub(crate) fn get_integrated_themeset() -> LazyThemeSet {
295 from_binary(include_bytes!("../assets/themes.bin"), COMPRESS_THEMES)
358 from_binary(include_bytes!("../assets/themes.bin"), COMPRESS_THEMES)
296}
359}
297
360
361+pub fn get_acknowledgements() -> String {
362+ from_binary(
363+ include_bytes!("../assets/acknowledgements.bin"),
364+ COMPRESS_ACKNOWLEDGEMENTS,
365+ )
366+}
367+
298pub(crate) fn from_binary<T: serde::de::DeserializeOwned>(v: &[u8], compressed: bool) -> T {
368pub(crate) fn from_binary<T: serde::de::DeserializeOwned>(v: &[u8], compressed: bool) -> T {
299 asset_from_contents(v, "n/a", compressed)
369 asset_from_contents(v, "n/a", compressed)
300 .expect("data integrated in binary is never faulty, but make sure `compressed` is in sync!")
370 .expect("data integrated in binary is never faulty, but make sure `compressed` is in sync!")
@@ -329,6 +399,16 @@ fn asset_from_cache<T: serde::de::DeserializeOwned>(
329 .map_err(|_| format!("Could not parse cached {}", description).into())
399 .map_err(|_| format!("Could not parse cached {}", description).into())
330}
400}
331
401
402+#[cfg(target_os = "macos")]
403+fn macos_dark_mode_active() -> bool {
404+ let mut defaults_cmd = std::process::Command::new("defaults");
405+ defaults_cmd.args(&["read", "-globalDomain", "AppleInterfaceStyle"]);
406+ match defaults_cmd.output() {
407+ Ok(output) => output.stdout == b"Dark\n",
408+ Err(_) => true,
409+ }
410+}
411+
332#[cfg(test)]
412#[cfg(test)]
333mod tests {
413mod tests {
334 use super::*;
414 use super::*;
@@ -559,13 +639,22 @@ mod tests {
559 }
639 }
560
640
561 #[test]
641 #[test]
562− fn syntax_detection_is_case_sensitive() {
642+ fn syntax_detection_is_case_insensitive() {
563 let mut test = SyntaxDetectionTest::new();
643 let mut test = SyntaxDetectionTest::new();
564
644
565− assert_ne!(test.syntax_for_file("README.MD"), "Markdown");
645+ assert_eq!(test.syntax_for_file("README.md"), "Markdown");
646+ assert_eq!(test.syntax_for_file("README.mD"), "Markdown");
647+ assert_eq!(test.syntax_for_file("README.Md"), "Markdown");
648+ assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
649+
650+ // Adding a mapping for "MD" in addition to "md" should not break the mapping
566 test.syntax_mapping
651 test.syntax_mapping
567 .insert("*.MD", MappingTarget::MapTo("Markdown"))
652 .insert("*.MD", MappingTarget::MapTo("Markdown"))
568 .ok();
653 .ok();
654+
655+ assert_eq!(test.syntax_for_file("README.md"), "Markdown");
656+ assert_eq!(test.syntax_for_file("README.mD"), "Markdown");
657+ assert_eq!(test.syntax_for_file("README.Md"), "Markdown");
569 assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
658 assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
570 }
659 }
571
660
src/assets/build_assets.rs+31−7
@@ -1,29 +1,43 @@
1+use std::convert::TryInto;
1use std::path::Path;
2use std::path::Path;
3+
2use syntect::highlighting::ThemeSet;
4use syntect::highlighting::ThemeSet;
3use syntect::parsing::{SyntaxSet, SyntaxSetBuilder};
5use syntect::parsing::{SyntaxSet, SyntaxSetBuilder};
4
6
5use crate::assets::*;
7use crate::assets::*;
8+use acknowledgements::build_acknowledgements;
9+
10+mod acknowledgements;
6
11
7pub fn build(
12pub fn build(
8 source_dir: &Path,
13 source_dir: &Path,
9 include_integrated_assets: bool,
14 include_integrated_assets: bool,
15+ include_acknowledgements: bool,
10 target_dir: &Path,
16 target_dir: &Path,
11 current_version: &str,
17 current_version: &str,
12) -> Result<()> {
18) -> Result<()> {
13− let theme_set = build_theme_set(source_dir, include_integrated_assets);
19+ let theme_set = build_theme_set(source_dir, include_integrated_assets)?;
14
20
15 let syntax_set_builder = build_syntax_set_builder(source_dir, include_integrated_assets)?;
21 let syntax_set_builder = build_syntax_set_builder(source_dir, include_integrated_assets)?;
16
22
17 let syntax_set = syntax_set_builder.build();
23 let syntax_set = syntax_set_builder.build();
18
24
25+ let acknowledgements = build_acknowledgements(source_dir, include_acknowledgements)?;
26+
19 print_unlinked_contexts(&syntax_set);
27 print_unlinked_contexts(&syntax_set);
20
28
21− write_assets(&theme_set, &syntax_set, target_dir, current_version)
29+ write_assets(
30+ &theme_set,
31+ &syntax_set,
32+ &acknowledgements,
33+ target_dir,
34+ current_version,
35+ )
22}
36}
23
37
24−fn build_theme_set(source_dir: &Path, include_integrated_assets: bool) -> ThemeSet {
38+fn build_theme_set(source_dir: &Path, include_integrated_assets: bool) -> Result<LazyThemeSet> {
25 let mut theme_set = if include_integrated_assets {
39 let mut theme_set = if include_integrated_assets {
26− crate::assets::get_integrated_themeset()
40+ crate::assets::get_integrated_themeset().try_into()?
27 } else {
41 } else {
28 ThemeSet::new()
42 ThemeSet::new()
29 };
43 };
@@ -45,7 +59,7 @@ fn build_theme_set(source_dir: &Path, include_integrated_assets: bool) -> ThemeS
45 );
59 );
46 }
60 }
47
61
48− theme_set
62+ theme_set.try_into()
49}
63}
50
64
51fn build_syntax_set_builder(
65fn build_syntax_set_builder(
@@ -85,8 +99,9 @@ fn print_unlinked_contexts(syntax_set: &SyntaxSet) {
85}
99}
86
100
87fn write_assets(
101fn write_assets(
88− theme_set: &ThemeSet,
102+ theme_set: &LazyThemeSet,
89 syntax_set: &SyntaxSet,
103 syntax_set: &SyntaxSet,
104+ acknowledgements: &Option<String>,
90 target_dir: &Path,
105 target_dir: &Path,
91 current_version: &str,
106 current_version: &str,
92) -> Result<()> {
107) -> Result<()> {
@@ -104,6 +119,15 @@ fn write_assets(
104 COMPRESS_SYNTAXES,
119 COMPRESS_SYNTAXES,
105 )?;
120 )?;
106
121
122+ if let Some(acknowledgements) = acknowledgements {
123+ asset_to_cache(
124+ acknowledgements,
125+ &target_dir.join("acknowledgements.bin"),
126+ "acknowledgements",
127+ COMPRESS_ACKNOWLEDGEMENTS,
128+ )?;
129+ }
130+
107 print!(
131 print!(
108 "Writing metadata to folder {} ... ",
132 "Writing metadata to folder {} ... ",
109 target_dir.to_string_lossy()
133 target_dir.to_string_lossy()
@@ -114,7 +138,7 @@ fn write_assets(
114 Ok(())
138 Ok(())
115}
139}
116
140
117−fn asset_to_contents<T: serde::Serialize>(
141+pub(crate) fn asset_to_contents<T: serde::Serialize>(
118 asset: &T,
142 asset: &T,
119 description: &str,
143 description: &str,
120 compressed: bool,
144 compressed: bool,
src/assets/build_assets/acknowledgements.rsnew file+222
@@ -0,0 +1,222 @@
1+use std::fs::read_to_string;
2+use std::path::{Path, PathBuf};
3+
4+use walkdir::DirEntry;
5+
6+use crate::error::*;
7+
8+struct PathAndStem {
9+ path: PathBuf,
10+ stem: String,
11+ relative_path: String,
12+}
13+
14+/// Looks for LICENSE and NOTICE files in `source_dir`, does some rudimentary
15+/// analysis, and compiles them together in a single string that is meant to be
16+/// used in the output to `--acknowledgements`
17+pub fn build_acknowledgements(
18+ source_dir: &Path,
19+ include_acknowledgements: bool,
20+) -> Result<Option<String>> {
21+ if !include_acknowledgements {
22+ return Ok(None);
23+ }
24+
25+ let mut acknowledgements = format!("{}\n\n", include_str!("../../../NOTICE"));
26+
27+ // Sort entries so the order is stable over time
28+ let entries = walkdir::WalkDir::new(source_dir).sort_by(|a, b| a.path().cmp(b.path()));
29+ for path_and_stem in entries
30+ .into_iter()
31+ .flatten()
32+ .flat_map(|entry| to_path_and_stem(source_dir, entry))
33+ {
34+ if let Some(license_text) = handle_file(&path_and_stem)? {
35+ append_to_acknowledgements(
36+ &mut acknowledgements,
37+ &path_and_stem.relative_path,
38+ &license_text,
39+ )
40+ }
41+ }
42+
43+ Ok(Some(acknowledgements))
44+}
45+
46+fn to_path_and_stem(source_dir: &Path, entry: DirEntry) -> Option<PathAndStem> {
47+ let path = entry.path();
48+
49+ Some(PathAndStem {
50+ path: path.to_owned(),
51+ stem: path.file_stem().map(|s| s.to_string_lossy().to_string())?,
52+ relative_path: path
53+ .strip_prefix(source_dir)
54+ .map(|p| p.to_string_lossy().to_string())
55+ .ok()?,
56+ })
57+}
58+
59+fn handle_file(path_and_stem: &PathAndStem) -> Result<Option<String>> {
60+ if path_and_stem.stem == "NOTICE" {
61+ handle_notice(&path_and_stem.path)
62+ } else if path_and_stem.stem.to_ascii_uppercase() == "LICENSE" {
63+ handle_license(&path_and_stem.path)
64+ } else {
65+ Ok(None)
66+ }
67+}
68+
69+fn handle_notice(path: &Path) -> Result<Option<String>> {
70+ // Assume NOTICE as defined by Apache License 2.0. These must be part of acknowledgements.
71+ Ok(Some(read_to_string(path)?))
72+}
73+
74+fn handle_license(path: &Path) -> Result<Option<String>> {
75+ let license_text = read_to_string(path)?;
76+
77+ if include_license_in_acknowledgments(&license_text) {
78+ Ok(Some(license_text))
79+ } else if license_not_needed_in_acknowledgements(&license_text) {
80+ Ok(None)
81+ } else {
82+ Err(format!("ERROR: License is of unknown type: {:?}", path).into())
83+ }
84+}
85+
86+fn include_license_in_acknowledgments(license_text: &str) -> bool {
87+ let markers = vec![
88+ // MIT
89+ "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
90+
91+ // BSD
92+ "Redistributions in binary form must reproduce the above copyright notice,",
93+
94+ // Apache 2.0
95+ "Apache License Version 2.0, January 2004 http://www.apache.org/licenses/",
96+ "Licensed under the Apache License, Version 2.0 (the \"License\");",
97+ ];
98+
99+ license_contains_marker(license_text, &markers)
100+}
101+
102+fn license_not_needed_in_acknowledgements(license_text: &str) -> bool {
103+ let markers = vec![
104+ // Public domain
105+ "This is free and unencumbered software released into the public domain.",
106+
107+ // Public domain with stronger wording than above
108+ "DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE",
109+
110+ // Special license of assets/syntaxes/01_Packages/LICENSE
111+ "Permission to copy, use, modify, sell and distribute this software is granted. This software is provided \"as is\" without express or implied warranty, and with no claim as to its suitability for any purpose."
112+ ];
113+
114+ license_contains_marker(license_text, &markers)
115+}
116+
117+fn license_contains_marker(license_text: &str, markers: &[&str]) -> bool {
118+ let normalized_license_text = normalize_license_text(license_text);
119+ markers.iter().any(|m| normalized_license_text.contains(m))
120+}
121+
122+fn append_to_acknowledgements(
123+ acknowledgements: &mut String,
124+ relative_path: &str,
125+ license_text: &str,
126+) {
127+ acknowledgements.push_str(&format!("## {}\n\n{}", relative_path, license_text));
128+
129+ // Make sure the last char is a newline to not mess up formatting later
130+ if acknowledgements
131+ .chars()
132+ .last()
133+ .expect("acknowledgements is not the empty string")
134+ != '\n'
135+ {
136+ acknowledgements.push('\n');
137+ }
138+
139+ // Add two more newlines to make it easy to distinguish where this text ends
140+ // and the next starts
141+ acknowledgements.push_str("\n\n");
142+}
143+
144+/// Replaces newlines with a space character, and replaces multiple spaces with one space.
145+/// This makes the text easier to analyze.
146+fn normalize_license_text(license_text: &str) -> String {
147+ use regex::Regex;
148+
149+ let whitespace_and_newlines = Regex::new(r"\s").unwrap();
150+ let as_single_line = whitespace_and_newlines.replace_all(license_text, " ");
151+
152+ let many_spaces = Regex::new(" +").unwrap();
153+ many_spaces.replace_all(&as_single_line, " ").to_string()
154+}
155+
156+#[cfg(test)]
157+mod tests {
158+ #[cfg(test)]
159+ use super::*;
160+
161+ #[test]
162+ fn test_normalize_license_text() {
163+ let license_text = "This is a license text with these terms:
164+ * Complicated multi-line
165+ term with indentation";
166+
167+ assert_eq!(
168+ "This is a license text with these terms: * Complicated multi-line term with indentation".to_owned(),
169+ normalize_license_text(license_text),
170+ );
171+ }
172+
173+ #[test]
174+ fn test_normalize_license_text_with_windows_line_endings() {
175+ let license_text = "This license text includes windows line endings\r
176+and we need to handle that.";
177+
178+ assert_eq!(
179+ "This license text includes windows line endings and we need to handle that."
180+ .to_owned(),
181+ normalize_license_text(license_text),
182+ );
183+ }
184+
185+ #[test]
186+ fn test_append_to_acknowledgements_adds_newline_if_missing() {
187+ let mut acknowledgements = "preamble\n\n\n".to_owned();
188+
189+ append_to_acknowledgements(&mut acknowledgements, "some/path", "line without newline");
190+ assert_eq!(
191+ "preamble
192+
193+
194+## some/path
195+
196+line without newline
197+
198+
199+",
200+ acknowledgements
201+ );
202+
203+ append_to_acknowledgements(&mut acknowledgements, "another/path", "line with newline\n");
204+ assert_eq!(
205+ "preamble
206+
207+
208+## some/path
209+
210+line without newline
211+
212+
213+## another/path
214+
215+line with newline
216+
217+
218+",
219+ acknowledgements
220+ );
221+ }
222+}
src/assets/lazy_theme_set.rsnew file+104
@@ -0,0 +1,104 @@
1+use super::*;
2+
3+use std::collections::BTreeMap;
4+use std::convert::TryFrom;
5+
6+use serde::Deserialize;
7+use serde::Serialize;
8+
9+use once_cell::unsync::OnceCell;
10+
11+use syntect::highlighting::{Theme, ThemeSet};
12+
13+/// Same structure as a [`syntect::highlighting::ThemeSet`] but with themes
14+/// stored in raw serialized form, and deserialized on demand.
15+#[derive(Debug, Default, Serialize, Deserialize)]
16+pub struct LazyThemeSet {
17+ /// This is a [`BTreeMap`] because that's what [`syntect::highlighting::ThemeSet`] uses
18+ themes: BTreeMap<String, LazyTheme>,
19+}
20+
21+/// Stores raw serialized data for a theme with methods to lazily deserialize
22+/// (load) the theme.
23+#[derive(Debug, Serialize, Deserialize)]
24+struct LazyTheme {
25+ serialized: Vec<u8>,
26+
27+ #[serde(skip, default = "OnceCell::new")]
28+ deserialized: OnceCell<syntect::highlighting::Theme>,
29+}
30+
31+impl LazyThemeSet {
32+ /// Lazily load the given theme
33+ pub fn get(&self, name: &str) -> Option<&Theme> {
34+ self.themes.get(name).and_then(|lazy_theme| {
35+ lazy_theme
36+ .deserialized
37+ .get_or_try_init(|| lazy_theme.deserialize())
38+ .ok()
39+ })
40+ }
41+
42+ /// Returns the name of all themes.
43+ pub fn themes(&self) -> impl Iterator<Item = &str> {
44+ self.themes.keys().map(|name| name.as_ref())
45+ }
46+}
47+
48+impl LazyTheme {
49+ fn deserialize(&self) -> Result<Theme> {
50+ asset_from_contents(
51+ &self.serialized[..],
52+ "lazy-loaded theme",
53+ COMPRESS_LAZY_THEMES,
54+ )
55+ }
56+}
57+
58+impl TryFrom<LazyThemeSet> for ThemeSet {
59+ type Error = Error;
60+
61+ /// Since the user might want to add custom themes to bat, we need a way to
62+ /// convert from a `LazyThemeSet` to a regular [`ThemeSet`] so that more
63+ /// themes can be added. This function does that pretty straight-forward
64+ /// conversion.
65+ fn try_from(lazy_theme_set: LazyThemeSet) -> Result<Self> {
66+ let mut theme_set = ThemeSet::default();
67+
68+ for (name, lazy_theme) in lazy_theme_set.themes {
69+ theme_set.themes.insert(name, lazy_theme.deserialize()?);
70+ }
71+
72+ Ok(theme_set)
73+ }
74+}
75+
76+#[cfg(feature = "build-assets")]
77+impl TryFrom<ThemeSet> for LazyThemeSet {
78+ type Error = Error;
79+
80+ /// To collect themes, a [`ThemeSet`] is needed. Once all desired themes
81+ /// have been added, we need a way to convert that into [`LazyThemeSet`] so
82+ /// that themes can be lazy-loaded later. This function does that
83+ /// conversion.
84+ fn try_from(theme_set: ThemeSet) -> Result<Self> {
85+ let mut lazy_theme_set = LazyThemeSet::default();
86+
87+ for (name, theme) in theme_set.themes {
88+ // All we have to do is to serialize the theme
89+ let lazy_theme = LazyTheme {
90+ serialized: crate::assets::build_assets::asset_to_contents(
91+ &theme,
92+ &format!("theme {}", name),
93+ COMPRESS_LAZY_THEMES,
94+ )?,
95+ deserialized: OnceCell::new(),
96+ };
97+
98+ // Ok done, now we can add it
99+ lazy_theme_set.themes.insert(name, lazy_theme);
100+ }
101+
102+ Ok(lazy_theme_set)
103+ }
104+}
src/bin/bat/app.rs+2−2
@@ -307,7 +307,7 @@ impl App {
307 .map(|style_str| {
307 .map(|style_str| {
308 style_str
308 style_str
309 .split(',')
309 .split(',')
310− .map(|x| StyleComponent::from_str(x))
310+ .map(StyleComponent::from_str)
311 .collect::<Result<Vec<StyleComponent>>>()
311 .collect::<Result<Vec<StyleComponent>>>()
312 })
312 })
313 .transpose()?;
313 .transpose()?;
@@ -322,7 +322,7 @@ impl App {
322 .collect::<Vec<_>>()
322 .collect::<Vec<_>>()
323 })
323 })
324 .or(env_style_components)
324 .or(env_style_components)
325− .unwrap_or_else(|| vec![StyleComponent::Full])
325+ .unwrap_or_else(|| vec![StyleComponent::Default])
326 .into_iter()
326 .into_iter()
327 .map(|style| style.components(self.interactive_output))
327 .map(|style| style.components(self.interactive_output))
328 .fold(HashSet::new(), |mut acc, components| {
328 .fold(HashSet::new(), |mut acc, components| {
src/bin/bat/clap_app.rs+41−17
@@ -349,6 +349,18 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
349 )
349 )
350 .takes_value(true),
350 .takes_value(true),
351 )
351 )
352+ .arg(
353+ Arg::with_name("ignored-suffix")
354+ .number_of_values(1)
355+ .multiple(true)
356+ .takes_value(true)
357+ .long("ignored-suffix")
358+ .hidden_short_help(true)
359+ .help(
360+ "Ignore extension. For example:\n \
361+ 'bat --ignored-suffix \".dev\" my_file.json.dev' will use JSON syntax, and ignore '.dev'"
362+ )
363+ )
352 .arg(
364 .arg(
353 Arg::with_name("theme")
365 Arg::with_name("theme")
354 .long("theme")
366 .long("theme")
@@ -384,11 +396,20 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
384 .validator(|val| {
396 .validator(|val| {
385 let mut invalid_vals = val.split(',').filter(|style| {
397 let mut invalid_vals = val.split(',').filter(|style| {
386 !&[
398 !&[
387− "auto", "full", "plain", "header", "grid", "rule", "numbers", "snip",
399+ "auto",
400+ "full",
401+ "default",
402+ "plain",
403+ "header",
404+ "header-filename",
405+ "header-filesize",
406+ "grid",
407+ "rule",
408+ "numbers",
409+ "snip",
388 #[cfg(feature = "git")]
410 #[cfg(feature = "git")]
389− "changes",
411+ "changes",
390− ]
412+ ].contains(style)
391− .contains(style)
392 });
413 });
393
414
394 if let Some(invalid) = invalid_vals.next() {
415 if let Some(invalid) = invalid_vals.next() {
@@ -399,7 +420,7 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
399 })
420 })
400 .help(
421 .help(
401 "Comma-separated list of style elements to display \
422 "Comma-separated list of style elements to display \
402− (*auto*, full, plain, changes, header, grid, rule, numbers, snip).",
423+ (*default*, auto, full, plain, changes, header, header-filename, header-filesize, grid, rule, numbers, snip).",
403 )
424 )
404 .long_help(
425 .long_help(
405 "Configure which elements (line numbers, file headers, grid \
426 "Configure which elements (line numbers, file headers, grid \
@@ -410,11 +431,14 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
410 '--style=\"..\"' option to the configuration file or export the \
431 '--style=\"..\"' option to the configuration file or export the \
411 BAT_STYLE environment variable (e.g.: export BAT_STYLE=\"..\").\n\n\
432 BAT_STYLE environment variable (e.g.: export BAT_STYLE=\"..\").\n\n\
412 Possible values:\n\n \
433 Possible values:\n\n \
413− * full: enables all available components (default).\n \
434+ * default: enables recommended style components (default).\n \
414− * auto: same as 'full', unless the output is piped.\n \
435+ * full: enables all available components.\n \
436+ * auto: same as 'default', unless the output is piped.\n \
415 * plain: disables all available components.\n \
437 * plain: disables all available components.\n \
416 * changes: show Git modification markers.\n \
438 * changes: show Git modification markers.\n \
417− * header: show filenames before the content.\n \
439+ * header: alias for 'header-filename'.\n \
440+ * header-filename: show filenames before the content.\n \
441+ * header-filesize: show file sizes before the content.\n \
418 * grid: vertical/horizontal lines to separate side bar\n \
442 * grid: vertical/horizontal lines to separate side bar\n \
419 and the header from the content.\n \
443 and the header from the content.\n \
420 * rule: horizontal lines to delimit files.\n \
444 * rule: horizontal lines to delimit files.\n \
@@ -509,16 +533,10 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
509 .help("Show diagnostic information for bug reports.")
533 .help("Show diagnostic information for bug reports.")
510 )
534 )
511 .arg(
535 .arg(
512− Arg::with_name("ignored-suffix")
536+ Arg::with_name("acknowledgements")
513− .number_of_values(1)
537+ .long("acknowledgements")
514− .multiple(true)
515− .takes_value(true)
516− .long("ignored-suffix")
517 .hidden_short_help(true)
538 .hidden_short_help(true)
518− .help(
539+ .help("Show acknowledgements."),
519− "Ignore extension. For example:\n \
520− 'bat --ignored-suffix \".dev\" my_file.json.dev' will use JSON syntax, and ignore '.dev'"
521− )
522 )
540 )
523 .help_message("Print this help message.")
541 .help_message("Print this help message.")
524 .version_message("Show version information.");
542 .version_message("Show version information.");
@@ -578,6 +596,12 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
578 "Create completely new syntax and theme sets \
596 "Create completely new syntax and theme sets \
579 (instead of appending to the default sets).",
597 (instead of appending to the default sets).",
580 ),
598 ),
599+ )
600+ .arg(
601+ Arg::with_name("acknowledgements")
602+ .long("acknowledgements")
603+ .requires("build")
604+ .help("Build acknowledgements.bin."),
581 ),
605 ),
582 )
606 )
583 }
607 }
src/bin/bat/config.rs+2−2
@@ -91,7 +91,7 @@ pub fn get_args_from_config_file() -> Result<Vec<OsString>, shell_words::ParseEr
91 .ok()
91 .ok()
92 .map(|content| get_args_from_str(&content))
92 .map(|content| get_args_from_str(&content))
93 .transpose()?
93 .transpose()?
94− .unwrap_or_else(Vec::new))
94+ .unwrap_or_default())
95}
95}
96
96
97pub fn get_args_from_env_var() -> Option<Result<Vec<OsString>, shell_words::ParseError>> {
97pub fn get_args_from_env_var() -> Option<Result<Vec<OsString>, shell_words::ParseError>> {
@@ -104,7 +104,7 @@ fn get_args_from_str(content: &str) -> Result<Vec<OsString>, shell_words::ParseE
104 .map(|line| line.trim())
104 .map(|line| line.trim())
105 .filter(|line| !line.is_empty())
105 .filter(|line| !line.is_empty())
106 .filter(|line| !line.starts_with('#'))
106 .filter(|line| !line.starts_with('#'))
107− .map(|line| shell_words::split(line))
107+ .map(shell_words::split)
108 .collect::<Result<Vec<_>, _>>()?;
108 .collect::<Result<Vec<_>, _>>()?;
109
109
110 Ok(args_per_line
110 Ok(args_per_line
src/bin/bat/main.rs+24−10
@@ -47,9 +47,13 @@ fn build_assets(matches: &clap::ArgMatches) -> Result<()> {
47 .map(Path::new)
47 .map(Path::new)
48 .unwrap_or_else(|| PROJECT_DIRS.cache_dir());
48 .unwrap_or_else(|| PROJECT_DIRS.cache_dir());
49
49
50− let blank = matches.is_present("blank");
50+ bat::assets::build(
51−
51+ source_dir,
52− bat::assets::build(source_dir, !blank, target_dir, clap::crate_version!())
52+ !matches.is_present("blank"),
53+ matches.is_present("acknowledgements"),
54+ target_dir,
55+ clap::crate_version!(),
56+ )
53}
57}
54
58
55fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
59fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
@@ -70,13 +74,9 @@ fn get_syntax_mapping_to_paths<'a>(
70) -> HashMap<&'a str, Vec<String>> {
74) -> HashMap<&'a str, Vec<String>> {
71 let mut map = HashMap::new();
75 let mut map = HashMap::new();
72 for mapping in mappings {
76 for mapping in mappings {
73− match mapping {
77+ if let (matcher, MappingTarget::MapTo(s)) = mapping {
74− (_, MappingTarget::MapToUnknown) => {}
78+ let globs = map.entry(*s).or_insert_with(Vec::new);
75− (_, MappingTarget::MapExtensionToUnknown) => {}
79+ globs.push(matcher.glob().glob().into());
76− (matcher, MappingTarget::MapTo(s)) => {
77− let globs = map.entry(*s).or_insert_with(Vec::new);
78− globs.push(matcher.glob().glob().into());
79− }
80 }
80 }
81 }
81 }
82 map
82 map
@@ -230,6 +230,9 @@ fn invoke_bugreport(app: &App) {
230 let pager = bat::config::get_pager_executable(app.matches.value_of("pager"))
230 let pager = bat::config::get_pager_executable(app.matches.value_of("pager"))
231 .unwrap_or_else(|| "less".to_owned()); // FIXME: Avoid non-canonical path to "less".
231 .unwrap_or_else(|| "less".to_owned()); // FIXME: Avoid non-canonical path to "less".
232
232
233+ let mut custom_assets_metadata = PROJECT_DIRS.cache_dir().to_path_buf();
234+ custom_assets_metadata.push("metadata.yaml");
235+
233 let mut report = bugreport!()
236 let mut report = bugreport!()
234 .info(SoftwareVersion::default())
237 .info(SoftwareVersion::default())
235 .info(OperatingSystem::default())
238 .info(OperatingSystem::default())
@@ -254,6 +257,14 @@ fn invoke_bugreport(app: &App) {
254 "MANPAGER",
257 "MANPAGER",
255 ]))
258 ]))
256 .info(FileContent::new("Config file", config_file()))
259 .info(FileContent::new("Config file", config_file()))
260+ .info(FileContent::new(
261+ "Custom assets metadata",
262+ custom_assets_metadata,
263+ ))
264+ .info(DirectoryEntries::new(
265+ "Custom assets",
266+ PROJECT_DIRS.cache_dir(),
267+ ))
257 .info(CompileTimeInformation::default());
268 .info(CompileTimeInformation::default());
258
269
259 #[cfg(feature = "paging")]
270 #[cfg(feature = "paging")]
@@ -324,6 +335,9 @@ fn run() -> Result<bool> {
324 } else if app.matches.is_present("cache-dir") {
335 } else if app.matches.is_present("cache-dir") {
325 writeln!(io::stdout(), "{}", cache_dir())?;
336 writeln!(io::stdout(), "{}", cache_dir())?;
326 Ok(true)
337 Ok(true)
338+ } else if app.matches.is_present("acknowledgements") {
339+ writeln!(io::stdout(), "{}", bat::assets::get_acknowledgements())?;
340+ Ok(true)
327 } else {
341 } else {
328 run_controller(inputs, &config)
342 run_controller(inputs, &config)
329 }
343 }
src/error.rs+4−1
@@ -2,11 +2,14 @@ use std::io::Write;
2use thiserror::Error;
2use thiserror::Error;
3
3
4#[derive(Error, Debug)]
4#[derive(Error, Debug)]
5+#[non_exhaustive]
5pub enum Error {
6pub enum Error {
6 #[error(transparent)]
7 #[error(transparent)]
7 Io(#[from] ::std::io::Error),
8 Io(#[from] ::std::io::Error),
8 #[error(transparent)]
9 #[error(transparent)]
9− SyntectError(#[from] ::syntect::LoadingError),
10+ SyntectError(#[from] ::syntect::Error),
11+ #[error(transparent)]
12+ SyntectLoadingError(#[from] ::syntect::LoadingError),
10 #[error(transparent)]
13 #[error(transparent)]
11 ParseIntError(#[from] ::std::num::ParseIntError),
14 ParseIntError(#[from] ::std::num::ParseIntError),
12 #[error(transparent)]
15 #[error(transparent)]
src/input.rs+9−2
@@ -1,4 +1,5 @@
1use std::convert::TryFrom;
1use std::convert::TryFrom;
2+use std::fs;
2use std::fs::File;
3use std::fs::File;
3use std::io::{self, BufRead, BufReader, Read};
4use std::io::{self, BufRead, BufReader, Read};
4use std::path::{Path, PathBuf};
5use std::path::{Path, PathBuf};
@@ -87,6 +88,7 @@ impl<'a> InputKind<'a> {
87#[derive(Clone, Default)]
88#[derive(Clone, Default)]
88pub(crate) struct InputMetadata {
89pub(crate) struct InputMetadata {
89 pub(crate) user_provided_name: Option<PathBuf>,
90 pub(crate) user_provided_name: Option<PathBuf>,
91+ pub(crate) size: Option<u64>,
90}
92}
91
93
92pub struct Input<'a> {
94pub struct Input<'a> {
@@ -116,7 +118,7 @@ impl OpenedInput<'_> {
116 self.metadata
118 self.metadata
117 .user_provided_name
119 .user_provided_name
118 .as_ref()
120 .as_ref()
119− .or_else(|| match self.kind {
121+ .or(match self.kind {
120 OpenedInputKind::OrdinaryFile(ref path) => Some(path),
122 OpenedInputKind::OrdinaryFile(ref path) => Some(path),
121 _ => None,
123 _ => None,
122 })
124 })
@@ -130,9 +132,14 @@ impl<'a> Input<'a> {
130
132
131 fn _ordinary_file(path: &Path) -> Self {
133 fn _ordinary_file(path: &Path) -> Self {
132 let kind = InputKind::OrdinaryFile(path.to_path_buf());
134 let kind = InputKind::OrdinaryFile(path.to_path_buf());
135+ let metadata = InputMetadata {
136+ size: fs::metadata(path).map(|m| m.len()).ok(),
137+ ..InputMetadata::default()
138+ };
139+
133 Input {
140 Input {
134 description: kind.description(),
141 description: kind.description(),
135− metadata: InputMetadata::default(),
142+ metadata,
136 kind,
143 kind,
137 }
144 }
138 }
145 }
src/less.rs+59−8
@@ -3,21 +3,38 @@
3use std::ffi::OsStr;
3use std::ffi::OsStr;
4use std::process::Command;
4use std::process::Command;
5
5
6−pub fn retrieve_less_version(less_path: &dyn AsRef<OsStr>) -> Option<usize> {
6+#[derive(Debug, PartialEq)]
7+pub enum LessVersion {
8+ Less(usize),
9+ BusyBox,
10+}
11+
12+pub fn retrieve_less_version(less_path: &dyn AsRef<OsStr>) -> Option<LessVersion> {
7 let resolved_path = grep_cli::resolve_binary(less_path.as_ref()).ok()?;
13 let resolved_path = grep_cli::resolve_binary(less_path.as_ref()).ok()?;
8
14
9 let cmd = Command::new(resolved_path).arg("--version").output().ok()?;
15 let cmd = Command::new(resolved_path).arg("--version").output().ok()?;
10− parse_less_version(&cmd.stdout)
16+ if cmd.status.success() {
17+ parse_less_version(&cmd.stdout)
18+ } else {
19+ parse_less_version_busybox(&cmd.stderr)
20+ }
11}
21}
12
22
13−fn parse_less_version(output: &[u8]) -> Option<usize> {
23+fn parse_less_version(output: &[u8]) -> Option<LessVersion> {
14 if !output.starts_with(b"less ") {
24 if !output.starts_with(b"less ") {
15 return None;
25 return None;
16 }
26 }
17
27
18 let version = std::str::from_utf8(&output[5..]).ok()?;
28 let version = std::str::from_utf8(&output[5..]).ok()?;
19 let end = version.find(|c: char| !c.is_ascii_digit())?;
29 let end = version.find(|c: char| !c.is_ascii_digit())?;
20− version[..end].parse::<usize>().ok()
30+ Some(LessVersion::Less(version[..end].parse::<usize>().ok()?))
31+}
32+
33+fn parse_less_version_busybox(output: &[u8]) -> Option<LessVersion> {
34+ match std::str::from_utf8(output) {
35+ Ok(version) if version.contains("BusyBox ") => Some(LessVersion::BusyBox),
36+ _ => None,
37+ }
21}
38}
22
39
23#[test]
40#[test]
@@ -30,7 +47,7 @@ For information about the terms of redistribution,
30see the file named README in the less distribution.
47see the file named README in the less distribution.
31Homepage: http://www.greenwoodsoftware.com/less";
48Homepage: http://www.greenwoodsoftware.com/less";
32
49
33− assert_eq!(Some(487), parse_less_version(output));
50+ assert_eq!(Some(LessVersion::Less(487)), parse_less_version(output));
34}
51}
35
52
36#[test]
53#[test]
@@ -43,7 +60,7 @@ For information about the terms of redistribution,
43see the file named README in the less distribution.
60see the file named README in the less distribution.
44Homepage: http://www.greenwoodsoftware.com/less";
61Homepage: http://www.greenwoodsoftware.com/less";
45
62
46− assert_eq!(Some(529), parse_less_version(output));
63+ assert_eq!(Some(LessVersion::Less(529)), parse_less_version(output));
47}
64}
48
65
49#[test]
66#[test]
@@ -56,7 +73,7 @@ For information about the terms of redistribution,
56see the file named README in the less distribution.
73see the file named README in the less distribution.
57Home page: http://www.greenwoodsoftware.com/less";
74Home page: http://www.greenwoodsoftware.com/less";
58
75
59− assert_eq!(Some(551), parse_less_version(output));
76+ assert_eq!(Some(LessVersion::Less(551)), parse_less_version(output));
60}
77}
61
78
62#[test]
79#[test]
@@ -69,7 +86,7 @@ For information about the terms of redistribution,
69see the file named README in the less distribution.
86see the file named README in the less distribution.
70Home page: https://greenwoodsoftware.com/less";
87Home page: https://greenwoodsoftware.com/less";
71
88
72− assert_eq!(Some(581), parse_less_version(output));
89+ assert_eq!(Some(LessVersion::Less(581)), parse_less_version(output));
73}
90}
74
91
75#[test]
92#[test]
@@ -77,4 +94,38 @@ fn test_parse_less_version_wrong_program() {
77 let output = b"more from util-linux 2.34";
94 let output = b"more from util-linux 2.34";
78
95
79 assert_eq!(None, parse_less_version(output));
96 assert_eq!(None, parse_less_version(output));
97+ assert_eq!(None, parse_less_version_busybox(output));
98+}
99+
100+#[test]
101+fn test_parse_less_version_busybox() {
102+ let output = b"pkg/less: unrecognized option '--version'
103+BusyBox v1.35.0 (2022-04-21 10:38:11 EDT) multi-call binary.
104+
105+Usage: less [-EFIMmNSRh~] [FILE]...
106+
107+View FILE (or stdin) one screenful at a time
108+
109+ -E Quit once the end of a file is reached
110+ -F Quit if entire file fits on first screen
111+ -I Ignore case in all searches
112+ -M,-m Display status line with line numbers
113+ and percentage through the file
114+ -N Prefix line number to each line
115+ -S Truncate long lines
116+ -R Remove color escape codes in input
117+ -~ Suppress ~s displayed past EOF";
118+
119+ assert_eq!(
120+ Some(LessVersion::BusyBox),
121+ parse_less_version_busybox(output)
122+ );
123+}
124+
125+#[test]
126+fn test_parse_less_version_invalid_utf_8() {
127+ let output = b"\xff";
128+
129+ assert_eq!(None, parse_less_version(output));
130+ assert_eq!(None, parse_less_version_busybox(output));
80}
131}
src/lib.rs+1
@@ -46,6 +46,7 @@ pub(crate) mod printer;
46pub mod style;
46pub mod style;
47pub(crate) mod syntax_mapping;
47pub(crate) mod syntax_mapping;
48mod terminal;
48mod terminal;
49+mod vscreen;
49pub(crate) mod wrapping;
50pub(crate) mod wrapping;
50
51
51pub use pretty_printer::{Input, PrettyPrinter};
52pub use pretty_printer::{Input, PrettyPrinter};
src/output.rs+7−5
@@ -4,7 +4,7 @@ use std::process::Child;
4
4
5use crate::error::*;
5use crate::error::*;
6#[cfg(feature = "paging")]
6#[cfg(feature = "paging")]
7−use crate::less::retrieve_less_version;
7+use crate::less::{retrieve_less_version, LessVersion};
8#[cfg(feature = "paging")]
8#[cfg(feature = "paging")]
9use crate::paging::PagingMode;
9use crate::paging::PagingMode;
10#[cfg(feature = "paging")]
10#[cfg(feature = "paging")]
@@ -83,13 +83,13 @@ impl OutputType {
83 let replace_arguments_to_less = pager.source == PagerSource::EnvVarPager;
83 let replace_arguments_to_less = pager.source == PagerSource::EnvVarPager;
84
84
85 if args.is_empty() || replace_arguments_to_less {
85 if args.is_empty() || replace_arguments_to_less {
86− p.arg("--RAW-CONTROL-CHARS");
86+ p.arg("-R"); // Short version of --RAW-CONTROL-CHARS for maximum compatibility
87 if single_screen_action == SingleScreenAction::Quit {
87 if single_screen_action == SingleScreenAction::Quit {
88− p.arg("--quit-if-one-screen");
88+ p.arg("-F"); // Short version of --quit-if-one-screen for compatibility
89 }
89 }
90
90
91 if wrapping_mode == WrappingMode::NoWrapping(true) {
91 if wrapping_mode == WrappingMode::NoWrapping(true) {
92− p.arg("--chop-long-lines");
92+ p.arg("-S"); // Short version of --chop-long-lines for compatibility
93 }
93 }
94
94
95 // Passing '--no-init' fixes a bug with '--quit-if-one-screen' in older
95 // Passing '--no-init' fixes a bug with '--quit-if-one-screen' in older
@@ -103,7 +103,9 @@ impl OutputType {
103 None => {
103 None => {
104 p.arg("--no-init");
104 p.arg("--no-init");
105 }
105 }
106− Some(version) if (version < 530 || (cfg!(windows) && version < 558)) => {
106+ Some(LessVersion::Less(version))
107+ if (version < 530 || (cfg!(windows) && version < 558)) =>
108+ {
107 p.arg("--no-init");
109 p.arg("--no-init");
108 }
110 }
109 _ => {}
111 _ => {}
src/preprocessor.rs+10−3
@@ -53,26 +53,33 @@ pub fn replace_nonprintable(input: &[u8], tab_width: usize) -> String {
53 let tab_width = if tab_width == 0 { 4 } else { tab_width };
53 let tab_width = if tab_width == 0 { 4 } else { tab_width };
54
54
55 let mut idx = 0;
55 let mut idx = 0;
56+ let mut line_idx = 0;
56 let len = input.len();
57 let len = input.len();
57 while idx < len {
58 while idx < len {
58 if let Some((chr, skip_ahead)) = try_parse_utf8_char(&input[idx..]) {
59 if let Some((chr, skip_ahead)) = try_parse_utf8_char(&input[idx..]) {
59 idx += skip_ahead;
60 idx += skip_ahead;
61+ line_idx += 1;
60
62
61 match chr {
63 match chr {
62 // space
64 // space
63 ' ' => output.push('·'),
65 ' ' => output.push('·'),
64 // tab
66 // tab
65 '\t' => {
67 '\t' => {
66− if tab_width == 1 {
68+ let tab_stop = tab_width - ((line_idx - 1) % tab_width);
69+ line_idx = 0;
70+ if tab_stop == 1 {
67 output.push('↹');
71 output.push('↹');
68 } else {
72 } else {
69 output.push('├');
73 output.push('├');
70− output.push_str(&"─".repeat(tab_width - 2));
74+ output.push_str(&"─".repeat(tab_stop - 2));
71 output.push('┤');
75 output.push('┤');
72 }
76 }
73 }
77 }
74 // line feed
78 // line feed
75− '\x0A' => output.push_str("␊\x0A"),
79+ '\x0A' => {
80+ output.push_str("␊\x0A");
81+ line_idx = 0;
82+ }
76 // carriage return
83 // carriage return
77 '\x0D' => output.push('␍'),
84 '\x0D' => output.push('␍'),
78 // null
85 // null
src/pretty_printer.rs+6
@@ -164,6 +164,12 @@ impl<'a> PrettyPrinter<'a> {
164 self
164 self
165 }
165 }
166
166
167+ /// Whether to print binary content or nonprintable characters (default: no)
168+ pub fn show_nonprintable(&mut self, yes: bool) -> &mut Self {
169+ self.config.show_nonprintable = yes;
170+ self
171+ }
172+
167 /// Whether to show "snip" markers between visible line ranges (default: no)
173 /// Whether to show "snip" markers between visible line ranges (default: no)
168 pub fn snip(&mut self, yes: bool) -> &mut Self {
174 pub fn snip(&mut self, yes: bool) -> &mut Self {
169 self.active_style_components.snip = yes;
175 self.active_style_components.snip = yes;
src/printer.rs+147−95
@@ -4,6 +4,8 @@ use std::vec::Vec;
4use ansi_term::Colour::{Fixed, Green, Red, Yellow};
4use ansi_term::Colour::{Fixed, Green, Red, Yellow};
5use ansi_term::Style;
5use ansi_term::Style;
6
6
7+use bytesize::ByteSize;
8+
7use console::AnsiCodeIterator;
9use console::AnsiCodeIterator;
8
10
9use syntect::easy::HighlightLines;
11use syntect::easy::HighlightLines;
@@ -29,7 +31,9 @@ use crate::error::*;
29use crate::input::OpenedInput;
31use crate::input::OpenedInput;
30use crate::line_range::RangeCheckResult;
32use crate::line_range::RangeCheckResult;
31use crate::preprocessor::{expand_tabs, replace_nonprintable};
33use crate::preprocessor::{expand_tabs, replace_nonprintable};
34+use crate::style::StyleComponent;
32use crate::terminal::{as_terminal_escaped, to_ansi_color};
35use crate::terminal::{as_terminal_escaped, to_ansi_color};
36+use crate::vscreen::AnsiStyle;
33use crate::wrapping::WrappingMode;
37use crate::wrapping::WrappingMode;
34
38
35pub(crate) trait Printer {
39pub(crate) trait Printer {
@@ -118,7 +122,7 @@ pub(crate) struct InteractivePrinter<'a> {
118 config: &'a Config<'a>,
122 config: &'a Config<'a>,
119 decorations: Vec<Box<dyn Decoration>>,
123 decorations: Vec<Box<dyn Decoration>>,
120 panel_width: usize,
124 panel_width: usize,
121− ansi_prefix_sgr: String,
125+ ansi_style: AnsiStyle,
122 content_type: Option<ContentType>,
126 content_type: Option<ContentType>,
123 #[cfg(feature = "git")]
127 #[cfg(feature = "git")]
124 pub line_changes: &'a Option<LineChanges>,
128 pub line_changes: &'a Option<LineChanges>,
@@ -202,7 +206,7 @@ impl<'a> InteractivePrinter<'a> {
202 config,
206 config,
203 decorations,
207 decorations,
204 content_type: input.reader.content_type,
208 content_type: input.reader.content_type,
205− ansi_prefix_sgr: String::new(),
209+ ansi_style: AnsiStyle::new(),
206 #[cfg(feature = "git")]
210 #[cfg(feature = "git")]
207 line_changes,
211 line_changes,
208 highlighter_from_set,
212 highlighter_from_set,
@@ -249,6 +253,21 @@ impl<'a> InteractivePrinter<'a> {
249 }
253 }
250 }
254 }
251
255
256+ fn print_header_component_indent(&mut self, handle: &mut dyn Write) -> std::io::Result<()> {
257+ if self.config.style_components.grid() {
258+ write!(
259+ handle,
260+ "{}{}",
261+ " ".repeat(self.panel_width),
262+ self.colors
263+ .grid
264+ .paint(if self.panel_width > 0 { "│ " } else { "" }),
265+ )
266+ } else {
267+ write!(handle, "{}", " ".repeat(self.panel_width))
268+ }
269+ }
270+
252 fn preprocess(&self, text: &str, cursor: &mut usize) -> String {
271 fn preprocess(&self, text: &str, cursor: &mut usize) -> String {
253 if self.config.tab_width > 0 {
272 if self.config.tab_width > 0 {
254 return expand_tabs(text, self.config.tab_width, cursor);
273 return expand_tabs(text, self.config.tab_width, cursor);
@@ -286,25 +305,6 @@ impl<'a> Printer for InteractivePrinter<'a> {
286 return Ok(());
305 return Ok(());
287 }
306 }
288
307
289− if self.config.style_components.grid() {
290− self.print_horizontal_line(handle, '┬')?;
291−
292− write!(
293− handle,
294− "{}{}",
295− " ".repeat(self.panel_width),
296− self.colors
297− .grid
298− .paint(if self.panel_width > 0 { "│ " } else { "" }),
299− )?;
300− } else {
301− // Only pad space between files, if we haven't already drawn a horizontal rule
302− if add_header_padding && !self.config.style_components.rule() {
303− writeln!(handle)?;
304− }
305− write!(handle, "{}", " ".repeat(self.panel_width))?;
306− }
307−
308 let mode = match self.content_type {
308 let mode = match self.content_type {
309 Some(ContentType::BINARY) => " <BINARY>",
309 Some(ContentType::BINARY) => " <BINARY>",
310 Some(ContentType::UTF_16LE) => " <UTF-16LE>",
310 Some(ContentType::UTF_16LE) => " <UTF-16LE>",
@@ -314,17 +314,60 @@ impl<'a> Printer for InteractivePrinter<'a> {
314 };
314 };
315
315
316 let description = &input.description;
316 let description = &input.description;
317+ let metadata = &input.metadata;
318+
319+ // We use this iterator to have a deterministic order for
320+ // header components. HashSet has arbitrary order, but Vec is ordered.
321+ let header_components: Vec<StyleComponent> = [
322+ (
323+ StyleComponent::HeaderFilename,
324+ self.config.style_components.header_filename(),
325+ ),
326+ (
327+ StyleComponent::HeaderFilesize,
328+ self.config.style_components.header_filesize(),
329+ ),
330+ ]
331+ .iter()
332+ .filter(|(_, is_enabled)| *is_enabled)
333+ .map(|(component, _)| *component)
334+ .collect();
335+
336+ // Print the cornering grid before the first header component
337+ if self.config.style_components.grid() {
338+ self.print_horizontal_line(handle, '┬')?;
339+ } else {
340+ // Only pad space between files, if we haven't already drawn a horizontal rule
341+ if add_header_padding && !self.config.style_components.rule() {
342+ writeln!(handle)?;
343+ }
344+ }
317
345
318− writeln!(
346+ header_components.iter().try_for_each(|component| {
319− handle,
347+ self.print_header_component_indent(handle)?;
320− "{}{}{}",
348+
321− description
349+ match component {
322− .kind()
350+ StyleComponent::HeaderFilename => writeln!(
323− .map(|kind| format!("{}: ", kind))
351+ handle,
324− .unwrap_or_else(|| "".into()),
352+ "{}{}{}",
325− self.colors.filename.paint(description.title()),
353+ description
326− mode
354+ .kind()
327− )?;
355+ .map(|kind| format!("{}: ", kind))
356+ .unwrap_or_else(|| "".into()),
357+ self.colors.header_value.paint(description.title()),
358+ mode
359+ ),
360+
361+ StyleComponent::HeaderFilesize => {
362+ let bsize = metadata
363+ .size
364+ .map(|s| format!("{}", ByteSize(s)))
365+ .unwrap_or_else(|| "-".into());
366+ writeln!(handle, "Size: {}", self.colors.header_value.paint(bsize))
367+ }
368+ _ => Ok(()),
369+ }
370+ })?;
328
371
329 if self.config.style_components.grid() {
372 if self.config.style_components.grid() {
330 if self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable {
373 if self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable {
@@ -402,9 +445,21 @@ impl<'a> Printer for InteractivePrinter<'a> {
402 return Ok(());
445 return Ok(());
403 }
446 }
404 };
447 };
405− highlighter_from_set
448+
449+ // skip syntax highlighting on long lines
450+ let too_long = line.len() > 1024 * 16;
451+
452+ let for_highlighting: &str = if too_long { "\n" } else { &line };
453+
454+ let mut highlighted_line = highlighter_from_set
406 .highlighter
455 .highlighter
407− .highlight(&line, highlighter_from_set.syntax_set)
456+ .highlight_line(for_highlighting, highlighter_from_set.syntax_set)?;
457+
458+ if too_long {
459+ highlighted_line[0].1 = &line;
460+ }
461+
462+ highlighted_line
408 };
463 };
409
464
410 if out_of_range {
465 if out_of_range {
@@ -420,6 +475,10 @@ impl<'a> Printer for InteractivePrinter<'a> {
420 let highlight_this_line =
475 let highlight_this_line =
421 self.config.highlighted_lines.0.check(line_number) == RangeCheckResult::InRange;
476 self.config.highlighted_lines.0.check(line_number) == RangeCheckResult::InRange;
422
477
478+ if highlight_this_line && self.config.theme == "ansi" {
479+ self.ansi_style.update("^[4m");
480+ }
481+
423 let background_color = self
482 let background_color = self
424 .background_color_highlight
483 .background_color_highlight
425 .filter(|_| highlight_this_line);
484 .filter(|_| highlight_this_line);
@@ -444,35 +503,51 @@ impl<'a> Printer for InteractivePrinter<'a> {
444 let italics = self.config.use_italic_text;
503 let italics = self.config.use_italic_text;
445
504
446 for &(style, region) in &regions {
505 for &(style, region) in &regions {
447− let text = &*self.preprocess(region, &mut cursor_total);
506+ let ansi_iterator = AnsiCodeIterator::new(region);
448− let text_trimmed = text.trim_end_matches(|c| c == '\r' || c == '\n');
507+ for chunk in ansi_iterator {
449− write!(
508+ match chunk {
450− handle,
509+ // ANSI escape passthrough.
451− "{}",
510+ (ansi, true) => {
452− as_terminal_escaped(
511+ self.ansi_style.update(ansi);
453− style,
512+ write!(handle, "{}", ansi)?;
454− text_trimmed,
513+ }
455− true_color,
456− colored_output,
457− italics,
458− background_color
459− )
460− )?;
461
514
462− if text.len() != text_trimmed.len() {
515+ // Regular text.
463− if let Some(background_color) = background_color {
516+ (text, false) => {
464− let ansi_style = Style {
517+ let text = &*self.preprocess(text, &mut cursor_total);
465− background: to_ansi_color(background_color, true_color),
518+ let text_trimmed = text.trim_end_matches(|c| c == '\r' || c == '\n');
466− ..Default::default()
519+
467− };
520+ write!(
468− let width = if cursor_total <= cursor_max {
521+ handle,
469− cursor_max - cursor_total + 1
522+ "{}",
470− } else {
523+ as_terminal_escaped(
471− 0
524+ style,
472− };
525+ &format!("{}{}", self.ansi_style, text_trimmed),
473− write!(handle, "{}", ansi_style.paint(" ".repeat(width)))?;
526+ true_color,
527+ colored_output,
528+ italics,
529+ background_color
530+ )
531+ )?;
532+
533+ if text.len() != text_trimmed.len() {
534+ if let Some(background_color) = background_color {
535+ let ansi_style = Style {
536+ background: to_ansi_color(background_color, true_color),
537+ ..Default::default()
538+ };
539+
540+ let width = if cursor_total <= cursor_max {
541+ cursor_max - cursor_total + 1
542+ } else {
543+ 0
544+ };
545+ write!(handle, "{}", ansi_style.paint(" ".repeat(width)))?;
546+ }
547+ write!(handle, "{}", &text[text_trimmed.len()..])?;
548+ }
549+ }
474 }
550 }
475− write!(handle, "{}", &text[text_trimmed.len()..])?;
476 }
551 }
477 }
552 }
478
553
@@ -482,31 +557,12 @@ impl<'a> Printer for InteractivePrinter<'a> {
482 } else {
557 } else {
483 for &(style, region) in &regions {
558 for &(style, region) in &regions {
484 let ansi_iterator = AnsiCodeIterator::new(region);
559 let ansi_iterator = AnsiCodeIterator::new(region);
485− let mut ansi_prefix: String = String::new();
486 for chunk in ansi_iterator {
560 for chunk in ansi_iterator {
487 match chunk {
561 match chunk {
488 // ANSI escape passthrough.
562 // ANSI escape passthrough.
489− (text, true) => {
563+ (ansi, true) => {
490− let is_ansi_csi = text.starts_with("\x1B[");
564+ self.ansi_style.update(ansi);
491−
565+ write!(handle, "{}", ansi)?;
492− if is_ansi_csi && text.ends_with('m') {
493− // It's an ANSI SGR sequence.
494− // We should be mostly safe to just append these together.
495− ansi_prefix.push_str(text);
496− if text == "\x1B[0m" {
497− self.ansi_prefix_sgr = "\x1B[0m".to_owned();
498− } else {
499− self.ansi_prefix_sgr.push_str(text);
500− }
501− } else if is_ansi_csi {
502− // It's a regular CSI sequence.
503− // We should be mostly safe to just append these together.
504− ansi_prefix.push_str(text);
505− } else {
506− // It's probably a VT100 code.
507− // Passing it through is the safest bet.
508− write!(handle, "{}", text)?;
509− }
510 }
566 }
511
567
512 // Regular text.
568 // Regular text.
@@ -556,10 +612,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
556 "{}\n{}",
612 "{}\n{}",
557 as_terminal_escaped(
613 as_terminal_escaped(
558 style,
614 style,
559− &*format!(
615+ &*format!("{}{}", self.ansi_style, line_buf),
560− "{}{}{}",
561− self.ansi_prefix_sgr, ansi_prefix, line_buf
562− ),
563 self.config.true_color,
616 self.config.true_color,
564 self.config.colored_output,
617 self.config.colored_output,
565 self.config.use_italic_text,
618 self.config.use_italic_text,
@@ -585,19 +638,13 @@ impl<'a> Printer for InteractivePrinter<'a> {
585 "{}",
638 "{}",
586 as_terminal_escaped(
639 as_terminal_escaped(
587 style,
640 style,
588− &*format!(
641+ &*format!("{}{}", self.ansi_style, line_buf),
589− "{}{}{}",
590− self.ansi_prefix_sgr, ansi_prefix, line_buf
591− ),
592 self.config.true_color,
642 self.config.true_color,
593 self.config.colored_output,
643 self.config.colored_output,
594 self.config.use_italic_text,
644 self.config.use_italic_text,
595 background_color
645 background_color
596 )
646 )
597 )?;
647 )?;
598−
599− // Clear the ANSI prefix buffer.
600− ansi_prefix.clear();
601 }
648 }
602 }
649 }
603 }
650 }
@@ -618,6 +665,11 @@ impl<'a> Printer for InteractivePrinter<'a> {
618 writeln!(handle)?;
665 writeln!(handle)?;
619 }
666 }
620
667
668+ if highlight_this_line && self.config.theme == "ansi" {
669+ self.ansi_style.update("^[24m");
670+ write!(handle, "\x1B[24m")?;
671+ }
672+
621 Ok(())
673 Ok(())
622 }
674 }
623}
675}
@@ -628,7 +680,7 @@ const DEFAULT_GUTTER_COLOR: u8 = 238;
628pub struct Colors {
680pub struct Colors {
629 pub grid: Style,
681 pub grid: Style,
630 pub rule: Style,
682 pub rule: Style,
631− pub filename: Style,
683+ pub header_value: Style,
632 pub git_added: Style,
684 pub git_added: Style,
633 pub git_removed: Style,
685 pub git_removed: Style,
634 pub git_modified: Style,
686 pub git_modified: Style,
@@ -657,7 +709,7 @@ impl Colors {
657 Colors {
709 Colors {
658 grid: gutter_style,
710 grid: gutter_style,
659 rule: gutter_style,
711 rule: gutter_style,
660− filename: Style::new().bold(),
712+ header_value: Style::new().bold(),
661 git_added: Green.normal(),
713 git_added: Green.normal(),
662 git_removed: Red.normal(),
714 git_removed: Red.normal(),
663 git_modified: Yellow.normal(),
715 git_modified: Yellow.normal(),
src/style.rs+30−4
@@ -3,6 +3,7 @@ use std::str::FromStr;
3
3
4use crate::error::*;
4use crate::error::*;
5
5
6+#[non_exhaustive]
6#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)]
7#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)]
7pub enum StyleComponent {
8pub enum StyleComponent {
8 Auto,
9 Auto,
@@ -11,9 +12,12 @@ pub enum StyleComponent {
11 Grid,
12 Grid,
12 Rule,
13 Rule,
13 Header,
14 Header,
15+ HeaderFilename,
16+ HeaderFilesize,
14 LineNumbers,
17 LineNumbers,
15 Snip,
18 Snip,
16 Full,
19 Full,
20+ Default,
17 Plain,
21 Plain,
18}
22}
19
23
@@ -22,7 +26,7 @@ impl StyleComponent {
22 match self {
26 match self {
23 StyleComponent::Auto => {
27 StyleComponent::Auto => {
24 if interactive_terminal {
28 if interactive_terminal {
25− StyleComponent::Full.components(interactive_terminal)
29+ StyleComponent::Default.components(interactive_terminal)
26 } else {
30 } else {
27 StyleComponent::Plain.components(interactive_terminal)
31 StyleComponent::Plain.components(interactive_terminal)
28 }
32 }
@@ -31,14 +35,25 @@ impl StyleComponent {
31 StyleComponent::Changes => &[StyleComponent::Changes],
35 StyleComponent::Changes => &[StyleComponent::Changes],
32 StyleComponent::Grid => &[StyleComponent::Grid],
36 StyleComponent::Grid => &[StyleComponent::Grid],
33 StyleComponent::Rule => &[StyleComponent::Rule],
37 StyleComponent::Rule => &[StyleComponent::Rule],
34− StyleComponent::Header => &[StyleComponent::Header],
38+ StyleComponent::Header => &[StyleComponent::HeaderFilename],
39+ StyleComponent::HeaderFilename => &[StyleComponent::HeaderFilename],
40+ StyleComponent::HeaderFilesize => &[StyleComponent::HeaderFilesize],
35 StyleComponent::LineNumbers => &[StyleComponent::LineNumbers],
41 StyleComponent::LineNumbers => &[StyleComponent::LineNumbers],
36 StyleComponent::Snip => &[StyleComponent::Snip],
42 StyleComponent::Snip => &[StyleComponent::Snip],
37 StyleComponent::Full => &[
43 StyleComponent::Full => &[
38 #[cfg(feature = "git")]
44 #[cfg(feature = "git")]
39 StyleComponent::Changes,
45 StyleComponent::Changes,
40 StyleComponent::Grid,
46 StyleComponent::Grid,
41− StyleComponent::Header,
47+ StyleComponent::HeaderFilename,
48+ StyleComponent::HeaderFilesize,
49+ StyleComponent::LineNumbers,
50+ StyleComponent::Snip,
51+ ],
52+ StyleComponent::Default => &[
53+ #[cfg(feature = "git")]
54+ StyleComponent::Changes,
55+ StyleComponent::Grid,
56+ StyleComponent::HeaderFilename,
42 StyleComponent::LineNumbers,
57 StyleComponent::LineNumbers,
43 StyleComponent::Snip,
58 StyleComponent::Snip,
44 ],
59 ],
@@ -58,9 +73,12 @@ impl FromStr for StyleComponent {
58 "grid" => Ok(StyleComponent::Grid),
73 "grid" => Ok(StyleComponent::Grid),
59 "rule" => Ok(StyleComponent::Rule),
74 "rule" => Ok(StyleComponent::Rule),
60 "header" => Ok(StyleComponent::Header),
75 "header" => Ok(StyleComponent::Header),
76+ "header-filename" => Ok(StyleComponent::HeaderFilename),
77+ "header-filesize" => Ok(StyleComponent::HeaderFilesize),
61 "numbers" => Ok(StyleComponent::LineNumbers),
78 "numbers" => Ok(StyleComponent::LineNumbers),
62 "snip" => Ok(StyleComponent::Snip),
79 "snip" => Ok(StyleComponent::Snip),
63 "full" => Ok(StyleComponent::Full),
80 "full" => Ok(StyleComponent::Full),
81+ "default" => Ok(StyleComponent::Default),
64 "plain" => Ok(StyleComponent::Plain),
82 "plain" => Ok(StyleComponent::Plain),
65 _ => Err(format!("Unknown style '{}'", s).into()),
83 _ => Err(format!("Unknown style '{}'", s).into()),
66 }
84 }
@@ -89,7 +107,15 @@ impl StyleComponents {
89 }
107 }
90
108
91 pub fn header(&self) -> bool {
109 pub fn header(&self) -> bool {
92− self.0.contains(&StyleComponent::Header)
110+ self.header_filename() || self.header_filesize()
111+ }
112+
113+ pub fn header_filename(&self) -> bool {
114+ self.0.contains(&StyleComponent::HeaderFilename)
115+ }
116+
117+ pub fn header_filesize(&self) -> bool {
118+ self.0.contains(&StyleComponent::HeaderFilesize)
93 }
119 }
94
120
95 pub fn numbers(&self) -> bool {
121 pub fn numbers(&self) -> bool {
src/syntax_mapping.rs+25−2
@@ -8,6 +8,7 @@ use globset::{Candidate, GlobBuilder, GlobMatcher};
8pub mod ignored_suffixes;
8pub mod ignored_suffixes;
9
9
10#[derive(Debug, Clone, Copy, PartialEq)]
10#[derive(Debug, Clone, Copy, PartialEq)]
11+#[non_exhaustive]
11pub enum MappingTarget<'a> {
12pub enum MappingTarget<'a> {
12 /// For mapping a path to a specific syntax.
13 /// For mapping a path to a specific syntax.
13 MapTo(&'a str),
14 MapTo(&'a str),
@@ -40,6 +41,9 @@ impl<'a> SyntaxMapping<'a> {
40 pub fn builtin() -> SyntaxMapping<'a> {
41 pub fn builtin() -> SyntaxMapping<'a> {
41 let mut mapping = Self::empty();
42 let mut mapping = Self::empty();
42 mapping.insert("*.h", MappingTarget::MapTo("C++")).unwrap();
43 mapping.insert("*.h", MappingTarget::MapTo("C++")).unwrap();
44+ mapping
45+ .insert(".clang-format", MappingTarget::MapTo("YAML"))
46+ .unwrap();
43 mapping.insert("*.fs", MappingTarget::MapTo("F#")).unwrap();
47 mapping.insert("*.fs", MappingTarget::MapTo("F#")).unwrap();
44 mapping
48 mapping
45 .insert("build", MappingTarget::MapToUnknown)
49 .insert("build", MappingTarget::MapToUnknown)
@@ -116,13 +120,32 @@ impl<'a> SyntaxMapping<'a> {
116 mapping.insert(glob, MappingTarget::MapTo("INI")).unwrap();
120 mapping.insert(glob, MappingTarget::MapTo("INI")).unwrap();
117 }
121 }
118
122
123+ // unix mail spool
124+ for glob in &["/var/spool/mail/*", "/var/mail/*"] {
125+ mapping.insert(glob, MappingTarget::MapTo("Email")).unwrap()
126+ }
127+
119 // pacman hooks
128 // pacman hooks
120 mapping
129 mapping
121 .insert("*.hook", MappingTarget::MapTo("INI"))
130 .insert("*.hook", MappingTarget::MapTo("INI"))
122 .unwrap();
131 .unwrap();
123
132
124− if let Some(xdg_config_home) = std::env::var_os("XDG_CONFIG_HOME") {
133+ // Global git config files rooted in `$XDG_CONFIG_HOME/git/` or `$HOME/.config/git/`
125− let git_config_path = Path::new(&xdg_config_home).join("git");
134+ // See e.g. https://git-scm.com/docs/git-config#FILES
135+ if let Some(xdg_config_home) =
136+ std::env::var_os("XDG_CONFIG_HOME").filter(|val| !val.is_empty())
137+ {
138+ insert_git_config_global(&mut mapping, &xdg_config_home);
139+ }
140+ if let Some(default_config_home) = std::env::var_os("HOME")
141+ .filter(|val| !val.is_empty())
142+ .map(|home| Path::new(&home).join(".config"))
143+ {
144+ insert_git_config_global(&mut mapping, &default_config_home);
145+ }
146+
147+ fn insert_git_config_global(mapping: &mut SyntaxMapping, config_home: impl AsRef<Path>) {
148+ let git_config_path = config_home.as_ref().join("git");
126
149
127 mapping
150 mapping
128 .insert(
151 .insert(
src/vscreen.rsnew file+212
@@ -0,0 +1,212 @@
1+use std::fmt::{Display, Formatter};
2+
3+// Wrapper to avoid unnecessary branching when input doesn't have ANSI escape sequences.
4+pub struct AnsiStyle {
5+ attributes: Option<Attributes>,
6+}
7+
8+impl AnsiStyle {
9+ pub fn new() -> Self {
10+ AnsiStyle { attributes: None }
11+ }
12+
13+ pub fn update(&mut self, sequence: &str) -> bool {
14+ match &mut self.attributes {
15+ Some(a) => a.update(sequence),
16+ None => {
17+ self.attributes = Some(Attributes::new());
18+ self.attributes.as_mut().unwrap().update(sequence)
19+ }
20+ }
21+ }
22+}
23+
24+impl Display for AnsiStyle {
25+ fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
26+ match self.attributes {
27+ Some(ref a) => a.fmt(f),
28+ None => Ok(()),
29+ }
30+ }
31+}
32+
33+struct Attributes {
34+ foreground: String,
35+ background: String,
36+ underlined: String,
37+
38+ /// The character set to use.
39+ /// REGEX: `\^[()][AB0-3]`
40+ charset: String,
41+
42+ /// A buffer for unknown sequences.
43+ unknown_buffer: String,
44+
45+ /// ON: ^[1m
46+ /// OFF: ^[22m
47+ bold: String,
48+
49+ /// ON: ^[2m
50+ /// OFF: ^[22m
51+ dim: String,
52+
53+ /// ON: ^[4m
54+ /// OFF: ^[24m
55+ underline: String,
56+
57+ /// ON: ^[3m
58+ /// OFF: ^[23m
59+ italic: String,
60+
61+ /// ON: ^[9m
62+ /// OFF: ^[29m
63+ strike: String,
64+}
65+
66+impl Attributes {
67+ pub fn new() -> Self {
68+ Attributes {
69+ foreground: "".to_owned(),
70+ background: "".to_owned(),
71+ underlined: "".to_owned(),
72+ charset: "".to_owned(),
73+ unknown_buffer: "".to_owned(),
74+ bold: "".to_owned(),
75+ dim: "".to_owned(),
76+ underline: "".to_owned(),
77+ italic: "".to_owned(),
78+ strike: "".to_owned(),
79+ }
80+ }
81+
82+ /// Update the attributes with an escape sequence.
83+ /// Returns `false` if the sequence is unsupported.
84+ pub fn update(&mut self, sequence: &str) -> bool {
85+ let mut chars = sequence.char_indices().skip(1);
86+
87+ if let Some((_, t)) = chars.next() {
88+ match t {
89+ '(' => self.update_with_charset('(', chars.map(|(_, c)| c)),
90+ ')' => self.update_with_charset(')', chars.map(|(_, c)| c)),
91+ '[' => {
92+ if let Some((i, last)) = chars.last() {
93+ // SAFETY: Always starts with ^[ and ends with m.
94+ self.update_with_csi(last, &sequence[2..i])
95+ } else {
96+ false
97+ }
98+ }
99+ _ => self.update_with_unsupported(sequence),
100+ }
101+ } else {
102+ false
103+ }
104+ }
105+
106+ fn sgr_reset(&mut self) {
107+ self.foreground.clear();
108+ self.background.clear();
109+ self.underlined.clear();
110+ self.bold.clear();
111+ self.dim.clear();
112+ self.underline.clear();
113+ self.italic.clear();
114+ self.strike.clear();
115+ }
116+
117+ fn update_with_sgr(&mut self, parameters: &str) -> bool {
118+ let mut iter = parameters
119+ .split(';')
120+ .map(|p| if p.is_empty() { "0" } else { p })
121+ .map(|p| p.parse::<u16>())
122+ .map(|p| p.unwrap_or(0)); // Treat errors as 0.
123+
124+ while let Some(p) = iter.next() {
125+ match p {
126+ 0 => self.sgr_reset(),
127+ 1 => self.bold = format!("\x1B[{}m", parameters),
128+ 2 => self.dim = format!("\x1B[{}m", parameters),
129+ 3 => self.italic = format!("\x1B[{}m", parameters),
130+ 4 => self.underline = format!("\x1B[{}m", parameters),
131+ 23 => self.italic.clear(),
132+ 24 => self.underline.clear(),
133+ 22 => {
134+ self.bold.clear();
135+ self.dim.clear();
136+ }
137+ 30..=39 => self.foreground = Self::parse_color(p, &mut iter),
138+ 40..=49 => self.background = Self::parse_color(p, &mut iter),
139+ 58..=59 => self.underlined = Self::parse_color(p, &mut iter),
140+ 90..=97 => self.foreground = Self::parse_color(p, &mut iter),
141+ 100..=107 => self.foreground = Self::parse_color(p, &mut iter),
142+ _ => {
143+ // Unsupported SGR sequence.
144+ // Be compatible and pretend one just wasn't was provided.
145+ }
146+ }
147+ }
148+
149+ true
150+ }
151+
152+ fn update_with_csi(&mut self, finalizer: char, sequence: &str) -> bool {
153+ if finalizer == 'm' {
154+ self.update_with_sgr(sequence)
155+ } else {
156+ false
157+ }
158+ }
159+
160+ fn update_with_unsupported(&mut self, sequence: &str) -> bool {
161+ self.unknown_buffer.push_str(sequence);
162+ false
163+ }
164+
165+ fn update_with_charset(&mut self, kind: char, set: impl Iterator<Item = char>) -> bool {
166+ self.charset = format!("\x1B{}{}", kind, set.take(1).collect::<String>());
167+ true
168+ }
169+
170+ fn parse_color(color: u16, parameters: &mut dyn Iterator<Item = u16>) -> String {
171+ match color % 10 {
172+ 8 => match parameters.next() {
173+ Some(5) /* 256-color */ => format!("\x1B[{};5;{}m", color, join(";", 1, parameters)),
174+ Some(2) /* 24-bit color */ => format!("\x1B[{};2;{}m", color, join(";", 3, parameters)),
175+ Some(c) => format!("\x1B[{};{}m", color, c),
176+ _ => "".to_owned(),
177+ },
178+ 9 => "".to_owned(),
179+ _ => format!("\x1B[{}m", color),
180+ }
181+ }
182+}
183+
184+impl Display for Attributes {
185+ fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
186+ write!(
187+ f,
188+ "{}{}{}{}{}{}{}{}{}",
189+ self.foreground,
190+ self.background,
191+ self.underlined,
192+ self.charset,
193+ self.bold,
194+ self.dim,
195+ self.underline,
196+ self.italic,
197+ self.strike,
198+ )
199+ }
200+}
201+
202+fn join(
203+ delimiter: &str,
204+ limit: usize,
205+ iterator: &mut dyn Iterator<Item = impl ToString>,
206+) -> String {
207+ iterator
208+ .take(limit)
209+ .map(|i| i.to_string())
210+ .collect::<Vec<String>>()
211+ .join(delimiter)
212+}
tests/benchmarks/test-src/grep-output-ansi-sequences.txt → tests/benchmarks/highlighting-speed-src/grep-output-ansi-sequences.txtrenamed

The content is the same.

tests/benchmarks/test-src/jquery.js → tests/benchmarks/highlighting-speed-src/jquery.jsrenamed

The content is the same.

tests/benchmarks/test-src/miniz.c → tests/benchmarks/highlighting-speed-src/miniz.crenamed

The content is the same.

tests/benchmarks/test-src/numpy_test_multiarray.py → tests/benchmarks/highlighting-speed-src/numpy_test_multiarray.pyrenamed

The content is the same.

tests/benchmarks/many-small-files/small-file-0.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 0
tests/benchmarks/many-small-files/small-file-1.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 1
tests/benchmarks/many-small-files/small-file-10.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 10
tests/benchmarks/many-small-files/small-file-100.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 100
tests/benchmarks/many-small-files/small-file-11.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 11
tests/benchmarks/many-small-files/small-file-12.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 12
tests/benchmarks/many-small-files/small-file-13.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 13
tests/benchmarks/many-small-files/small-file-14.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 14
tests/benchmarks/many-small-files/small-file-15.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 15
tests/benchmarks/many-small-files/small-file-16.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 16
tests/benchmarks/many-small-files/small-file-17.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 17
tests/benchmarks/many-small-files/small-file-18.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 18
tests/benchmarks/many-small-files/small-file-19.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 19
tests/benchmarks/many-small-files/small-file-2.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 2
tests/benchmarks/many-small-files/small-file-20.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 20
tests/benchmarks/many-small-files/small-file-21.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 21
tests/benchmarks/many-small-files/small-file-22.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 22
tests/benchmarks/many-small-files/small-file-23.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 23
tests/benchmarks/many-small-files/small-file-24.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 24
tests/benchmarks/many-small-files/small-file-25.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 25
tests/benchmarks/many-small-files/small-file-26.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 26
tests/benchmarks/many-small-files/small-file-27.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 27
tests/benchmarks/many-small-files/small-file-28.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 28
tests/benchmarks/many-small-files/small-file-29.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 29
tests/benchmarks/many-small-files/small-file-3.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 3
tests/benchmarks/many-small-files/small-file-30.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 30
tests/benchmarks/many-small-files/small-file-31.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 31
tests/benchmarks/many-small-files/small-file-32.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 32
tests/benchmarks/many-small-files/small-file-33.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 33
tests/benchmarks/many-small-files/small-file-34.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 34
tests/benchmarks/many-small-files/small-file-35.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 35
tests/benchmarks/many-small-files/small-file-36.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 36
tests/benchmarks/many-small-files/small-file-37.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 37
tests/benchmarks/many-small-files/small-file-38.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 38
tests/benchmarks/many-small-files/small-file-39.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 39
tests/benchmarks/many-small-files/small-file-4.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 4
tests/benchmarks/many-small-files/small-file-40.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 40
tests/benchmarks/many-small-files/small-file-41.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 41
tests/benchmarks/many-small-files/small-file-42.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 42
tests/benchmarks/many-small-files/small-file-43.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 43
tests/benchmarks/many-small-files/small-file-44.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 44
tests/benchmarks/many-small-files/small-file-45.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 45
tests/benchmarks/many-small-files/small-file-46.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 46
tests/benchmarks/many-small-files/small-file-47.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 47
tests/benchmarks/many-small-files/small-file-48.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 48
tests/benchmarks/many-small-files/small-file-49.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 49
tests/benchmarks/many-small-files/small-file-5.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 5
tests/benchmarks/many-small-files/small-file-50.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 50
tests/benchmarks/many-small-files/small-file-51.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 51
tests/benchmarks/many-small-files/small-file-52.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 52
tests/benchmarks/many-small-files/small-file-53.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 53
tests/benchmarks/many-small-files/small-file-54.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 54
tests/benchmarks/many-small-files/small-file-55.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 55
tests/benchmarks/many-small-files/small-file-56.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 56
tests/benchmarks/many-small-files/small-file-57.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 57
tests/benchmarks/many-small-files/small-file-58.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 58
tests/benchmarks/many-small-files/small-file-59.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 59
tests/benchmarks/many-small-files/small-file-6.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 6
tests/benchmarks/many-small-files/small-file-60.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 60
tests/benchmarks/many-small-files/small-file-61.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 61
tests/benchmarks/many-small-files/small-file-62.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 62
tests/benchmarks/many-small-files/small-file-63.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 63
tests/benchmarks/many-small-files/small-file-64.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 64
tests/benchmarks/many-small-files/small-file-65.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 65
tests/benchmarks/many-small-files/small-file-66.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 66
tests/benchmarks/many-small-files/small-file-67.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 67
tests/benchmarks/many-small-files/small-file-68.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 68
tests/benchmarks/many-small-files/small-file-69.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 69
tests/benchmarks/many-small-files/small-file-7.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 7
tests/benchmarks/many-small-files/small-file-70.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 70
tests/benchmarks/many-small-files/small-file-71.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 71
tests/benchmarks/many-small-files/small-file-72.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 72
tests/benchmarks/many-small-files/small-file-73.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 73
tests/benchmarks/many-small-files/small-file-74.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 74
tests/benchmarks/many-small-files/small-file-75.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 75
tests/benchmarks/many-small-files/small-file-76.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 76
tests/benchmarks/many-small-files/small-file-77.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 77
tests/benchmarks/many-small-files/small-file-78.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 78
tests/benchmarks/many-small-files/small-file-79.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 79
tests/benchmarks/many-small-files/small-file-8.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 8
tests/benchmarks/many-small-files/small-file-80.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 80
tests/benchmarks/many-small-files/small-file-81.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 81
tests/benchmarks/many-small-files/small-file-82.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 82
tests/benchmarks/many-small-files/small-file-83.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 83
tests/benchmarks/many-small-files/small-file-84.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 84
tests/benchmarks/many-small-files/small-file-85.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 85
tests/benchmarks/many-small-files/small-file-86.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 86
tests/benchmarks/many-small-files/small-file-87.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 87
tests/benchmarks/many-small-files/small-file-88.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 88
tests/benchmarks/many-small-files/small-file-89.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 89
tests/benchmarks/many-small-files/small-file-9.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 9
tests/benchmarks/many-small-files/small-file-90.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 90
tests/benchmarks/many-small-files/small-file-91.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 91
tests/benchmarks/many-small-files/small-file-92.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 92
tests/benchmarks/many-small-files/small-file-93.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 93
tests/benchmarks/many-small-files/small-file-94.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 94
tests/benchmarks/many-small-files/small-file-95.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 95
tests/benchmarks/many-small-files/small-file-96.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 96
tests/benchmarks/many-small-files/small-file-97.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 97
tests/benchmarks/many-small-files/small-file-98.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 98
tests/benchmarks/many-small-files/small-file-99.txtnew file+1
@@ -0,0 +1 @@
1+I am small file 99
tests/benchmarks/run-benchmarks.sh+39−17
@@ -9,15 +9,15 @@ if ! command -v hyperfine > /dev/null 2>&1; then
9 exit 1
9 exit 1
10fi
10fi
11
11
12−# Check that jq is installed.
12+# Check that python3 is installed.
13−if ! command -v jq > /dev/null 2>&1; then
13+if ! command -v python3 > /dev/null 2>&1; then
14− echo "'jq' does not seem to be installed."
14+ echo "'python3' does not seem to be installed."
15− echo "You can get it here: https://stedolan.github.io/jq"
15+ echo "You can get it here: https://www.python.org/downloads/"
16 exit 1
16 exit 1
17fi
17fi
18
18
19get_cargo_target_dir() {
19get_cargo_target_dir() {
20− cargo metadata --no-deps --format-version 1 | jq -r .target_directory
20+ cargo metadata --no-deps --format-version 1 | python3 -c 'import sys, json; print(json.load(sys.stdin)["target_directory"])'
21}
21}
22
22
23heading() {
23heading() {
@@ -95,17 +95,27 @@ cat "$RESULT_DIR/startup-time.md" >> "$REPORT"
95
95
96heading "Startup time with syntax highlighting"
96heading "Startup time with syntax highlighting"
97hyperfine \
97hyperfine \
98− "$(printf "%q" "$BAT") --no-config --color=always test-src/small-Markdown-file.md" \
98+ "$(printf "%q" "$BAT") --no-config --color=always startup-time-src/small-CpuInfo-file.cpuinfo" \
99− --command-name "bat … small-Markdown-file.md" \
99+ --command-name "bat … small-CpuInfo-file.cpuinfo" \
100 --warmup "$WARMUP_COUNT" \
100 --warmup "$WARMUP_COUNT" \
101 --export-markdown "$RESULT_DIR/startup-time-with-syntax-highlighting.md" \
101 --export-markdown "$RESULT_DIR/startup-time-with-syntax-highlighting.md" \
102 --export-json "$RESULT_DIR/startup-time-with-syntax-highlighting.json"
102 --export-json "$RESULT_DIR/startup-time-with-syntax-highlighting.json"
103cat "$RESULT_DIR/startup-time-with-syntax-highlighting.md" >> "$REPORT"
103cat "$RESULT_DIR/startup-time-with-syntax-highlighting.md" >> "$REPORT"
104
104
105
105
106+heading "Startup time with syntax with dependencies"
107+hyperfine \
108+ "$(printf "%q" "$BAT") --no-config --color=always startup-time-src/small-Markdown-file.md" \
109+ --command-name "bat … small-Markdown-file.md" \
110+ --warmup "$WARMUP_COUNT" \
111+ --export-markdown "$RESULT_DIR/startup-time-with-syntax-with-dependencies.md" \
112+ --export-json "$RESULT_DIR/startup-time-with-syntax-with-dependencies.json"
113+cat "$RESULT_DIR/startup-time-with-syntax-with-dependencies.md" >> "$REPORT"
114+
115+
106heading "Plain-text speed"
116heading "Plain-text speed"
107hyperfine \
117hyperfine \
108− "$(printf "%q" "$BAT") --no-config --language=txt --style=plain test-src/numpy_test_multiarray.py" \
118+ "$(printf "%q" "$BAT") --no-config --language=txt --style=plain highlighting-speed-src/numpy_test_multiarray.py" \
109 --command-name 'bat … --language=txt numpy_test_multiarray.py' \
119 --command-name 'bat … --language=txt numpy_test_multiarray.py' \
110 --warmup "$WARMUP_COUNT" \
120 --warmup "$WARMUP_COUNT" \
111 --export-markdown "$RESULT_DIR/plain-text-speed.md" \
121 --export-markdown "$RESULT_DIR/plain-text-speed.md" \
@@ -113,14 +123,26 @@ hyperfine \
113cat "$RESULT_DIR/plain-text-speed.md" >> "$REPORT"
123cat "$RESULT_DIR/plain-text-speed.md" >> "$REPORT"
114
124
115
125
116−for SRC in test-src/*; do
126+for wrap in character never; do
117− filename="$(basename "$SRC")"
127+ for SRC in highlighting-speed-src/*; do
128+ filename="$(basename "$SRC")"
118
129
119− heading "Syntax highlighting speed: \`$filename\`"
130+ heading "Syntax highlighting speed --wrap=${wrap}: \`$filename\`"
120− hyperfine --warmup "$WARMUP_COUNT" \
131+ hyperfine --warmup "$WARMUP_COUNT" \
121− "$(printf "%q" "$BAT") --no-config --style=full --color=always --wrap=character --terminal-width=80 '$SRC'" \
132+ "$(printf "%q" "$BAT") --no-config --style=full --color=always --wrap=${wrap} --terminal-width=80 '$SRC'" \
122− --command-name "bat … ${filename}" \
133+ --command-name "bat … ${filename}" \
123− --export-markdown "$RESULT_DIR/syntax-highlighting-speed-${filename}.md" \
134+ --export-markdown "$RESULT_DIR/syntax-highlighting-speed-${filename}.md" \
124− --export-json "$RESULT_DIR/syntax-highlighting-speed-${filename}.json"
135+ --export-json "$RESULT_DIR/syntax-highlighting-speed-${filename}.json"
125− cat "$RESULT_DIR/syntax-highlighting-speed-${filename}.md" >> "$REPORT"
136+ cat "$RESULT_DIR/syntax-highlighting-speed-${filename}.md" >> "$REPORT"
137+ done
126done
138done
139+
140+
141+heading "Many small files speed (overhead of metadata)"
142+hyperfine \
143+ "$(printf "%q" "$BAT") --no-config --language=txt --style=plain many-small-files/*.txt" \
144+ --command-name 'bat … --language=txt *.txt' \
145+ --warmup "$WARMUP_COUNT" \
146+ --export-markdown "$RESULT_DIR/many-small-files-speed.md" \
147+ --export-json "$RESULT_DIR/many-small-files-speed.json"
148+cat "$RESULT_DIR/many-small-files-speed.md" >> "$REPORT"
tests/benchmarks/startup-time-src/small-CpuInfo-file.cpuinfonew file+1
@@ -0,0 +1 @@
1+OneColor : AnotherColor
tests/benchmarks/test-src/small-Markdown-file.md → tests/benchmarks/startup-time-src/small-Markdown-file.mdrenamed

The content is the same.

tests/examples/git/.config/git/confignew file+3
@@ -0,0 +1,3 @@
1+[user]
2+ email = foo@bar.net
3+ name = foobar
tests/examples/git/.gitconfignew file+3
@@ -0,0 +1,3 @@
1+[user]
2+ email = foo@bar.net
3+ name = foobar
tests/examples/longline.jsonnew file+3
@@ -0,0 +1,3 @@
1+{"api":
2+ {"ANGLE_instanced_arrays":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"drawArraysInstancedANGLE":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays/drawArraysInstancedANGLE","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"drawElementsInstancedANGLE":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays/drawElementsInstancedANGLE","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"vertexAttribDivisorANGLE":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays/vertexAttribDivisorANGLE","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}}},"AbortController":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController","spec_url":"https://dom.spec.whatwg.org/#interface-abortcontroller","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}},"AbortController":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController/AbortController","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortcontroller-abortcontroller①","description":"<code>AbortController()</code> constructor","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}}},"abort":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController/abort","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortcontroller-abortcontroller①","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}}},"signal":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController/signal","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortcontroller-signal②","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}}}},"AbortPaymentEvent":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortPaymentEvent","support":{"chrome":{"version_added":"70"},"chrome_android":{"version_added":"70"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"57"},"opera_android":{"version_added":"49"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"10.0"},"webview_android":{"version_added":false}},"status":{"experimental":true,"standard_track":false,"deprecated":false}},"AbortPaymentEvent":{"__compat":{"description":"<code>AbortPaymentEvent()</code> constructor","mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortPaymentEvent/AbortPaymentEvent","support":{"chrome":{"version_added":"70"},"chrome_android":{"version_added":"70"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"57"},"opera_android":{"version_added":"49"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"10.0"},"webview_android":{"version_added":false}},"status":{"experimental":true,"standard_track":false,"deprecated":false}}},"respondWith":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortPaymentEvent/respondWith","support":{"chrome":{"version_added":"70"},"chrome_android":{"version_added":"70"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"57"},"opera_android":{"version_added":"49"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"10.0"},"webview_android":{"version_added":false}},"status":{"experimental":true,"standard_track":false,"deprecated":false}}}},"AbortSignal":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal","spec_url":"https://dom.spec.whatwg.org/#interface-AbortSignal","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"abort":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/abort","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortsignal-abort①","support":{"chrome":{"version_added":false},"chrome_android":{"version_added":false},"edge":{"version_added":false},"firefox":{"version_added":"88"},"firefox_android":{"version_added":"88"},"ie":{"version_added":false},"nodejs":{"version_added":false},"opera":{"version_added":false},"opera_android":{"version_added":false},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":false},"webview_android":{"version_added":false}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"abort_event":{"__compat":{"description":"<code>abort</code> event","mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event","spec_url":"https://dom.spec.whatwg.org/#eventdef-abortsignal-abort","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"aborted":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/aborted","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortsignal-aborted①","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"onabort":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/onabort","spec_url":"https://dom.spec.whatwg.org/#abortsignal-onabort","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}}},"AbsoluteOrientationSensor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbsoluteOrientationSensor","spec_url":"https://w3c.github.io/orientation-sensor/#absoluteorientationsensor-interface","support":{"chrome":{"version_added":"67"},"chrome_android":{"version_added":"67"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"54"},"opera_android":{"version_added":"48"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"67"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"AbsoluteOrientationSensor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbsoluteOrientationSensor/AbsoluteOrientationSensor","spec_url":"https://w3c.github.io/orientation-sensor/#dom-absoluteorientationsensor-absoluteorientationsensor","description":"<code>AbsoluteOrientationSensor()</code> constructor","support":{"chrome":{"version_added":"67"},"chrome_android":{"version_added":"67"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"54"},"opera_android":{"version_added":"48"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"67"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}}},"AbstractRange":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbstractRange","spec_url":"https://dom.spec.whatwg.org/#interface-abstractrange","support":{"chrome":{"version_added":"90"},"chrome_android":{"version_added":"90"},"edge":[{"version_added":"90"},{"version_added":"18","version_removed":"79"}],"firefox":{"version_added":"69"},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":false},"opera_android":{"version_added":false},"safari":{"version_added":"14.1"},"safari_ios":{"version_added":"14.5"},"samsunginternet_android":{"version_added":false},"webview_android":{"version_added":"90"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"collapsed":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbstractRange/collapsed","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-range-collapsed①","support":{"chrome":{"version_added":"90"},"chrome_android":{"version_added":"90"},"edge":[{"version_added":"90"},{"version_added":"18","version_removed":"79"}],"firefox":{"version_added":"69"},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":false},"opera_android":
3+ {"version_added":false}
tests/integration_tests.rs+306−3
@@ -1,4 +1,5 @@
1use assert_cmd::cargo::CommandCargoExt;
1use assert_cmd::cargo::CommandCargoExt;
2+use predicates::boolean::PredicateBooleanExt;
2use predicates::{prelude::predicate, str::PredicateStrExt};
3use predicates::{prelude::predicate, str::PredicateStrExt};
3use serial_test::serial;
4use serial_test::serial;
4use std::path::Path;
5use std::path::Path;
@@ -918,7 +919,7 @@ fn empty_file_leads_to_empty_output_with_rule_enabled() {
918}
919}
919
920
920#[test]
921#[test]
921−fn filename_basic() {
922+fn header_basic() {
922 bat()
923 bat()
923 .arg("test.txt")
924 .arg("test.txt")
924 .arg("--decorations=always")
925 .arg("--decorations=always")
@@ -932,7 +933,21 @@ fn filename_basic() {
932}
933}
933
934
934#[test]
935#[test]
935−fn filename_binary() {
936+fn header_full_basic() {
937+ bat()
938+ .arg("test.txt")
939+ .arg("--decorations=always")
940+ .arg("--style=header-filename,header-filesize")
941+ .arg("-r=0:0")
942+ .arg("--file-name=foo")
943+ .assert()
944+ .success()
945+ .stdout("File: foo\nSize: 12 B\n")
946+ .stderr("");
947+}
948+
949+#[test]
950+fn header_binary() {
936 bat()
951 bat()
937 .arg("test.binary")
952 .arg("test.binary")
938 .arg("--decorations=always")
953 .arg("--decorations=always")
@@ -945,6 +960,67 @@ fn filename_binary() {
945 .stderr("");
960 .stderr("");
946}
961}
947
962
963+#[test]
964+fn header_full_binary() {
965+ bat()
966+ .arg("test.binary")
967+ .arg("--decorations=always")
968+ .arg("--style=header-filename,header-filesize")
969+ .arg("-r=0:0")
970+ .arg("--file-name=foo")
971+ .assert()
972+ .success()
973+ .stdout("File: foo <BINARY>\nSize: 4 B\n")
974+ .stderr("");
975+}
976+
977+#[test]
978+fn header_default() {
979+ bat()
980+ .arg("--paging=never")
981+ .arg("--color=never")
982+ .arg("--terminal-width=80")
983+ .arg("--wrap=never")
984+ .arg("--decorations=always")
985+ .arg("--style=default")
986+ .arg("single-line.txt")
987+ .assert()
988+ .success()
989+ .stdout(
990+ "\
991+───────┬────────────────────────────────────────────────────────────────────────
992+ │ File: single-line.txt
993+───────┼────────────────────────────────────────────────────────────────────────
994+ 1 │ Single Line
995+───────┴────────────────────────────────────────────────────────────────────────
996+",
997+ )
998+ .stderr("");
999+}
1000+
1001+#[test]
1002+fn header_default_is_default() {
1003+ bat()
1004+ .arg("--paging=never")
1005+ .arg("--color=never")
1006+ .arg("--terminal-width=80")
1007+ .arg("--wrap=never")
1008+ .arg("--decorations=always")
1009+ .arg("single-line.txt")
1010+ .assert()
1011+ .success()
1012+ .stdout(
1013+ "\
1014+───────┬────────────────────────────────────────────────────────────────────────
1015+ │ File: single-line.txt
1016+───────┼────────────────────────────────────────────────────────────────────────
1017+ 1 │ Single Line
1018+───────┴────────────────────────────────────────────────────────────────────────
1019+",
1020+ )
1021+ .stderr("");
1022+}
1023+
948#[test]
1024#[test]
949fn filename_stdin() {
1025fn filename_stdin() {
950 bat()
1026 bat()
@@ -1015,6 +1091,18 @@ fn header_padding() {
1015 .stderr("");
1091 .stderr("");
1016}
1092}
1017
1093
1094+#[test]
1095+fn header_full_padding() {
1096+ bat()
1097+ .arg("--decorations=always")
1098+ .arg("--style=header-filename,header-filesize")
1099+ .arg("test.txt")
1100+ .arg("single-line.txt")
1101+ .assert()
1102+ .stdout("File: test.txt\nSize: 12 B\nhello world\n\nFile: single-line.txt\nSize: 11 B\nSingle Line\n")
1103+ .stderr("");
1104+}
1105+
1018#[test]
1106#[test]
1019fn header_padding_rule() {
1107fn header_padding_rule() {
1020 bat()
1108 bat()
@@ -1035,6 +1123,28 @@ Single Line
1035 .stderr("");
1123 .stderr("");
1036}
1124}
1037
1125
1126+#[test]
1127+fn header_full_padding_rule() {
1128+ bat()
1129+ .arg("--decorations=always")
1130+ .arg("--style=header-filename,header-filesize,rule")
1131+ .arg("--terminal-width=80")
1132+ .arg("test.txt")
1133+ .arg("single-line.txt")
1134+ .assert()
1135+ .stdout(
1136+ "File: test.txt
1137+Size: 12 B
1138+hello world
1139+────────────────────────────────────────────────────────────────────────────────
1140+File: single-line.txt
1141+Size: 11 B
1142+Single Line
1143+",
1144+ )
1145+ .stderr("");
1146+}
1147+
1038#[test]
1148#[test]
1039fn grid_overrides_rule() {
1149fn grid_overrides_rule() {
1040 bat()
1150 bat()
@@ -1054,7 +1164,9 @@ Single Line
1054────────────────────────────────────────────────────────────────────────────────
1164────────────────────────────────────────────────────────────────────────────────
1055",
1165",
1056 )
1166 )
1057− .stderr("\x1b[33m[bat warning]\x1b[0m: Style 'rule' is a subset of style 'grid', 'rule' will not be visible.\n");
1167+ .stderr(
1168+ "\x1b[33m[bat warning]\x1b[0m: Style 'rule' is a subset of style 'grid', 'rule' will not be visible.\n",
1169+ );
1058}
1170}
1059
1171
1060#[cfg(target_os = "linux")]
1172#[cfg(target_os = "linux")]
@@ -1152,6 +1264,52 @@ fn show_all_mode() {
1152 .stderr("");
1264 .stderr("");
1153}
1265}
1154
1266
1267+#[test]
1268+fn show_all_extends_tab_markers_to_next_tabstop() {
1269+ bat()
1270+ .arg("tabs.txt")
1271+ .arg("--show-all")
1272+ .arg("--tabs=4")
1273+ .arg("--style=plain")
1274+ .assert()
1275+ .success()
1276+ .stdout(
1277+ "├──┤1├─┤2├─┤3├─┤4␊
1278+1├─┤?␊
1279+22├┤?␊
1280+333↹?␊
1281+4444├──┤?␊
1282+55555├─┤?␊
1283+666666├┤?␊
1284+7777777↹?␊
1285+88888888├──┤?␊
1286+",
1287+ );
1288+}
1289+
1290+#[test]
1291+fn show_all_extends_tab_markers_to_next_tabstop_width_8() {
1292+ bat()
1293+ .arg("tabs.txt")
1294+ .arg("--show-all")
1295+ .arg("--tabs=8")
1296+ .arg("--style=plain")
1297+ .assert()
1298+ .success()
1299+ .stdout(
1300+ "├──────┤1├─────┤2├─────┤3├─────┤4␊
1301+1├─────┤?␊
1302+22├────┤?␊
1303+333├───┤?␊
1304+4444├──┤?␊
1305+55555├─┤?␊
1306+666666├┤?␊
1307+7777777↹?␊
1308+88888888├──────┤?␊
1309+",
1310+ );
1311+}
1312+
1155#[test]
1313#[test]
1156fn no_paging_arg() {
1314fn no_paging_arg() {
1157 bat()
1315 bat()
@@ -1218,6 +1376,7 @@ fn grid_for_file_without_newline() {
1218 "\
1376 "\
1219───────┬────────────────────────────────────────────────────────────────────────
1377───────┬────────────────────────────────────────────────────────────────────────
1220 │ File: single-line.txt
1378 │ File: single-line.txt
1379+ │ Size: 11 B
1221───────┼────────────────────────────────────────────────────────────────────────
1380───────┼────────────────────────────────────────────────────────────────────────
1222 1 │ Single Line
1381 1 │ Single Line
1223───────┴────────────────────────────────────────────────────────────────────────
1382───────┴────────────────────────────────────────────────────────────────────────
@@ -1226,10 +1385,50 @@ fn grid_for_file_without_newline() {
1226 .stderr("");
1385 .stderr("");
1227}
1386}
1228
1387
1388+// For ANSI theme, use underscore as a highlighter
1389+#[test]
1390+fn ansi_highlight_underline() {
1391+ bat()
1392+ .arg("--paging=never")
1393+ .arg("--color=never")
1394+ .arg("--terminal-width=80")
1395+ .arg("--wrap=never")
1396+ .arg("--decorations=always")
1397+ .arg("--theme=ansi")
1398+ .arg("--style=plain")
1399+ .arg("--highlight-line=1")
1400+ .write_stdin("Ansi Underscore Test\nAnother Line")
1401+ .assert()
1402+ .success()
1403+ .stdout("\x1B[4mAnsi Underscore Test\n\x1B[24mAnother Line")
1404+ .stderr("");
1405+}
1406+
1407+// Ensure that ANSI passthrough is emitted properly for both wrapping and non-wrapping printer.
1408+#[test]
1409+fn ansi_passthrough_emit() {
1410+ for wrapping in &["never", "character"] {
1411+ bat()
1412+ .arg("--paging=never")
1413+ .arg("--color=never")
1414+ .arg("--terminal-width=80")
1415+ .arg(format!("--wrap={}", wrapping))
1416+ .arg("--decorations=always")
1417+ .arg("--style=plain")
1418+ .write_stdin("\x1B[33mColor\nColor \x1B[m\nPlain\n")
1419+ .assert()
1420+ .success()
1421+ .stdout("\x1B[33m\x1B[33mColor\n\x1B[33mColor \x1B[m\nPlain\n")
1422+ .stderr("");
1423+ }
1424+}
1425+
1229#[test]
1426#[test]
1230fn ignored_suffix_arg() {
1427fn ignored_suffix_arg() {
1231 bat()
1428 bat()
1232 .arg("-f")
1429 .arg("-f")
1430+ .arg("--theme")
1431+ .arg("Monokai Extended")
1233 .arg("-p")
1432 .arg("-p")
1234 .arg("test.json~")
1433 .arg("test.json~")
1235 .assert()
1434 .assert()
@@ -1239,6 +1438,8 @@ fn ignored_suffix_arg() {
1239
1438
1240 bat()
1439 bat()
1241 .arg("-f")
1440 .arg("-f")
1441+ .arg("--theme")
1442+ .arg("Monokai Extended")
1242 .arg("-p")
1443 .arg("-p")
1243 .arg("--ignored-suffix=.suffix")
1444 .arg("--ignored-suffix=.suffix")
1244 .arg("test.json.suffix")
1445 .arg("test.json.suffix")
@@ -1249,6 +1450,8 @@ fn ignored_suffix_arg() {
1249
1450
1250 bat()
1451 bat()
1251 .arg("-f")
1452 .arg("-f")
1453+ .arg("--theme")
1454+ .arg("Monokai Extended")
1252 .arg("-p")
1455 .arg("-p")
1253 .arg("test.json.suffix")
1456 .arg("test.json.suffix")
1254 .assert()
1457 .assert()
@@ -1256,3 +1459,103 @@ fn ignored_suffix_arg() {
1256 .stdout("\u{1b}[38;5;231m{\"test\": \"value\"}\u{1b}[0m")
1459 .stdout("\u{1b}[38;5;231m{\"test\": \"value\"}\u{1b}[0m")
1257 .stderr("");
1460 .stderr("");
1258}
1461}
1462+
1463+#[test]
1464+fn highlighting_is_skipped_on_long_lines() {
1465+ let expected = "\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mapi\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\n".to_owned() +
1466+ "\u{1b}" +
1467+ r#"[38;5;231m {"ANGLE_instanced_arrays":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"drawArraysInstancedANGLE":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays/drawArraysInstancedANGLE","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"drawElementsInstancedANGLE":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays/drawElementsInstancedANGLE","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"vertexAttribDivisorANGLE":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays/vertexAttribDivisorANGLE","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}}},"AbortController":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController","spec_url":"https://dom.spec.whatwg.org/#interface-abortcontroller","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}},"AbortController":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController/AbortController","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortcontroller-abortcontroller①","description":"<code>AbortController()</code> constructor","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}}},"abort":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController/abort","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortcontroller-abortcontroller①","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}}},"signal":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController/signal","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortcontroller-signal②","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though <code>window.AbortController</code> is defined, it doesn't really abort <code>fetch</code> requests. See <a href='https://webkit.org/b/174980'>bug 174980</a>."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}}}},"AbortPaymentEvent":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortPaymentEvent","support":{"chrome":{"version_added":"70"},"chrome_android":{"version_added":"70"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"57"},"opera_android":{"version_added":"49"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"10.0"},"webview_android":{"version_added":false}},"status":{"experimental":true,"standard_track":false,"deprecated":false}},"AbortPaymentEvent":{"__compat":{"description":"<code>AbortPaymentEvent()</code> constructor","mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortPaymentEvent/AbortPaymentEvent","support":{"chrome":{"version_added":"70"},"chrome_android":{"version_added":"70"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"57"},"opera_android":{"version_added":"49"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"10.0"},"webview_android":{"version_added":false}},"status":{"experimental":true,"standard_track":false,"deprecated":false}}},"respondWith":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortPaymentEvent/respondWith","support":{"chrome":{"version_added":"70"},"chrome_android":{"version_added":"70"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"57"},"opera_android":{"version_added":"49"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"10.0"},"webview_android":{"version_added":false}},"status":{"experimental":true,"standard_track":false,"deprecated":false}}}},"AbortSignal":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal","spec_url":"https://dom.spec.whatwg.org/#interface-AbortSignal","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"abort":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/abort","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortsignal-abort①","support":{"chrome":{"version_added":false},"chrome_android":{"version_added":false},"edge":{"version_added":false},"firefox":{"version_added":"88"},"firefox_android":{"version_added":"88"},"ie":{"version_added":false},"nodejs":{"version_added":false},"opera":{"version_added":false},"opera_android":{"version_added":false},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":false},"webview_android":{"version_added":false}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"abort_event":{"__compat":{"description":"<code>abort</code> event","mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event","spec_url":"https://dom.spec.whatwg.org/#eventdef-abortsignal-abort","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"aborted":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/aborted","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortsignal-aborted①","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"onabort":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/onabort","spec_url":"https://dom.spec.whatwg.org/#abortsignal-onabort","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}}},"AbsoluteOrientationSensor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbsoluteOrientationSensor","spec_url":"https://w3c.github.io/orientation-sensor/#absoluteorientationsensor-interface","support":{"chrome":{"version_added":"67"},"chrome_android":{"version_added":"67"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"54"},"opera_android":{"version_added":"48"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"67"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"AbsoluteOrientationSensor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbsoluteOrientationSensor/AbsoluteOrientationSensor","spec_url":"https://w3c.github.io/orientation-sensor/#dom-absoluteorientationsensor-absoluteorientationsensor","description":"<code>AbsoluteOrientationSensor()</code> constructor","support":{"chrome":{"version_added":"67"},"chrome_android":{"version_added":"67"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"54"},"opera_android":{"version_added":"48"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"67"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}}},"AbstractRange":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbstractRange","spec_url":"https://dom.spec.whatwg.org/#interface-abstractrange","support":{"chrome":{"version_added":"90"},"chrome_android":{"version_added":"90"},"edge":[{"version_added":"90"},{"version_added":"18","version_removed":"79"}],"firefox":{"version_added":"69"},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":false},"opera_android":{"version_added":false},"safari":{"version_added":"14.1"},"safari_ios":{"version_added":"14.5"},"samsunginternet_android":{"version_added":false},"webview_android":{"version_added":"90"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"collapsed":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbstractRange/collapsed","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-range-collapsed①","support":{"chrome":{"version_added":"90"},"chrome_android":{"version_added":"90"},"edge":[{"version_added":"90"},{"version_added":"18","version_removed":"79"}],"firefox":{"version_added":"69"},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":false},"opera_android":"# +
1468+ "\u{1b}[0m\n\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mversion_added\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\u{1b}[38;5;141mfalse\u{1b}[0m\u{1b}[38;5;231m}\u{1b}[0m\n";
1469+
1470+ bat()
1471+ .arg("-f")
1472+ .arg("--theme")
1473+ .arg("Monokai Extended")
1474+ .arg("-p")
1475+ .arg("longline.json")
1476+ .assert()
1477+ .success()
1478+ .stdout(expected)
1479+ .stderr("");
1480+}
1481+
1482+#[test]
1483+fn all_global_git_config_locations_syntax_mapping_work() {
1484+ let fake_home = Path::new(EXAMPLES_DIR).join("git").canonicalize().unwrap();
1485+ let expected = "\u{1b}[38;5;231m[\u{1b}[0m\u{1b}[38;5;149muser\u{1b}[0m\u{1b}[38;5;231m]\u{1b}[0m
1486+\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;231memail\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;203m=\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;186mfoo@bar.net\u{1b}[0m
1487+\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;231mname\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;203m=\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;186mfoobar\u{1b}[0m
1488+";
1489+
1490+ bat()
1491+ .env("XDG_CONFIG_HOME", fake_home.join(".config").as_os_str())
1492+ .arg("-f")
1493+ .arg("--theme")
1494+ .arg("Monokai Extended")
1495+ .arg("-p")
1496+ .arg("git/.config/git/config")
1497+ .assert()
1498+ .success()
1499+ .stdout(expected)
1500+ .stderr("");
1501+
1502+ bat()
1503+ .env("HOME", fake_home.as_os_str())
1504+ .arg("-f")
1505+ .arg("--theme")
1506+ .arg("Monokai Extended")
1507+ .arg("-p")
1508+ .arg("git/.config/git/config")
1509+ .assert()
1510+ .success()
1511+ .stdout(expected)
1512+ .stderr("");
1513+
1514+ bat()
1515+ .env("HOME", fake_home.as_os_str())
1516+ .arg("-f")
1517+ .arg("--theme")
1518+ .arg("Monokai Extended")
1519+ .arg("-p")
1520+ .arg("git/.gitconfig")
1521+ .assert()
1522+ .success()
1523+ .stdout(expected)
1524+ .stderr("");
1525+}
1526+
1527+#[test]
1528+fn acknowledgements() {
1529+ bat()
1530+ .arg("--acknowledgements")
1531+ .assert()
1532+ .success()
1533+ .stdout(
1534+ // Just some sanity checking that avoids names of persons, except our own Keith Hall :)
1535+ predicate::str::contains(
1536+ "Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat).",
1537+ )
1538+ .and(predicate::str::contains(
1539+ "Copyright (c) 2012-2020 The Sublime CMake authors",
1540+ ))
1541+ .and(predicate::str::contains(
1542+ "Copyright 2014-2015 SaltStack Team",
1543+ ))
1544+ .and(predicate::str::contains(
1545+ "Copyright (c) 2013-present Dracula Theme",
1546+ ))
1547+ .and(predicate::str::contains(
1548+ "## syntaxes/01_Packages/Rust/LICENSE.txt",
1549+ ))
1550+ .and(predicate::str::contains(
1551+ "## syntaxes/02_Extra/http-request-response/LICENSE",
1552+ ))
1553+ .and(predicate::str::contains(
1554+ "## themes/dracula-sublime/LICENSE",
1555+ ))
1556+ .and(predicate::str::contains("Copyright (c) 2017 b123400"))
1557+ .and(predicate::str::contains("Copyright (c) 2021 Keith Hall"))
1558+ .and(predicate::str::contains("Copyright 2014 Clams")),
1559+ )
1560+ .stderr("");
1561+}
tests/scripts/license-checks.shnew file+24
@@ -0,0 +1,24 @@
1+#!/usr/bin/env bash
2+set -o errexit -o nounset -o pipefail
3+
4+# Make sure that we don't accidentally include GPL licenced files
5+gpl_term="General Public License"
6+gpl_excludes=(
7+ # Snippet expands to GPL, but is not under GPL
8+ ":(exclude)assets/syntaxes/01_Packages/Matlab/Snippets/Octave-function.sublime-snippet"
9+
10+ # 'gpl_term' matches itself :D
11+ ":(exclude)tests/scripts/license-checks.sh"
12+
13+ # Contains a reference to GPL, but is not under GPL
14+ ":(exclude)tests/syntax-tests/source/Java Server Page (JSP)/LICENSE.md"
15+)
16+gpl_occurances=$(git grep --recurse-submodules "${gpl_term}" -- "${gpl_excludes[@]}" || true)
17+
18+if [ -z "${gpl_occurances}" ]; then
19+ echo "PASS: No files under GPL were found"
20+else
21+ echo "FAIL: GPL:ed code is not compatible with bat, but occurances of '${gpl_term}' were found:"
22+ echo "${gpl_occurances}"
23+ exit 1
24+fi
tests/snapshots/output/full.snapshot.txt+1
@@ -1,5 +1,6 @@
1───────┬────────────────────────────────────────────────────────────────────────
1───────┬────────────────────────────────────────────────────────────────────────
2 │ File: sample.rs
2 │ File: sample.rs
3+ │ Size: 533 B
3───────┼────────────────────────────────────────────────────────────────────────
4───────┼────────────────────────────────────────────────────────────────────────
4 1 + │ /// A rectangle. First line is changed to prevent a regression of #1869
5 1 + │ /// A rectangle. First line is changed to prevent a regression of #1869
5 2 │ struct Rectangle {
6 2 │ struct Rectangle {
tests/syntax-tests/highlighted/Dart/inner_comment.dartnew file+5
@@ -0,0 +1,5 @@
1+return Object(
2+ Object(
3+ // Not highlighted as a comment
4+ )
5+)
tests/syntax-tests/highlighted/Dart/test.dart+52−52
@@ -1,45 +1,45 @@
1/* array sorting alogorithm */
1/* array sorting alogorithm */
2−int partition(List list, int low, int high) {
2+int partition(List list, int low, int high) {
3− if (list == null || list.length == 0) return 0;
3+ if (list == null || list.length == 0) return 0;
4− int pivot = list[high];
4+ int pivot = list[high];
5− int i = low - 1;
5+ int i = low - 1;
6
6
7− void swap(List list, int i, int j) {
7+ void swap(List list, int i, int j) {
8− int temp = list[i];
8+ int temp = list[i];
9 list[i] = list[j];
9 list[i] = list[j];
10 list[j] = temp;
10 list[j] = temp;
11 }
11 }
12
12
13− for (int j = low; j < high; j++) {
13+ for (int j = low; j < high; j++) {
14 if (list[j] <= pivot) {
14 if (list[j] <= pivot) {
15 i++;
15 i++;
16− swap(list, i, j);
16+ swap(list, i, j);
17 }
17 }
18− swap(list, i + 1, high);
18+ swap(list, i + 1, high);
19 return i + 1;
19 return i + 1;
20 }
20 }
21}
21}
22
22
23−void quickSort(List list, int low, int high) {
23+void quickSort(List list, int low, int high) {
24 if (low < high) {
24 if (low < high) {
25− int pi = partition(list, low, high);
25+ int pi = partition(list, low, high);
26− quickSort(list, low, pi - 1);
26+ quickSort(list, low, pi - 1);
27− quickSort(list, pi + 1, high);
27+ quickSort(list, pi + 1, high);
28 }
28 }
29}
29}
30
30
31−void merge(List list, int leftIndex, int middleIndex, int rightIndex) {
31+void merge(List list, int leftIndex, int middleIndex, int rightIndex) {
32− int leftSize = middleIndex - leftIndex + 1;
32+ int leftSize = middleIndex - leftIndex + 1;
33− int rightSize = rightIndex - middleIndex;
33+ int rightSize = rightIndex - middleIndex;
34
34
35− List leftList = new List(leftSize);
35+ List leftList = new List(leftSize);
36− List rightList = new List(rightSize);
36+ List rightList = new List(rightSize);
37
37
38− for (int i = 0; i < leftSize; i++) leftList[i] = list[leftIndex + i];
38+ for (int i = 0; i < leftSize; i++) leftList[i] = list[leftIndex + i];
39− for (int j = 0; j < rightSize; j++) rightList[j] = list[middleIndex + j + 1];
39+ for (int j = 0; j < rightSize; j++) rightList[j] = list[middleIndex + j + 1];
40
40
41− int i = 0, j = 0;
41+ int i = 0, j = 0;
42− int k = leftIndex;
42+ int k = leftIndex;
43
43
44 while (i < leftSize && j < rightSize) {
44 while (i < leftSize && j < rightSize) {
45 if (leftList[i] <= rightList[j]) {
45 if (leftList[i] <= rightList[j]) {
@@ -65,14 +65,14 @@
65 }
65 }
66}
66}
67
67
68−void mergeSort(List list, int leftIndex, int rightIndex) {
68+void mergeSort(List list, int leftIndex, int rightIndex) {
69 if (leftIndex < rightIndex) {
69 if (leftIndex < rightIndex) {
70− int middleIndex = (rightIndex + leftIndex) ~/ 2;
70+ int middleIndex = (rightIndex + leftIndex) ~/ 2;
71
71
72− mergeSort(list, leftIndex, middleIndex);
72+ mergeSort(list, leftIndex, middleIndex);
73− mergeSort(list, middleIndex + 1, rightIndex);
73+ mergeSort(list, middleIndex + 1, rightIndex);
74
74
75− merge(list, leftIndex, middleIndex, rightIndex);
75+ merge(list, leftIndex, middleIndex, rightIndex);
76 }
76 }
77}
77}
78
78
@@ -80,54 +80,54 @@
80var name = 'Voyager I';
80var name = 'Voyager I';
81var year = 1977;
81var year = 1977;
82var antennaDiameter = 3.7;
82var antennaDiameter = 3.7;
83−var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
83+var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
84var image = {
84var image = {
85− 'tags': ['saturn'],
85+ 'tags': ['saturn'],
86− 'url': '//path/to/saturn.jpg'
86+ 'url': '//path/to/saturn.jpg'
87};
87};
88
88
89/*classes */
89/*classes */
90−class Spacecraft {
90+class Spacecraft {
91− String name;
91+ String name;
92− DateTime launchDate;
92+ DateTime launchDate;
93− Spacecraft(this.name, this.launchDate) {}
93+ Spacecraft(this.name, this.launchDate) {}
94
94
95− // Named constructor that forwards to the default one.
95+ // Named constructor that forwards to the default one.
96− Spacecraft.unlaunched(String name) : this(name, null);
96+ Spacecraft.unlaunched(String name) : this(name, null);
97
97
98− int get launchYear => launchDate?.year;
98+ int get launchYear => launchDate?.year;
99
99
100− void describe() {
100+ void describe() {
101− print('Spacecraft: $name');
101+ print('Spacecraft: $name');
102 if (launchDate != null) {
102 if (launchDate != null) {
103− int years = DateTime.now().difference(launchDate).inDays ~/ 365;
103+ int years = DateTime.now().difference(launchDate).inDays ~/ 365;
104− print('Launched: $launchYear ($years years ago)');
104+ print('Launched: $launchYear ($years years ago)');
105 } else {
105 } else {
106− print('Unlaunched');
106+ print('Unlaunched');
107 }
107 }
108 }
108 }
109}
109}
110
110
111/* Mixins */
111/* Mixins */
112−class PilotedCraft extends Spacecraft with Piloted {
112+class PilotedCraft extends Spacecraft with Piloted {
113− // ···
113+ // ···
114}
114}
115
115
116/* Interfaces and abstract classes */
116/* Interfaces and abstract classes */
117−class MockSpaceship implements Spacecraft {
117+class MockSpaceship implements Spacecraft {
118− // ···
118+ // ···
119}
119}
120
120
121/* async */
121/* async */
122−Future<void> printWithDelay(String message) {
122+Future<void> printWithDelay(String message) {
123− return Future.delayed(const Duration(seconds: 2)).then((_) {
123+ return Future.delayed(const Duration(seconds: 2)).then((_) {
124− print(message);
124+ print(message);
125 });
125 });
126}
126}
127
127
128−Stream<String> report(Spacecraft craft, Iterable<String> objects) async* {
128+Stream<String> report(Spacecraft craft, Iterable<String> objects) async* {
129 for (var object in objects) {
129 for (var object in objects) {
130− await Future.delayed(const Duration(seconds: 2));
130+ await Future.delayed(const Duration(seconds: 2));
131− yield '${craft.name} flies by $object';
131+ yield '${craft.name} flies by $object';
132 }
132 }
133}
133}
tests/syntax-tests/highlighted/INI/test.infnew file+5
@@ -0,0 +1,5 @@
1+[section]
2+key=value
3+# This file is just for testing that the INI syntax is registered to handle
4+# the .inf file extension, it is not testing the syntax highlighting capabilities
5+# of the INI syntax itself
tests/syntax-tests/highlighted/JQ/sample.jqnew file+60
@@ -0,0 +1,60 @@
1+import "../imported-file" ;
2+
3+# With Comments !
4+def weird($a; $b; $c):
5+ [ $a, $b, $c ] | transpose | reduce .[][] as $item (
6+ [];
7+ . + $item.property
8+ )
9+;
10+
11+. | weird (.a; .b; .c) |
12+
13+(
14+
15+if (. | contains("never") ) then
16+ "Why yes"
17+else
18+ 12.23
19+end
20+
21+) as $never |
22+
23+{
24+ hello,
25+ why: "because",
26+ hello: ( weird | ascii_upcase ),
27+ format_eg: ( . | @json "My json string \( . | this | part | just | white | ascii_upcase | transpose)" ),
28+ never: $never,
29+ "literal_key": literal_value,
30+ "this": 12.1e12,
31+ "part": "almost"
32+ "like": [
33+ 12,
34+ 2
35+ "json"
36+ {
37+ "quite": {
38+ similar: "but not quite"
39+ }
40+ }
41+ ],
42+} | (
43+ 
44+ # And with very basic brace matching
45+ 
46+ # Invalid End
47+ ] 
48+ 
49+ # Other invalid ends
50+ ( [ } ] )
51+
52+ # A "valid" sequence
53+ ( [ { key: () , other_key:( [ [] [[]] ] ), gaga } ] )
54+
55+ # A "invalid" sequence
56+ ( [ { key: () , other_key:( [ [] [[] ] ), gaga } ] )
57+
58+ "A string\n whith escaped characters \" because we can"
59+)
60+
tests/syntax-tests/highlighted/Log/example.log+1
@@ -1,2 +1,3 @@
12021-03-06 23:22:21.392 https://[2001:db8:4006:812::200e]:8080/path/the%20page.html
12021-03-06 23:22:21.392 https://[2001:db8:4006:812::200e]:8080/path/the%20page.html
22021-03-06 23:22:21 https://example.com:8080/path/the%20page(with_parens).html
22021-03-06 23:22:21 https://example.com:8080/path/the%20page(with_parens).html
3+2022-03-16T17:41:02.519 helix_term::application [WARN] unhandled window/showMessage: ShowMessageParams { typ: Error, message: "rust-analyzer failed to load workspace: Failed to read Cargo metadata from Cargo.toml file /home/zeta/dev/raytracer/Cargo.toml, cargo 1.61.0-nightly (65c8266 2022-03-09): Failed to run `\"cargo\" \"metadata\" \"--format-version\" \"1\" \"--manifest-path\" \"/home/zeta/dev/raytracer/Cargo.toml\" \"--filter-platform\" \"wasm32-unknown-unknown\"`: `cargo metadata` exited with an error: Updating crates.io index\nerror: failed to select a version for `parking_lot`.\n ... required by package `raytracer v0.1.0 (/home/zeta/dev/raytracer)`\nversions that meet the requirements `^0.12.0` are: 0.12.0\n\nthe package `raytracer` depends on `parking_lot`, with features: `wasm-bindgen` but `parking_lot` does not have these features.\n\n\nfailed to select a version for `parking_lot` which could resolve this conflict\n" }
tests/syntax-tests/highlighted/PowerShell/test.ps1+2−2
@@ -20,6 +20,6 @@
20 'Path does not contain Rust'
20 'Path does not contain Rust'
21}
21}
22
22
23−(5..30) | ? { $_ % (2 * 2 + 1) -eq 0 } | % {"In {0} minutes, the time will be {1}." -f $_, $( Get-FutureTime $_ )}
23+(5..30) | ? { $_ % (2 * 2 + 1) -eq 0 } | % {"In {0} minutes, the time will be {1}." -f $_, $( Get-FutureTime $_ )}
24−$later = Get-FutureTime -Minutes $( Get-Random -Minimum 60 -Maximum 120 )
24+$later = Get-FutureTime -Minutes $( Get-Random -Minimum 60 -Maximum 120 )
25"The time will be " + $later + " later."
25"The time will be " + $later + " later."
tests/syntax-tests/highlighted/RequirementsTXT/requirements.txtdeleted−8
@@ -1,8 +0,0 @@
1−#this is a sample requirements.txt file
2−
3−django==11.2.0
4−pywheels>=12.4 #a whitespace followed by comments
5−Nuitka<0.6.8.4
6−wxPython>=1.0, <=2.1
7−
8−#this is another comment
tests/syntax-tests/highlighted/SCSS/example.scss+16−16
@@ -1,20 +1,20 @@
1@import 'fonts';
1@import 'fonts';
2
2
3$theme_dark: (
3$theme_dark: (
4− "background-color": null,
4+ "background-color": null,
5);
5);
6$theme_main: (
6$theme_main: (
7− "text-size": 3em,
7+ "text-size": 3em,
8 "text-color": black,
8 "text-color": black,
9− "text-shadow": #36ad 0px 0px 3px,
9+ "text-shadow": #36ad 0px 0px 3px,
10 "card-background": #d6f,
10 "card-background": #d6f,
11− "card-shadow": #11121212 0px 0px 2px 1px,
11+ "card-shadow": #11121212 0px 0px 2px 1px,
12− "card-padding": 1rem,
12+ "card-padding": 1rem,
13− "card-margin": 0.5in,
13+ "card-margin": 0.5in,
14− "image-width": 600px,
14+ "image-width": 600px,
15− "image-height": 100vh,
15+ "image-height": 100vh,
16 "background-color": #dedbef,
16 "background-color": #dedbef,
17− "i-ran-out-of-placeholders-for-units": (1vw 100% 60pt),
17+ "i-ran-out-of-placeholders-for-units": (1vw 100% 60pt),
18);
18);
19
19
20$current_theme: $theme_main;
20$current_theme: $theme_main;
@@ -51,12 +51,12 @@
51 header[data-selectable="false"] {
51 header[data-selectable="false"] {
52 -webkit-user-select: none;
52 -webkit-user-select: none;
53 -moz-user-select: none;
53 -moz-user-select: none;
54− -ms-user-select: /* CSS comment */ none;
54+ -ms-user-select: /* CSS comment */ none;
55 cursor: default !important; // SCSS comment
55 cursor: default !important; // SCSS comment
56 }
56 }
57 
57 
58 > div {
58 > div {
59− border: #04f 1px solid;
59+ border: #04f 1px solid;
60 
60 
61 &::after {
61 &::after {
62 content: 'Pseudo';
62 content: 'Pseudo';
@@ -67,12 +67,12 @@
67}
67}
68
68
69@keyframes rotate {
69@keyframes rotate {
70− 0% {
70+ 0% {
71− transform: rotate(0deg);
71+ transform: rotate(0deg);
72 }
72 }
73− 50% {
73+ 50% {
74− transform: rotate(180deg)}
74+ transform: rotate(180deg)}
75− 100% {transform: rotate(0rad);}
75+ 100% {transform: rotate(0rad);}
76}
76}
77
77
78@font-face {
78@font-face {
tests/syntax-tests/highlighted/Sass/example.sass+18−18
@@ -1,22 +1,22 @@
1@import "fonts"
1@import "fonts"
2
2
3$theme_dark: (
3$theme_dark: (
4− "background-color": null
4+ "background-color": null
5)
5)
6
6
7$theme_main: (
7$theme_main: (
8− "text-size": 3em
8+ "text-size": 3em
9 "text-color": black
9 "text-color": black
10− "text-shadow": #36ad 0px 0px 3px
10+ "text-shadow": #36ad 0px 0px 3px
11 "card-background": #d6f
11 "card-background": #d6f
12− "card-shadow": #11121212 0px 0px 2px 1px
12+ "card-shadow": #11121212 0px 0px 2px 1px
13− "card-padding": 1rem
13+ "card-padding": 1rem
14− "card-margin": 0.5in
14+ "card-margin": 0.5in
15− "image-width": 600px
15+ "image-width": 600px
16− "image-height": 100vh
16+ "image-height": 100vh
17 "background-color": #dedbef
17 "background-color": #dedbef
18 "i-ran-out-of-placeholders-for-units": (
18 "i-ran-out-of-placeholders-for-units": (
19− 1vw 100% 60pt
19+ 1vw 100% 60pt
20 )
20 )
21)
21)
22
22
@@ -49,12 +49,12 @@
49 header[data-selectable="false"]
49 header[data-selectable="false"]
50 -webkit-user-select: none
50 -webkit-user-select: none
51 -moz-user-select: none
51 -moz-user-select: none
52− -ms-user-select: /* CSS comment */ none
52+ -ms-user-select: /* CSS comment */ none
53− cursor: default !important // Sass comment
53+ cursor: default !important // Sass comment
54
54
55
55
56 > div
56 > div
57− border: #04f 1px solid
57+ border: #04f 1px solid
58
58
59 &::after
59 &::after
60 content: "Pseudo"
60 content: "Pseudo"
@@ -62,12 +62,12 @@
62 box-sizing: border-box
62 box-sizing: border-box
63
63
64@keyframes rotate
64@keyframes rotate
65− 0%
65+ 0%
66− transform: rotate(0deg)
66+ transform: rotate(0deg)
67− 50%
67+ 50%
68− transform: rotate(180deg)
68+ transform: rotate(180deg)
69− 100%
69+ 100%
70− transform: rotate(0rad)
70+ transform: rotate(0rad)
71
71
72@font-face
72@font-face
73 font-family: "Example Font"
73 font-family: "Example Font"
tests/syntax-tests/highlighted/Svelte/App.svelte+5−1
@@ -27,9 +27,13 @@
27</script>
27</script>
28
28
29<script type="text/livescript">
29<script type="text/livescript">
30− // This block is a regression test for a bat panic when a LiveScript syntax definition is missing
30+ // This block is a regression test for a bat panic when a LiveScript syntax definition is missing
31</script>
31</script>
32
32
33+<style lang="text/postcss">
34+ /* This block is a regression test for a bat panic when a PostCSS syntax definition is missing */
35+</style>
36+
33<style>
37<style>
34 main {
38 main {
35 position: relative;
39 position: relative;
tests/syntax-tests/highlighted/Syslog/example.syslog+3−3
@@ -1,7 +1,7 @@
1Apr 4 00:00:01 hostname-here systemd[1]: logrotate.service: Succeeded.
1Apr 4 00:00:01 hostname-here systemd[1]: logrotate.service: Succeeded.
2Apr 4 00:00:01 hostname-here systemd[1]: Finished Rotate log files.
2Apr 4 00:00:01 hostname-here systemd[1]: Finished Rotate log files.
3Apr 4 00:00:01 hostname-here colord[920]: failed to get session [pid 137485]: No data available
3Apr 4 00:00:01 hostname-here colord[920]: failed to get session [pid 137485]: No data available
4−Apr 4 00:00:21 hostname-here kernel: [55604.908232] audit: type=1400 audit(1617483621.094:28): apparmor="DENIED" operation="capable" profile="/usr/sbin/cups-browsed" pid=59311 comm="cups-browsed" capability=23 capname="sys_nice"
4+Apr 4 00:00:21 hostname-here kernel: [55604.908232] audit: type=1400 audit(1617483621.094:28): apparmor="DENIED" operation="capable" profile="/usr/sbin/cups-browsed" pid=59311 comm="cups-browsed" capability=23 capname="sys_nice"
5Apr 4 00:01:38 hostname-here systemd-resolved[721]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP.
5Apr 4 00:01:38 hostname-here systemd-resolved[721]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP.
6Apr 4 00:04:46 hostname-here ntpd[952]: Soliciting pool server 255.76.59.37
6Apr 4 00:04:46 hostname-here ntpd[952]: Soliciting pool server 255.76.59.37
7Apr 4 00:05:21 hostname-here ntpd[952]: ::1 local addr 0:0:0:0:0:0:0:1 -> <null>
7Apr 4 00:05:21 hostname-here ntpd[952]: ::1 local addr 0:0:0:0:0:0:0:1 -> <null>
@@ -10,7 +10,7 @@
10Apr 4 16:32:07 hostname-here NetworkManager[740]: <info> [1617629527.1101] manager: NetworkManager state is now CONNECTED_GLOBAL
10Apr 4 16:32:07 hostname-here NetworkManager[740]: <info> [1617629527.1101] manager: NetworkManager state is now CONNECTED_GLOBAL
11Apr 4 22:00:45 hostname-here dbus-daemon[1094]: [session uid=1000 pid=1094] Successfully activated service 'io.github.celluloid_player.Celluloid'
11Apr 4 22:00:45 hostname-here dbus-daemon[1094]: [session uid=1000 pid=1094] Successfully activated service 'io.github.celluloid_player.Celluloid'
12Aug 11 13:29:06 hostname-here insomnia_insomnia.desktop[142666]: 13:29:06.316 › [updater] Updater not running platform=linux dev=false
12Aug 11 13:29:06 hostname-here insomnia_insomnia.desktop[142666]: 13:29:06.316 › [updater] Updater not running platform=linux dev=false
13−Aug 11 13:36:34 192.168.220.5 nginx: 2021/08/11 13:36:34 [debug] 2031#2031: epoll add event: fd:6 op:1 ev:00002001
13+Aug 11 13:36:34 192.168.220.5 nginx: 2021/08/11 13:36:34 [debug] 2031#2031: epoll add event: fd:6 op:1 ev:00002001
14−Aug 11 21:31:08 ::1 nginx: 2021/08/11 21:31:08 [debug] 760831#760831: epoll add event: fd:6 op:1 ev:10000001
14+Aug 11 21:31:08 ::1 nginx: 2021/08/11 21:31:08 [debug] 760831#760831: epoll add event: fd:6 op:1 ev:10000001
15Aug 11 21:40:31 hostname-here scop hello
15Aug 11 21:40:31 hostname-here scop hello
16Aug 16 21:38:21 hostname-here systemd[1]: Finished Cleanup of Temporary Directories.
16Aug 16 21:38:21 hostname-here systemd[1]: Finished Cleanup of Temporary Directories.
tests/syntax-tests/highlighted/Vue/example.vue+5
@@ -8,6 +8,11 @@
8 </div>
8 </div>
9</template>
9</template>
10
10
11+<template lang='pug'>
12+ #container.col
13+ p This shall be formatted as Plain Text as long as a Pug syntax definition is missing
14+</template>
15+
11<script>
16<script>
12import AppHeader from "@/components/AppHeader";
17import AppHeader from "@/components/AppHeader";
13import AppLoadingIndicator from "@/components/AppLoadingIndicator";
18import AppLoadingIndicator from "@/components/AppLoadingIndicator";
tests/syntax-tests/highlighted/Zig/example.zig+39−39
@@ -1,18 +1,18 @@
1//! this is a top level doc, starts with "//!"
1//! this is a top level doc, starts with "//!"
2
2
3−const std = @import("std");
3+const std = @import("std");
4
4
5pub fn main() anyerror!void {
5pub fn main() anyerror!void {
6− const stdout = std.io.getStdOut().writer();
6+ const stdout = std.io.getStdOut().writer();
7− try stdout.print("Hello, {}!\n", .{"world"});
7+ try stdout.print("Hello, {}!\n", .{"world"});
8}
8}
9
9
10−const expect = std.testing.expect;
10+const expect = std.testing.expect;
11
11
12test "comments" {
12test "comments" {
13 // comments start with "//" until newline
13 // comments start with "//" until newline
14 // foo bar baz
14 // foo bar baz
15− const x = true; // another comment
15+ const x = true; // another comment
16 expect(x);
16 expect(x);
17}
17}
18
18
@@ -25,26 +25,26 @@
25 /// number of nanoseconds past the second
25 /// number of nanoseconds past the second
26 nano: u32,
26 nano: u32,
27
27
28− const Self = @This();
28+ const Self = @This();
29
29
30 pub fn unixEpoch() Self {
30 pub fn unixEpoch() Self {
31 return Self{
31 return Self{
32− .seconds = 0,
32+ .seconds = 0,
33− .nanos = 0,
33+ .nanos = 0,
34 };
34 };
35 }
35 }
36};
36};
37
37
38−const my_val = switch (std.Target.current.os.tag) {
38+const my_val = switch (std.Target.current.os.tag) {
39− .linux => "Linux",
39+ .linux => "Linux",
40 else => "not Linux",
40 else => "not Linux",
41};
41};
42
42
43const Book = enum {
43const Book = enum {
44− paperback,
44+ paperback,
45− hardcover,
45+ hardcover,
46− ebook,
46+ ebook,
47− pdf,
47+ pdf,
48};
48};
49
49
50const TokenType = union(enum) {
50const TokenType = union(enum) {
@@ -54,54 +54,54 @@
54};
54};
55
55
56const array_lit: [4]u8 = .{ 11, 22, 33, 44 };
56const array_lit: [4]u8 = .{ 11, 22, 33, 44 };
57−const sentinal_lit = [_:0]u8{ 1, 2, 3, 4 };
57+const sentinal_lit = [_:0]u8{ 1, 2, 3, 4 };
58
58
59test "address of syntax" {
59test "address of syntax" {
60 // Get the address of a variable:
60 // Get the address of a variable:
61 const x: i32 = 1234;
61 const x: i32 = 1234;
62− const x_ptr = &x;
62+ const x_ptr = &x;
63
63
64 // Dereference a pointer:
64 // Dereference a pointer:
65 expect(x_ptr.* == 1234);
65 expect(x_ptr.* == 1234);
66
66
67 // When you get the address of a const variable, you get a const pointer to a single item.
67 // When you get the address of a const variable, you get a const pointer to a single item.
68− expect(@TypeOf(x_ptr) == *const i32);
68+ expect(@TypeOf(x_ptr) == *const i32);
69
69
70 // If you want to mutate the value, you'd need an address of a mutable variable:
70 // If you want to mutate the value, you'd need an address of a mutable variable:
71 var y: i32 = 5678;
71 var y: i32 = 5678;
72− const y_ptr = &y;
72+ const y_ptr = &y;
73− expect(@TypeOf(y_ptr) == *i32);
73+ expect(@TypeOf(y_ptr) == *i32);
74− y_ptr.* += 1;
74+ y_ptr.* += 1;
75 expect(y_ptr.* == 5679);
75 expect(y_ptr.* == 5679);
76}
76}
77
77
78// integer literals
78// integer literals
79−const decimal_int = 98222;
79+const decimal_int = 98222;
80−const hex_int = 0xff;
80+const hex_int = 0xff;
81−const another_hex_int = 0xFF;
81+const another_hex_int = 0xFF;
82−const octal_int = 0o755;
82+const octal_int = 0o755;
83−const binary_int = 0b11110000;
83+const binary_int = 0b11110000;
84
84
85// underscores may be placed between two digits as a visual separator
85// underscores may be placed between two digits as a visual separator
86−const one_billion = 1_000_000_000;
86+const one_billion = 1_000_000_000;
87−const binary_mask = 0b1_1111_1111;
87+const binary_mask = 0b1_1111_1111;
88−const permissions = 0o7_5_5;
88+const permissions = 0o7_5_5;
89−const big_address = 0xFF80_0000_0000_0000;
89+const big_address = 0xFF80_0000_0000_0000;
90
90
91// float literals
91// float literals
92−const floating_point = 123.0E+77;
92+const floating_point = 123.0E+77;
93−const another_float = 123.0;
93+const another_float = 123.0;
94−const yet_another = 123.0e+77;
94+const yet_another = 123.0e+77;
95
95
96−const hex_floating_point = 0x103.70p-5;
96+const hex_floating_point = 0x103.70p-5;
97−const another_hex_float = 0x103.70;
97+const another_hex_float = 0x103.70;
98−const yet_another_hex_float = 0x103.70P-5;
98+const yet_another_hex_float = 0x103.70P-5;
99
99
100// underscores may be placed between two digits as a visual separator
100// underscores may be placed between two digits as a visual separator
101−const lightspeed = 299_792_458.000_000;
101+const lightspeed = 299_792_458.000_000;
102−const nanosecond = 0.000_000_001;
102+const nanosecond = 0.000_000_001;
103−const more_hex = 0x1234_5678.9ABC_CDEFp-10;
103+const more_hex = 0x1234_5678.9ABC_CDEFp-10;
104
104
105fn max(comptime T: type, a: T, b: T) T {
105fn max(comptime T: type, a: T, b: T) T {
106− return if (a > b) a else b;
106+ return if (a > b) a else b;
107}
107}
tests/syntax-tests/highlighted/cmd-help/test.cmd-helpnew file+54
@@ -0,0 +1,54 @@
1+bat 0.20.0 (e735562-modified)
2+A cat(1) clone with syntax highlighting and Git integration.
3+
4+USAGE:
5+ bat [OPTIONS] [FILE]...
6+ bat <SUBCOMMAND>
7+
8+OPTIONS:
9+ -A, --show-all
10+ Show non-printable characters (space, tab, newline, ..).
11+
12+ -p, --plain Show plain style (alias for '--style=plain').
13+ -l, --language <language> Set the language for syntax highlighting.
14+ -H, --highlight-line <N:M>... Highlight lines N through M.
15+ --file-name <name>... Specify the name to display for a file.
16+ -d, --diff
17+ Only show lines that have been added/removed/modified.
18+
19+ --tabs <T> Set the tab width to T spaces.
20+ --wrap <mode>
21+ Specify the text-wrapping mode (*auto*, never, character).
22+
23+ -n, --number
24+ Show line numbers (alias for '--style=numbers').
25+
26+ --color <when> When to use colors (*auto*, never, always).
27+ --italic-text <when> Use italics in output (always, *never*)
28+ --decorations <when>
29+ When to show the decorations (*auto*, never, always).
30+
31+ --paging <when>
32+ Specify when to use the pager, or use `-P` to disable (*auto*, never,
33+ always).
34+ -m, --map-syntax <glob:syntax>...
35+ Use the specified syntax for files matching the glob pattern
36+ ('*.cpp:C++').
37+ --theme <theme> Set the color theme for syntax highlighting.
38+ --list-themes Display all supported highlighting themes.
39+ --style <components>
40+ Comma-separated list of style elements to display (*auto*, full, plain,
41+ changes, header, grid, rule, numbers, snip).
42+ -r, --line-range <N:M>... Only print the lines from N to M.
43+ -L, --list-languages Display all supported languages.
44+ -h, --help Print this help message.
45+ -V, --version Show version information.
46+
47+ARGS:
48+ <FILE>... File(s) to print / concatenate. Use '-' for standard input.
49+
50+SUBCOMMANDS:
51+ cache Modify the syntax-definition and theme cache
52+
53+Note: `bat -h` prints a short and concise overview while `bat --help` gives all
54+details.
tests/syntax-tests/highlighted/nim/test.nimblenew file+23
@@ -0,0 +1,23 @@
1+version = "0.1.0"
2+author = "creator_name"
3+description = "Tests nimble syntax highlighting"
4+license = "custom"
5+
6+bin = @["test"]
7+srcdir = "src"
8+installExt = @["nim"]
9+
10+# Dependencies
11+
12+requires "nim >= 1.6.2"
13+
14+when defined(nimdistros):
15+ import distros
16+ if detectOs(Ubuntu):
17+ foreignDep "external_lib"
18+ else:
19+ foreignDep "other_lib"
20+
21+task test, "Runs a task called 'test'":
22+ withDir "tests":
23+ exec "nim c -r tester"
tests/syntax-tests/source/Dart/inner_comment.dartnew file+5
@@ -0,0 +1,5 @@
1+return Object(
2+ Object(
3+ // Not highlighted as a comment
4+ )
5+)
tests/syntax-tests/source/INI/test.infnew file+5
@@ -0,0 +1,5 @@
1+[section]
2+key=value
3+# This file is just for testing that the INI syntax is registered to handle
4+# the .inf file extension, it is not testing the syntax highlighting capabilities
5+# of the INI syntax itself
tests/syntax-tests/source/JQ/LICENSE.mdnew file+25
@@ -0,0 +1,25 @@
1+The `sample.jq` file was taken from [SublimeJQ] under the following license:
2+
3+[SublimeJQ]: https://github.com/zogwarg/SublimeJQ
4+
5+MIT License
6+
7+Copyright (c) 2017 Thomas Buick
8+
9+Permission is hereby granted, free of charge, to any person obtaining a copy
10+of this software and associated documentation files (the "Software"), to deal
11+in the Software without restriction, including without limitation the rights
12+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13+copies of the Software, and to permit persons to whom the Software is
14+furnished to do so, subject to the following conditions:
15+
16+The above copyright notice and this permission notice shall be included in all
17+copies or substantial portions of the Software.
18+
19+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25+SOFTWARE.
tests/syntax-tests/source/JQ/sample.jqnew file+60
@@ -0,0 +1,60 @@
1+import "../imported-file" ;
2+
3+# With Comments !
4+def weird($a; $b; $c):
5+ [ $a, $b, $c ] | transpose | reduce .[][] as $item (
6+ [];
7+ . + $item.property
8+ )
9+;
10+
11+. | weird (.a; .b; .c) |
12+
13+(
14+
15+if (. | contains("never") ) then
16+ "Why yes"
17+else
18+ 12.23
19+end
20+
21+) as $never |
22+
23+{
24+ hello,
25+ why: "because",
26+ hello: ( weird | ascii_upcase ),
27+ format_eg: ( . | @json "My json string \( . | this | part | just | white | ascii_upcase | transpose)" ),
28+ never: $never,
29+ "literal_key": literal_value,
30+ "this": 12.1e12,
31+ "part": "almost"
32+ "like": [
33+ 12,
34+ 2
35+ "json"
36+ {
37+ "quite": {
38+ similar: "but not quite"
39+ }
40+ }
41+ ],
42+} | (
43+
44+ # And with very basic brace matching
45+
46+ # Invalid End
47+ ]
48+
49+ # Other invalid ends
50+ ( [ } ] )
51+
52+ # A "valid" sequence
53+ ( [ { key: () , other_key:( [ [] [[]] ] ), gaga } ] )
54+
55+ # A "invalid" sequence
56+ ( [ { key: () , other_key:( [ [] [[] ] ), gaga } ] )
57+
58+ "A string\n whith escaped characters \" because we can"
59+)
60+
tests/syntax-tests/source/Log/example.log+1
@@ -1,2 +1,3 @@
12021-03-06 23:22:21.392 https://[2001:db8:4006:812::200e]:8080/path/the%20page.html
12021-03-06 23:22:21.392 https://[2001:db8:4006:812::200e]:8080/path/the%20page.html
22021-03-06 23:22:21 https://example.com:8080/path/the%20page(with_parens).html
22021-03-06 23:22:21 https://example.com:8080/path/the%20page(with_parens).html
3+2022-03-16T17:41:02.519 helix_term::application [WARN] unhandled window/showMessage: ShowMessageParams { typ: Error, message: "rust-analyzer failed to load workspace: Failed to read Cargo metadata from Cargo.toml file /home/zeta/dev/raytracer/Cargo.toml, cargo 1.61.0-nightly (65c8266 2022-03-09): Failed to run `\"cargo\" \"metadata\" \"--format-version\" \"1\" \"--manifest-path\" \"/home/zeta/dev/raytracer/Cargo.toml\" \"--filter-platform\" \"wasm32-unknown-unknown\"`: `cargo metadata` exited with an error: Updating crates.io index\nerror: failed to select a version for `parking_lot`.\n ... required by package `raytracer v0.1.0 (/home/zeta/dev/raytracer)`\nversions that meet the requirements `^0.12.0` are: 0.12.0\n\nthe package `raytracer` depends on `parking_lot`, with features: `wasm-bindgen` but `parking_lot` does not have these features.\n\n\nfailed to select a version for `parking_lot` which could resolve this conflict\n" }
tests/syntax-tests/source/RequirementsTXT/requirements.txtdeleted−8
@@ -1,8 +0,0 @@
1−#this is a sample requirements.txt file
2−
3−django==11.2.0
4−pywheels>=12.4 #a whitespace followed by comments
5−Nuitka<0.6.8.4
6−wxPython>=1.0, <=2.1
7−
8−#this is another comment
tests/syntax-tests/source/Svelte/App.svelte+5−1
@@ -27,9 +27,13 @@
27</script>
27</script>
28
28
29<script type="text/livescript">
29<script type="text/livescript">
30− // This block is a regression test for a bat panic when a LiveScript syntax definition is missing
30+ // This block is a regression test for a bat panic when a LiveScript syntax definition is missing
31</script>
31</script>
32
32
33+<style lang="text/postcss">
34+ /* This block is a regression test for a bat panic when a PostCSS syntax definition is missing */
35+</style>
36+
33<style>
37<style>
34 main {
38 main {
35 position: relative;
39 position: relative;
tests/syntax-tests/source/Vue/example.vue+5
@@ -8,6 +8,11 @@
8 </div>
8 </div>
9</template>
9</template>
10
10
11+<template lang='pug'>
12+ #container.col
13+ p This shall be formatted as Plain Text as long as a Pug syntax definition is missing
14+</template>
15+
11<script>
16<script>
12import AppHeader from "@/components/AppHeader";
17import AppHeader from "@/components/AppHeader";
13import AppLoadingIndicator from "@/components/AppLoadingIndicator";
18import AppLoadingIndicator from "@/components/AppLoadingIndicator";
tests/syntax-tests/source/cmd-help/test.cmd-helpnew file+54
@@ -0,0 +1,54 @@
1+bat 0.20.0 (e735562-modified)
2+A cat(1) clone with syntax highlighting and Git integration.
3+
4+USAGE:
5+ bat [OPTIONS] [FILE]...
6+ bat <SUBCOMMAND>
7+
8+OPTIONS:
9+ -A, --show-all
10+ Show non-printable characters (space, tab, newline, ..).
11+
12+ -p, --plain Show plain style (alias for '--style=plain').
13+ -l, --language <language> Set the language for syntax highlighting.
14+ -H, --highlight-line <N:M>... Highlight lines N through M.
15+ --file-name <name>... Specify the name to display for a file.
16+ -d, --diff
17+ Only show lines that have been added/removed/modified.
18+
19+ --tabs <T> Set the tab width to T spaces.
20+ --wrap <mode>
21+ Specify the text-wrapping mode (*auto*, never, character).
22+
23+ -n, --number
24+ Show line numbers (alias for '--style=numbers').
25+
26+ --color <when> When to use colors (*auto*, never, always).
27+ --italic-text <when> Use italics in output (always, *never*)
28+ --decorations <when>
29+ When to show the decorations (*auto*, never, always).
30+
31+ --paging <when>
32+ Specify when to use the pager, or use `-P` to disable (*auto*, never,
33+ always).
34+ -m, --map-syntax <glob:syntax>...
35+ Use the specified syntax for files matching the glob pattern
36+ ('*.cpp:C++').
37+ --theme <theme> Set the color theme for syntax highlighting.
38+ --list-themes Display all supported highlighting themes.
39+ --style <components>
40+ Comma-separated list of style elements to display (*auto*, full, plain,
41+ changes, header, grid, rule, numbers, snip).
42+ -r, --line-range <N:M>... Only print the lines from N to M.
43+ -L, --list-languages Display all supported languages.
44+ -h, --help Print this help message.
45+ -V, --version Show version information.
46+
47+ARGS:
48+ <FILE>... File(s) to print / concatenate. Use '-' for standard input.
49+
50+SUBCOMMANDS:
51+ cache Modify the syntax-definition and theme cache
52+
53+Note: `bat -h` prints a short and concise overview while `bat --help` gives all
54+details.
tests/syntax-tests/source/nim/test.nimblenew file+23
@@ -0,0 +1,23 @@
1+version = "0.1.0"
2+author = "creator_name"
3+description = "Tests nimble syntax highlighting"
4+license = "custom"
5+
6+bin = @["test"]
7+srcdir = "src"
8+installExt = @["nim"]
9+
10+# Dependencies
11+
12+requires "nim >= 1.6.2"
13+
14+when defined(nimdistros):
15+ import distros
16+ if detectOs(Ubuntu):
17+ foreignDep "external_lib"
18+ else:
19+ foreignDep "other_lib"
20+
21+task test, "Runs a task called 'test'":
22+ withDir "tests":
23+ exec "nim c -r tester"