From 37d3567f465e70136e90f0a33325944876f3d809 Mon Sep 17 00:00:00 2001 From: lnicola Date: Mon, 16 Oct 2023 08:00:48 +0000 Subject: [PATCH] deploy: 9461775c9d7a17e4d8192864384e90c4bf1d9d84 --- .nojekyll | 0 Gemfile | 12 + Gemfile.lock | 71 + README.md | 16 + .../blog/first-release/extend-selection.webm | Bin 0 -> 60203 bytes .../blog/first-release/fill-match-arms.webm | Bin 0 -> 86875 bytes assets/blog/first-release/impl-iter.webm | Bin 0 -> 213570 bytes assets/blog/first-release/new-mod.webm | Bin 0 -> 37693 bytes .../blog/first-release/return-completion.webm | Bin 0 -> 65924 bytes assets/blog/first-release/run.webm | Bin 0 -> 107719 bytes .../blog/first-release/workspace-symbol.webm | Bin 0 -> 141273 bytes .../blog/how-to-make-a-light-bulb/bulb1.png | Bin 0 -> 33010 bytes .../blog/how-to-make-a-light-bulb/bulb2.png | Bin 0 -> 41494 bytes .../how-to-make-a-light-bulb/emacs-helm.png | Bin 0 -> 65574 bytes assets/browserconfig.xml | 9 + assets/fav/android-chrome-192x192.png | Bin 0 -> 2156 bytes assets/fav/android-chrome-512x512.png | Bin 0 -> 8189 bytes assets/fav/apple-touch-icon.png | Bin 0 -> 1920 bytes assets/fav/favicon-16x16.png | Bin 0 -> 694 bytes assets/fav/favicon-32x32.png | Bin 0 -> 952 bytes assets/fav/favicon.ico | Bin 0 -> 15086 bytes assets/fav/mstile-144x144.png | Bin 0 -> 2081 bytes assets/fav/mstile-310x150.png | Bin 0 -> 6108 bytes assets/fav/mstile-310x310.png | Bin 0 -> 5590 bytes assets/fav/mstile-70x70.png | Bin 0 -> 1664 bytes assets/fav/ra.svg | 20 + assets/fav/safari-pinned-tab.svg | 25 + assets/ferrous-logo.png | Bin 0 -> 4614 bytes assets/github.svg | 1 + assets/mstile-150x150.png | Bin 0 -> 2164 bytes assets/rust-analyzer.svg | 40 + assets/site.webmanifest | 19 + blog.html | 164 + blog/2019/10/16/finance.html | 188 + blog/2019/11/13/find-usages.html | 406 + blog/2020/02/11/2019-financial-report.html | 128 + blog/2020/03/30/macros-vs-rename.html | 235 + blog/2020/04/20/first-release.html | 474 + blog/2020/05/18/next-few-years.html | 406 + ...hree-architectures-for-responsive-ide.html | 581 + blog/2020/08/20/financial-report.html | 147 + blog/2020/09/16/challeging-LR-parsing.html | 443 + blog/2020/09/28/how-to-make-a-light-bulb.html | 358 + blog/2020/10/24/introducing-ungrammar.html | 391 + .../12/04/measuring-memory-usage-in-rust.html | 262 + blog/2021/08/03/financial-report-3.html | 147 + blog/2021/11/21/ides-and-macros.html | 479 + blog/2021/12/30/2021-recap.html | 393 + blog/2023/07/24/durable-incrementality.html | 263 + css/asciidoctor.css | 426 + css/main.css | 205 + css/rouge-github.css | 209 + feed.xml | 841 ++ generated_assists.html | 5628 ++++++++ generated_config.html | 1705 +++ generated_diagnostic.html | 423 + index.html | 161 + manual.html | 11992 ++++++++++++++++ redirects.json | 1 + thisweek.html | 1109 ++ thisweek/2019/07/24/changelog-0.html | 189 + thisweek/2019/12/04/changelog-1.html | 156 + thisweek/2019/12/09/changelog-2.html | 151 + thisweek/2019/12/16/changelog-3.html | 164 + thisweek/2019/12/23/changelog-4.html | 179 + thisweek/2019/12/30/changelog-5.html | 152 + thisweek/2020/01/06/changelog-6.html | 137 + thisweek/2020/01/13/changelog-7.html | 190 + thisweek/2020/01/20/changelog-8.html | 163 + thisweek/2020/01/27/changelog-9.html | 149 + thisweek/2020/02/03/changelog-10.html | 184 + thisweek/2020/02/10/changelog-11.html | 199 + thisweek/2020/02/17/changelog-12.html | 221 + thisweek/2020/02/24/changelog-13.html | 223 + thisweek/2020/03/02/changelog-14.html | 250 + thisweek/2020/03/09/changelog-15.html | 229 + thisweek/2020/03/16/changelog-16.html | 215 + thisweek/2020/03/23/changelog-17.html | 206 + thisweek/2020/03/30/changelog-18.html | 200 + thisweek/2020/04/06/changelog-19.html | 288 + thisweek/2020/04/13/changelog-20.html | 227 + thisweek/2020/04/20/changelog-21.html | 256 + thisweek/2020/04/27/changelog-22.html | 266 + thisweek/2020/05/04/changelog-23.html | 236 + thisweek/2020/05/11/changelog-24.html | 237 + thisweek/2020/05/18/changelog-25.html | 207 + thisweek/2020/05/25/changelog-26.html | 222 + thisweek/2020/06/01/changelog-27.html | 185 + thisweek/2020/06/08/changelog-28.html | 242 + thisweek/2020/06/15/changelog-29.html | 205 + thisweek/2020/06/22/changelog-30.html | 230 + thisweek/2020/06/29/changelog-31.html | 232 + thisweek/2020/07/06/changelog-32.html | 294 + thisweek/2020/07/13/changelog-33.html | 257 + thisweek/2020/07/20/changelog-34.html | 226 + thisweek/2020/07/27/changelog-35.html | 219 + thisweek/2020/08/03/changelog-36.html | 222 + thisweek/2020/08/10/changelog-37.html | 176 + thisweek/2020/08/17/changelog-38.html | 202 + thisweek/2020/08/24/changelog-39.html | 189 + thisweek/2020/08/31/changelog-40.html | 194 + thisweek/2020/09/07/changelog-41.html | 153 + thisweek/2020/09/14/changelog-42.html | 176 + thisweek/2020/09/21/changelog-43.html | 166 + thisweek/2020/09/28/changelog-44.html | 149 + thisweek/2020/10/05/changelog-45.html | 192 + thisweek/2020/10/12/changelog-46.html | 208 + thisweek/2020/10/19/changelog-47.html | 226 + thisweek/2020/10/26/changelog-48.html | 228 + thisweek/2020/11/02/changelog-49.html | 177 + thisweek/2020/11/09/changelog-50.html | 218 + thisweek/2020/11/16/changelog-51.html | 191 + thisweek/2020/11/23/changelog-52.html | 190 + thisweek/2020/11/30/changelog-53.html | 210 + thisweek/2020/12/07/changelog-54.html | 174 + thisweek/2020/12/14/changelog-55.html | 260 + thisweek/2020/12/21/changelog-56.html | 218 + thisweek/2020/12/28/changelog-57.html | 219 + thisweek/2021/01/04/changelog-58.html | 209 + thisweek/2021/01/11/changelog-59.html | 246 + thisweek/2021/01/18/changelog-60.html | 211 + thisweek/2021/01/25/changelog-61.html | 234 + thisweek/2021/02/01/changelog-62.html | 220 + thisweek/2021/02/08/changelog-63.html | 232 + thisweek/2021/02/15/changelog-64.html | 270 + thisweek/2021/02/22/changelog-65.html | 206 + thisweek/2021/03/01/changelog-66.html | 233 + thisweek/2021/03/08/changelog-67.html | 283 + thisweek/2021/03/15/changelog-68.html | 329 + thisweek/2021/03/22/changelog-69.html | 367 + thisweek/2021/03/29/changelog-70.html | 258 + thisweek/2021/04/05/changelog-71.html | 276 + thisweek/2021/04/12/changelog-72.html | 264 + thisweek/2021/04/19/changelog-73.html | 223 + thisweek/2021/04/26/changelog-74.html | 244 + thisweek/2021/05/03/changelog-75.html | 191 + thisweek/2021/05/10/changelog-76.html | 244 + thisweek/2021/05/17/changelog-77.html | 208 + thisweek/2021/05/24/changelog-78.html | 247 + thisweek/2021/05/31/changelog-79.html | 305 + thisweek/2021/06/07/changelog-80.html | 265 + thisweek/2021/06/14/changelog-81.html | 224 + thisweek/2021/06/21/changelog-82.html | 210 + thisweek/2021/06/28/changelog-83.html | 231 + thisweek/2021/07/05/changelog-84.html | 222 + thisweek/2021/07/12/changelog-85.html | 243 + thisweek/2021/07/19/changelog-86.html | 205 + thisweek/2021/07/26/changelog-87.html | 228 + thisweek/2021/08/02/changelog-88.html | 222 + thisweek/2021/08/09/changelog-89.html | 260 + thisweek/2021/08/16/changelog-90.html | 255 + thisweek/2021/08/23/changelog-91.html | 212 + thisweek/2021/08/30/changelog-92.html | 230 + thisweek/2021/09/06/changelog-93.html | 234 + thisweek/2021/09/13/changelog-94.html | 198 + thisweek/2021/09/20/changelog-95.html | 224 + thisweek/2021/09/27/changelog-96.html | 204 + thisweek/2021/10/04/changelog-97.html | 252 + thisweek/2021/10/11/changelog-98.html | 206 + thisweek/2021/10/18/changelog-99.html | 235 + thisweek/2021/10/25/changelog-100.html | 190 + thisweek/2021/11/01/changelog-101.html | 196 + thisweek/2021/11/08/changelog-102.html | 164 + thisweek/2021/11/15/changelog-103.html | 171 + thisweek/2021/11/22/changelog-104.html | 208 + thisweek/2021/11/29/changelog-105.html | 183 + thisweek/2021/12/06/changelog-106.html | 204 + thisweek/2021/12/13/changelog-107.html | 188 + thisweek/2021/12/20/changelog-108.html | 200 + thisweek/2021/12/27/changelog-109.html | 234 + thisweek/2022/01/03/changelog-110.html | 180 + thisweek/2022/01/10/changelog-111.html | 226 + thisweek/2022/01/17/changelog-112.html | 180 + thisweek/2022/01/24/changelog-113.html | 141 + thisweek/2022/01/31/changelog-114.html | 159 + thisweek/2022/02/07/changelog-115.html | 205 + thisweek/2022/02/14/changelog-116.html | 163 + thisweek/2022/02/21/changelog-117.html | 161 + thisweek/2022/02/28/changelog-118.html | 251 + thisweek/2022/03/07/changelog-119.html | 230 + thisweek/2022/03/14/changelog-120.html | 198 + thisweek/2022/03/21/changelog-121.html | 243 + thisweek/2022/03/28/changelog-122.html | 210 + thisweek/2022/04/04/changelog-123.html | 226 + thisweek/2022/04/11/changelog-124.html | 203 + thisweek/2022/04/18/changelog-125.html | 226 + thisweek/2022/04/25/changelog-126.html | 171 + thisweek/2022/05/02/changelog-127.html | 197 + thisweek/2022/05/09/changelog-128.html | 195 + thisweek/2022/05/16/changelog-129.html | 204 + thisweek/2022/05/17/changelog-129-5.html | 178 + thisweek/2022/05/23/changelog-130.html | 213 + thisweek/2022/05/30/changelog-131.html | 179 + thisweek/2022/06/06/changelog-132.html | 205 + thisweek/2022/06/13/changelog-133.html | 168 + thisweek/2022/06/20/changelog-134.html | 179 + thisweek/2022/06/27/changelog-135.html | 155 + thisweek/2022/07/04/changelog-136.html | 176 + thisweek/2022/07/11/changelog-137.html | 150 + thisweek/2022/07/18/changelog-138.html | 192 + thisweek/2022/07/25/changelog-139.html | 246 + thisweek/2022/08/01/changelog-140.html | 206 + thisweek/2022/08/08/changelog-141.html | 177 + thisweek/2022/08/15/changelog-142.html | 187 + thisweek/2022/08/22/changelog-143.html | 185 + thisweek/2022/08/29/changelog-144.html | 176 + thisweek/2022/09/05/changelog-145.html | 207 + thisweek/2022/09/12/changelog-146.html | 151 + thisweek/2022/09/19/changelog-147.html | 174 + thisweek/2022/09/26/changelog-148.html | 149 + thisweek/2022/10/03/changelog-149.html | 187 + thisweek/2022/10/10/changelog-150.html | 129 + thisweek/2022/10/17/changelog-151.html | 201 + thisweek/2022/10/24/changelog-152.html | 170 + thisweek/2022/10/31/changelog-153.html | 162 + thisweek/2022/11/07/changelog-154.html | 209 + thisweek/2022/11/14/changelog-155.html | 189 + thisweek/2022/11/21/changelog-156.html | 172 + thisweek/2022/11/28/changelog-157.html | 167 + thisweek/2022/12/05/changelog-158.html | 154 + thisweek/2022/12/12/changelog-159.html | 165 + thisweek/2022/12/19/changelog-160.html | 147 + thisweek/2022/12/26/changelog-161.html | 181 + thisweek/2023/01/02/changelog-162.html | 162 + thisweek/2023/01/09/changelog-163.html | 161 + thisweek/2023/01/16/changelog-164.html | 230 + thisweek/2023/01/23/changelog-165.html | 186 + thisweek/2023/01/30/changelog-166.html | 181 + thisweek/2023/02/06/changelog-167.html | 177 + thisweek/2023/02/13/changelog-168.html | 191 + thisweek/2023/02/20/changelog-169.html | 180 + thisweek/2023/02/27/changelog-170.html | 137 + thisweek/2023/03/06/changelog-171.html | 187 + thisweek/2023/03/13/changelog-172.html | 196 + thisweek/2023/03/20/changelog-173.html | 208 + thisweek/2023/03/27/changelog-174.html | 147 + thisweek/2023/04/03/changelog-175.html | 189 + thisweek/2023/04/10/changelog-176.html | 191 + thisweek/2023/04/17/changelog-177.html | 215 + thisweek/2023/04/24/changelog-178.html | 180 + thisweek/2023/05/01/changelog-179.html | 176 + thisweek/2023/05/08/changelog-180.html | 200 + thisweek/2023/05/15/changelog-181.html | 173 + thisweek/2023/05/22/changelog-182.html | 229 + thisweek/2023/05/29/changelog-183.html | 217 + thisweek/2023/06/05/changelog-184.html | 197 + thisweek/2023/06/12/changelog-185.html | 186 + thisweek/2023/06/19/changelog-186.html | 159 + thisweek/2023/06/26/changelog-187.html | 176 + thisweek/2023/07/03/changelog-188.html | 192 + thisweek/2023/07/10/changelog-189.html | 220 + thisweek/2023/07/17/changelog-190.html | 171 + thisweek/2023/07/24/changelog-191.html | 162 + thisweek/2023/07/31/changelog-192.html | 138 + thisweek/2023/08/07/changelog-193.html | 190 + thisweek/2023/08/14/changelog-194.html | 171 + thisweek/2023/08/21/changelog-195.html | 162 + thisweek/2023/08/28/changelog-196.html | 147 + thisweek/2023/09/04/changelog-197.html | 141 + thisweek/2023/09/11/changelog-198.html | 196 + thisweek/2023/09/18/changelog-199.html | 135 + thisweek/2023/09/25/changelog-200.html | 159 + thisweek/2023/10/02/changelog-201.html | 155 + thisweek/2023/10/09/changelog-202.html | 157 + thisweek/2023/10/16/changelog-203.html | 185 + 265 files changed, 69667 insertions(+) create mode 100644 .nojekyll create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 README.md create mode 100644 assets/blog/first-release/extend-selection.webm create mode 100644 assets/blog/first-release/fill-match-arms.webm create mode 100644 assets/blog/first-release/impl-iter.webm create mode 100644 assets/blog/first-release/new-mod.webm create mode 100644 assets/blog/first-release/return-completion.webm create mode 100644 assets/blog/first-release/run.webm create mode 100644 assets/blog/first-release/workspace-symbol.webm create mode 100644 assets/blog/how-to-make-a-light-bulb/bulb1.png create mode 100644 assets/blog/how-to-make-a-light-bulb/bulb2.png create mode 100644 assets/blog/how-to-make-a-light-bulb/emacs-helm.png create mode 100644 assets/browserconfig.xml create mode 100644 assets/fav/android-chrome-192x192.png create mode 100644 assets/fav/android-chrome-512x512.png create mode 100644 assets/fav/apple-touch-icon.png create mode 100644 assets/fav/favicon-16x16.png create mode 100644 assets/fav/favicon-32x32.png create mode 100644 assets/fav/favicon.ico create mode 100644 assets/fav/mstile-144x144.png create mode 100644 assets/fav/mstile-310x150.png create mode 100644 assets/fav/mstile-310x310.png create mode 100644 assets/fav/mstile-70x70.png create mode 100644 assets/fav/ra.svg create mode 100644 assets/fav/safari-pinned-tab.svg create mode 100644 assets/ferrous-logo.png create mode 100644 assets/github.svg create mode 100644 assets/mstile-150x150.png create mode 100644 assets/rust-analyzer.svg create mode 100644 assets/site.webmanifest create mode 100644 blog.html create mode 100644 blog/2019/10/16/finance.html create mode 100644 blog/2019/11/13/find-usages.html create mode 100644 blog/2020/02/11/2019-financial-report.html create mode 100644 blog/2020/03/30/macros-vs-rename.html create mode 100644 blog/2020/04/20/first-release.html create mode 100644 blog/2020/05/18/next-few-years.html create mode 100644 blog/2020/07/20/three-architectures-for-responsive-ide.html create mode 100644 blog/2020/08/20/financial-report.html create mode 100644 blog/2020/09/16/challeging-LR-parsing.html create mode 100644 blog/2020/09/28/how-to-make-a-light-bulb.html create mode 100644 blog/2020/10/24/introducing-ungrammar.html create mode 100644 blog/2020/12/04/measuring-memory-usage-in-rust.html create mode 100644 blog/2021/08/03/financial-report-3.html create mode 100644 blog/2021/11/21/ides-and-macros.html create mode 100644 blog/2021/12/30/2021-recap.html create mode 100644 blog/2023/07/24/durable-incrementality.html create mode 100644 css/asciidoctor.css create mode 100644 css/main.css create mode 100644 css/rouge-github.css create mode 100644 feed.xml create mode 100644 generated_assists.html create mode 100644 generated_config.html create mode 100644 generated_diagnostic.html create mode 100644 index.html create mode 100644 manual.html create mode 100644 redirects.json create mode 100644 thisweek.html create mode 100644 thisweek/2019/07/24/changelog-0.html create mode 100644 thisweek/2019/12/04/changelog-1.html create mode 100644 thisweek/2019/12/09/changelog-2.html create mode 100644 thisweek/2019/12/16/changelog-3.html create mode 100644 thisweek/2019/12/23/changelog-4.html create mode 100644 thisweek/2019/12/30/changelog-5.html create mode 100644 thisweek/2020/01/06/changelog-6.html create mode 100644 thisweek/2020/01/13/changelog-7.html create mode 100644 thisweek/2020/01/20/changelog-8.html create mode 100644 thisweek/2020/01/27/changelog-9.html create mode 100644 thisweek/2020/02/03/changelog-10.html create mode 100644 thisweek/2020/02/10/changelog-11.html create mode 100644 thisweek/2020/02/17/changelog-12.html create mode 100644 thisweek/2020/02/24/changelog-13.html create mode 100644 thisweek/2020/03/02/changelog-14.html create mode 100644 thisweek/2020/03/09/changelog-15.html create mode 100644 thisweek/2020/03/16/changelog-16.html create mode 100644 thisweek/2020/03/23/changelog-17.html create mode 100644 thisweek/2020/03/30/changelog-18.html create mode 100644 thisweek/2020/04/06/changelog-19.html create mode 100644 thisweek/2020/04/13/changelog-20.html create mode 100644 thisweek/2020/04/20/changelog-21.html create mode 100644 thisweek/2020/04/27/changelog-22.html create mode 100644 thisweek/2020/05/04/changelog-23.html create mode 100644 thisweek/2020/05/11/changelog-24.html create mode 100644 thisweek/2020/05/18/changelog-25.html create mode 100644 thisweek/2020/05/25/changelog-26.html create mode 100644 thisweek/2020/06/01/changelog-27.html create mode 100644 thisweek/2020/06/08/changelog-28.html create mode 100644 thisweek/2020/06/15/changelog-29.html create mode 100644 thisweek/2020/06/22/changelog-30.html create mode 100644 thisweek/2020/06/29/changelog-31.html create mode 100644 thisweek/2020/07/06/changelog-32.html create mode 100644 thisweek/2020/07/13/changelog-33.html create mode 100644 thisweek/2020/07/20/changelog-34.html create mode 100644 thisweek/2020/07/27/changelog-35.html create mode 100644 thisweek/2020/08/03/changelog-36.html create mode 100644 thisweek/2020/08/10/changelog-37.html create mode 100644 thisweek/2020/08/17/changelog-38.html create mode 100644 thisweek/2020/08/24/changelog-39.html create mode 100644 thisweek/2020/08/31/changelog-40.html create mode 100644 thisweek/2020/09/07/changelog-41.html create mode 100644 thisweek/2020/09/14/changelog-42.html create mode 100644 thisweek/2020/09/21/changelog-43.html create mode 100644 thisweek/2020/09/28/changelog-44.html create mode 100644 thisweek/2020/10/05/changelog-45.html create mode 100644 thisweek/2020/10/12/changelog-46.html create mode 100644 thisweek/2020/10/19/changelog-47.html create mode 100644 thisweek/2020/10/26/changelog-48.html create mode 100644 thisweek/2020/11/02/changelog-49.html create mode 100644 thisweek/2020/11/09/changelog-50.html create mode 100644 thisweek/2020/11/16/changelog-51.html create mode 100644 thisweek/2020/11/23/changelog-52.html create mode 100644 thisweek/2020/11/30/changelog-53.html create mode 100644 thisweek/2020/12/07/changelog-54.html create mode 100644 thisweek/2020/12/14/changelog-55.html create mode 100644 thisweek/2020/12/21/changelog-56.html create mode 100644 thisweek/2020/12/28/changelog-57.html create mode 100644 thisweek/2021/01/04/changelog-58.html create mode 100644 thisweek/2021/01/11/changelog-59.html create mode 100644 thisweek/2021/01/18/changelog-60.html create mode 100644 thisweek/2021/01/25/changelog-61.html create mode 100644 thisweek/2021/02/01/changelog-62.html create mode 100644 thisweek/2021/02/08/changelog-63.html create mode 100644 thisweek/2021/02/15/changelog-64.html create mode 100644 thisweek/2021/02/22/changelog-65.html create mode 100644 thisweek/2021/03/01/changelog-66.html create mode 100644 thisweek/2021/03/08/changelog-67.html create mode 100644 thisweek/2021/03/15/changelog-68.html create mode 100644 thisweek/2021/03/22/changelog-69.html create mode 100644 thisweek/2021/03/29/changelog-70.html create mode 100644 thisweek/2021/04/05/changelog-71.html create mode 100644 thisweek/2021/04/12/changelog-72.html create mode 100644 thisweek/2021/04/19/changelog-73.html create mode 100644 thisweek/2021/04/26/changelog-74.html create mode 100644 thisweek/2021/05/03/changelog-75.html create mode 100644 thisweek/2021/05/10/changelog-76.html create mode 100644 thisweek/2021/05/17/changelog-77.html create mode 100644 thisweek/2021/05/24/changelog-78.html create mode 100644 thisweek/2021/05/31/changelog-79.html create mode 100644 thisweek/2021/06/07/changelog-80.html create mode 100644 thisweek/2021/06/14/changelog-81.html create mode 100644 thisweek/2021/06/21/changelog-82.html create mode 100644 thisweek/2021/06/28/changelog-83.html create mode 100644 thisweek/2021/07/05/changelog-84.html create mode 100644 thisweek/2021/07/12/changelog-85.html create mode 100644 thisweek/2021/07/19/changelog-86.html create mode 100644 thisweek/2021/07/26/changelog-87.html create mode 100644 thisweek/2021/08/02/changelog-88.html create mode 100644 thisweek/2021/08/09/changelog-89.html create mode 100644 thisweek/2021/08/16/changelog-90.html create mode 100644 thisweek/2021/08/23/changelog-91.html create mode 100644 thisweek/2021/08/30/changelog-92.html create mode 100644 thisweek/2021/09/06/changelog-93.html create mode 100644 thisweek/2021/09/13/changelog-94.html create mode 100644 thisweek/2021/09/20/changelog-95.html create mode 100644 thisweek/2021/09/27/changelog-96.html create mode 100644 thisweek/2021/10/04/changelog-97.html create mode 100644 thisweek/2021/10/11/changelog-98.html create mode 100644 thisweek/2021/10/18/changelog-99.html create mode 100644 thisweek/2021/10/25/changelog-100.html create mode 100644 thisweek/2021/11/01/changelog-101.html create mode 100644 thisweek/2021/11/08/changelog-102.html create mode 100644 thisweek/2021/11/15/changelog-103.html create mode 100644 thisweek/2021/11/22/changelog-104.html create mode 100644 thisweek/2021/11/29/changelog-105.html create mode 100644 thisweek/2021/12/06/changelog-106.html create mode 100644 thisweek/2021/12/13/changelog-107.html create mode 100644 thisweek/2021/12/20/changelog-108.html create mode 100644 thisweek/2021/12/27/changelog-109.html create mode 100644 thisweek/2022/01/03/changelog-110.html create mode 100644 thisweek/2022/01/10/changelog-111.html create mode 100644 thisweek/2022/01/17/changelog-112.html create mode 100644 thisweek/2022/01/24/changelog-113.html create mode 100644 thisweek/2022/01/31/changelog-114.html create mode 100644 thisweek/2022/02/07/changelog-115.html create mode 100644 thisweek/2022/02/14/changelog-116.html create mode 100644 thisweek/2022/02/21/changelog-117.html create mode 100644 thisweek/2022/02/28/changelog-118.html create mode 100644 thisweek/2022/03/07/changelog-119.html create mode 100644 thisweek/2022/03/14/changelog-120.html create mode 100644 thisweek/2022/03/21/changelog-121.html create mode 100644 thisweek/2022/03/28/changelog-122.html create mode 100644 thisweek/2022/04/04/changelog-123.html create mode 100644 thisweek/2022/04/11/changelog-124.html create mode 100644 thisweek/2022/04/18/changelog-125.html create mode 100644 thisweek/2022/04/25/changelog-126.html create mode 100644 thisweek/2022/05/02/changelog-127.html create mode 100644 thisweek/2022/05/09/changelog-128.html create mode 100644 thisweek/2022/05/16/changelog-129.html create mode 100644 thisweek/2022/05/17/changelog-129-5.html create mode 100644 thisweek/2022/05/23/changelog-130.html create mode 100644 thisweek/2022/05/30/changelog-131.html create mode 100644 thisweek/2022/06/06/changelog-132.html create mode 100644 thisweek/2022/06/13/changelog-133.html create mode 100644 thisweek/2022/06/20/changelog-134.html create mode 100644 thisweek/2022/06/27/changelog-135.html create mode 100644 thisweek/2022/07/04/changelog-136.html create mode 100644 thisweek/2022/07/11/changelog-137.html create mode 100644 thisweek/2022/07/18/changelog-138.html create mode 100644 thisweek/2022/07/25/changelog-139.html create mode 100644 thisweek/2022/08/01/changelog-140.html create mode 100644 thisweek/2022/08/08/changelog-141.html create mode 100644 thisweek/2022/08/15/changelog-142.html create mode 100644 thisweek/2022/08/22/changelog-143.html create mode 100644 thisweek/2022/08/29/changelog-144.html create mode 100644 thisweek/2022/09/05/changelog-145.html create mode 100644 thisweek/2022/09/12/changelog-146.html create mode 100644 thisweek/2022/09/19/changelog-147.html create mode 100644 thisweek/2022/09/26/changelog-148.html create mode 100644 thisweek/2022/10/03/changelog-149.html create mode 100644 thisweek/2022/10/10/changelog-150.html create mode 100644 thisweek/2022/10/17/changelog-151.html create mode 100644 thisweek/2022/10/24/changelog-152.html create mode 100644 thisweek/2022/10/31/changelog-153.html create mode 100644 thisweek/2022/11/07/changelog-154.html create mode 100644 thisweek/2022/11/14/changelog-155.html create mode 100644 thisweek/2022/11/21/changelog-156.html create mode 100644 thisweek/2022/11/28/changelog-157.html create mode 100644 thisweek/2022/12/05/changelog-158.html create mode 100644 thisweek/2022/12/12/changelog-159.html create mode 100644 thisweek/2022/12/19/changelog-160.html create mode 100644 thisweek/2022/12/26/changelog-161.html create mode 100644 thisweek/2023/01/02/changelog-162.html create mode 100644 thisweek/2023/01/09/changelog-163.html create mode 100644 thisweek/2023/01/16/changelog-164.html create mode 100644 thisweek/2023/01/23/changelog-165.html create mode 100644 thisweek/2023/01/30/changelog-166.html create mode 100644 thisweek/2023/02/06/changelog-167.html create mode 100644 thisweek/2023/02/13/changelog-168.html create mode 100644 thisweek/2023/02/20/changelog-169.html create mode 100644 thisweek/2023/02/27/changelog-170.html create mode 100644 thisweek/2023/03/06/changelog-171.html create mode 100644 thisweek/2023/03/13/changelog-172.html create mode 100644 thisweek/2023/03/20/changelog-173.html create mode 100644 thisweek/2023/03/27/changelog-174.html create mode 100644 thisweek/2023/04/03/changelog-175.html create mode 100644 thisweek/2023/04/10/changelog-176.html create mode 100644 thisweek/2023/04/17/changelog-177.html create mode 100644 thisweek/2023/04/24/changelog-178.html create mode 100644 thisweek/2023/05/01/changelog-179.html create mode 100644 thisweek/2023/05/08/changelog-180.html create mode 100644 thisweek/2023/05/15/changelog-181.html create mode 100644 thisweek/2023/05/22/changelog-182.html create mode 100644 thisweek/2023/05/29/changelog-183.html create mode 100644 thisweek/2023/06/05/changelog-184.html create mode 100644 thisweek/2023/06/12/changelog-185.html create mode 100644 thisweek/2023/06/19/changelog-186.html create mode 100644 thisweek/2023/06/26/changelog-187.html create mode 100644 thisweek/2023/07/03/changelog-188.html create mode 100644 thisweek/2023/07/10/changelog-189.html create mode 100644 thisweek/2023/07/17/changelog-190.html create mode 100644 thisweek/2023/07/24/changelog-191.html create mode 100644 thisweek/2023/07/31/changelog-192.html create mode 100644 thisweek/2023/08/07/changelog-193.html create mode 100644 thisweek/2023/08/14/changelog-194.html create mode 100644 thisweek/2023/08/21/changelog-195.html create mode 100644 thisweek/2023/08/28/changelog-196.html create mode 100644 thisweek/2023/09/04/changelog-197.html create mode 100644 thisweek/2023/09/11/changelog-198.html create mode 100644 thisweek/2023/09/18/changelog-199.html create mode 100644 thisweek/2023/09/25/changelog-200.html create mode 100644 thisweek/2023/10/02/changelog-201.html create mode 100644 thisweek/2023/10/09/changelog-202.html create mode 100644 thisweek/2023/10/16/changelog-203.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000..7098091a --- /dev/null +++ b/Gemfile @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem "jekyll", "~> 3.8" + +group :jekyll_plugins do + gem 'jekyll-asciidoc' + gem 'jekyll-redirect-from' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 00000000..2d332e61 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,71 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + asciidoctor (2.0.10) + colorator (1.1.0) + concurrent-ruby (1.1.7) + em-websocket (0.5.1) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + eventmachine (1.2.7) + ffi (1.13.1) + forwardable-extended (2.6.0) + http_parser.rb (0.6.0) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jekyll (3.9.0) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (>= 1.17, < 3) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-asciidoc (3.0.0) + asciidoctor (>= 1.5.0) + jekyll (>= 3.0.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-watch (2.2.1) + listen (~> 3.0) + kramdown (2.3.0) + rexml + liquid (4.0.3) + listen (3.2.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (4.0.5) + rb-fsevent (0.10.4) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.4) + rouge (3.22.0) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + +PLATFORMS + ruby + +DEPENDENCIES + jekyll (~> 3.8) + jekyll-asciidoc + jekyll-redirect-from + +BUNDLED WITH + 2.1.4 diff --git a/README.md b/README.md new file mode 100644 index 00000000..a1fc13b8 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# rust-analyzer.github.io + +[![Build Status](https://travis-ci.org/rust-analyzer/rust-analyzer.github.io.svg?branch=src)](https://travis-ci.org/rust-analyzer/rust-analyzer.github.io) + +Website for rust-analyzer. To report bugs in rust-analyzer itself, see https://github.com/rust-analyzer/rust-analyzer. + +## Building + +``` +$ bundle --path=.bundle/gems +$ bundle exec jekyll serve +``` + +The markup language we use (.adoc) is AsciiDoctor. It is awesome :-). + +[AsciiDoctor Syntax Quick Reference](https://asciidoctor.org/docs/asciidoc-syntax-quick-reference/). diff --git a/assets/blog/first-release/extend-selection.webm b/assets/blog/first-release/extend-selection.webm new file mode 100644 index 0000000000000000000000000000000000000000..231b5d217a02db874603977f3d29599f52ebfdfc GIT binary patch literal 60203 zcmd3MQ;;w`)8%;P8QZpP+qP}nwr$(CZQHgz^NeTTZ@;(x+P&EOO{G(PlAPppS1MPH zDY91t2=Kofo?vJIpy1zs>@fgD@F@U7FfiE7#Lz}CEC5I_Bmf9q$=~e1TQ8pxWU`$3 zxn#Pcl&XSJBq~gmssm1Bx}yIoVgI+Z|Kaie4-drXA1(jG zCH+6S8UKW7^iP-!^#3t>d}|9sS9^CFS9^~CIfwKAaSowKQMj;*qJXl5oUCwIGCe)# ze>yuY6aBvp002*@)#bm6$B51X0E+MnUjhIC`~xL|1ObHQ(MaLhiLud5(ShatHr{*V z&Rp%X_I~VM`L=%d{c?WTzVwEE`L_LH-hbH6Kiz)B-hKOa?Y{G7ekp#$PQQM)e#w4y zzV@E*p7Ef*^#1zt9sg$jCjb0Sy!#&TZN2Gjo&Fv8+I!>+`_g;;9s9z&c?x;^!F%63 z@usU6kNU*3xc}B`_;Ff!h11#SXzVae(<}ez3pg5kF4{_4^ZWC4CUOCPrFTD@(0r7( zzB1xl_#_!}(xp{sd{=Wp+m8FOgT__g-nViW(* zAjb~d;fU}Vr9@JfHL#LHjww4(Ymh%-X?!H)) zAtlR7|A^me8$KCTN2sn~cSl{1W3CqWp+lX)UmxkfMWh)5-aW`%AtDW?>hM_gW?|=N zHhb_J{F#2h*=(DM^MoLa7WwqsW6Ak^10fLirbN^^@w1|vRk+V<>QHdFb*2+~UBv*fz(0 zcVf%7q2*2Rvz|>l)0abe^!sudx*qibe8>E$1&Qa z>{&TvT`}j^Dq89S3Ox#uiQi;6=fEp|gc~Coesis}WHsCg!#}prG>?UaMLEG>Bxl^# z|CxZUb2hGq) zq-1!^GR_Y~f|wd8!yvNQc4E1KPL0cp_e#w1yNUht8lz^1(qzmKz{IZW^K0xfE)HGp zX*9ka9F2{Uwfgv+OAV*JH7OA81k>U7;T%n7K|jz{z1n5|2CyOCvK0eLsyUcMe&Y&i z5y^r?*T_NX&A>_^C(!(aE>}p_U}>+acW34SbDOi`Ugl1~)4FEDbcq4{En9dxNu9hl ztsSv}Dcp_baeDeR;0(tT3z2)Lt|EO=31FQ0rMwjC6qAuJ1HY1(`EG{QFpsVvDKQZWs+q`g-@Oe0;T1rhadh- zCf!x+hoMW3zyCzS9H9AwM2(q9-R`eT^BIy}ltl857i9z=H(?ZQsLG|I|H)+|IPw0@ zeXiK9g^ykXWQ{>U@YxvMTIUSouEK*+Vxw%6IP1mwPFQ|A_rt=G_7=u#ha^fi`8QHh zp?a!s{5>O76IS^F<7t#M7aI+;o@6w5?R1nkGns+Ez@=@sWY3;4i? z(VHf_*3ETkGk{fdI4@56!0CLp8{Oi-DL<=REfK_WAMc$(V2P%M_9mEYOy2lbn04u`F1NFijl_v&$7iuL#T%0xz3a66kx=#$^gDT6)f()M zK|z8DtMhF1bHlN&8-C&|*Qt~@^N3y}cG{x^cLc9ES!Y}mPx+o4SrGPN)_ju~3yx_I zN}i^07|6b&DeCO^|9u1-GFQ$db9*OwL{!o`WrfHE)Zw|1&%uFjR{adheIa1L!Q48gR==-fa`q{{GQ;WNaQ; zd3thv32Ht(ARLUa8;8&Daf^YYn8go6Osyx{@!!>xG@597o}IA~C+L zF9_JX0u0sh@xv$oQD3?6F3iyw8Aqo>uUx@;Y z7}Pr)7uV5E*+VCJnT^{5Ry--Z^UvPKb;)!VBN8GXzPGv?B$xe>NRnqC8yT{+U!8-YmCwNT zLVe6mCw?|&(8!)Xc3sj$M+73<})9 zuR3L7S-HzK38|0StmAF#@~t9TzTK_rk54RQbV1L~e~+D_`#ZVV)gNFzIWIUqe)=nj zLfl20rAN2`_1>;rNG^lQ2k9kY*TctDE%lUh9sSAbe;JX9QXvp zd0C^?P7M+2kyWK?qz{3Cg6w6c9`si{O=Ky`xva$r)@VTUg0xA%g8ua;RV0D#mqT8a zgVr2w{~c#vv!}!X*PY;4JF>4<5Y05)pi}>WbBpc|_il~_j!DqQjE3UaTzkZChCHBs zk>-id@EGdeWcJ9+Rw=75jF!2pjy*ESVeWi!56HWx<7j_^GSuvW zeb2KafQ+a(Sm?UWD>Q$Pv4RYn@DmfAvy#JHDEJRN!N)jI=^aO1MOGiKg1_nC6RbV3cnL zmH~0qM;%2e&z-ESzhcK`B5~LN0wwFr8Sj2SO5UV*&K_j}O!}2HWWw6y25jxptGER! zZsLI{fccVb>Z0={pU>tm8o+{*CM9DlAFE=|<0130%vS4QzZYly^=v%9l>6%qJk&|| zns=Fyam!K*)XB5BP+|EO!DGuwesq^IM&9oalE@sT{r&D3K+b#&--fd7^JZT*vjAjQ zgM3m{l(N*U?RdV(P zM_D28QzEBh{jtg@uGtibz`jN%dHE9sPdWev_Gxs3xg{6uqezmOOwS~v6zLLUjTY5G z<9y4rmKFn2{OPPu93Rg7&-1W9n>Bg+@L5ScV0d~+B4S1_KR%9g&jP*3e7rY?=P{g) z3fE%zdb51x`r#q3UsFV=dLtCTlP=`v8D=|puk~+`j~HIcdq)UXcF31BPpdMrc+C+x z_<_l_TcqIFAd*vUDkd0zhX(frU$%U~PQT*pQoeMU{W#In(W2*-g#t&n&5O{O@;>gF zvvQ#Ai|x(`d}{o_UT`%jum`q*(=i6*4QeI`l4xk}fyoRdZm*GmF^%^+90DI+xQ=V}RA75lGId5yHT$@GqKe;+!li9vpqqTj7wt571^;>y|_ zw5p1|q>aedx{3WQdZ;8eQzzlxdQUeSc|7Q>`5dW z&AQBCI`A_B=r4z9D*2KpavkO-q{GzK`>hF?P@vQw(s8Yb7%}}@|3)I|pP7XF%iXtn&ozzJ1J@0+Y z?QM z{s_&yzs;t`?a?Bm(OOD>8huEhW$X(1LEz%p>S8Sadja68d+zS$n+*=YSQl*d*5Wu) z6pMFV{csxvx`LPh51y<<6VDPEZoth*cdqe4$U(Yue1CX%=8~ADUax{2z*_~}D3Km1 zx0Wxt)MMjuXcBD$!AfuwvIKX}%)Y`?gyI(3m-75RM3Ai>k6CTck0OmN8qB%4vx?R& z7XNEPNtZicQ9k1>Y~<^R6Umo0V9D|85MIsG7K}peFHG z2^fFeR2oeVW&62h)=r=YeeZGmsFm)fYORpxI=*(!^UNq1_?>N|{#ShBrXlTdGj2}| z_f^EMZ|R_b$G0B55l)Eb0Sf_KIw0|>UO}t4yHD(en43;C@wBbUtK~V-@38hm1uBKv z^BLcNH5}J9{~%9;rgS;(r60JnDl*F&3$|DifDYmE)9B=Y9=0X)XR)&L0j|bMgz%Wa zfEbdAPogLr_fB`=rKB75YOWkfwU0bMY%ZxN^wJ$@<^?Mg8OfGtqhn9oqo%4iv6GlA zhUIP_H+KR<=IZBuIQ}mjZ|D4rS_1d4zTa5@Qg`fKaQTRx`tj&vj@%bYsQ^*a2`@ok z!fq|Zfge zBD^KS`GB~W`#Gyi&hMYf`;M{t_kf7;ivX9FiD1?8O*Dwv^n&(z@EMZpIGBKMP0x}N z!j2?@fvahLTooLFmxT6p4saj+vp05uvjxdDc@Z$K)=;?@Hsj00gCOcupWcDGSu$V! zT9p=$V^p}VQYCYeQQM|U!rmxXW_JqI{iEi2g^--UO@)f=g@h@T6vkkZMw!C->H8#* zl_cy{yqZLeKiN}H=`l`O?U{WRnFt)_d|Q(R)Hc-lXriPc6jZ?7D6KIFQ%v89?T zZ-3fYE+Ppxns$QRr`gHPq9+*pRMk!BE$2Aqzw%&NLIU4sao8`()lYZ$kK_E&JGq8g zn;dF1j!Q`r8MAbGFUy8m)(Z13Z|n_di-ywsGavr~AE>ot4ui6m%IQb}D!hj$4~%PD$XY6aadPq4zg^)$ zh1BaBuzIBR+0&HAq}Us?8kPiyEi2n>!@+_8^Lupd*^iFF9*s_YtH^s@LCa1hpXtkd zG9EUK`J@LBS1HE#d4#KDLK{sXh>B>@))`hj{w8jM?u*tV&Koq7{>4p2)vj1n86kv>cWTnRom+ts8XoOF9DP@Nl5h2 zfBT8AWet`2+;p86^_ORFsUlUXp5eyFrYe4?g}LhLp&1y8j?g4{)xks!uC_67iqVH* z(bki@%K(c9<|2)1O^{-G<(CM)(|__c=W3esdAt7VaHV`si1gcyA61V#oKhX~``sjT z0-7JOYFiZu)4FGz@wH*T>dOwnXj|fTq3DlV(vWt()kVS7V9fh-H7wVRPr-~Jl=O|) z8HZ&XCo)$HoiX6f^;9s;xYj2}H-}upqXtvc&`?}kT*iCG*!!;=(ls`@IZ5aoG-|jv zQ6IameZ9>3>XuXqG$(XHANkVtbt(XueT(~0?d8$A9O1*c`ls(^j+KsKecop=5a0Av z5*xnKn4Q|^SsxU;1Q#iu*!G(Lu2KqNgBK!Bx4B(t40^Iaw=c~(&9}R~aT*OC5x)sE zlC#vhxK577#irTD?MF~2J_R;dw8W<-if(FtBZ7%tTaO2LUeEc5UAwziJ|GI}yH>$sdr0r@ZO!SR9s-NZh7`1_ql zrBRZOCLoyHd{Cx+ddTF*#qZ1C5f?`j#k#LysxbkUr=tG5PlKmtwLO2k!ko~T*LQKN|=X)$qP5*Se#ogQWXOL@e z2LFO8;s#+W1TA`eaAoLOLvxFtUmyrC(R8<{z+}wsTt#WDsYvugfSxPCG~uX{AFx3| z?XBnDtw*{Se=fD=A`s;521!VuvOD4VPI>`Bv00{8E4MG^m;fuf z*xh57=K1Q#K|MH(lWse%Z1j0Gk5FgtE_&dTsZZ~_+>e!1?T28X*lp6_C-B$mWs}1D zLgc*Uh*9IonO$mxXAb@Bi=$)*+rVP!OTIJ~@w60+< zb`D-sIAAdnTARuXzVbR88I4-f9@x;JH48_!R67^_XmA2XL>`1~7c;?-F;HGh5WcnJ zjE8VPQJSv2%bl@z&;tWy(|9mX_O(ZK7engS)WV+W6P6;t<-`-g|WtmmHp=$mjz&YJfs@02?Y8JximtNgF|c>V%S?Q@3E0+n%P0nB`&_m zFosxQ!xs3DFCI`o#>v~%)9`T(+=n)Q|9tm(Y;~wPTAUbtSS`25_V9Dlo)TKtosq0Z zDAhI5tJo9J{UgLAzf|@pXf0&-6aI}Dii=vix@DfuYfj#k7LQ*pU(T)7MFNqC=Iv40 z4}x^kO#2YQ#+Gb1BQb0G2Uf+!9v&Wdwvt1$#kQ-&MG-uMuysPnJg=LB(@xJBE5|dN zsA&tdQfK|^VGvfYQ1Bd8RzoUQHu=E6um35(W2w)?f4JWAxDS<~*wJt9(j*h?Hhsrv zt-v1Sp^gC>kpzp71P7@PI{Rqxm)J>tqk%Z<3RbScYbOCf<)CNP|I)jC70defgsJe7 znX0}gsexTKIHedvX3N0I9@g!@1 z+i7T~gL}ECfAlEg6%(UYO48Qu3WS$MI~%ff!k)a?r-J9wV8Pz7@fu#E>QxQx`gU2t zIf#LI{(dyoSUJu*wLM5QS^>=&Re&viYdM>z+F{VI35uih(FXt85tRlo z=nYY4xyIdvR(FH<_BtYjdjebUuT9Z(W4LK(I1kp=5X5?!XpH$@ z?#-;=a@Xq+$;+j|tkxs^cfAM6w`>>l-#3_(K=ltjCzm#z)SLGMz5s7)9AR;$EZZ#&Au zV`c?z-}r~mPS-`cPBc^P5$s(SR~GLnj~mnbiRh2gN~l_ZzcKCp!P5J?R8Zx)r5UZF za>hmE*=&$OmY>p`bsU6{zEzfDq!e-U(KB{JskEF(w9ao_ZK6HrSm=OSoZ;Vg{E1Wv zS}9y6ja2|UYYY-;w+Vw;*Rif&l648mVyXSJb;4@DHMH2{`#ZCSCa#AVzm7h?p6^>9qTkzWs(*$C z81NS=9$Z?GzxaNo$1J6G_zSVL3HnH>3^slhZyPC1R zU&lpSud{D_!#v!`ICNnK>K$`Mmt8wi=74KNrnph3HGsM>PWE~ zzf)(ubtu&)7|kEwk*e?Ja%1fzLKt;7d~Q^Fo9z3+Wu6WdUSofkc64L44>=A8w;+GP0An+>k?ZvtE}EAL1Dhi$Pp$)b(PDs5H!y4rd=2=pL0M(SU6- zqQ1Ikq zHWq3XSIpjxku!+6MjiFg!bc!m70cT%^jL8EbW)P9yhm~oW*K-+#le3&-`FG)9 z{3Fq$htbeXWXyX%^l=p+Y_*dX&#Jmy!E3>TVw(0l@Yo%(NUHp)Dj&K|MQU$nM}{w` zhhu3x zn%VhadDhBN=(W+WOZCN(rCh2iV1_*J>l@^F#wztA`$dP#jifJNyXwZqWhW)~9#GLn zRjHHMABVubh?hXRbCILcPF`Zij^s2b_0c~~A+hR`)XXD^dGzX9N`Nm%9^nXp#FUHD z2P>Af_|aia@)1=wQ5nZPLba3tzV06h{PTV!v6AWAmPisV*?LqE<>Ivv-XPG@FB3H+IvkQ zA7=OB2&H+E&ZSk6r7h5h3s5GkR&SJuQt4cDP1e!E^QaZq9g=lkE(INlO0nQLWfI#m z6zB;j3W#`kDpG!AWI4l0TGGWyEqQs75_dGIkSe~glEJk0Zy~yaP|X{c8@X+ zn@q~YRxq=3tXk6EJ3f9r{)b;k`#t(jB|~lw6@;oY5B-ot<6dLJ;s^#)7SDcKuV`Co zdN*isn9*Dx!tZRbfa>Oui1en=ee2QN`HV@_*| zRV}U4wxASW|8MioyDh*dsCmn+qq?NfH?wD6!e(d&t&FW_N-fpC2GimwTW73cdeU}; zM)Tc^`&jT&Xvtdo*1Kd}FXvsPPRVkaoU4e)`?L~zRBU$#MM80Ya21qd>M!N~Vvoe- zMiYx4pBbCJ56Fv6aj%3=hD#(0k7p3p95^}Nd~0duqKvhZmW}pSZ+byI6~Pz6xvId# z?nE38#E7PLNp^E*1YgIp^jYCCeF#7cO7^O2i=L_kqt|WksdAvXZPd@I6kF)X$&kJ1l9F1bm$G69rC#qEpmw}2YGI!G-(uBp=!iD{JKq{I>pVo0V zEl@KqvgyhbiOlE1Y`kFR#L8DvaIl9aT7qe#0sS?~yu+R}rN#wSORie!`>kCsr?+wT z^e$as%G<-B<}kE!#HfbR6u^FiehOh=xcS9XHlxtG(?TsWb>+`5dI=h1CtpOw=RsMF@H4Yz<0>Kq^4Va>KrOK8?{ ze3|=QJXaXvgAl4n+qa2n7~ZTn8u7t|q3KV36QeXnf-2kQ4PGdTH*usV_8%a<383sM#Q}Oy3Dh+7yhw<(zr*#SyGMM@ z1y`EkLS9wWilkh}@;L^QLReXTvQ6hw?=hFm&!9AkDvoeMoSu~1AK6U&+G7z`sp5ia zABwTZHbg%qA6JU{_5|&3@|s`ZnbHfV@hf>Gd!6a+l<%k)dTAP8Qo|+-N8X=H^^q-$teJ0`#){|8bm^J z3}-1w1Bp4ug|_#{m&Z61EzlVdxVo5?S>%~@UBaFRq*U|=y0Zvl1)go?~+(1>qU zC|P3lgsB@}kzAP`JAjJ=RH&Uz1?p zdMDZ1TN>S8{pH!6$Rr;k(PY@=6DA%f!6tv|>g}c2`m{LC+o+e~Xw?nUyPY7bb&S5x zlC+Z4Rz{YPG-ZARG^Ia_U7oZ0=h|cLFUnDS?~*`MJa)ecwhgsJk_rI?Qoj}=4Vije z51j(*ey+TkFSUAAz~sdxdp-+bw4r+-DszzXpQDB?=x&E{k=)W#j(V+&B$~j+QKkFr zVjW^ghl3GnWvmxZn8{G?9Z(w>70HBK81z(vB=e>@&|wSEI_--%jYNBj3!fU`YPKk> zld;(62XO9SI*ae#74o4ELzFCck>i9k-R+}1_Nz>#%9^!yQRzf*@S0p)NRy?cHTra! z>p3T1j-i97Vzfa9+f4x}S8c|FBn)~8*@%}E7Xl(YSN3uLVo2L1)sRmTZ_-T{=dksX zYJVr51@dUfv_%9F!2J{v=6B^c8hk3sPw*)TXfhpZ8q_e3tln2B5NKAtS?8kyxbn-u z_}kyBOybvs07qpS0T9x|$?@c^2Tu1aZ1Cat>)`Vm<3R-h)uLWtEcHD>aS#g|ip!Xo z05E&HhQPvV%U;~F;X!m~1hDhBWxS2qP|B3X1!nrvL3x@SExN@!yv*yE0ILzn-C4A? zK!~93wW>1)-VAJ6{vMUs4XKVBhvSW@_bcD9clJV^B5JnMYo-1Nq4@kA$Bbd-@x`CA z-|@0HN|-#&Wgc7Hrjs@=AUrj4TgkWd&K<*SuWxZJHl(fJ@5-yQ;A?IqU?C(iBM_~Z zc=vq=#VtC+c0X84cR5^(K*G?XKgd=Ixf}-#F%pCjHnbV zB(y4+4b&b_rv6yTZy&jns$62J;yiF1$a%svr!*oE4jfR32*`|tI{r?=idf655@zn! zImwkqN(tj*dL=!&Qy3vaq|q`P`$&xW2$d z`}(`m+ks+##fYzlE_aOyoDI>llPWlVzQpFjDBaic(ndVy6AbKOx6tb5#A>!?V{b|R zih>27<*}~FfefUAk|d)gOm)L4bfb-tAEKVcjaiVRT#_*h*q8$0Njybz&o>iMc=$Sp zA#ES3lV4W?Eg$&01~b(Zu`9f6+K>SI+a0TgD4B*&#*|2G=^e;-2_duaP)P%X`$(D)*h;KOY2b-x~r>41aM?D3x1GHB{L)SS$REB z{wC<)*}jdqJ9QGMPgeTv)XDgB#`F#!{`9$J7ZuZeBsm&T&#t$h!Zn7jihMG8O3+FK zWFxG>l~@?K?(8$dh#8A)vl)i8A+(8 zXWE#Daj?#pt4`u{eR?H9b{k>1gEYE2lZ=UBk@Du*i(;#ULAQC&SiovI3TzE&j9AJ| zIWfj|dh4=6CX+?WO?kVMTUC=RX=pqf$Z&;Jh&6_hk|{+<5HdC$d7kkOK=_$=t+`bE zd$eT9A**g4(yt3vmX?%?FH|C_9m}~qs6!U)$&0HbnA4G&bwcl9=LB0DtWsK$ugED? zvSiX?V^ApA_wE|eReiab&Xc|{;h2j7U*)#DD=B;V{&U7gtjJpA%`<6M_wu-l&!iYE z^w{qX@!BO}kB8fdVqMHr-fKG&&Vh^d5eAfKt0&Ayq5=lQ1WX~4_|3;tuRwrpt|r*MIfN_!I(0oobBhC9#Bvvv zi<}7_plvi@4KuQz{HSV$E2dF$4$H%2Ge1>>Q*VUL_D*OY7_3bct#v}$cDqKEKW|AO z4zUIs6i}f_xwV=YFguq1Tc?t)aLm0mA4|l z=pj;MrZYe7x&bAI_|urr%Cz87%2Yv+9Y}N8jtYZ%K=3o zP?mH8gU=UfN5##S?VP|fNCJO> z%cupS3ZNFHr$7w~V{_&SKP(B%-DcVq+$KI2|9_(0toq-Pq5Rho3|lY!NM zcDO4`APi7tE42clni>ba_9oHyRijGDsut~oFE9Q)JA_3v$)~^8nR%zbmGwD766JxZ zFka;%L!N|n))peG0EQ93TrjsNChSsK#*<_CN>_dGDG9=X7uF|g!DBr71o|wF$;UU) zp@%d;%<0@urhCYTs2u076-)W~(8fC9z^+>THAztzqrZLAQUbI(K7~#@2PPmTk-(2k z-xWYWyq7ddz$q(G$RzJT!Ltr(9UYE~)1$@xV#quG&2`5_tHDoiMVmM{Rfftj@#g2x zWk_%6EyNA!E`!}ws3iOW2oa|%^DTtx1Kbp1Fm0WWC$4WwM;i!)_29FZ8`7uul>RCs zX%p!Fp1O?@iDGU245#UQyAMHx&c_az5)#<)f7^z5h&oDw5Yz@iH@@4)ed;rJb zl1l@k=m)&(%XP>8L~`L~h;eWH<1c?;WYQ`6xotmD_A^0H5HVJQ7~ zR5u2V&oXUiL6%n!*w|bCY3%4w(REg}0h1&FR4lD#e@bo_p?q$qa$Tnh&)|~hlpXW) zcCSAImO1nOr~uV4Mn7mf5$G6o*(F2j2~x)sL|{*z+zClEl>=BANAU-L-7)Zs0xX1@ zIm}q-Dim!4C4u57Lh<9+3n3FjVvNiwHM_!j**bi_n+5T~Zq!Pz!pbDckN5-Zj=!1m zNowXV<5o#(hva#82AndbSx2PLsw?S^p%{>LkiIc(X8Z=DFU>2=Xe83MNdKbU`_F67kTh8a`<$tJ1pQKH%)USKfxwdEfI|h2dF_+Z;i~eh&#KzXae?;qd9-`* zE=q6+{Zkn&2J6?3<6|CG1dvaK7F%%PaTnzbf%~+Pi`5=@OdQ3vQ9hB0{(7X{Qrit-cSxLgJ*q#1S#=W=l78!7_4cQ6~Lye!) z!^}J1LQ9SC?dyv~>a*f`JUEB%A9|Rr`g}kp4E7$qQ5ZzVrqaE_)sxyxi}ZHApGpK+ z_fjQyD;~@DoC6R_bMf`K?E=50J$<86%ddmfz~k>2{U$JUJxCne-~64SEwL>5YN@hwFwY!S=cx(>{v)uG}+7nD4^bX-IP%R#ZI^ z=nj~OLaL+{{C4&S7BH`7V>4GwI#}EhEAx>8vW*PANs2-wC`F#WFJuc81O~$qCN6(A zV~g)S@6xv_hPk=kUW)RBOQ!(>IEftnGWL?yH4~B2gl}sUyQSUOOt{hAYpPH8+&C%R?Y!BmNSuX%Etzvp29_pKm-yPrA^>E zSi5Xc26gd8Zpt3V2M_zi!ChoeC*7MW!N-OE5Y0Yp(T<39_A$9?Or~l^@ZlSe_+3Zi zx;KV_kD*M%{`z7Ukjn140UFIq$#j?@L;AMVIcO5um%y*IYu&ninw)D#8diD9T6Yfo zwwg$YJ*Jj-8D#MuhG^>MW!;Dx= zdU9O(%v=%7wTkxN+gQXKPtqx|(*+O%yGda;NE#O6d8IH38&eFHrl?KV$LMoQ1)xWr&@uC= zO92|0XTE4XeTSRoNs%k51S40QPu2CY%!mRag*-1u=+4a|-V2w6wU+6n!ig`cpDceU zz}<)2=u$D}=!>+q*DZlj!taQrmKGX>KVhli&NHN;H*rHDO?=Bw@(U7>#QFw%)fH%7 z^#xy*_I7iri6l1#k*iFkS-(WIYpLlWr5>5EM zP$gY%IYc7S=eVk7pup|;{##w$hev9z;*Lbad|5tkXPArpz7oMevzWd@9I)-8m1SE# zD|=GW!j$;k(7>%H43>YjtE8Iz#}t?rZpM{n;Ff#H;Fgkq1ac+z&O-CMAXM9LrRjWH z{ZipCXqE}-p%|GxnJ;J@+9X_b@Q}VWEofD9zcA(0vAlU*GKrE_srJzdoCT>kLy0F+ z=-mA7S~Sfe2c@W6DibR1Z)CN=5wE%&l!A62B=3+HZ^|0Q@-8qkoc zwUP}r%}uWMzyrmcynhijs#-YNma^Jl=wM1YG!SjblN-Re!-ZqeNkSbcr(al2|99l? zj913-MU(1YnyXEEACT1IRkH64BhBrY*&k$|w?1YRoz?A!oa2xk!fzoO%MOov}uzM%|(A9w$W}$D4y4GYqzmq3Qhq zHwwa#r!sbzYK23_GxgBh-0j_p;nLP9B!ARUCNLH(lFOsgjlh2^+AjXkfoJ?vop#8o zsiFF~sg}rj2Je<@zIS-c{%p;T}p}-wV^DfuJlU;;7qM zmBOH5#Xw#lPwC@8E|=_K)b^~1(d$3-2aFU}5J4QtOrA3?WsfIJ-HRh9*>pFVb2yXf&!8ilm|XAi!!RHH&I{7e50!(IJ){oNs-vT?bK5m8H>OKn{% zztuzjNRzvePpXutF)IJ;a%tLKL#mq#UbFySXvNG6X^mWY!*Fs6pB-?q3>q5zGOhk5F=3AGB!9m))?+G1DJWp}maQ zwHfhMW#L_dsP^1~S@XU7L*|u6=kHN0W-6TR!^WOS2L{BHf6B2zpg$rTVR(c|q6oZW zF-L%J+FI1(D4I*e?4$=eb_ua5A-Bvo?U*mZb2doB$x! zYer0KiixApDCBt>&w)RSj&Y(`yQOadLu)n2lfR&JQ!qAD zsKXbr2{Oj-)1<>m5OSGDMD=UyJ!z{GN1w`B7lI8TCKMEf&A)+|yijeI*;IAV z=T)@o9$5f%s^zsV!kpDvt-p$BXpKZzHi35!sHQaCQ9+mzGcr)hw39)H$uiQl06=Pz z(757{?G1v#UIUg2ORSYEn~hdRsn0z372VA^jssN_3iOq92DU^0^bnvbJC7NL37eb$ z?Xz7uW|&Q(6L|YbWRGiWArs=836*Hgc_OFHQb!NTeF+*IN5r&!6=yF+NBsD7#k(A- zeaKQse(WO)#`&mJU}|SFNV=2lx#mAv*5SA$9ezYkRupm#7?SjY9&O}q3dJfaNyB`; z{R)c2FhA%jgo?;Ka$&JG;E-%tG9TE0EJ|Pgda;G&qn0|L=d~_tp!ZpYYF_-X&G$Z*4(IFE|%T^@zFIe1a zzM6C|n{E=-w#i)h(r5LJEMJxvVw2&BgtV9}RoPL(!5|*gP7zQOTK+A}61G-RCZ#(L z6K|og8es}>J+Ia8L>H(HpwqN)WsH5S?T>6!ZIrYS+p}shj=vZsYz@?ybP3CmIr)*K zrd6~)6%LCNw8WheUN-q|KcuKXyP#B!Ebz#J1!pC$ObnY4x5o*Kppv{-sGNQkxe|g% zVjnsLTQ(*N08I+r*jO1iOtXlpjV}A!*C!n`G6)tplsXec3v~y~t|04s5dJ$Vv&%Bf zCuenmHuY;&$^)Cx`18)|JTY5Z&{>C`V0We6=%kDhZ_tV~f?I%Uiy>`&dpFmwaxn#3 zC}gXY;>jaEQ~8d70u3;XF|GXFDTe<;$K6WbQ7-Vc9&kcL(LBVB1##W0zf)M2)bhRb zrBc%xKfT#PL&NjzunxSs&rZ&DjByfmUOPyAgJCMlVumnjxmCy%)uEhr`IsqB<%}bU zt?yIO2-d|@fx1=U-&h6scshltKtkH%t_`E$EoqE%I^7|2{A3-1x%O)PR`&q(M zyz*=&;ngybKvxkaqq#+qVD1dJ0L>H;!Ua)KbDpo#Sl*~gfSp@qk&A#*@Tg}dO`4*z2)0I z4FUr6b|<)j0MwnKZ_mYAp^)P1D2&)3Mfvc2y`vQi5Gq!MJ|9%Sc^+JfXCLBa_fV6k zB+~|)%ml|GM#o?;lw0DQW5+q-4_hsgUm+0%3`pTII$&fCd=yng!N4L^&o!*GpWo!; zGSYt>(l*S;EAXBAnT{jKu#fR;&^nnKs|9SXYdD}LQ|XMmcrvzE+^avi(5ApHkg8wn zVwopp?_<6MDN*{j5nY{m0GlS`)Don~+(^9vl-$7c&B=#E8Y@#`upA?9qUuc9vX>NG zgN@VCr|8sQ=r>{2&wZYMsz(KKT{=8_c}RNk_!9h42F_yp3=6!bE`?vxs+0hZ*F`LN zWDY`0jq2=2DjReeyf8)4+rk=px3uN-(uiJj@Y)6J-2rVXFz;CU$UaA$ZXTG2|3TK9 zps)cd8=P{pGp+%bs!%ym-IUVupK52Hfpwve-F2G-)F;h9i(QyzyFD#g??So2dC1~i z`Iyo3P+L(zD+z94!-1U|A#LzpzWykSXz?_uX3u7lv^KX$Y>t2s4mSCLY`{TecNlKDM`93}7eU>qV<3Uu#D> z`je7UOU#peH)mTwZ$zyv@3nkU1H4JmE%HzjHP*w7l~Q_FNN`Y1)XU-7d(_)Xg2GEs z(OIlLq|pKIn{{k_QgD)PkKz3$?TD<*yFnCyUkWdS=;deg&?ip)#6&S2o?0?dD-s)h zmwNUMABz10iyp;;5m3m~jM&>og;dvQzNIoX7gmykz=~l9;IQmGp$f~vp3ptTa(im_ zcAPUy^x@=RjG69cXW+j!fP3EI(`hqQ*5t>^Kz)k4kO1}=*50{kS06OW1FkOPH;*lf zp=2h`h|0O7N+sfuM>Dnzr>`G8Hoxnq(jy^L@QrA|85r&1k(DRL; z7VuuUB$xbG21-Cy9ZM+hKb2P%iZWj-W#A8piVpPCs;3ZzC3DL@akPJt1G;4&E5f;g zbYtj{98wU4Km1#~DFPG+?#oF2 zAXOmVYdLpBfQN^ItUA$`*+tX%^pt$9(FP?zzy2=(H$ce0ZybVD!dN{1dRmJvO5Nag zVCv2~Knb{n3BpOy-eOR}b%c@=Uz(`He0@rd<+zG;ZXTU>95`r>AwI?V_z^r)nM>wO z?%jHA3u3+Lox|fg-FFwEMo%UOv|V}%coU6W-n_Afw2>XxdE0VcTye*&_kM}MRJb;H-0Kl7s!kbESB*U{A%x_vVQypyMuPv!_xBob4J*N2 z%}4=dO;USr^Z9}E$dB^(K8>`21)x)#(2G=TH?IJ>emCT|)M)RV`i38@kt6`}FM1w? z?xt*sK2?%~scoilC;jizsBJv0brbNPFAqb0)0bo9!_FYXe@UL6Z5IN;gw&163!OZca z0R?Z)!3?hs4(Z*IA(eOIA_C86@X5%)H?jM1#OiS|3lvs`oQAHQ-yoDTHmXXC&mord zk>hizXX+D$Zs*PY7GI723xz-p!Xc@=pKu%6V|>$53Bz+IM7^%2P22POJ(O*+ihVx|2cXkFV#H8Ab|l072XgW)c-7-aR_4?nNjk&GqmAMA~6$! zg9VxI2%a|>iKy`nW{@PSqdOz-p+NWt3NuLVj^IKp4HTc&oCX9V|H*!I&QhO_D#8*q z5c7qlicKslsS){fgf>ipUN-(Ody8MsJD}x8bg;lwGK!Wfg5NE8ugThw1F*Vqe9vji74( z*N0U}KaZI5;$Ruz<$~@^GH!e<#KM6_Xg<}->FjyZ!lXQYkcf6dp3yhZUpjDKckB{T z0Fx@*Rt}vtv_u^>xShH1%U3;;+cZ?2l@7s3%88fkD-I4&!j*kf{ngsWLaFUziCMpI z`$bg6=_s*Xw$`^hvuEq|jSo5>4nlKlF8GXl+ii7}HeWMB9D@%9C^JNC3Q7i${n>Jr zM_3>@XWvG#sEUx9TXkiwR93Ijp7Pq-Mdf0a$g<9N5#zkG`9mst8tNaeIA4#YV`GG; zO18t+eqop!cvXdPW9%T{v_})V!T+r%NYN(nH7iB?^{Gz zne9O&;@a!~_8`v))dAYkZ`+FTTa|$Myiw zm`%UMw+LM)mdm2aR2qXm0AiX@(hsYtFZzQ1G|0!EY`9TZ(p{MNte|TuCKy=YuZNk8 zby?y^#yA)V)=n!OcY6yY+YmtF@BswsE@MM3fXLHXzqg5LSs#}1MZp=OIfO)70oF^v zmCmM_s0~|d9Rf60t%S0i1q_wn-|6c@g*j?#?Vf>swf>e5lj_Y)2WK7D4;=A*aK@An zBVcmlnCJ{57LyL|Lk(Vd%p#QdXc~%n8U*Ab4?_99-}%;|Un83`nnXayxYxy_DR?b`z!;>*MM0lX^PY!n~ z)cn3(<{5Qc#SwkaTZ0qH!il&^fjNe%qg|2u&V5)Vb!NlU7Vd>Am9B0YSX?2$prrl-kdqHBqo*~LMa9K3oV{F-_3!s1wa?)` z^oLGk_bxgh*hiP87!6yLGa&Z2WPV%0eG0Cf;@SR+hB8k(bF3ezIiq_ufg-fKnwYW= z&M6GaCLB~7?!{D(F+v)lS+J7Kr8Jmm)Y{V@=(H2P-*1X<8FTH3a0k9RjI@t1r}6GK z$DI?(bsWs}BMkn5xm<)cVP$D2wDmq9+YYV`zFPO0x{o#Bl~-~7K%`j$z`{dMRopK; zU)*jtVC&#;w7}|vJ$89?65m-n zEV`{aO8|OxNk~ukBudR<4U|tDk4a(0-&}=SAy>xPocgTSW|+hJw(p=3DQ`o@Vfu{y zELf-x3-_gKu5OfSq?E{PuJVFHXE29H=OLFk+gFW}ex>kG)?GOgx`etR(drr;`IGqmY+zjwPL%SxJHCfBt7QNp=#M^wWsP|L9NNQ;Jv z4+Pu8dOW2+R|vw3Eg^W)L=F&1jYR}QgRHZZ`GLi*H*E9^*g3^=RCpzz?K3t*akN~L zQ3x2%Wa_?15@QoK7B=|K*N|FpMpM=*xS1?d;b=lLnacbuydkc6O^iF-sFAH1ebK3M z*Bu9(rN}DnBv8iryaBVSxGmm_O^p@-`RMyy5+7d7o+~Y7;E@;hmLnhD8>7$A!tzUj ziR*vOD|cn5#}e0RS%iMNJ?-_$u7{jP4u8j=x%RTj!>yH*3dj0+desDxeWpl~O>=m| z$#T-}mVJ(VNMU!*<*uG4o(tNm(|LM6){=(;Ah-AQc#sJrVP@&HtdG*OB;#<;+R zkrZb~^{vy{7?Ro90@n$5Me@UtK(Zy|KHUcTf#R*?vb?F*ADT@!0SSGDjn4U zv0SELSeL=$mfDQeyUQ+eAM0#t?RPP1p?ONb;2R1a3*u+q7ytcd9Pl+R$%TdwZ71h8 zB^6z4wwp;b>!^4UauK4{*##lukUQuk^c9&HHe(f)|MYOd`TB_Ov}~xiO-@ZEBF#Rm zv{86E9N*ZFhn$($-yGM&#jkGJX*U};Z3-G78h=J4Zzhg@%bc)sj3`7`Mtz7zZ6giH zT+zeH_s62reOe0y#S0!4%mqsO2GuXSYy;12XG-1>yoTt`?g3R718XgJmmtX;oDr$3 zfQDYpOK&dOdM(v3Z@x$ccIu`m%veGj#{Bidwk0)0V67MsR`D3g{=Tq0W8P{OttbM313@MtpARY3E%RpzrQ#D9_1DI79E^uw5M3+BnG*6T%L9D zT7jT8&@U44g3>@JGPKzV7ZSWjSGv`AflInrr+wfMuiD5eo5=a8UmJo8RuF0w2Wvlt zM`y+F4&7!_dVv4QC`%_-IYj}@O{~4m7|dg{Ej}s*mL$oYyf;3nqG$lcn8y`ZelDEZ zlzIT2LBDceWy>?W;Z9?S3c-|&#=rjTj{m@))qw6o&E(?|ow|x024STbeL3p^Q(nV& zK`XyCmZ!-f5z-RsGW{LNTun4i>>LKOwjKWqeXjwvJxBo^s(;^0{@-%KHS%h#H2%B* zbzpVc;onN^s;bQQYM>I}t5erU46dsWb3-e%q#aS5NKI_&`M_FKGzBbWy`Gwe;H=cM zN_3{@&MRgG4QtKWAz-^I%b;Uh?PWUOnv0`;I=c1t)5r#)ma79i#kj{@R#+8N;)e#f zs~G4+NacOga^zxEH5tSM;w1DBjyI=hSO3K<>fz$bRMJgzg)cFlzfR67-(|v+yWe)yEMU66={-@jDP7ok8_c2 z8^MzTTp~7x*yuhSrw-EtX=gqY+%TfNlpzWU!tckf;C5+6gBWfh+`Uy7lTeT>^)0=} zy7zG~-X)#RiU)TjBk+QUY(?Ir|G)y5c_vx-JvY z%LZur>^U7(053m_ac6{*vHAcIUpQgec1;6Wh|~vsS%qiS(OAAX8gup}nff3E7NSim zqPnFwAfuJ`IKbE^bMS>j9zIhRTOO$-k-37;plsy7mA2x(n}rK=E1(fG4aa`r&&835 zW97CY*pc8=2s2CS9mYr$o#X1n1AHCz)0^M=?+*N5uHxy7K&K%Cvwhq1_6weE+_9GmcSb!BfHibNzF){%3^lhgsI-9Bq-P(Ld1%B9B z;rrV<3u&Rs$)J=~gVL-8xv12?v2#LF*Zg|1rMbJ9Ml9Voat4tnwPW5WFL`Rba@G6g z|GC{ma#i^?K6}#=)9P^JUF6D>)m=_H(Y40^{FWsW%l&I1jABNc%a<4%Q{>U~Z(mR* zjh^bHs1Q)7dzxrE)WH2bfm4zR2Y-tQK_7yV_2DdZ4FaNQ9tDefdAsX(de5trS zJXxI$b!?@&`FMzmv`n}=J_?mb$tyCV?vrgG$M?k#Y>F)?h-tl@*eb*(eNh00y1q)J za&kC^x81HBi$_+A)vBdoRjMW7@9EZ^KtfO0-H3EL?bfaZ-&Sq@2ax;$Q>}nnrk1n% zf_;IMdII`^=7NdymLkE0UgsUGbFUtoruh$!qcsq7ue;p(B7UsofRGh7Ms;?YN^+{> zr^)aPnwko^oe`RQ?N#5Gd?gw2W3q`rf~^xIgv9hR^G@-nB(}@-{iL|X+!bpB$r1*T z70=$EX6Bd6paO7-2dJTseL2~Xwf`~`XE9E?r9gXq+=bsZju~D;)`E6QaX1ZCn$Ag={2WV|G{I?tFzjT0eD?uA8 z{#%QKH=N4jwO(Nj=$ru!K%%0Jioue8IsDhx(1AU3RnWLEq7ax1_?~c53X=X!0+epJ z%@ys3TbEArJ9mLz=2uK-|J&;q$#)M3C5Bt0LZ?Z=&zDCLuh3Y9-^`J~fV3{bPRQvJ zJtxC2tCbFq)o4!mqKLU{7ZPsOkkH^FjN9>ZX^DBw)UGE3j+(;MBYH_IMSh9)_HDg~ zI}X2^*cjDVWTRFi)OJ6`wN;I;7r(kG1Ie*)8;25E@}NnCxBQA3TI$o~EevJKWGH{s zCXL_>ije+TuKv2jm^II9SYTm{|oG8RbeyMuk_~CPcdwV&#;6CkA zMJi_1#2o`0^4w7FwEydF0m$lc%ni<-5--gk!f_?#myxZ>AcruDH#POjT1$TKGnAtAUl z4tZd6KIqQyaG>>GNeaSm!HKK%qB-IaQJZRwwG)*v{jLGT*>4#55)fS`Hz_B zA5Ec);X|$SY~kwwkLUH|;PD?B1Z&uhGx26*s7EkmDXGz8sCGu%HNioU7*uy3;`sGZ zez*;bn8FP&rl=Fi=-OF*Q23;7sVSxR40)}GEWiJgcGr1eCbs2^g$ZxFvWm9)z4pRf zv5!dpk`psRm__6@;CK8ly-=@}*>%#%i)YYMIf0CcnH%MpXuAjg2Avq7{e-^g6rzU- zd_IgwyrEA^h8w%d&JCVJKjKA>{xslrD4}~@G0lnag61@V>;OVHvBUO4YIM__gNysH0O;sp=~lP(JSZqEh4yJiBPu8`%D ztzL-_UguaYdZ3_>Fv(@egOXlPtMY*Ro5SIVC*O`AZ2j|Pm-G#9j_7D>q{%?$Ec zUGDsJxsIG)$Jrx<)17$i4F)rmurkb3?Oe*;>-S<3=QqYG!|xN5#tpT0F8$oY3i)iI zpcyC*xQ}F|oz(`{H`TnGrL}gEN|o6?9H3#L?kO9%muR-Eu@8UiJ&%?D#vFBQj~3h^ z%)TkK3tPAFMu^8kZU*ys9M#gYYv6WSKQh>oiA)cA%T#$T&pKD8x&ir$;I7Sb75&sj z3RJQZzIuvqODm;~9)Z9%6V6SE{DXF|d-eipJ@!cTjv!{PnR%c%)d?i=hKtU5N&z*` zY{pF~DP;&(?buh=T?3UhRP0ny^*GWNGEBQT*DOKNH4f|<;*sGBrMW9Q^gwNXj-!`t zqfVRgH=6g4$;k=222CZRu>akmfu^&XU@|2)sxw1MFg8@H`|`aOR!ql*Inhi|B9MIk z-39n!H&O|5!lG+(;i|6j$5}k~B^HI8)cmEb3DZm~h?w-+QXoHKLp8B3ZxNT5;Wh@R z?uTEnJxju>Iw0s&-nZ`(7wz%Visx}tR_Vu!z9;)9?We`HC)jMN;;4ftiQIi#`j%Vd zCw8y_EF+n%95A6h9D#)9LDxGA{)O(N;@j;-92PJ#bgMnofe;^!cRkVR$J-Qg;guFD zXg21Esp^M|5A2z^-5mm<9Bk41&k2a$`%R##dleFyBqGz0mP0!+CWuarro3tsmz7YZ z)Tl7~bCYJbL4uaSM&GB+{=xphs7z5sr=H1M&v6e3AU+E8~|t~ z7F0p

01+OYBF|#{OGs)H8XEy>_tb0w&T^78N}4?B0gax<>NyUDVRj^S}0agt0@` zL~iY{V7VR;p9Oz9&1!aX$9+ebWww=+V?fU>!ACrE(l~y1AU-FLbzURrd724Zt9Y@RJj38i{eoI`dA~Nyw6IgQK0>xX8TVjWxx2IO2@q$8CViJWB-PjwM9Q- znk+OXl;~rGF|fql(}J-_w9@wNJA{X{5ct`Ec{r1AlFUff*j`f7Y-sxPhIVJ>igR1vAWCrOZXfo}52p+P1zAS~uzZpQbOrQWf# z{6y2n#wGn$`;SwT5?|7i>xp$6GfDY_n-bs zEL0;9-<8#5RU(~BcJ!O$PI4QZa+Q^73j+7#W5;NJ37F&O-iQyunnG03CSnW)%XQUy z8uwIpZm{R>@Mgrb;6voIr#qX-zbMAgC?CtQ+!?KR+$En2&N4tAQdD-CN*Yv~4ga9` zhs!K>|Hg$&3g!d1XMJrePhCh#hU_6ZWw3fioZ3Up2#^aNj+oh;5-d$4dDcRw)=h1N zeyG0a8b5UBaW@O7^W44vui_W6Bs*R*JVFn=0=KNr9k1KO@yLrFBi*ijco&}=(dVce zZpA3WO9pndbjl~G28JM;EYi7jFVCCI(&q5?^Jq?GDW!TF-Dbvp;xW?d@|LUWiGXS`oR zD!lP)Jg~|CFxUsU+wVA5+DT-Y^G#LvEqAJ*V5Ze!%u7v_4JLoKykMJ~8bMoZtdRR_ zsDQAFp4Tu2*qnwKPOMe+_^IYkH%nlNVHYMhtAyU4vXp|N_$Zvq&dQ}3V4d+nfFv2gFTWi{dEx@hb0 z7g9D2ZP{fYs?Xx?S|Z%W=HgJ}?K91_13`q{0DmnY+J%oI<^>44C|w>=B@O4qJ7u^C z!2?neNaYRWw?cV$`qBA}i;w?l5}ISh-;VgcU$z~6T80LPjTZ6Voz-RH(RuN-Lde4X zXE-5*_jjo-c!FBzD6r8BPx{aGlQ8)KSXfRR=l{usUMePV<4X=LEI(p2j!lHZvP4Sr z_f%nQ2eQNCsXvqiVOw$~%PxkEl)au`Uti%JZXF$U8qnoF$YKkh&Qd`VlvzT)XXo_g8U958718UR8*{g9N!J>qHA@mSH6KW6Syt){)FUSd~9jz zb$IixzW!*f-A}5Xy{s^!%T7F~ni{CUK-(u{8rMb53-nNddl!{~vgnlL zri$GNiC|91E&Pe-gJ(ib%6Z-sr_oG7ay4K>m5Mdl`%5=HzPT3s_8N8~vUzU}%=$Y} zPQyzEyQN~%KvGuHf@*f7*TGj#_8hCKWF9a-a+82i*SCfur&5_ZT5VY7MQ5m&+n^(% z->vHkgV6fiS5zrAT6j*rGa1W*E|e%$aY2P18tJ;c`zEQ2G1%=s@PryXWA-XJ&`0z& zeH?l@fa0(Q$*tM9*!Sa|5MunZ$seCF-g;oCq_l^)HdupNE`M0mUD0H^$|$ob()UQv zEKl-T%BhlV5UQg3gah)1W8UlQe|dI6{9;S?kCbiB9{uVBqK(ZV-#{xcWvTj9g1>z- z3b015kh+!mEZHHrQ$gq2@N#;}7i6Hjv|zIVlK*&fh>QQ2asgp##`6zxu{w|e>1~QB z{D8U$`L`JPL={^y%#ept&9eK8fApn2lp|+>)XG$s7 zUn|O)^uR1M!lR%?l&SF4W*mx=oirS{V~znG)4u^cWPhgMUfbQ<92*C0Yt+qG!SMh~ zK2_5N5U@E2gUfN1?6+`T)Xwe!m6qu$t&_{3l9h>`X@egN+B~?GP}Bj9UTY3$%E<|A zt3pJvD5J&xUK8VS^(#oBUq=KbBEl??OjvWYrnWY#Tqa)NrLM645eN~f9g zT*K%V&rqI51XX777K*om(8Q^w?JM`yCgwh{<1DWZywPBq!1b^>ORv7DxA4c$eVR+^ z7b-|v4#xb*W)_p5NV1OR91Om!s)QVcEtjha57x$w z8-wMr2(#kT+(3m}hHGNPr0Wxu{7`Es0d zNYoE;PKGV-`l~RoLiO=Ho-XuYCSmu^_&5B*E^n%k@#k7p&^C@N-i?fm&4UCk#4GKv z7ucqEtd_V21Q>NVU`g$Fp|mX6npZo12dFAgwqrc#6|o!R zO(fe@e6~lX=iV^nIs;n33Ayev1fRP>>$Tv8~ z->{)jDaMTXylt*} zrM`_b&|bEIv3Ik=9<2d$0OV#w^XzC2%MK5b2*Q=F3HLe0re2G=`T_@4@s#+r7H&9_d6Yc)w%t#9Em^Qdks@?ib7B^d;&!;8Zx(t9&4!s8zqjF%dFZ=n`L~ z3kYDi(Pr%hLr;!^6i!9Pgkpe7E4upDAv|_{C!G_ld>Q*#T&%T*%rIURm5fdXtwOcH zI0u!IQ3QBenJyz$`0x~9@MncP{lfBd4&kb(HwTC4n8h9s3uku*9;On|}-g#r#t&`9!89ru+1)){u^87{ZCaW@XG$YXj~cjo59d z+8)G~7zwBcNHNFa-aGU=&>PF~e0HG;KPzb&_pr%c@$O8^4yvFRe9WZ=7#h?c4L4DQ z$3elie!^vQI24O#&M9*mq;O^68S*tZG4=VNLHS20f2@kMRFQ{J8U(T|)UA9F=#k=w zH~8M;SpTH@x5Q^0ZyP4i>|8!L6e`gy6SrI`?Is<`k28Yu{R13@caIibj6&@+Ced9> zd~F4&ivVD|nEb1(R4*e*1y|^(*@^es3 zi1hOpjNO>Y)jbf5R{R#-tt~Lzo$Rju4XXD$KgAz;3c8C4g`3rVXTYE(2c#2<7&6mn zsq&jepsU-cm<%%GSbl)kv~KA_)Y{`$AkpqU8}TnSe7$pxkE$Ha_sB%Xw{P;&a$g-x$o6*2=kAH;3#PK2cM|?atg)M!W{{wr@01Ee> zXgkm~2+iVuz3_&0tgKOqimn%Ee?S`&wIrxDl5{iN8{Noo% z62DN;F7`7|AjhifLJuc*x}xEcr2XuDFi3S-2c;FahHo+%mNQA2_R96uQ2lgEwI5u7 z#0TQm;EDkITg_>|nv5C~r<1*xImO@o6iyiS$x0RvD5cSo&uZ*8rJlu|>DE9_Y@@&j zTc+;P&_iX{P#mnut35J9trG$8Z^z3X!PVBPBh6Elcy26lsQz_8?w3f-b`0qdpmO3+ zo@?b1eje?-xACsf{X(#VTU>rdc7k}wEl6m$#uVlSd81IDy_KEH_1jeT8MCW3oxLB^ zEW;put&C8<8I!!Vowox^aJv^@Jg<8@nii|gmP2n7yKp(g9>jd@ynU9F?eDe~JMgi! zl&#d!(;1G3v0yT5GSd{l(Ccyf?)PGM%ROCy`{gSM2cVb^U82SFQqcvTG+o*ceb<%}yzaC99TAy*5bOlHlh z46c@U<-rYI{5Kf!6Hm84>mQK&Itsb$#2~|Q7^itbqyz5MTIccV@|of(F8+XyBT?iW zXSuSfEFk22L`DU(yd;VvK%#KGl(auIuNULtOL&q{2z1^$YrDM#|L#>7r3O4|VPRUn zG*dQR71AyP%aP2(qmfaTaZbyGET)Zp8cjDx04Kc<)DiiFaMhC%#F%xMZF5CCOl5r6 zeo)*jSyr)d13+mhX^?31j(ax}os8cdu7Tfk?* zbGzrbST1*ap8c*N!rqYym^2Ho-j{Po93nC%KIgNY zl6+4;K&v}tr{<$lM@jl)`gTFYjsK58KPZ|%go=-mGsFh1is%LHvM`_YIw7b*%Lxl7 zt6+mI9b0ZWbLy0FHtk;&Vy<(I)nev&p;J3quBv9wXiW*&Y8;YT*#{^!TEG9(E=C@o zf%}uS!|Eb092)yR^zOxar^uBotWhA`#+FPY?hv3ZOzw=b&ic*l2`brSPRrf)u?Lmj z!k*-$aF`$)=xA_O1FWq#xIaw%MLB(KN2)X+|Adm5@sRy`OcZ)oy1n>=Rt54^=zhz_ zNypsZ`&8B1M&k??u|OR+0SL;9Ci}&+7@)eC;eE8I@N`i=Hmp7O9~?|^T9pR6rte!^ zhm#ACj7E`Q+5Wari(6DzE&~hIAWF!xpgaTeB)iGLEcvr zAnaSV134p5=JiNa1a=G$i8}VLgNWc62nr-ZMTtE56pE4R67~klFjZ$NM8)FwA&jgkyxCVOo?nmiPe`^i97lfqEXQ?uvn_emlDm$T3qdP zW2ynaZOqK}!!I$)m>x(nA+r z^x*n3)k;ZCjQQ;PM{9xGKorA)2Lb7O{S|ipn_pr-WHq%f+a#C)jc1VsxunTr=IU(> z?V)~_qtF>6q?_v&Pk$R> zbcUb1yE(JVS4A4dNK6B6*@A|J<O zRJ`fDbsNWbGOhZ7`43E>aTF^?E0%C?xrySP&v9Cl6k4!tP#?;sfBmcc7X-gF!=`{7 zGM$ssS@;))deL8{KX8Dryy7*Yc7R#(GAApHSsb&@HSvPWlY|~H+b%?3X}MD)YgS8< zA~aH~gu7pGV;7$0;7jFmFe-21f4x*wR>8s!7j7nWTmaHUZ~0%;85LK61&{&+Zx8f0 zTKcQ}n=sWOfNQb)hXVswmC&91pgdQRfp{sB=7K+`#~PnbSxxa zg9_1lOQ97<@fOyQpT%=Z<0v*8U)VVD-OBaVYubB>i{~}oK@Rh#+9aq?uzSJ!s9ros zkkdrjA79$J%p=!On)#5NGJQl7Hgu^y{`_s_Y?=$U2V_(7fFW_3S`U_mws-qnAi~d` zW3zh9iU~D10i%_fu{R#%_!&u!9iZ~h_SLI7W+~9v)hp=ba_Tm(AVdOOit(WA_&Ee$ z1Qnu4;<2QT+DTKdM9CVtFMOS|kP9e@e+wQ7h$feQ&J)*l@{{ashE^uOOBEtzaS$3_ zhRR2$SYKSxl1ZuB4|MZLkg`L#P4ZiB+<5Yc4r6+8bM!9a#reYsX4z~$U4^MQ^9fb= zZ0x#(_sih>{sza7;HqAZWSXMv2xt=!s2Od6yK0Nex)vzkkWagJM8(okkj!Y-4}mPIiNuBaOAVp9 zV0<9GG>4dSeHXaVPG`bfb4Ud8;BUU?wFInjE?uDs)y^dx{guWI5FZl)KVTZ)J|tN9 zX!BEGH_00Q+?yI3Y z(!fZxf2>rT+wj&H)sQ|iaQ7me|D9d(phV2LyhLx5hH%O>9ZU(P39czr3%ZO+deQ34-l zlt$g(1Q@MidV101<<{;PRIj#!7!v`$#zxX8QkU|^r+gwez<-61Wu=g&yUJWWQZHM( z?)CMn?3m$ko@fhoS7)(A>7l3dLWPCF6n6=Rr?svpu^PC2L7#`1Cdu0zd5s;=ebx7< zUzK(1cQ!@);35XNK0UDXr60@s1>f>n8^+VSdREYQ+!|5=+@|9cwX5Fn0(?8#aw8xn4~+ z;%#S^`-nBvH<^+?+qO?;@)-R=|jWQ92144!qrh9?$utJ5zQvZ#L%1ws9 z>IO+K>+xJzmTg+A%!LmA$xcQ9sEEL_a~Mw-1WLDx${ijXDv(c8jRk2gfZ|pnYcNG6 z_>2{b5~qny!GHwzM412V43rDWmzIB2jzuSHUR_THo#bCAW;KqR)ji8x3C(7;3+bwD-^3uk zQ2!%HMfQgnt?aAof8?btE2%l{k~`T(J}<7tW1d*%{)s1;)o9#aA@09Sy8|oJw?u=F zH(4(WDsvl_<|;B)rR_vb-9mBI`3BjL6PhvFnqGF1?DdznT&c@2K~H{25lTll+`5>0 zr8--POs!N~YEgMu*G)YDm>Jg>_PV50vYSXq`SL`tl=R?>k$v%Z=$XX->v_ zSsLCW8`}Ib_KW?Lmmny*m)?L$8k5e8g@((VZA} zZKpQ(ZCNb25bz}(kO}7}{*Q5CB!7wcvPLW)oIZ}JowMLrFGldt!z@W4p1$D5_dC4X zJO=O7(0rbK*QqNEjc1&8R;elTLCj3SlNBg)v;8TOioAVc=q+5mt$D~PcR(;ta@5wu ztV2BM5<;?mb3(cB==0Oy2yZhK zM);tdphX}6mAA-#F!9$hLOJ27m%5&8DS#=QC|X{J!Q+z@~D%}&#RwI!xX*4 zf>E1&bGmjm)&;a{KKQmtsFn>eA_!G|$wn&G;bT1xPu5cJVON;xy@!LFE;Ap?eJ+B_ou&(H~@kH3SV@nGf7jvb}DsMQv``U0LA&5Np zM?Dnm;j*RFoD^W38Y97;+W~a;Zf5}Ng-hvB#?r#=+|)bFuiZT(NZ+7>UFMPmAv~=5iglMYTeN`hl<~liX;2{cl)b7Kh z?P|`ggXFdW0R8G70}!j#hm44?z$rIh=YQ=drn5yt_X+o)IiLmuL5l!j(&_&y3zA6I zG!=@tK!*VpWLx~z>ty6fdRGP@qp5^yNIYSufm-Tr?VImGq$zxD(h#Hd$ zAW2n?mn;K$e9+dwm?l!523~>x?KLpofPeEH9Gc}3ltj#V&mc6;pV#pI;*Z)|X%s2n z|M8Ph+jRPi-w%kB-7&qJnb^|;KOdp(R#EON!xUpS12%+1-JJXCR@-_xo#+>^%X-F| zvWKX3w``vlYQ!b(N1=dfqEl!*&P3bRoSG6E%% z^==l?o1v;zmZ>g@!LKtusT;MFbVAnIE5X-%OW^TBLL`fBL6Un4acXAHi~E7!kLg>3 zG_`gdT1fxf{`Hm*7@McY9;)n^b(Dcu`5V&HZH6zi* z!Ptiq@cH#&JYj>pC^iHq@hz(wALv3RR=a+y&AHsC03@ngUi_Jem}PgexP1Uwbfau^w7>o2>*XLO*w}l;htrQ1#Z0WNfV@k!!)stkZLoq0mR%~8T|b3C zU`&gIskF)s@54zQV;_4mN*({m7P^S88b=5A!P*ZXg*HF6vbvm}3xQK7W^T{%ux^&@ z7vBe&0jYM(pCBs65||Y(s{eL!aj&Wdub$ZCl{nXFhxw7-6afFGm}#1b&U^$b(%I<1 z`}e%2{sjrQVs5a<;Kc#EKtgOg(xon_Zjj&h&{NcfaDH3d^kPTdz2bxU%0aIH&7nrr z*iObTpOyho3up*Ui?IriZKw4iRgNn!IUH8m*t?H#;q&LFAi6hFn5Zho-4yBOb0*Q^ z(NBwwVbR*o;{4jfoNE4Gh?w)L%KhcQj3j(G!Mc}yI1w_z1zu1k&-oG{@xfv2sXuDt z13M;!)H4qxg0r zRiiH{6vnXt^*R$41Ui)@0G;@=jvMCH3PJlf1DE{A{v#6C+K}=xDz*$ilV(SYYnDxQ zH!~1n?@)VnM2$U>`%i8Z#~W>aCP)*xBFDz6`lfLL6eQc=OQKIH4j$wQIO zk{MLJax+hds0^T+b9XNwkpyuk69GHQt%7fETfH{khF=z7ddBrVD-y{uKgJgX^X%&q zUdPNkC*F-KJjJ)H^Il27 ze#@ySl#Y7%h8Q{1S5oox^?W?2)yV~KBqGhtEcTGU9;(I!2&HL}cc_?nwu>|$Z`sSI z?e`+mm0AObqgXQemI@74|Jba86^oG`+@k0Av*)iNX|}!k7VOV{7ekL~{8uOZ(PRH% zwzXn}8Vy=I6g{>e=R@|l=zAB1?O!1**KF7;=^g-G5cCoK)GmL3xHKCS{gljeda+#m zZJ-gKM@ZRyOtaekGE*ubTR?M|FxjQ@()6}@!;fY zRJn-6Kc!i`7yeNAK75TpQpcg~Gb?lYb^4?7O;SK8*W{IPxteg|Vdg%~+(NZ-$JL$=FpEMw35sf8}R(EFhPj$DuqT>($Bx|D- z=gP%rZQ5gabQOxN3*d=Kw>gC0CI8mQA0tek$a`1{}jy9S7l> zm5$vJ!K%@1M%Akc#KX@8)QH<%5#+oS^$*in9W}NK8HLWMDI=F@)KY`=85!=lS zRo)=g(pQkNp;Qc)m*}4xINkg3K`6-;@K(PTc?QJ8=`D|810~{;w z?c0c^zJPdNSifiLpJvUe@dbv0-~V{hU>G#!p@zBi=tvpcg=HsDw+7_Yhw7~7V&XCr zn3Lyzos)HSO~wfM27l}lM_2(4n0Us4N`a64?v=~4iy$CVUeDL!S!yLV2hC+Io1#pu z^~s-}Phm=_N$WO4n}RC%1nfj|))gr;^DcwGcBt0$e1UL%nJ-VA=)Pe_tt1? zTu5WWMDxWfWoOghoMBLVtcQ?4>{(6`CN-6d^qL0U4nX=+~RO?hY^ z;NC(GOjv7bEsz0nWCbyhMyCR46qnDu_0CE0jj*6 zrCs2o!F$pFl{~G(*(U}DEq3|SA4zZjxBo01{tc`4J|1AcW#$<^U}4Df^nQo*5F4;_ zfM)GU4T||lo}6|6@I)atr^!>fTs zjqsj3B&eX;wW(TrFeo(tA}PfndH*6Ru^GYk>q3u8CxN&joabPnSOa z#Ky$7olI<~M(g>c=7?``)z}B!pu2X4Hamqr6`tl)Dg-1Kmz)XuYM> zCUBKK(Gm0uiZwvCW}SMO=CIAK+Vc$QC{Z7mXf-`CK_DSG<2{5ri)Hw@(PKbR>c~yd)g9R-z>Azs3yq-NV@o~* z;o^)Y`?IO(!(;hrf0cuwM4up<{-v`71X3-qh7!JZLw_j@;3uKvd5mv%=^eoVe41}r zbAAZ>`7y;MQ`Ytfh)Ny}!t_bVbP{1Je&7VZ30#p8N19F~H7tyDExs%*&bj8qOK7)f zE01@PTgoNP7Da@t8kTZ|9ZkSjx+}TQja4wqSM9px596{*%>vzHvkB&pJ*IK|jcWbC zzQ^4Q!^p*9*?oyP1T8!D3mG$Z% z@nJRUhpeTcOkU|wY8BsGj|&_r^{o7nniKKbCxN&sOT&Z$GaLYqfLg!{y6qx`42JDL z7U*U%$HCS_o!9dHL~+`a$slhrVZ^$@Ac88%pXe7HbpR&!7Spp+dfb2-74>l-Pq5fL z;ny|oMxqyt)yvSA$q89;;jdmX$oZ@vbt)(OQl`Zh;)~K(_z&~Smplmu$hyYwwcF2& z>jKHL_(`*onhSi*C@BuKT~@%ouZo;}Ch;3n6Kphni$a9=d(607jBf~~E1dL2VFr71 z!zN{5iEA+$c@j9cN?rkcEH&8uU zGOO|ixGt7;FeG;J0~22FG+JZAi$5A@j4`-{i-C4n%7>M$M_PfXmZ$UUPJGI%+Xm~g!aOjHX^~l6!u{J1ltRFLx z5)Axakzs}lrRJ~ayljQZcJ)JC3rMWu-+!|X@`((CI)t^(?6T;3mKU>>xX`u?iE;~# z`IE=0FiAp|qpyOC7jD$_gI2YqnCh5^MRy5FT zgYnIKvS`NpYMNTk`CT~9?3nu?P+w`+$lXlyM+*E^7y74Zq;_93#gBmA@AyS`a2gdq zu4RGb1hTce)NS8)0&EdS&2k_#w!RBhGY-x(t+kOb4~P^mVMM!?n0h>R2(YNAm!2Y| zSawH4Zw{k`SE0IYG!#)3phr8U8o2?%qg2it(3Oh~w%Oizw4Ti4Fl znRDz>uc!+_RQ1l`Sl)BGGt!f_S-#0Mj!J9|wVd-2g^yKZ9yGqyA58UFS%GjHgEeBJ zIG}eUbS*|9Ix|yC77AFmy!Q?ZjxdyQ_HOykF?8Q7?2%W;wifB~8_cS-5%*LQAzu-m zr)96KXPnURx-zoNXtL?sgwG*%BG$@9lipQ&zzDD;8s{ zp&NvIJL^p}_l6XH=8;aS=`-AKl;(4o7W-n-`- zg7W3uv^?o3<3)Oi=ZwyF4!1pSD74TID-vcCDX;{yf?S-9i6WR_m!V|ogO*GT60t~& z&po(Jqe)}YtGxK=SR5;{N`YkgK*-g0J(49U7gC+WTw8vhJ=9>-}!cBsyJDZaQJqc@%M@ z^mlDSi#QM4T=Tv3U^2eupGINc{2>&BxqkYQxfSRllXMGe%5F1ZJsI*PzUq$RkX7aa zW8?(pY|5phYOk>d9%e|jLH(K+dIeLdQnumklU+)%OK~&YX2l1k&2`+#FvbeK!)23^ zuYp@4V>6pDP*sCe=b+FD1|{k9LgBI>_d8fGVT^-{vbs`_l~_>mi;!r>;R7#m3oXjgx|BR8uk&V|TP6;i9M( z?YCc*=6Z>1kKN+-IFI}hCf2+D)ugu-QC?AZ1F6wAUW7*YB_pW=dlmAC$(6=m{_`#*IbKu%fGO!aW@=kt&O9(&DOjF;X3^vimJvzxtVgk_yLbM}$ zO$~|WWnGKAj1aF5=BsDy5VQMIDB-#mBsBlRGDPQ`Ycwa;B;nXig;_F^DGv> zUz_kRhlxEu8aLb~l@}WrBCF=6xQyjlk!KM+4{)CA zQ{flwv+P_>eO9D6)trWJv#BEhmXHREAF2mnhkq!eEFZEXOMPxGPt$(H&>MZr&E50V zi*+jS+F#7$ed;}imw?iyHrU_I`2E{ziTo6$Mch?f(O1pY>NoLTQAY>%n7&|JdyhAC zR|<%A0j~ut0`rJPB?1is^v{X#7-0-k&X?yekPhgfJl;?yU{zjySBptjdM2+rPXx-r z&gBo~Lm+VQEHFK`7&DX|fkkUJbC`viPNKSzGL$E$TteQ`@2COKW)Hyw3MkUKtUrT9}O_ z1^t}Z1s2d3BnrP1fC@;3i6)&5e#?ZjPH1_O48b-!G*3`0P&DrSr{wdP{#) zG$YywT^d(XNU}Z=>;D!BT?w_1%gYGy!`4~Q?rp_30RuTcdv%CB=DH01WnMP;>y0{6 zYmt)oCIWUMXgYPx@XdOfd$m_vm?`N35ixqf?PUjpT8p!&Bv(f@S1%Gc>w;ot_^ma# z#vyG)o(DGmx+y2S$Vz*5{$&m=wl8PDa0@|D!%T&H{itc`S0=k;_M>D&YM0rIRzPzb z!PBT?=K-g&Jxbv00h(`l(S)BeJ&+LwGTtxpsoqkjegvf-lHqnXcVOzTuVk*i3tp9W zb4A1^8w5T#F=5?AT2To&K+ubgr3l5Brjr+SU1$%hB<=y#zwp2%4sY$0)wYLe#+x?j z_r*Of1>%Xo2oT)G=++@JH;o4EzZfxHZaVo%Zth9(*zSaPsOnAB=i$6jO})Ga%*I)d z6V7Utx-~;hV}N5foC$9(Wzt$Vd4V;lv&ZIo~eg>DfAt-4Ci44gaQeyOjt4%AGf+2=fI)CxJu7o%u9_-9XGwTyVKti3=<=zB{fDf7Z|M zyyy4QWi+(Ou*BTpy;t^F8X+#ldpkp`HMn4wMaL2MTpShg>as#kV#~toZR(g_o->)c zdsUc1DZa#{8voDnY_2<#F_P(~R)_$dvcW1GgdMI!J*0BL1GCSp9^qv`EvGNjR=oL7sunGsXJe#1=dT#XTo<42Yd@JN z;Xr2wh4Oxb2oiq-a44W*B|e`C^07~MBT?|DqVY$!*0SHu6XP>W=IqbPHwxkjGRq@4Am`l#p2PW_Pt+iyl_gVz?^m@fEue#XA z3B+7Exnaj*T1$$27)YlOm-U%paRciyM5_L}*O*?GKP>|;>TCdA?R5{s!baR#d(A9D z!{MU0z%Eb?{ayWtCm5qe@07E6@k@D_IZ|{J&Zd-Ur+i$h+#CJkdCdDDreB9&^t>X; zd~==V9c`lVIZ5jE8^nHUhF_}BP<=V8JDTYSg%W8d``wv z+jc#)Me82Fk~Qq!=SyTrZlW%DqD8Pkskp8BGp)7egO+1>GK2&T_X5!D(&lIVAby%R zT;@eW%i7`_3m42t6Tj;`o0%pWs0SM6Bu4tql1?sUXmdQ|8!B%7hqMBEUQiQ${wS&Y zK|X7uhW+uqAoQ*R>$_FWY|9SlA%3PH$X7Tftl34!D0tp&b*b>UHa%uH-bk*XqaC|bJ#xQAN;ZvUN_8DtL6b#9=_j&YK5YZKYcu!4Q+92TyZr3 zoL-bq#X-on+*7V)^2uh-jEIt&NTHDjWW*@QU78&Jb74W!?51$-qVtPu+l@cm*|(=nma^O2!inzo);=dLuP^0~nLI_g?017xL7)NCg}GU+aa zF39CT55UHkiaK$Xg4O(4%N8fTDer*p&UvJ=g;O#nanQvvL@k6^UYg5$wMlK~|NgxR zCV+uwjHxLtb`3>?14%ODa&=MQH-{XYd3V(OtQ&Qjq+*>w6iAQ(j^3tP6&p{p3W-S$4r?+k@aT*@@o-SAAM)eBe+MtoA z>cbyu-hZxfxztx^OsSf=CrY66EJK*@(uxJ1-oTU*>Jnmjy&_u7lmq5X68xEmG#c4b zRcR1H&|r*6Ksh>@{MugU+`v+RAW8?apSg_zx#I8zDk?AoiG-Nmj3^P=k{)R-qEc5g zMBD}7ituvs19dq^F!UYSM_YC>FrBjkQ ziZbJh+Dg{WOcO{~v=ccf4MX*&(!)ld_al5fBc-mDEwzqA$X8Y5`Q!K==w=2~qxJ0C zWNcW=Bh}?)mmz?O9J={Okz^RA=`Z4Oc3 zj_RPuW|VsC{LS{(M^IQ|imF^Tthcv-HL~`ZaWcJbEowwu6m7<2w>S<%UIItqacv-c zc$xC6MxWwiXUVYoE{p1igC-+Jk>CBk$oY~e1W1i`SQO6X=dil*SehG3CVUX7^ zRZOYm^mcn%q-V9^zGsZj=%pPm(K38%%W?xjV24|svxOqFs+k<`{du_-(Y14wZrQn3 ztNb^3xLoLRDqcC!C_i60LdA5080JU}O)+;L4X63#p9?H#!7CJ9D!qb(bs>*++kX?h zim)OTFeo}zYF8zq5_nV0#`DH$cmmsC7$<=#DmT9E#3xA0lu9I7U3eyY**`jKcQ}X4iBF=Q{*})66BJi zM2r$I=mPE{1!l(Z$Gj&1(UOYe)>(qx_ty3pPu7^N>c}bh>0~Y@p#EH>ZlwVHOUHLi zo7hxZm)KGqrcBon?7|;@#Es8gu9vcM8HCiAroO0LIxa1@Gm|Cu`~CgIrr#ulSD(+W zuYXvf&gRqli=isqs?iLIErr{J%@<9H(b!8&QlR#cn#|6R z@1DTy_=4=E58DQAzRZ2}H<<8=lF60Ic};?Fb6v;;(X$l6Dl|$Duf^T1R$yivUj}PDO(~aP_Tn zZw=z??~`g|g#1iF7+*8n+9EuRhebuGo2N;892P%Pp2w`d+I!-QIC}ARJB@!N&i6#$ zC-x@A;zBi+p#k}>>_S1;K=~JON&Anw;uyA$v{WKgc7GwAn|kKuS%|~C7^7Klj+3?W z$v4rv8qu%G`!>S!yK+L$)-7i>bG^{CW*xI|%D~VPcLD%pEkiQrhbV0C0>a}Q`TQ~; zujsj8NL4hL^zt-IVx3dHl5CK)UL%yP?_M0p1J&^ccUYbW)iJm8^0c8ER3Qh$1gU(& z1Ha6Qr=`b|Ygu__v-Mu+a&;hu_&b$-bO^iRD`fe~{tuTf94ICD((Pt2ofTBf7~tud zKE8&Ssz$JJSu%QrB^r8U!UeIR$N_NH@ z&EX6ZxpdgVAodE}Qk+R8`_5D_^Y zB}lE8eSa=Lsyo+##tG0~3Wv*T*JpP-HHx+=4iWRO3C(5OSHjRx)_Bn#Ml}y^-yI|l zBB9lR;A2W?7%romVOB*MF;&)TNXwchS1e+WK07lwC1Y1T9NU`@D1k}rSf1b2C_X-(nS;TH-RdqWGGbdIbTSr zlV_{WefWksW}${&R`PbK1>MhXR8oE&-0dY8&4wFiR=@Dy08Jg1WF7IInVqu(jVs*> z>?>~AZM&SSX-}g7#Ez9lxNuheI?ip$?7#SUoVf{4b}7ic&^`$I_8NDgz#j9d-C-c9 z8`I)R(&#xv+=F~s!oJU*W#%ydz;L}{)UNQB(o_=h*nqkzThHf^D@i9e?&QTjS4o7% zIG>mQDK`(P_3ebCFw;YosnIRqpjF78*?IT8s!jTL;H~i*R8NJV%@tD#ebmNTm~sB} zO%W6XgOFcmBM$>tT6^MV_E4e}LjGZNDO9VWA0%sn>Z`==`2_?1A~(|%Ckon;l!#^! zf&53EMe%RzSvfm9$Di)<{Z}RST6?ttRbM=SnW`Hxn9yu~jLxtB`QB@M*lfdPP;%7! zFy{F_aRqP9e~LN!Zg}g}lVj^7>&MhQMbLYnpkk^zz6$VR>P{a7#v~E_{N}IYUKD1g zQ`N)jZJB1?`C;7V(A{LA7lmop6M1lB8;QN!M3qq&?{5*Iu>cNKqtn^zzI&3Fg_i8x zdwca_UCoQ6LC}?a5KXQUBUgn?FR>~IT%eyo*meG1Ot-$*Ev5Gq9_e;qvfV>O_K|7w z_OG$8181tHvEY+eWRjK0N&_>NkB4FU3Im8)`dz3%#Zm6$lCD@!g05_E@$gNTV41Yl z=pE&(x>Egw43BTogC=+ynW{wgQ5aTd9>oxBzqcwl0sCXsyCRF5$|#-!{N$j{tGWU9 z$NN85Wpi%wX`cZNH8^zx`QB({EiDV>V_J^;EJNvpMhd*6a9veN1(PH^hQV$kzK50! zd)-7gwj*Zxz`dkbDz85VBiafkaGR)O&8c9MAAOIV-7B(2nw%vtIHBRaCB)?6jH&@C z?xWZ%k`pKaH0${c;kgH_qZh`jPj$v6B}+Mm~k#lAnz0WSt-*;r*4(!|*|b6GxlU2E>kQgp-0)Rizdb zQZLLT+hDTsydg|$;$i~%yh1wlfMxpE2wH>_Z}OlFlJS&9Ko$-=PwN>hnxa<}yh`F$ zDA6e)66cG}=eE$P)IU%}uVAV|O>rO< z_HrzkXK-qg6lTbGe^}*rp4X|NsFg;kFNL5d!DUdrJ3(lcV~$PbGia<8bAouVD7g1B znD{W@eKjqMm`8@K<&0T6qETi9C-lb-#xXbXlYq9y6mK`ns^9gNo3z1VR)!?g)YwJ}AA9cMe8Q3vsk{Q{Pt4X&DZM6OL_qeEb8_MFRqU0i zD8v*%Q4GUR>vD|*L5;yfH|Up%g*`h8&LL^k{^OvR)FGk8PP)WFYRu!Sq29xU>-QjP80 zHrgX^6*L`7){p&r;7w$A@k*XDEN90@!vqd^H8-Gc_iY>2!Wvo0_+81?Q(^!2D}Wsb zbC~wmpabfjpB-XU3yrgZ^fEXNf&hS`7#NzBEx=3)tUi(ty-<6Q+Yen*gEx_4FrQZK zFtI-=>)9t#UAFpt3&#V<)Xjf~yAWYMqzH8}6LR!<=e!s-V%lqV+;-|&{BU00_9Qwf zH@>UWPSI6Y2Fk)*1o~?OZIb9LA*%XyOlzT60350hAmZg~%BHKZiL~IV{v$7pK((vU^{FDwhMCo z$3r<()8I7?$nTqXONpt^mjdIHYL0yGMN%fI)5-UTD?B*Of_rxZck2*)u{VLm6S!X$ zxv&=0#UR^)PItr8f{YojrVF6`Ks;r0tT9 zS!Og|^ej62vRC=D&3@iuMw%(W_F6KL@0T`Uk5g7WhThfX#iLuSf4K~?@rE~l7`~re zeNUX3`W`4Bk{>MQ`k+h_gm;{mCXGG3tq~axN}e}1&dXKS@RORH-SHumTv@1ygo>)`<0UD_WJQ$b?wS1Q2j!UW{ z_rGEE*i#$wjiV~iEgoX>$iZ0-hhwT(oj`s2tQTB+)``wql9m^mL7+Li--NS)-Uu<0 zpnf@KO(0l;aS2R;+7@BV-!5g)`rYCgV(yAzmhYWVC-d?RdFAZ)9~23}k<_%hpg*XM zdWkVND$}pQ_sI~zE`ch#pzYv4_(J~zX(kLgFHFWL5KcNhKT-srVLRl^I!B;)XfT_w z;h0E13>SC;XRLUf2^XcLrj(p18RipDRXR`QPS{L-=QBAcy4`tMjE_|Qd=n%UqLE^y z$!4LVHl@@TDbhD_P!zY}svavW&X|ukw=rzRxx*)BZUlu*)LcfJ zx8avDxY4Q&M51v)?u-uGwHYUlP*h0jJP@rCw3r4eBHfyuVoR$S8{{(C<90U_Q)}At zSX$Lvf$jrcgh6FlW@ek1$L`YxTO4ayaZ}4&5Rd6oHg;1yl)FGZRd=v+?$Ca-L5cI1 zMIMDl(MfXWTtpO7wmHJlXt#wL^t2=o;5J&RX>eO8iDB2S6s`OC)T|~_UjGsDAH6U! zwB2c*Ix6q;V+NpoU|5o2o3JpQz1FeK%@j_W=LX+Ok&r;wC5rB;D!Iqz{BwalYO$V= zWb~%sy)reI2P=~nQ%43{-%ZU@;*@C2#T$$c59bm$+hln62rypRz1yp|BnfDLd9trx zSt)3lKCi}P;PWI?g7j+Zk?Yk?R&1Kq>dYHn&yCSPkT3R*hPpns_>27n_2+r0!a$BM z@|}L#>Vy3`^!)~AdFw5l5pt2R`#TuqSUYT#s|f0DbI7b)ueql=1tmb(=s{1nXIjbh z`c5hdQrqOJrB$}^ zkpn0cdIZjR89SS8%9lZfK>CXbyM>0ZA*>CNwbXWO`3;KTv%K7 zHOm*>3=1r-3q<`GzFd9t2*Uix$UbsD!*AmOUYi~pyY7JjVW)f7Q~tC{%z3aF*xg5> zC?SZB!`xdWEtIqSIChM4k%V@pCz8eJ%G+FSf!|P4xh0QNv z?X9pLQRCiwIB{|vA41)}*2 zhn4*Q;Gj%qqJM~BWC>eo|H1z&U+B&kDEc2pIjn@P54?|k+k_&Jtae{MS9;%i8L^kO z99;S8$L$+JWnKm{Tjhz?kRmPihMoppJ8d+*a{oKmja{o8U-$hVu>fz)?pn%nrr-Kb zZZGY00UXG;v?)^E7oyCF5=bZW?2mR2@5yW z))>-o_U2JA9XiQ_$v>BHpxHZbii4bY=+(3=X}(;#d~=m_mC^|oir$~|HVOCw8$*nw zJdMOeoL!f=Cf(-|nbX98BI&>gW{eXP69AkUi$qGkV^I(ZR{n#6mR0Y~h-!tsovI)$ z>M*#^%&8cr&1nlk1Vq1CSae@Qfu02_I5jdZRpJTr#>a!3$z)s|z*_g2ywJc8;hq&Gxgq48M0I-re zd!mQD6D_H(3TW&U3os%$>+^&524ef@Hw?QFzm~4|Yj48Oxfx6y0078QbH*6Nq?7Fp z>6^NaI0jIx0MNWgU@}5u%~&fsVD|>3muQM8kRcX-nw~C4!KK#_cQKXEkoP{( zvlCYnlgP8|sP^*#&RGiwtMwtI?nn0zL+{`!V{Wf7OuSVL4N0xO$-Zfl=}rwSnPcZ$ zg3sAEd^2z{FCLMKjB;?gyZJ&@Dr3XE=i%UUVlyil5()|2uKM@^nJThv80Rr}Gd^vX zu$f19i_!|F6YWZ#riw`j(L1Cz(EZ9zObQh$4B{a6bX1*|g^5+n{#$%)ySn0cv*|{i z>_KIIxBP-~63;V5_FWwA#sX2e-)aCaiyM5yX-Z}sXF3z-f+_2Ek0*{x%blXZ3_r}A zN`F~mjAerGQ?8GXW%hS=Uu*J~o+#Ou5Ai)ccWkpss#terL+o5N2BZbDIUy6Xs){8c z0LbyCb1LwySb$X9+^q;I426iBA&?5?Xg0N@&#~>apLHAOBZW~gaMS!1v72kDG0;l6 ziwYQ*(|$7%`qy#Y`jAsA8;Qf!>P1+XbNjtvr2A^ZETbrbXlU`)ZwvY;LtXw$QB;G` zmZ{nwKP7(PXP|ubTuVa?n-a2znfCzIzzxKR8^NiCzU8%cbGGEJqw738$TgRGMyDP8 z=5S_Sl3`92|Jr2g1>K?=LxuHK=1SxU*PhG;teB_u9%)(R+cD1(o8GqY*U>0{0lR_1 z`5)$)+9>@l)kwrycpS>zEH=WnZscI_P|~1nk0K~k0Nm*pdcO|4AY8~i{s&*6+rN>5 zLR`QHnBU$B8efh1j|Y8*Ax->$e91(!>Ox%y-te1l8rm+f0-+f=x&kIciBmD!#|NRK z$_Fd-dQ72cCE@gc_%Y@XFFeRD4IrUMVTVEeI29$(B$wH)i^|)Dl zD_&32UWZq8EZ%WCC*u!POC`IrNslWTOqtEFMXwOeOuamB2xgsTZ_RV6?Wi#k;*ubH zHGj-dyh4=QT!pNxoz2syx6o9Vun{JAL(Jok@dZ}>SBweeeFX3}$Zej6+FCkjRdl5=D5V8H(gh+kTi?Fr$cr07jhSJ}O03I20g zoGBlvz)nGuBtV`3t}k%=-)lk4zD<_3GSPSjj_^9ZsH*yQ5G(o=_ z|9p&+EfMTrtqe|(s3}AHDCaX~hZux0VIc_r4ZFWpPjyS6sa&+-^E+W~oQz>lPRXvR z;l;f^n%r()3YmMmmG4|l{Aq13W$1gThmm*I&~)3PutjfFpoaCr>U%6zk`f{s7$w3! zxUm^3%`NlidVwxzVFH^eUQiQC9?wuc5a@7Ln>9fyFnwq+OLpH_SAQOz)U{R*CO+4g z6jv*-=Pq~2oyN{GFRWF8mjDOetc}%Omaz{CWjM%g>iRME3dGhDD}2C_OlZ}8 zq(#nT0C}yxAOU|B02TeCz^BO1AGii*;4p~K=MjXm2P{R!Yy6)>6&-+f9yPzTgbzP# zm5@)KaHucH;U~E}_EG=^9Kh%-#a1KRpVBF-|HQ^#gtDEoyfM`Rf1ft9M)QM&+>_!$ z-jp*ELkGoE6Y$uT3Bms<6A&R(#iSQi2Ktrt27E+bGU4V}JHg(VeS5|aW{P_^$2m#_ zmoCLS<|FjGm6VP4MfkQLQ!E@2eqspH;%z1)a1l@ck)P%$rtJPN3ehsw=egH0FMQJ9 zNTYLJs5*hx%e-|0Eij0dyL8RLvQT|eZ>LD0PKyqR3nCeeTIXZe6!m(IBGnLuw_;mD zv-#4W*8^0|lN2z(ydg}XI>!hfDO5Rb8MW|r+@od6O0`dCX2%d zXl3~j@*Le|g-_0`I%uO6*g|wjuJCE!jb43*fa=(+ze&>T_ku+V7osLnSqVl$wGGZ8 z#&XaM(|{A9B&#F|d^9pPtu4^6rw-1c>KQX)KMi4-Li3ThZt5f~jGufN+bHa_A;E>> zLD8Yo;c;$^7l<2~iC*Tmy5GDFezt$>D>PkwqMh+hcWnBK7w>vH7gRc(2D!$owyM{N zO4o)fhifEcyu|j+Z%BY2zkn^Q@m-txF$~*0C|vFpWT`-^B->0XyNe6R6?6XOc$$t= z)fCEq-ParBHHo-(tnIPWt(f(hmozLo%3Byyz144hJet^wVximT3nvswzfDc9SCzzi zNWZAg1@nD}#k(cJhq$z@$GAx5x+JV1MrZc5*x_r;-2e74Dmo*`NtzQrVW6f9TQ0%Oj`A%Q~$vE9{465k!`Omo_E^88f=;Fy>Gu z0L21g#fBB90Pf>n2tdcU8z}8Zlx_fk32?#V0k2j%r|9^w<7NIR$Wx|@{T87p_W-o- zjnO)Eu777gpla;SJuN1c9JWIoapM(MY>-%XT9Q4P0&dMXl@G7fDf>y>hj&haRlK(`!QND#85g|85;J<2H)Y6LG##^74*z_ zsM9M+ds*zk7ux}|0~N1osO4X6jbwBl-`g0_+*(Sm#x^Oza&{g|gnv;zUTf!FQm)1| zg4V1jy$CUMFv<@oFdd=qdqu-M^tHE8ap6bz9z7Vu)_ai`SJlS|sG=}Co!5z>4pIfG zjX*y7CMsWZw2=WIb=x05C#qD10n&vZ*x}mIMYF#1>0lm;hqJJUr9<2n@7OkIez+nS zf_Gv&RuUe?f}H$$fzxRK#jCPk2a!47k85lfJY;{0r6IJ@%fs%(oDp$*@%n+WsYMl+ zG;J{Gr^`aO4xkZ=9=36WpabX+Oe*t;A4L6f=fTpyr@eghbEENBt6(?O^lZnC*kqjA zR8-S3pX)Mn$ zFGsA^h_^#bqQ-ZQyLjF|BIe}MW2AByqyZ!806hKBpYqv*yJpP#;MUfua>b14%Pn^N zK3)_YeyGS$CHTIr-7@BZ*)uhq$d zv@9-~BEF2RlMX6(}t3V}@Gz9-3mu)iGUE`mKJpM!PNSDW{J1j z(kuPrN}Gft_b$1TI>Q538<@bUcfnKe%o#Da2kke|d*gW}xl`usVte6GM@_PurZ34Y#$j zCpj*B8>%bLbb{%h4!1P;cFba_Bf_1)R9^Hp*8<#Ft=&bL$8mHlYKYQhw2B>)A<6Ju;GO`<9=w<+NjDOKUx8pJ2Te;bfj~ zxvTs=45?}+F)rH|)Q?tDz^@u-W|rUkbW@l3Na3Rb;VaKupLM8H;mxXb>xQup&cMu% zgR^1TIE*eZ&)+J(Y%9+iI9<(GjBXc07QZ^nJMaMKq#ov?U z4dC)IFu*Pr>lN39_Bc>rn=^7?(NpTT5R`vjqHwYISmY)=X?xp~U8z#Q3JYAvUsJ1j ze6M~hHyK=Fl`{It~W*mM*TpwH;<6r=%$`Hx*PsFE6WQ1~Git)ECm zgAhu733gp6R8U=iib~tNDUm^PY-|HfXtH_l@(5qmpf#-fW6L`7^flOnv(i5lpj%|I z3-Bt@xP-&W0!vej!WB4VS#8=dsN#t`7y=NNEpv`aemuA<^?~lM1j$^<4ot)qcMU|G z-^p!GG|>nS*O$zA87z~(r2z3}%)MfxQUb@BZ8@iYmccLA($SbZH9bg{S4^jgOeU)h zWG@n_zFHz`AGz#)rpHn(mVm;StwJ8P&xymcP_pVN(^^|8r;>FEuEDy}r3;Wk?X+rR z<>eAORlbVCbuJtylc*FTlG!*c=OQXm(=hFkBrV30Ue7vreL`ejvikg^6eh0BW%>6%_)osA*G zyof0Zz$cY1kuws9p9`203*uR7&vklbsNXBMsp=VdyN2( zd(n2~?F}`zbX9B+o65j#+^Ny(bez}NjB?T9=}WA+#1656^r*E^rhF7kK?b#Bfq)Eg z(ugB6P{k2b3Lf*|AO4ylUk6-ic-ktR(92`@#D#kjk!6x=^xCH!o(U=Nk!#+)fwwh+ z5b(pOXfCVMTtluVqVkT1$&UCs|1>==g#v^B)|>RX77N;|tpg8R&%mKb?9|r^ua{Ka zTba*AAIxok7nv=wh~RvY@j*Tu;8-8vKYk*sO*P=gO(FcwA#z5LABTh@z!y4$epKyQ z??1f-ifF0-yW4RQhpVjN} zl-^F(4^Bm(LU%}Wp2QGw_bCOlWn}f_vbqiAI1#_|K#~ek4c!eypms&fJbr9P(DsnY zL9S0J=uG9}zmGnDr~nF#fB5?!oTMfyLx?e|)E(E_MG=o#qMy4OYYb`vS-emO4WT0?USJHb=XJtU${A7M(S6YIOys zVhqYEmxVy6A6GH`bC0|amATWgP5A|e*tbc{-E#Cjv43eZ_@$kAlfQeTr7dYfJ@ZbW zF5Yo+h-u71k4m5DkcFZL5ZJpeY1$Mb4FiN+2xl6v zrLVR4)4w4y+dR)6``TMlk?=mK+pvXIN;Al|W{hv?Do%ajse{E{CW=H#imaA#54HQn zRsp@s&hBnA{B97egXlpRWo8|b!==*d)5BaB^WZG7kc4sC?-kPTAg1rBKQ9NV&$D*8 zWf7|?LX5{Zc1AiZ)xP4r5+u5e-MW68FZTodng1S{Xd|@!(JMB#xXR|ZvQ>J_yw^H7 zB7>by-w(xl<0^2WPPvTUm#`Gi6t}3G_~q0xRlyPLOaiE<1!NmikW3qXWp;cz!n1TY zj*aZ_d1AnBak?Bg{}nckCwh0;M}J%;X617z)8Y%G_&1dOGX?^X|Na}Iw0GqG96)RB zr2DUd)pC0JeC8muWkDyY4*(jVXZkvM<-Rb@|NpQFqUFs02?f!z{_|YxPwp>T0NfWA z=M&x?8~&%i{r6)pz2=TiIY={B-H$H;&!AzDUUp3*a9z|6pJa9IX2TGU+)ZQK47diU z)%W_%7h~*&qN=z+=5Q0HwAUZEUX-?vIkv)$kC_p>Qi2X6S3cX48rl35jxBns*Hsgk z^bu^lj;JK@%!nHmTb?F;nsfFamh&pzpTYssIs^CSSV+Cj45UJd@l$bS=-|1+>@c&( zB7oN-hlVGrIb;5xb`ZsrA<(Ve*Dv3+YydVwg4NPb=MaW*1wL2xi&}YQWXgzu&LXp9 z4Fq?U(S6%YbxrbpQT_T>)n3R0z9>;naQKW-8yqLq;(yWqxhMXgn&cB*{=Y{H@cP0d{)JMirTzNYpfd&(r_jvXe^g^#GxZ-i15_$U*1)|af&j+O4523aQ) zeFGTZW!|atu{~7R<>CF4X+;nkE-<o08aIv>o+<>Th zj)-wGTSV9knmpiMu>JOn=YVShT}r6+F8M1Y`EUFj!^yC9{!w4QqHnv0O_QZdP+;fD zmKme=PV^Iw9BA-OTz%$wVC75`8exFEHeYy$f9fwBQk3xDO$n-tn*YZf;k41SK9&c| zEu$uz3Zp+yKxlil;kwEG+u7h3|B?Zsf4qm_59gm6_$T=<&Q{}#!2K_@NY8&oLuwcC zbpt@ieEuciuYXqhB4qyuCFj3V{_6}V{|kJV?-z!@cu*0-{{fGp)ggFlBfL{O3K%~11_sto zsq3ggkGTZ20*G6)8pggj@|mZM+`VV}2H}_*Y>HTtCkTzMn_f*oaQcD?mh-h=T`^1`8v>LLtLRhrFNyTTIw}!m2ck+M zbHh73FWI5!l;&mn=UO(2p57!(CDXce&yW&qJM-yiw7x;kS-&>y#^R$WRAV;jO{lvT2c=`P(o^LX6zg@u-QIWeVzx{AirrE& z$Bk3;fXKmc^6|->GnFV)BXTXS9nUcDTiI#l-9W_jn0=H`4-BKSg4;uWYuW{4NM!F( zy5^8L>L`h{CH=0Up)auq12sV4;z<}Dqr$_VZ^91u`=~(O@TAf>X1tH4_4$0#Jg46i zY(M52TsVf@Gx}I;X!J$e z$jb^4uvF!niGKNa@{K8uBXjt>xg?DWaZIPxAs?A~IJXX`piH6<1`^nL80<)1=d@J# z<}ek9-XCc_A}yVv)8rr0-oY{$AOcdN>ZgZS=QW;6UC{g-1wYyLYnD(m&&LkSiUQx` zx-!7+O!6_s1Cg@^D&>s&zZ5z*xxE~XnSr*gllG&nwL{2t@70d1C8LRbkiiza;+1;v zL$m7e*?0I6R@u;b4CPjxh80`%QB=UDVJV`6sadt%adsk@D^uDx(#_jyLL+p7!!`DX zNh>AoZs<;0R(SHxHG#S$=?xM=Y&UxgP!O|_E+wz>TBm)6e%H|CL>*?Ypj>NK}T zF}*#?s>kQdyd}~5=uGQ7aVb5g4QpB0o@{39d^M3I#lcxZy_*14AKoUPI+|m3w~R$` z3?Y3-N0RgF%t$y&4*jHF`*=^t`we4aO>8v#!pF+mACNy9gmwE@3z3QVYdQfy_j{~| zX2dD=a)afRL%w~|1PC$0H`;Ik8CZ}+eYI91QJ5k;wdOr(?2&`yz!}H|H38m5a)0h+ zH_WdJ!hZLczjDC8wXZM+2!RkNtO3q4Bmw-|{WpV--v+-5@UI@?|7Czf{a>B|C;ay% z{#lX8#J{>h{VFDaLT@h^=NNKLknO+vj6ZYm%fR%%IpZ&bf&a=tl>1*QqksP_%{L^R z4%g%}l{MMmRc7nku)epzt;dz}QD(f@dPf(}uczb>z$KPWI!eU0z~x>ntOoACpJ;kv zr;7-HVq?r9y|p2Ee$7$d1Pud>lBF33CrVBQE1YRO;rq6c8u+u~_x8pl+nHmgiDw0@-e ziZ0m~2)UR4Sr1N>fovDj^2oZIE`kOCqOmFc-Vqd~mDnNL9%h{%UC+1d?Y(Qjv;gwQ zF^fPSL!noCDW`n?DhrIZjO*+*TOrr|WTPO$DuK}jQB_QB#xLW<_i?ATk4{8|RDwyG zES98DXGZO*ArGq6`HlZ5t)l<^Ng^8qRV3!(JdY)Q6%O90JJ@s_vH>Zk@9W)nkxWo? zzh=b$)@nrmf2--=_`ekn|8b`O@jdtl-};9&;BWjtZ2Z4p$^Xm$KjilxwZ#FQ-=ECoHd;t-Iw17{ddqU=Q<;Kh8!yHUasx#HJ`r4= zgGDgHc0OhR*=7|<`A6jIQ+L^d?5fWuGcQbAxDCQJJN)HkaAX>W&_b-+G`EWdpW*9m zB5suM4wM!OZ4JS0wS;}*HLAB8JJvS?M-D|ro|Bp}>Xe`ygYIU$tJQ-FLCr*y4IqUPDdVmL| zO0+T(A4!in=3(X}Nu%P6pH29(pnKd^4#tl6XPp_}LT#}px4VZ`Bd@)k|}cteH&mBXTp6dvKQ zk!`3>t3r~m+EI8!T7fB#b5m+~V#h{B6Kg%19%_8EJvJ-#SN@2)0xS000c z5@Q<_OcLxah24EzG(N&DQn7kSk=J-4WssWO`@!>rPbP|b_BB$XaGrm)P7GDB3j9R> zeoQMOh?VV(96!_#)UYJp@-ujdX#(~=L%^}1c>c}IHE1WI7#m${Fh_ALONnU%?&76_ z>c-O9Qe_|CWDOhmu4N|bg)6Y-d@|8H0$Gyx*|Ug*4|)o3M(xq+b0gdaQH5bCLNr+m z)494K2i~{CI(W)oBs{PR{FfhGz+HTiLNff$K!=)*vwZz`0xu zgD^s(p-kAec7{rSzHT;pesa3cj>v3llF$8Z-ccxaO&Cw@^3Z22CC*U9@=k8*God%Z zT6p)W%fl9a)c4qJM0Ttwi4%9S$5eN;vvibRDZ>Xz`+?dj#nD=|yq2eI?>D*;qDOkV{hI+GuDMyNH1N zh6*X4`l#PP4WXA7JW2Rpl+%CaOS(prZX zr?g>XSAKl;`h~_Pb|ZzI$%sJZ2;UOza~S@dGEUcGFQCz4tGFjP)>S4%Z}7Cg1-;lQ z&wy8Z?)51EIilsHsh`>he-=(PZAa-y^>k`F(n658G0`rpJ0(P2*~ygR5IwPGFjX zBDsU*se=Cv{2Xt8eb{|YYUMM}z+3A(u{xIwX`|@0&sv-h)B4^u!z~75wjT{SGvK#m zqO&3!iUvlySI-#LX+%HN$BD8_uh|xOY7cPjfH1K(*Dw`{b(`V5+>9!f@ z%ax6J>v$+hYvop;iG(?A_4xR@jvd$5kPaU1}R%K@7!}Q0@EX?3EcIfm)HX-&#D7$frDiE}zs&qBM6OCB3*u&q>koNDixB1@65?7g8d#R=9kxR~BBE*&Vz+P=s7 znt;*t?RHqHTUsZeYwBix!-TwmUR8$(`@yW3n^{owD;zFnHG5p!9iAm;5QuvKYd#@* z?H&MyV)s=)iNV5!CJ1Po6Hltw+vq)!ML#4gNHv2HWSxpWVkcXG*mPMQ2pQx-Th0{N z8+h`lhDPB6-Zw9?gEaWr8qhvfS>lIp9JG=FzU&O2_`T(#ZI&>XX_Zx^L~wT$U-3pP zzA3I48o*XT8tX#MY)^t~pA#gz6f>+MYurp3BUzQOfUF@OGFHX^!yMH21#{h~O^6~d z5A;^ZUde{@Lb&^-1rK!~Ewy0lt5Si-+nt?^P&ZQ#P?vUO-%isp?EZlz?44(Tp9Wqy zSu57-3Y6#StD>0LG}JE)#ZZ?}9~eib3daG6WNz@qqZ4GF`KOXRn3niB&5bi7a1Mwo z`g*IctM5^(k22G)rqm?Kx@-W>Cnep|$6?5d$%msEXnoRi$o<=K)YErY6L>znw=unuD4qZ4UW3=&bpFN%Xo<4BGGV}Ne@`r&0{#Qo{F1Yc60mF2UK(7$p zg}kZDc8<%{o@MtWQ`6m#WY1Mpu4C@KUI~hr)zEeZOLNV|znJm(6t;b{Jed@ZXm z494mihe5WGg}2cj1c!{6JiesMQixB8>IV#wwqiJ5nzVZlOgtv5_FCNzVfwlXvj);# zPdS*O#MI;l5ThNi-Zdx@CQf*3HN9V?x$sI0#S}F#cClzH;xF)ey48?i?C>RJo~(Ld zcy{%KZQqG=Loz40O}~f*ukJ=k`@qKH5WRdIucNxMGL9lqh$x@l^ z86Dv%9Ar64$+kPHYt{^eJE9ZNXjKOX*$3ueg>SAn#!{p0nwI>D2TSe)Y}bKq`d_#{YV|h-A!HUs|x~DEcOnbXL6m2a@HEJH;7=Lsvhq)6OTC1}-Pd z+o+{3$U4X&#n%G(SKnC~-H3Q@ppd!0eM&p9>s!=wvB*i+D?=Sj*Q92Y0KYn3-kmOM zi)=%)b(;hs!Wr(BwCbDrnS|pu5Zs;Yv2|kz)q1MOupt<6%CPULN(x�|(t22Oi&I z7bIR6cN}lBtT{PKTR*6uKWI==_`@7A$r{s!U(F&;*}G#kg--{A23qUO;iV}Gy>Tu? z17EFH03t#Bo!JJq%xiwjpUz}EG2m5dss|mx<+RzwZQSMl(Dncn)p3Ig0;L~q@n53^ z)HI*!^&NbOIJ1~TiB+9jQY2h>6og9w#$7^#>745#!3glQ)^-i*aH)E1q1kL&KIW%vIU^f zlrPhr)`|N`0?R(m0sNEMwPNc+Xg@!%{}^~Ts?lDjF5gPqp5?+tI=yTL-v?VF8%Kp zz8u|w7)-){oMu}em8RCEu&iL+S_K@l!Zk`Cc;qElLi^)40|Oy&O2ZRXCvp#TZ9{`w zn#`RTi7t}IOEcrNF`DH>&&IDmlt#$)?r=8c0`tEG!7cxuc!2%)`8PxVUv97r54-e^ zKgMINhRQfUAg)Y9jsf5eOFa9HJ^!|sHw=OY{&w(-V<7DCJ-E%O+VYR<|LGD^b6XX2 zaBr}49zeDEJ*Sra6BVmn18aNGvPnAx-u-kfA4YTdG@Oi1-8^7r$Mg!-HYoVWC+J^U_>;` zJ>t3UV7U~T2HisZztIosm%bo@lX+s*Ly#I$+So=DLBE|Ws*rg1+N!}(P1@lA7KetF z_kCqg?j#&F0H-MPP;G=W%a9B)xn$1!t=5Uw8-N~OJe5StvGeU_sRze3!+zB*I6La~ z*4ivf%Kf(^$8kBr3nAm7*=Pp{Cet_sa|Ngo|?-GekyU%U4Wiez53B^`Y%TCF@ zlJtNf`KQ8MXpKu+uV=@0%WTpO?wnBHLzNHJp`bdGL&`vXFI@y>f#7Yrkz#E_?tP#L zfGxFn53gAdpR0qq#E#lZGdO?{L(Sp|tXa5o!o8*I9qn>8#lcAaqBc6i23B##vf#D1n*LF(%BX9>VU#VF{Lw8u91ka4Shr0=sxL)tov^r0V z98bL!33Vhql@n_m1pu!^%ZUQHfk>elEb=YHFusD~_j3Bnbm>RAE)kY*D+&Vx{QzLg>H&6^vo zaX(p7Odb|a+4o5%Y&Z{G)(TavDA^geht83g2SQ^cIIdJE>b6p9AbZZI+@>6uf86}w_{~Kx^Fl=Pw(8VnU--hjHw_s-7Uy_m^3-T=9Der23p zqKcIbk57w7If0HXwF6~s%*q*+`m?y1C-4*`-uIin(RS?-SZMdvW~I`N9ehTpd5i&h z?aK2*bVQRe6L4X;yo-U_?d4S2)bg8%uco@A*)->>G9bEeteELy;mCvT$K7Fg_ zQDHCL$VL|EVWSP+dEiXMw=%Dhek$ZWs!-hiD&5w)!8|#@sLwKVMeC1Wg|mxZ+!fjB zOX83fgGF2um~m)^3|dg54hL0=D&%Cla^UuMwt(2NpEj;)qNfoL4>?qf@qWhJS5;wpc&qfD$}Fbzp8$#+)Jp{169M>6zEY6izGJ zHhY;ram9j#j24zW{o*OZxw-=yDjZo?h%%@X-{KL!wnyPu`)QP@F8OXmV(((mu%mbQ zL2~dLys}uqmi>v-#x~J)-wExaGXWIK1NKh?lg~TJM>M^py$6yc4+}q;oQgt`CQZ;j zOXg9{0t4jm1CX!Zv&ntzRISldxVOd9L(Z1XjGW4L zi~u~$Z}T+WiJ`EgflKs7z*5wp2YiS?L9Ep0(hopNnW$m0>>n*{<9RpT@TD*9bIn-= z5NjV}gMURCOfBT{wn|H!8zjk6$3qcrlDwkyz!7#*{#yQe>_q{OqOa9-VQ+qR^ig-P zA@Vn@xhb{!SX)lP9RVNc#)6x6>Gw+oWm2jBxHmmON#+Sr>TKso!Vf+Dketxs#5S zM@JUBy-xD>%?eajnI5_7O__L1i&13Xj|Tg$Vd9$>-R0BE8dO6)g|G^Cnim!|Xu+$` zWy$`qsb${TKbjBv)y*EoSWX9WZ^LT5inZQSm0;(l#Q?co$dxsFJaCee=*#1aDzKb9 zo^=%A>9mCfB^d0}7Ap)nm5C7rP;;g$u*YI8shJXym8o6Ir`J#30ba7rNoKQEi#?7J zx=K2?W(&q#UKXD2GO;&5JK?TMVWFq`ScS2XLi!JM<%aKF1QY4LjX0~2K(BYOH5|y; zBjSgGqKaaqaIo7ohmnV}`ML0>ebdFaY=)K&dvUeW)WFZ949MbDq5~&KV0Ckuck^bM zUIxJcrLkyH>B^HYwrS@11{Hb@4C$4TIAYJKEAW_1oq=_IvWNWG`xH`3gsp=|k;&{{ zNB9ZUxAN20^cG*?1%*EN9TS|Le~j$i(4O&f?xXo0#U#~2GFmT_ih#mAoxR%jgE+5E zBA9`~QA^16BnZJcStpO8$O!Fo&Q=AdmC=x|7_=>X^wB}MALhH3M}}y95F(`%Q-x8o zIRAHngUA~ks72aDM)n}m5}J350c9NrTY{(CXvZDBIKJ&RF-x1@ok6@?V{k6v{6<~1 z48_(a^055d`MkYW)I$xAtrRb8=jRb9CGzj@3@?UHt*d)q8^QKDL%#=Djedm=gf{il z5W)3!aZ;p~T1JY#Qk-eAB7ZpaTVUPn5Mef*YCVq}6N^60ujwsnOuEe6$sW!pZ_pQ3 z>)L8vH?WmNs5igikmor&xoIYFM&*$+!xbz#^Tl=uc{><-Kev_KI@L`KIz6Ww%`4W< zLPr!&3O}=I_SbU-%rw;5P523Xt76gKg|7AwXVB3XO|Kk&MF*@UeBm4TiJ#DWvHF#8 ziPGfq)O4r`h?=Wka#^q5lTJe+1q#8RSr6u3awP(eIqnJ>L|9B9C8smJt(0sjkQOyv!R) z_VoGmsyQ2_cu^QBUCVNzn+`q2@l&e+VVB2AJXd6V*Ed1Tw4D!-uw`w&%it9uuF z25AbE)eVo=lDD*F^(l^G4)e?p(L1$*?J>YWW5Ewm3q_>jR<=K^zbl={KsoYfV;(cJ9Ye*8IVFq;vhgDSUPH@y$&=40U%D61@QNt{d}?XqmXzE>G_L%MwW zeu^oe$R#hez8^W}%l4A#?i(fVxP7c-O9)0dBVQW0 zOrdTD1fvPaV)^jJ^C%kJyg*L0q*$O%xI9A|Y`M7g@HdUL?lA#xfG$Ua#fOpM{Z)W9 zRbDqOhCXhXMBj?<<<0~VVbd<*h%Wp&gdHjyr$k#n68a`+)nimdxJx`9@l$>}Ae4nW zs7AZmBQ(QewJx!$rA6&7rT% z(Yki8i`;mk`s<8GS%jJ;`EkNF08Og#NgW}q-+YYhejEgIbV9nvS&%V_<$q&_8i7zgbJeUq%2}3snF)B*izYQh!Z8FI;85 zEVD@-?q=b18y-hp4#|Ph4+;G3q4r;aF~4~_LrCuLd`N<!O$XSK`{RZ7pk0E literal 0 HcmV?d00001 diff --git a/assets/blog/first-release/fill-match-arms.webm b/assets/blog/first-release/fill-match-arms.webm new file mode 100644 index 0000000000000000000000000000000000000000..37b6f6ba90959d21a048dfa63db9e88b05c89971 GIT binary patch literal 86875 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∋yx54IVaF7ArlBr3Hl^Ke9OnheG`BMY8zD5Jbmm&)mCK<@?sKPWMh)-%E3 zsYEe#FX?C6QH=?>8=33B*dx7-*Dj5LNKgBDmLF+0=0%@_8j>*xBzKWZJ;S_4(xnC7 zerK>y;8HBiAmdLKbx>;AA97wn|jC)QZwOQwrRpoYInKQqAS$z0Od=J4hO7ydfD9?~*gt zehgs_F0f^D={!T;UNm2c+}PwxV@c?~W$aXo(vf@JYY;2z{q~GLae><6xFE50RBMRT zW{r3JCq-5Jlp;s7Wx1Z2bwIbbQ0f#Z_?Cukf@?LvP_V}@s{9Vj+aMKFUS{+qCWi?p zHp7zl59t|lqA#T?t`*M8@|}+Xa=m#HC@pz%>#>Dg+B3)Ya`N68U(dI!`K=A^@g1uA z6YGayIY2z~l{@{x3a>zo3ul#Ep!-kn3(}oJMC1vb6<2y6z_4Dk#ZB?dM}?|)B7S_< zm|#!hT5}d|`LT@)J_MzDG$K3)K+s58`h-&e^CB`2DRFUDoH1c!5&%Pf93i9eQmLl; z^3kb5g}|SU{Be}GNXxus$cPQvDQvY%y!IR&1{K;IVuzji18@5|+yv0aWziIefyw5J4WnpHk z2W9;g2<3WsCWt^#@l#qD8W9HmiE`y=xv+KKSfz*V?Ov-FfC0~RXK4=!XB`l^hdKDw z;z$2&naYW*-rXCO{zq+g&IN}uo!h1jWc3D%)j%VG zddIO?H2GSnT){+?HMJL4nJ-ibYk=a@M|ig4llL_{Hpjzv%TeV6=DsS?I}C-n$D>*^ zIyApp^(~7hsf$*j*!6f8&g*VzBC7L2nS*?C!;ytmC?~8gjpui|1rq)@aZ*h$Ib82b z7k~yk)v<>8y-6uM!dm!1o-)-K`vo(a;SM~jI;8E$T<=RV$%Ey+tYPJk@Ri{tW;a0D z#22j@uD)1+5+8{)gZj_-5JFVO(VaGbg{j@nadRmF#Jblka5eW*U!vtnkI%?E*d<{U zmtKW7gTqy>`zc#q1P2^V5NA~TbeQqG2VMV_yoyL5_pP`r`j{2QAs+KnG6qO0NVu>r z>UovOFESPsw&e4 zMoyb!e*OGd_=yqTv~(bYQP?SnuZbs3cG9%&UINRk7cR5(Mmu-6kfx>Z4(Nc0%5Fj) zeRoshj>MK51r1c-03mg%gEjFMk>Tz#FGjqun`6p7y>v0P~T@p-9@Larcl_ zPyPP74$1X7&8_Y%i-1VHQ@udisemc*LMRJR?K7p`LZARU6aMLL$$2q>W*eSU&P>iT zgR>e?pNUT)0=;hEAD>QvWV#`M%d!ElC{+Iu9T+_JA%%xy|H9hhVb4YuzG{RsMh;ko zqNsw>>f%d=uT1+Gz;ux(3mp{_A_7eTyYi;(n>jq_HeEpHx3u0Yf$R@XU~+1_=-6;hYddZKBYM zddaF1;F0{#Qn;XZhqTP;4805&Jj^F134jD9`L(6mchh_s@6Joz%$*im|C-6pjPedm zRaE`s(>wxdDfMgAL%C^IazPO*FttMg2b{#_@bOh5M$0cO%Fw&6{I3Tvj+qAHYzhO*|7XF3* z5q9CemwizyZlJUGp_b+~J+593DFfv((s1pEN)3BnsHh_tV{T^WguY{5wT>y|%?lL0 z4Q5DT3b*1OSgXeIRWWgcHDP08Pgr4N0|kSGJ(wXp=W&pXlXB%Ku$ezpmFhD^RJ&~3 z@;8MDV?`!i=0X{ZaM*A!#=#l+G3{|hyZ1oR&-q&*q(so=KI{XbKj5K&wwJ;`;YpT z4b{HN3@C@2lh%2cW%Z1Z+h@Rw6nBjOEOJEyZ{tk|O>7@GUCU2i*a=kGnMovNrCX+Kwj4)N8^-8SWC(>YuFcl zY9ypAE6_hQ=t0kkk6I?k4FY;c!s{BvEu*4zyGS--@7hMJ9Ho}6h>=9Af3oyCw0j`@4FBC@199Ep626W zB!F$KMnwu#1!@+&pg6l0nXxu#=Ei z(V9~RKEo^n3Fk4^OZC*|Yzl@ujpxIm5&biuNg$&P+Ej!lMp zZZA9e1uIM2sDk!g3%u#PyMrnRv@X!ZK`7()5l(5WtIY{QTNn3a4(obm@hJ|yeGjBd z-l0}bNOpVHbA@xFeVhF(z_hucV!5w11SlZf^i z2Jb*O{3Z`GXTz*JlfsyPP6)1sgB9id_QgP|FXhmID26wFE=2{dAuje!J-%IXSN1|c z?jAf*WC{D5aB!_g;~M629KMwr!R3}u?9J=P19BmkD}ZmJJhz_`n)w2~2CCC86&n&D zufKp|nSkV+vC9UV^1A;wnW%2Z4qHtzD6l@lZFRhghp~@;Y2s%0LQf?MLhIG zipz=H`sEp<)5nA^qmy?c`EJ{xfhY#@;IBBS;Z-KtxY|@)g#O5#p+eAT}1_K8qxgg8eK(B*gLhTkV zqWyFw$eHmekCJgy^;ZqEsN1Ty<|7N=G=%)Tmce6H!qFEyq_l`Usd?jBp{4aN0sbK2 z7?gSKo4O4@lzt zK19Vw?}&AGav??K%YsE!FgVafw^9d~YQ_?Fg$8Rqxb%w(%*RxO8nnnbFI*<0-GvQD z1kVie(L0#PFJCL|L@Gp0UPffj(l2UUXYJq!s_VHE%7~ThmSayk)uZhG7tRv}8Z%RisPA`tRHni9WzhANu(wGF03clCA*wQZ6_dyYwtyHto z$#yVh9PwSK>?XwsnlH$Rpu6O!`voqB!(LA3c#YdoN(R#eXUKeS4Tj0MX=SK zk$Q&9Uw>Guo+ET3X0~!)tgR;(*Fo9iwQKg>!?+{~)MmiKG(=tqqgylat7ZFlIE!{e zJ^)TrmRhFRJ?70swmr+f)GAhw7!@(K{T#cya2>K!`VtU|jG1vNhB3*sZh%By!Vcv4oghPMs`*t!~V*YV8-<`oX?Yv#un8ncwSLt$vM z-jg(|gZvS_|CjBy(B*@g#QU@+qc?@%Q;V=4Gaz+ulVi>aieOz_iUH5MLwO>4ATiyQ z&V|?#U;$_><*ODDX$D;su{s=T`R9IWX_6^7k~Uqx{)JWI9lo{jC?CN)O;3z0a6bDd zxhwz;YNCo3G}wy~c_OxaEF z%)n55d%;mYeSe|a^fXlxV*&UtyeKKxL6Sqp;85+F?jJp{>ho#4Ut=@oyi12*0pRgx z5*lxk-g2>Y1GuX&kV{2g5TQNfs`S$(4u6?@E|3x*d5{nNQjxi_?pNenQliSlCfWHf z5VM-oi>SroWq#>~7dYf*%EBK>1nWu>SZNSRUIi&t#fl3@E~8PU{`hj?*Sffxj7Q>) z5k_<`mrgW;wHEZvipOnj7Cc|km|yEjM6!h-WT7S6!tDSu&>~?2w<3~P2P^YoxvU%l z{E{IIKXU;Pwl09sYZnBtK!6D#3?Pt{11mEC00|(Uw;SY3_|G*U zm`4BPSAa&IT9Hk0K_KAIzbJq-Apj_V;6H%>F9ZX&7vzOP{OPd@6~{-T?F zQK`=b|F{Ibr`v_6?d?53XE0+Y!uq9(xJ9u!-ZEeBk1km>6oap;a=KMW_{irsmVe(u zmAP35@kA|$1%(3uU>oLCq<0GdAfPaTL+~hn5=u36gm8!h9QsuSc9Kfp+xoKZfA#Qm z;ivl@Hn#AE3dFxMN?Ef~2b}q>Ht5`do)G8ao9#Iss%4TJCv&*fTGAwo;#R6*;jQB zENN9)72{LU4flZ+q6wbwCEjX<`;zLE+!|~LB;gft3o?qYvV-UfsSW(9SC06G>VsX| zGA|)>ygc2{#;A~5t5cW&h3%2Cm=C$nqWDVV zdz{m~v^uq587!yiHS$>C$*}TE@<6Ezr1rPfsB%`NIhh-|P&|)LIu9M&d(wh`zJ5}r zzPscKrTT_fdV?yA=8dWJGWs8o-i8Rdk(3OlPJYv(6Oc%lat!tTx^G@6Fq6^QdH~az zEH9K9o;{>U4XrQ`GqT}tZF_(r#rj}ez~6nMn?M8UPCUyDHeQ9P(aakGMH+j9zbDej zwIadlW+b)XeG&WWoCB^wdfA-b40XTm`HDr|PaLuCeMzm2 zS^}TXi`nW?1(tCN`q{b#N*d_>(UIjg9p)JT?5wAVLcyR2WL|C-2|GKw!5KO!hQBZ{ z`@c96H582#^*pog5OP06uon51-PaX%#tvd6B5CgUfCBrP8x|XC$Ia}Tc+s?|n*W7- z?sD{IaS+fZvkk3~5K>#hebkL1FS|;k{}Y-<+kmh&Cg}Bd=R$62fL_@R$i#qv_!&vQ zj+Inbdn3rpjsI?OT%3qv#$|E`1`LGTj(iB5Fu_DWWS-Pg#|Qk@&OVH{6C^=pz^gFL6N`wgP2PDf!nBb3CGdLH zu&+p9kyyjOVK#P=Vm|`3JKW1UcPctrsEujyxS zsxMxPhj4m6!YApHECK^*_#cD5VlW%Z#*IOoMMw6Xp@?)`q*a$?nV&a4(+o;? zwR4n8A=;(-NA2+U2+N)RAq~?~Nf{Dk>@fawpyoQ+)*)5hpI}kRFRdbzpX)SL1lKDySR4M<&m>7vs6Y)80qZFClK zZ2D2?#v}n=$}0sqfuWbc=x2!G*p&6geVIj|>^2=tJ=G5WUWy(k9o%Z?zNu>zlpR}W zCSf-*0*n2(3C%1_z8R$8qj)wu50;wCZUZ{|HJmG|Gd;>uz1?G9ixopPDj?N=yHPBl zmXchVxW0^u&^-B#^~th6%lSAqq#Ozmq#=>7+Z)O|jmcBwu5;hIr=l`j4}@7#jy#p& z6Mz;Tl%j(Ji&B{v0XiBU+ZSv=K(lB>>eY0Kj!*(7m z{V(iWu@#WKRj$dmUp*-23zrVP=hfO{!M!gNXYR|S^5%-U+rPMkuJ5{t;O_Y|#RA zR-MC*+DM?~6vN-Z26Fff24X?wC#4s32{(o&$*=Br(GN41w4gH&>tFNo&qg~>g0JRa z#%oJq=v7znM;YTDl?E}n1xCF&8pusa8Tqv$@YKJ5oDt>`be3H>`Qg#@{I=j?ykVr7 z8$wk99y^X0_x$dBik9T(UG*Hv%dSHn@^t4>-@l>U4u2HI!9+K}=5InOn6G z59hLbNDv7&E}RLt8&v}pShA8nJSxQ_=$VuNI*JciuXtmy)uV|6eB<0` z1bY&}+;~ktPy-F_s#D3*M0VR)ef7r}RCK&KR#>D-UElO&b`G-o&b5Y@pi43g82nZG zy9}x_sO@p%p52)Fxf&yIh-zNNy<5m4gEJ_6sM*a9e<8xxAzl4?>GhP)!Evz8G9I%( zth~1pG;Z#a3}aSup$1LXmso{@Q^l*w|5?sc^BwbvN^5=&eP8k$WDg)6bu6smQSw&{ z&9i>HodoShzR`onTDSYxMe@jKiBdx zCd!2R!KQDKD~NuSjkxzR( zOT2+Cv~DGdAKlG{|E%MEPx5Ym0M97H}KOE-*2Yh7b*C&4xRCtmkzs4WRquQaWt z>xnsYv%kYRRJ`^blcQUU6`HI^GG1-EI;)kBUXrIelKqBEKUT&Z07p%Xg06QL@= zeV(nd?!v}>soO*(9By;p0VcB-n~ij(8wjh%1tWKiDBSXqa}3>`iY%~1uS*YPlHZGP z(Xkbz*G;X3A18aCX@)Oc*NDB<&FtQ$IUnbOQb!4Y(B^zPbTJxnK_-s8sxL{7Bi+0$ ze)le{k~u7~Yi?paZm&5Pa4#R+%M1mILVI_#7R4H}8Y4_NObN3QX_Gd;)KggX$>T)2)RL zG|fb(JuYWxL0uA41s6l4Os5?R=OMK@Hi#_cl|uSw6@3rWL_a8FDt%UQ%~y-+2++30gkG-@Ri9ajoB0SbQ~SIhP<#*wtnu$&0Yw}L z032ZO7VwYf0058vQQuBv){OT&42%6bMz+vbfQI@* zoA=WX(9~_FHfjJAw*-O^{7Ve`4>3@H!T-=AXk{$hOEW(^a+p2=!CeA04HLGS3!&cY zSZ&bUHN6Ci#cTsXLjKhw5ZwpB0^G`V`@Hp^?tkQ{AjT>rfI@#))3{XphYYMoR}x{P zMr_3l!&5SjDR1hky3Z~H=dzdXDm$K>qhuEeHqr|4AOKW?Rig0Ki0tPDF&oj_Zg0;3 z(GNB~V^A#24m0WxUB=b%;(P;Bl}ow7Q=F;8!(**GBqW`6S?8_Hm}>BVZsrrlPibdR zjnRD!gkAT_+Ek}L2nONjA^C_U%rOJXEe8Sr5XiDWn78(*`?n`7)b$dYJ(O_vp-Cxx zuXzK>;^C}GLdG;0IeB_Bz(OhNRfietbz)_YwJm$E(YmXnj#t1K5z4t^Lk(3tPmz1L zBR+%w$h2A}Ks11Tx7*W4Sa6XjZ~VRC0)Q!Sbsic02U;6o>b$8D;oqV?jib9uito6t5D$Yqwl74QY7yPqvikr=L2fx zmw!1ZP}08aC%@8MIoAucp?BTO6S!7#nQ?=l{RsebD|Uda43mG;wU>NyA&Ppa+9*{) zHSK+^Gq~|k1;I?SOy~`(;1T8fycFJfKY-gUm|4j)-jNw?)Z}q9+Bj9QV?u>9aW(++ zvW)1)$*M6FdiNU5O!7jYFD6;JLXjvlnrJWSyYfBJG!+nGp8i)Jx*`b0PHl%(9 z-*%qePiFDN9TUoS#1})jA6CR1X{8lUBW;yD?dQrrIUGK_pd75FcZC)5q}#OIuH`x- zqVux$oyVz&yK_^Kut06Xo1s1ps_xgVxcyst;>@Ypi5VYoL^T`&FP_di5BU)1ul{=S z>4Bva`_P8JI?7qR6Uc6Uj4>|kcg1*gOX)SkG+nbc?n{>?uLxX+B0-I zEiZf_ql=0O{g6lpFa73Gf&3lRg*) z=FCZw(@FPx7_s2wJ$PNl&?u>@y@lAJA=Jf;Pv@c!^c5f+El=aZ;4b%0A-S3E<>Y3H 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 literal 0 HcmV?d00001 diff --git a/assets/blog/first-release/impl-iter.webm b/assets/blog/first-release/impl-iter.webm new file mode 100644 index 0000000000000000000000000000000000000000..2c9ba178fd546f31f4d64ec638fd8b9c228f05f2 GIT binary patch literal 213570 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

@>4bCuTS!9=yWdt+K^TkuAo0YqU4McMQ@admUZ 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

jt z*p|qtb#4)4RD5K&GOwTk`r`AELVRMW<1!1!uWK46dk3+z`NQ5E1>`u?atvSK)wlik zSU6@aaamX=n%P}a<3p|T2ZtlaZLw2@l?}`XicaxxSoy_xYKP4&guD>%KH+fTZwMUc z?)P|(-ws+*K;#dr z3}B;5=TkaYvoC0fxKH-{_P9DnIuB4xcJtDS6bOI&99OU?#Chp*V3YTzj0*EZI+o^RI{cBbv9bN=V0#Lqh`kjOc9Y$1t| zC0|hT5edX6a3x)rR`(5j_<$9B-UB)L!T9zj`+k??@|!JcmuR)Y$sXQn6e=f<=viSa zu&Qtev~TxTp`ep2UbUouj%ym&o8fwTTHSlFzp!@{ECpGr#o$2rSB^O@?2XC;qS|ek ze>uQ&9Zkk#ylz>^q%7HCQAuJc-s;uHSw7~8B5yu*-``;fMLSy%mLF@PA0cI9iyL!$ z+5p+S5+T?FJo6e6&|;)nQSH)T@8WiE`P&Hu$C&%!LA6z#NH9A-Zig%|D4 z@zM(-&0L{OJhXSK89`1=S|Tg%4UwR7q**oioA`m^~xR6o1;O1$2t@LDeCM6K5Ul2NY!K?kU!ZkC}?xYV}^*&4j9NF}G%UzBx*z~oiG0Pp+GYJN*?ej-2L1w8^5S8of^p4hABn< zF+L2_qD^y)PJlCYWZR+YuP`B_6^yr_ULZ(Gp|8mk9|{h9Xat@M{@Py8S{Sp#fYe32 zmt)T8&X>ucNQ&kk7o^nbtTnU24{<35XDV0!-kE+5|`w*svaofH7 zi+Zl9LzmKCa*`}Bn6a2w~%n)G;lL_Nnep@AzHj|Zm zby|fHeXE-Rf~LzS+qqlnJmjr46>+aa(4M`}E2cfrJ?Vi~?b?&$g(69Md^lfStIi;n zZIt$)ac62Kd&(_&?3;2K+udhNly$c*W{c92QKj{_`5tB{zZr5Gsegud;vsMLr(cm! zsLV0xoJs? z025=M@A)9XASq=nX;#pzhkcoEJ_u%5l)W#WZ6p6uE7u3v35vR|Una?RYjF3oL?F6y z5F5h^$=_wv2gw{6U&Qg)s>o-bs}uESSbX=IltJd`i;7%$dT0wGRfYfH=C?bT*#|LY zrwGiSrQWL37#|J8em#}}d>5?hOdic~W+d$;kq|GU6IA)#XO6O8Pg__-fJ&C$6Nv&j0Pp799H$>+F2(u2-JJvcGLmAB7NJ9p?YDRk5UUFUN}j5 zT7=N8R9qk`+_YGJtZH(o+CcC!(R3`3NL>=>HKrp82>t83d^Jk*dm30#)v4q z0906xG~fdc`_ru9-;ojJnfpc<{w4EIjtsg7@9!Zv`8r2^HD4h3(iH4%pWQhx7oz1j zo5pdL1lI~tl26|({GVwJjhVKQ?Xnn&CEm~YgJQJ}D=QO3oU>F1G$>R5&IbRkO~*GD z6qIZ}I?oF(=)IWLbk~Ix(pxPZs5Z#$96j-eQ5<-)!T5J1(GOb+2Z{34R1b{|x}ZGN z+LKph)+OQfI{-yLvh-T68P)XptH7jp(+HGiY2wYeW_wZ*)?tW~#_2(>&pnw_Br4En z?XHx6pkM_0Ie`5+6>dM1SoJ~foV^#Ls3iV5*8;gmKd&X1jyrYQJmaZUOuTLUZJ^8( zHvoL-go?lY3gqR>8Fo4cpx9PF_ga<;07a*WNzAO{B?^mVyJAibfJNHVADZ?wIsSpl z1Bo%?3rc>*E_rmjtzqPsYT;&O+d8+lcI{muHdj2+XJGMZtWStOLppuFYMn=9n{ zF`s=A`-B?)AZ8%Vku=}er7!3vct_;yY)duKC#nyG_e3Bj)g#n|U zeD%kQrlWQ{tDp$WEheORyx*lkR}x0q6+PcZ1hXU=*%T$t{|1I<^S2f5Bu)ds*7m#6 zEDC_netW9Z<6>Hg>EG&9F(g#>H8I-V)cNf+#P~-f>xKb66G=c9dg5ZxpDM73=2obD zVZ};X1|Qhqe<_QA>adbQFa#%(fi7d@FT$T`iJYxP%`T@IspPY`ILp2P0HJM)qK-|J zWZolx?4ME?oyw;U%{b0Y2+%379@c+xT#^~*2npGOV&G-q*I~mI3Xd6az!k>aG&m9 zwSo`;&D3K*C?m+eJgU7*_e?z<+_Q<#-&>k@q2WQIarY^%unJ;&){$>yW3*R4cY{BH zg{L}511d#My`mz4DOlDB%NN?4U1Vat_{JL!oev(Q#=?SmTo<;ysN~p30&EGO_;q>i zg6%K}>RQ($Q=#a8joKC8xGXXR$@RV$vJOayYgri$l^f?&Q$=Q<11T;I&5svPP9I?r zR|X05HnU(+O7b(`5#rZ{OVUy}=<%>evz@5=bF^==dW=ER_2S`neN0H^+S|A_E*ZGa zu*8*#wG=9)`oy)bt=vfn5m~^;D0j-9AM7`OMc`?X9_ed9SlL7rsFAk^HVPhaq$J9R z8KB_&nfN#vgQw6b0;6kDF64)!ZtB1ak3oK1?LC51r~AGFK0h@#hL;>Z z`PL7*a&~9{zIlz{`%+>Yu3*IZHtJ3P6Kab;rSgeMr@pVIM>gF^Ti2v4c=ict-x>d` zj$G+rh}W$A(-hW_ZfI`+-cZlXu^H-rwk_K#K6?fE=Beu0!pK~iO0#7u}cSJ;n z(73zKN?sn1*W6EWgp!W$e zlVAD5;U~SeQs09uxN=}<)Ec?d*o`5i6u(~*Y->5`t!}G7V=2mT5SiJt)x3OPrNzM% zBkvDN0K8dAH~UWyPFLA~rh>l_xDx941~kOr>VpZMrSYJC~$(M@?Ms zxz!z!R>BRs1?O@&1O9;4Ttq64hmtT>$KAHcgzVvQv$Ee|+C>eF?MY7`Odum?ut^N1Yrdh;kjaGdEUqy@c(jJC|s zUJI|s3XH<{kx}Gr{MhvPJDxz*;tHfN**Rq~SoQdUGn5gRB1zd$w{!^u6rTnnzWuk> zIAVtX3^5E!{{yxI5VKO#g8l}xC`mtsvw~n}8k%pu=G2&a;mSJn5L-HwL%u_%qIP`A zS6-)>61_Fm4pSNJ)F3O{>Jd_9^9kt#?X?(S25P6UJnU$uEc}H?e<~JM4n)%VZzPm| zkw606Dky=xmHYk^4QS6wnNMsQN;|znCpQy=9$oTBJE3wJ#o9s)=+qOZpx-(BOR^m^ zW9;EQ_{$eBQ$0_HxTIS;qd#Mf!hKi&+kZ_Q$#$bPvt}!2tTPD?_5&IXC_C|dTGO@& z2>!yOtHKCBx?Ug#xT3F9zzs4D9fDhGgRGENijE-|gd}pAP1v-=gXE9?Drxb2|4scD z3~S`7ay;4H1tAiKX*&GeZR9>8%KIs+EQXnCM;r}(axU_v{v8K^$yrHjhU3Jo4Yznd z`}vcIT+?dC+`N>%#CHXE-mA)px9_hbQ^;A1NBYV_+B(w@Nt4Nv#_oCu1KzQ;?0(5h ztukI4J&^ezy8Ogacfz4E5uv~Co|*ok#<7-Y#b-`oxJtAe_?Ts25d zG4D5qio^`+722Ex;ae$nyOEP@qa0YiNUQ`n7%{mbe35^~&OU>LOICX_pSDtwo79O=ocT*rVKG9N&@6U{ zBgibhZmCpi*K$yEhqEGHwGLOc;$PI}11`xUM9d0_zAcj_l5M*EYH z>%Kz9f+zdAS-jwj;HqFbw%jf{t$6)KJ4%W2 zzfFyF!SoC)4`+P@UYSl~Rrh8`Z13@h1BwL#1CdGoCGmgVJ^%v<{7$ zZ-|qppJ7o%3%KS&BP|k?LgCLW;GChnLTAWh?XIY9LI2Wot2mi==ps8*=3xLI1 z2xTlbu(hD@tuyc(c%gBZ%5W*E_u4FV3@;$u`We6ql!IJd^3{8gR&8=O(z*|z_-`O` z#DD7m@Q(rVzbSwlBWFR>YylW`9$K}IaTe2SMISq&cjW+=S@lVqOTCIU4B zVJVf}-JC*dMfKFo_W;m+?LuyqRRJ_dDt_Nn-=L#Vc;BSiH~vnl0zt5#Vc5M3yLL~f z>j`Y{W6UJ(yc_jOvQppXjxu~F*?bE|G%DSLACEV|IW$Por-7Q7NhuB0-7w%*| zee@LQ-QJ+8$)TN3A7>=>yNhE0K-_Ad1r&X{DrUg8z0iN;SHEQL?d}E*Q4qqap6O?o zr&x_@Y545!nO274Am;=GLBC=b-i<5CGMmJ=C-H{L;43z3Cx#J>(rN8JcS`#V z{$fXMy4TB}rEE@3o(s9^b?bXx;J-UP$V`T&El388(VpbiDZopw zmy;}D_l-w=0U*-VJN0$&Sm}jH5SJKH)a}^S+iNT{?leGm3Kcvjxx3c7P=LPnZY05w z1+tPuv*T0Vk=k;HrOe=4Gw>g6U)jfu@0nyF2p#|CeYpcA^c^j+IA8!HQ?=r<#Uh9z zs|<+{6hc@z!uzo}YOSPiTLY=uBbJmHV%023KOINWkr$GqL;f{*yC;mFypouHw(2&# z!D}P2MGZD!C3Fk=%jYBB8qh}5y%tKI&8qZe(f`(^y@EVJ@=70;NHQ(x@=8*SvDf)v zVLi!t6JYKuzJ+%ZkBtIX@-}E7V-CgZrk~SIbtGe_{NBnMbM3}&pq5*7i-VnU0Ek?m zg~n|iD_o;gRve~@J=v3U&=D153K*cg(tUqad{Bi<$#vZb)uQ3WxwCH{32O*r^C;-0 zS@$dliyW}!Hi8lE@4{xi1w?T^Y)>K3L)G5w^c)jeGYyhq3rf8pBsuOjj~5WUt^uqr zZ78>ATcf=vE9V39>Yi_|8Yte9q*`Q0~D9K($hLEuT$1`oBjosJb8#llC(1+>;WN$m9)Cc=eS&uOy zL!+CnS^>}H6HwR19u5%@XF`(cy279;Hz*GqHOlGy4a~oMSO;mg6xUMm;L$0uEL`rc zlgzlu5A+DJNux^l0dj}`fK~@}+kb&^KN6v4v3_f-nU%>UaLUj-Wdswf&qgklE`2c} z#8yT=Q=@MBjH6>>MQK&@M`Yia5GYp^s}Jqw9@$^|jG$};02#X|C7h7(B*PW+U@s0ZiEcV~`K5`nKWVPNr1DE_4_J0% zX&(Z2&|aU|)RnNEn4UCvhCmQ>piD;7PgPygV2KpTI+H51G2&;o7KBAU!A5r20u@yf zn)zEnPx2!lu=1AZ-VhEVh-wqVW4~)K)-OE6*0<^rBo@tW%u+X{< z6e~3f(TF^Z%aafYu1X}rS+`7s3OF6Yt^_%P)!}T-h&LSh5`lHu^)cu?G$bt#>Ppz& zwnXlI2AFpVOsxy@m}P%MmPxVe=8ePB;^%xNZP>XE<2{#<=u@PUYGu$>T@!NHd2sb;Ks&CAF4V}G{ml7Nh6`~VS*5>j zbVVa2c4(}eT4~3r*jbN$zkRX$mXkr*AbRp^htv#75~uZSJQ_+{ixM66Ac|uI$oN{_ z9INnwPm&vLVDE6#5tW)ZUS!&llsEStl`VWau;dEL(n(P2?0S%J;}N-F5%4XqmKWB^ zs!Flv3d64T3KilHKN9o9t;%!Br4;!77Fi}Y($Cs?-ZMj%O^zl2S@o%mCT_2aK{Ffr z-v(y+8?3hG#b+&NDS+adKme2f9{f1}ArAhp9~`uKYg89>UG50<>ep?apMTD@Y_7V&x*nZml*Kx z@<1jq33X#imLjc^urQ*mAo$kV4PTG58)}(g+}7kUY$zN$RLrOT)$`mh?}S}!G}))mE*?MAQks#sW7&cT0jN&Q31SdixFvNM(7}?Hu1_E zD}Tk=%0v9!{D&8|`pvwy=n&!ecMDI0*}{uimOC=hAy)?@XWuqpmTMV77%WKdH7o+; zJ6$;TOLC|~YfvI7d)+k<<|~54-ERC$n-xo8mO&JHEdk*h5cUn(`mE>uNXdlqHy53! zy-h%*q9GKT@mLcI7#(bXmEJP0u&i$X#?7-sdVpJ@-bFv`KG+!VK!qvGY=<7xak*`8?Ss6mJDEq zH&HdNMLaT@=wh>R#%V>>7g0WLa(ZXpFf5y2ABCin?1_2ZkpGI?VU1a*88_B_d>a^v!^2rq(b0T zOX?-;R8F*0U~bz>rj_ibO6B%0?BYz@`+B(LUJ>r4zQ=Kg-wIbNe(v2VIp)fIX{R(X zM~cw@N=|rB@xbf0dXzU`z|?d3F4bcwm;nyU1RY2CXL1W6xN4|$f^BP61<}d$OL&@c zKEzs=G3zrV_v#q|^EP5tT>s!AT3I;$EkmT={6s7DbdKyXMd>Nfsp$`Eja2@T7y8_@ zJ8h{}=5lBY0(&{0Qr`qrN}?P)t6Tmm#t<=m=q%EV6Pz;N^WZd|DX`vy%mA^ALdTnD zc8|t>>AyjOb36Q!+``%*yi96}gc6_a#)BW8;QUJ8~oRJ zY()02COns7^hvG7be6}JFxBO4YDCdQjhx#OG;}9T9V5Q~?Y{f~Wd&&_@z>`N)YPN@ zPz8tz0g8a6?3{G!7urt-DaT`Dw+L|O=E{4e;g$9Grvj~fr(ZnU{s03ynXW!CRb3E} zs4B)H(aEZuT#Vv0>WE3saspF9*7bIGB~XqQQ$zPyP{%*z%`sX*u6EF1DExe?1vrNl zGTmHRN%4EzejPBX{t@=bKt@Wj2oTmespWcJdGx6z@hVmJp7tC6XdF_?$G=z%T>AWkqWT(SLO4WA3)f*1rqiGsFuO zA#OyO4x4Ni38T=uw|1jgV~f?^J=VYr_5A_u$PD*_&ZC8~?rn=tS-dW@si?jbEBP%~86}-~oeRQmG zA<5Vc)7wqP=|-C_a)TID6Si{pVs?~*Q;3lK4>{F`! zJ*kDFZ~T{*!YZN|8sj{>xtU#u^@SZ&Y=&)C6Z72gN3cKmwa`#o? zXU!OO%|Rh_9HdswKjDMBJD1>>f3ZmJmRx{TvMei2h2fA_iW-X!u!et&TJs|T!)ngB#O=Aa&4dGs+2QdH#yY=YnQIG1s z;Zml>(TCWJ`9h6w1I)6yaq(7t|4}0(guJm)2FU?pkNxG^fRYnEidN3NTW%Zay|-d= z!+S`yDHDWP^rv6H&Vcj$3PsKnh5 zwFW4FzRygn`ec9z_Nf#_IK9MJ_(gH_0;@ufi5udr}z5_TcvBGxWu>wYEGiUh#mo{Txj~_6T>Mv zDAw|aWKVIOEBf|UMTkHc)Ss@Nc>l^3l8mr{E(werL*2}bjFif`PGnwP6#Er4`3t}0 zAHn;NwPT>{J_NBD-=%g0Sc$0~=SrJ(do_ThgGy8m=`+fvoKYhNA^BR+vtTU8u_sKN zCcTq4Suu2vy;i6g5XG9_FJb)H1VB9h6&BFN-TO6IGcc&Ts|z5jg~547Py9*e4Gllv z0Bc_AH!*1%MvOUMnXL`;0M&$s|I@n;*#BAtt|UrqL~#42;O9SB_|hdUluzzd5xgq1 zMf^`4ZxCjWbN;(E!~}?U%>gD)4F6QHB<1pk%Ye!9if{UEsqW{1->nP-Qw*9yeFbBM z{4tC&F2W!A>BUA%%yHa=PG@vI$GUw0>>CPhMg!C5gOX43*cU$_wK7viFCP%_r zksbobE1q`}t*8k;5`{Z6MVdc6Iue5wr%Ir(%gzn)`85=|NGSPo020UR%T8i}&lIeG?HA3E^SXi-f=W+1Z%{0%yF>fs(*<1yo|AT` z>sDIvBUD)`#stO$>X`FPB7uymY?>nC0>2#{bse5m#lkTYYGm><5lItl4{tBVQwf&0 zq;E(+QtkT7S3p}4R+q)cG85ZI9wY(rFPOX8ZcGw0lwwM_`MpeLbsbdfA~CqQRU@YgyyHB6bY%AdaKo2veMAQ2_%xRpzXB&L7!S zx;DpQ-5zp72SV6zy(%P%w{fon71b`{-y#Y;q6booHNv9h*sbr&W*d`~wBPpbr)ruT zz!Xv9X!-H8m;{CO`af>+s1Lyb`_$A}liCd&PLfX;cB8uJ6 zKO^09)M0#}+D4&v--qj6q6sY~gF=&KbCYy7nZ>1{7JYn|xu~eH&9LzU1>OX69B9Z9)cP_C)r;amwdsJ zK2WX*eWmCw8Ucuny^BZ88O^9P0|KC?0`hZx!0bOli>qPF|$BZB~JAQ@lR?; z%j(g%3eW)l0B-{A(0zljVdAe1RsG3)%shFGTr^#~49|*m#rRE9fDWA~L=0Rf;D7F*UWjDYiw8@7wF_CN4FYd&t4?6Tc@^;O&)<)1 zpp)R$l_Y{(Zv=w|T0UqGALB%tE2_J8UeTk`PMg^5H zrvM8^cDf`_S;1g^{7~N zg3t)QGhY6|BR~eFcAZCNwJM}>$+HUeV$FCBpD--EhB=P7f*qn0RQ{z?9>LpC;(~!~c+)PFdM=)bN%0DykUURJb{=`Vg(@kQJV`5GSea0;)VezTrBvc-9Ncn=YXqL zx@6@_kXHPvwE)bk03w@ZE!CYfv_&oaT_~hqM|aj558j3q{TWsr-bu zJRI1Z&SaxUQEI=VE;sO?EGWpv;y^oICl8D%6FuLtGHBUWphnv6fTKB?`4_D09P$nJ zza+QL@)s7DQSZLMth;+D0y?^>?<#qr;MnAabMqP!!(wVNY%66@{0sm)=8{%aUoG4j zI%fYU(s1@b>L5oWt6GFoWhiJwQpmu2al6*Ye4F1+rPqYM%fz*Bs5^Yx?i+pJ4vMum z>g}Jv?!eeM`^qvIWxnwkmmct4kR<=_8$~c|xS}cQJ7B_h(pUI>bI{7{(ecOC^5DfT zHB5BY=+nzUS&7GU5w`iRDyKXxC)qVJ-x)7S5|=QAY{S!{_w0KBk$&UM&?Mk4m&}Cv z+jLcXcu>F6ogC|rOYZl%1C*(lA)a>SkihsK*5WK*?w*y#JcZzyTt0FjDWqgx4H5ABKSNm0mm zDE2c-l-w-5W)TRd4f=0_*J=B~n_icfp=6g^8O$%aUSJO|yax}I0gkhy(38$?B$JDH z11*qR0@V7skDU7#yaUTj;hZ&<)~`a({QI}vCs*q#?Ns$l6+5&Kci$PR33sotG6KIj zYe*41rc+y1y!s)k9UxD5i&N_G(+ZFT)x*gv*pDfDr38DpDbw0IGV*}|IO(--d{*dU zoV;%A90q5sip!fU&T9i*r?QHD78K!yauGDbjL0|)srQd+2pqIxd_{lS*BT|V(nRJz zsQN3Dkp_{OxL&ZF(VGZd{F?$%AEI&d>(LqA<;()GxVQ}(mRgXugU|V# zPT2rR#$%=O{r_LAO|45j+6)Vpe-faeY8uy~yZ;ze@cm~_lHOCki)Sy5l19+Uk^wLf*y@c+!w|NCRAKXSgdmx-R%bAM z`3$}l_c158;41}}Q`hP4L21P|i4%QeyAJ$lTHlU&$pR=KR6#s%_bURXI-6JFrx_DW zGC!_hF_#I$ckdHIIm~##nx9^+1a;4HGKb%H+RRTg$8HWdCCNk7@}jPB_;6PW-69~S zF-Z5+jHN9y^D=7@9C^r!_~`a<&^PGx_#CHp14F22$s&nd?89{cC-k|~OA1F1)@9Id zntGVs)0qpR=p1d}!Xxn2nZj<%x~YzzfxMF`{e)~d-CHK{G^w`o*JttT2&soH7Y8xG z#Qma$ExyHF)n>dB zKJ^hm!5cM?WE8vLmIAoao8;=UHm$}g(qmPrR<1+yY|WtehuY0Z0%XxK} z-!g3XUV0niN7Mo?t}-KvN!1S45-O)Yot3+#nHXIpWmdIe?DKIvf~i;@daP|}jGq5;gI?N6R@Ib)nwtjsLxZj^G?3?VMpw86(-vl=9R zt{hxQR=QK~I$8R^83x(?$dI)t#F=kys=13<>Onlf5o#j?#|`j$@!G4s9Y*E7&eE3= z!95yT819KY2LIA)$x4NcJv|FA7FZ?^%? zNzEch=}Y|R28BKPH(=8}H7O9xHFWXpolDthU!V-cHr6dRD{9$=zjdH&OJOzrLh{{- z6i3t_96)0BHWJnq(VOs4;E)~T78t`OzGt2Gj_>aAZau6viFj`?$K)2ZjtA9iz2PGA z2TP%#p+%Y3?sby5AEuVz16?A!y2?HqGI&3;-B5yriFXe|ebn)ZtXHKGpF88)2;jp zSOkq*z8{>YHxtCWjJqxt1)WC&mus>b@G_U3?WnI;w&MmIxr5t7jW&nrMO2)bIJJ^A z1sZxS+xMReCmQaWZYpE%Q|37*$%<|B3O`|;<3vmr4=h~xv5Zt*2>^VYX2>%j?w-KE z1JH0OClKPnhsX%wSh4)+oa3)O9S5~Eid%*o@FG;d+5Ff5Wyxey@RVCrIyvZ6@y+w>QnFSvV0s7=WW!@qd{ta=cYQK13uvy`Vad5fYu8 zg5j`tO6?hf@Vd1nX7jCSAA(L@mA1^n>#!@%e-84viWbe7A#1Tgn^V3U$li|Iwkgq?imbN;lX7PS2qEva))X9 zE_YKhk)xW}!`NvAf@Nx+A>+IpgBYCVW5CMM1t$hfSGt&DQZ6Y_B%*FHU^9B#%Tf8G!oB8d%$1ojyhN~ zv6AWp_h_@~Qkuo!XDAtDcKyZJ8AD{PGcPPK!}ukvx-%o8H!dT|Ts^S9Evfy60aU<7 zjJla<%JuWzij>{~iq!~V6IteZDbNZ!_slc18!mO&pvicS+39&o#xq&nt0HI7gT}yf zCeyruk7-5h`FhbRx+BZkVc=dMj(mNn0eXPJh>oiz~3^6Y8M(?#@GZk2yEGm_v-u6OA%}Y2bKa~;4Qh7`&q~})ktL=wY1aDhei(OF6R#pF z@$(SaPku>qBV8aY>vnGMU}BvTZ&q7CcsGuw7w`s^iTGD;xs3#1>)>dmB$OK zLNqZX?;H|Zl)j0gT0>fW!T83(s{;HPh&*`8H#yPbu%Gwk;C`{mc!9J-Qv^FebU@LG zp335lsv2KVE0+K&)8eLHPU}s@P264tb&ldoUPlv`YOeZaAKj{|9?MGPdNTF|gM__- zrt`_A<5Hy^3Wd%|)+I}lLK4MOk1^~XE*Mt3yMJ3$vXcltq*|%oq!58n6r3SW zgNUT}#Fqg#BBKlEosVs}3V+T=FrhOsuUEunT?>wUSJLYd17cZ00cd1)BXe=rLRT;d z2a8+D8U&EW-l~3D5S8$P1b3T`%1-$B+U%n|?KlOhl9mUONr-jphPu);?~YlyfLuW2 z38c5Yy6bKx0{5+`yC)gTtprK;ZSm#7f_vgcI<_!HQ*EUz-jSn6*3ppDOO=%PDn9Qq zses6Cm1_F(u&qMTijwGGM0tqlx&su9-eMwIqR>@6N@I>dUcCAb5Bu3id?wCd**JD6 z>R!LD!!BE<4p3A*nk){r0>Fd%zRhZOB%|7>;Ce5qt`3AX@e|K{^;pyTfQ*1L$ILg1 zOgZ|u<>6w}>^q2|l6@GkE{)3aC7Lrh9lFViQEx}kkuWanId1CV7yoGgE-MU_)>Mhm z;?fVQ>ZNItkG(qfD+!r4)%)TuU}f!_)C(vb4P!VbITY6H65?$=l+b$UCZI&a8f!dU zv-<#X0WW3y^o~LS7nWE|M3rgo%32W1y-GS%XtHAs341*iwn{>!j)agzxg5YN;8CES zIHpPoY7Bu`fcOHA%?kkfyH5ji3li4Tr8mDCHmxzbR1@Yl zVuPxMbnT3(uMG#3iq!$gRaBUQiGMd7Z;QC~8T0R20X`54g}X$_Bt&tCar7GfF>!L= z&LI`k1lMjB98{_4E*`28(+3M+`+b{Jt?Om>4T~|U5!Pju@Q{Yp9Bp|THSz{0gURc_ z-UwbyAe2>=px}q;Oi1U|M)MzsDPJr}2#tCXDECVW=4yY=wC6^3^*~0_$`vJy(&KF# z-hinU=VIb%Do2rtoZ^H3i}c)ZAI(zzF_+4gj7Z0%6O?)%2N2yl#tKQ2msMfX+_vL- zlco<9fS3HrY^>?qHhbO`KII=54(WA&x!N{w8Hp-Q>F2j%$~-Ee8)&{vU3C{ zW9pvi#T<`P=A2_zx z(TE;tV4vu7P6Gq{3{Ll~(L2iku?Gd>l%r1ZJ1-BG!Hc-=&}m1kMK#5>in>T}lT_jq zaHhW&dA`6LO$Hbrtw%s|p>=4bt`L!5I2OV}6zLMPJ0Qv&w1?G+e+oLi^wn$_adEYz zFXM`Sy6j`b19S2O!+fXUJfce8>myMt_fTCXC$0S1vh~h#G7GwnAB36iv@y!hQ)``%EGfuk5yb{ptcfZ!smy z$PVg4C7D|@?Lv#g)vJ%>P#<-|*f-oxa?C7$!hJFPRm@n34)*aYv*sj;X_prLFGM$^{0H-Q@z>>n;qu^C!AI6Z>~O7+uS%sNfc%x!i;$`hFG1Dz?9 zdO)i_#X@SDXMa@W{g&DWQEtTK5k><2nBfp42M1viN8Be&R4(jBa)CXDp#hvx(b_1+ zlEqFWmNk9Zyp-7eJN>aaA?5*)EJ?&>-)^b)=*ouh%CkWi?J8nv!FJ4@G<;g#u>t4| z2)CIpyk8AzOWQ#e?XE)jPI4s{zBqa20KmvK3iZFY0Y;u~-t` zWji|b5CAZg@dh#?NUUif<5e3M#Kvq5XC^nfM z(PE3b9jlOt!t^>iI|K&0;ljisj+Ma%LVTO}3sp1XaySiAdh8EZ0JN7Zao~lAf`)cc zc~>iVU$x&XwNnjhl1T5S8JIcvsypiCOVW?0;}REfj4Fo? z0B;=XjVh+wQK)oz4_1p-Gs01uD)$scuILY#(9aTG>m&{HPV?b{rhHIuAK>zV!$J)7 zxG=jL98OWzs6HeK7LZKLJnb`}`HQMdBt^LNBgNu=Z>8?k$l@oDUY1RJ51-ma<%wn6 z?q|4yNeF~47SUWS5Tbyh|%qLhWd1S0wr69CXx)UG+nc(bp`GB06%(x zh*2R+$O~eQj^R{ueP+YhU$kq{Mz^ADUuwoOr|@A%&RIU-GlnF)hWx?aU?dvcGPp5^ ze3;qQEOJWBnH$}q2n+!AC$lweexV5BWS3*y(7I!kW7BCWIki$D{FxNgC+zPGHJ#G# zaF4%qZ77wOCl*A@5mq0e#v?%o$}q(%*h`3&m5fVDSSux7q3`iWkIA%VEb@X2)DWV10q=%Q3`tS zT@1Q-5|HN18;IGW>&q)sO9y>knmVa3?KqrjNRF7iV@IX{6KFi)eQ46Ca2036_WK_< zdk~nzTK%du{#Wd`BxL<({JD6V!=R*91}o@Vf^*_|Pl9eGQX+l~$6fsA;j)Y|_~vr6 zHsH&2ApeK3cMQ%1+PVf~+qP}nwrzLpq+@o+wv&!++qP}n$@AsD_pO?msi~R&yAJo! zK5MU4zth|#U8#4D;{UN;axEdfKaxeuOqqRKQA-IGaL}dZQv+sQQQqYXs2h0L9as`s zl^^$fN{HCV#_!wG?9D#N-hee{LpZvy_zdqRpnB>UA-lSDNUR|~_s8LJ{#O^FHg28% zjRu!evYd_o3(cYG8Mr@|3O6_?YsKFVpE38LuHz#dmShuTG?8M3i&gvAuZYmqSC$yY zZ_^WGox!3sc;6wgome$l?M6^UJ7kJx|yiC&0AyzRoAWKqjoyWO3)2T zZ!3sco2-el0yy3h-|J%Xx&KIEE6P6Tb_v`x1$+{ooPxkKpuWLk7}P*H+XXNe!x?GM&vkbWq z9??p&9s;5vuhNrDFZCbc3yMA~^gkRdD&?kmW(pkpu~nM}5XI2gFYUCjnwnk=G5c7< z%4-!VS7*1ExK(L38x|Xl>@Y9*uEf_AKqj4|3t-2)%0$iqfDF3Zeqre1uzP3RxNVp^ znpF6?%%)JOSs4hCD$fy0l58~Y#ch9iH8U8E8(fb!Wen@Ysk#_lRJ(dp)BF%ezP`I+#=Av#jc z?lcIdiT_p~bJ#zyuf=3@^iMury)y-Cc~$8@YG&2D{oQH6~I>(JhFtttI)--O^hbosjL*Est`->;}Y37f}Z~w*60(T z;iA@#FSrUm1C^}DmsRQw6^gkR)iiDF83 z$I{cyEYCekz^USo8_ITe);<8S3xv!myGGWvQ!8^$ky?}bCD8_)r%s@MqT|oL5@Z1f z3nsR!vPQbr%sw}xKcePq4tb9=4ekfytw$@JQbx+7UB+r1M9mBSrq)IrOynpi$bF2? zJ2-SWs55aOc*kQ1Ve5b+doXH^xq(*|ghY;+j^Cv!?_cLLtLdOED$@SD3G~D?a8vZE zw$twl+{$3XjNWC-Nk7z)1RY8iI(>*eX9Y2(ZKHHpY(o8sScka9uYZ3MZCO-wYC`dK zhnyrdF>iRLeYi3IJ_U@~Hu!X+s5ZMFn&mJ4FL;!qo|oGO1pSJ$N=%w&!s&}`->KG91y?bY6`2EDgQ;LLlf|R`tJ-~O z0^(*|5x|g($Z-pSzXmRnVso4+5VdPb7V!0%dklvrBIRC)17SUh^_m0Z=u5xKZ*!$1 zS7HWAn_oC0U>g{b$TaaieGJ1GEvR}%p9M89;}2``9YA@_tXfr=oC)58hk34BP9eH> ziI0WoF*Ie9)J|+(3C?NGzHr)$P5r@c6f6A?Eo$#$r%Gex@2@zYqaNU}xZaZ1lH^;f zPuii`5#HLTAb8%|jW;C8i`Av1faV1+gXx8?1lc?asXYb^bBcA{F^4Lzl{`UhfZ3GWeMd=^xpDnl*?Y4bSxsx z({J^nB&q`5iYfJ2pMn@fo{CEQItlTWzOjH&p`_4}3l4+n%ezGRN9qa&IJXvl)i(QU zl?yKy@=nUFpzjU1EZmUnkq*#G%{Javrh@e%;4@0FN3}4w#7j3ig&94A4p+ zr_{Y}2@R7v9jCH(WSNmFB>}V?2RgJy7dwH zHU06>Hb)V`vS*nrHbz*g=_dJFFA5r|zG!KT0Pbw zd|@0xEi%wCtG_SkhZ$S~=eUT1%xNNw{kw*}9XP!};!50ZvD;;B-?VPWB|=pkqV2f-%l4~$0L zkfqOFm@<^h@JFv@fG_w4?VA80$8a+whD68LfrjXobKi%90qA>Rqiklc4)wEWK)LiUq@-2Wo-VB3n9(==T%5w@H~& z36mVg<3JK#QLSsxYAk1M%veMvrobalbwkS*jm~nXz6H_E{?p{|pWTp%0W^%d5KLbB zD0mzuw5(?`KzsZKau@;fSZ7E-)F#DxenJ2p(blzlf&f9ki9_v%kGqp3bjw6PP=-6} z;aw%)kFUXFnvX30&lGvsK^ita0GSvR1Mc=T3#g4rkMg5b_an>X-~Ep%w?o5O9-Co zi0xiigKZh6sOvU*?QTeMV~+|U$NUn*JA`GHJQfo41b?8&6)1_}lv=|iE@W)uW{ggI zVmoA^QNK!nxpPykv>}AzNnILDs!OQkgi(q#IkO{-6yCM7CI`#mXM66Nh=Bt>)@%G{ zeY}BdI==+8wz&b6L$40IiLzP>P9gKh>3SIN;8T`z?DbXic$tHLOgp2uz}H3O3Ol9J zrl0iL`cUa*kVlz}Yl!)9lY7hc9dEZ(X!!7k$H7VD$djTDs(z*zaDaSmJU_5t$-?B> z3#9_jS99eAj5BwyBKEKpd!Fen#Gh<$Kkbnnm=n>ui3`299evGpJweWGU|cSB1v*x` zZx$;ZVyyg+Lt#mt=Nom0F)9QMAA8oHB0sk4D7mK;Y`_`3C;MT>5xH2@&F#KK|X>EyOW;iYeYAl^7?3b3-J!ho-pz*e)g?0e(eA z;AS`M^&eyMF0PkO(zzj)F8Ol}N{)0`Y~;W+GQm zUyXC;{j+cPYuOHz`;WpDq(kl|z#c`V$HOqWWx42?Y!>eeb{tSghiPL{=Z~;rNOc|M zl8LicnuCt3qr=Tt2Yog)K;ap2}xMW+~5O97= zsYyY%1tplzQofVFTDJved=a+BphzwJ!{IO2bXfWQ*8;4>vg|E_2dD5D#%XPC2qK7O z)N~+#MDWyUz=@TG*4eO%AOD7=h66cg1FJhdZP=XINTtQoOHtYbMfW+|k%UWd>(7Np z#w~fUjz2u26o&CzL1H~qq%o(|dt^dBD0+5%$sIiV+1o-ZAc6=er#@4asS!+~b}S*d zfRrfDvo+X_?-@74y3=cYHqVM|bf*^=Nxc@n zT{+^hZf$XEEi^V;bv=3dFO6#b$3u;f_3%3_cD#U%%PDK>2D1p^o2kiZJDrC3o&XUz zXd?fW^~4`@wOnAN?5$aHZZqwQ%?5Nj)tFM^fY8PaXDzxN#@zPT`Ynm^fSOoi+jHN= z(iQRoJkgWE3bL+76EjFDIK6%(c&Z#^c+45lptwLwbwe}>+Vun&&LoWQwkw2?uzSqg zw`wF&CR$yTgpbJTzcqGSKEXYvi;QN$_@B~Es~m}o}_AI zOWpP&p9Jvdc}$wWt(RpPZ&-`+F)0hy;n#D(GC#9Cxc4VXqFj<5kOJCsI=+&)n!jW! zUV6GoOqR6&`mYlLJ$=UVrkv#4`>CRgr9<8C13?3wM_^RLN-8eC0B7N2Z%Vtm+;6(xFjx&f^tNkVqr!kO3ifW8cYt) zkeM7%hF~5HfC7DgM<@PAQ<3TYqNB%{$4x zK*D1A!;)S3^(B%bIj z-Gc0VepRaP3M75IC801A%rR@_v&B&Rn6+=(4l_}(6=U!IbYw*?;Re-YQsh~6KWh|P z<}jz>Okal(W`O<2aSW9{g<$;CLhqBiK!Jv)*qxmg_9UpOdm(ULoVBZhNid_(^JB*@ zThOSY7zxE-P>pnX^vv|(h!g}2&B*% zR{m2PvbwO*^A}0G#k>G~^)6PbQ78(zuHd#tW(4lSAV{|HKqU)an0DY$G}b5VxpyG4 zAR4*1jL04&iKMN>NfrSTUcHo{BFm!zczZLg#1|MxB}ZEs>rs(u?O{S`Qkl7AC*s#? z8|4l)IC3fvrvdQkUWxh)b@d=5Z!)a_`sEm0LpfJR0afyl2GmRM*6hBRA=Zk9Xz&-;&VD=p%k00Gc=Tit7!CN7#(`MO4AHms`n-!lV zvO@jSj-XVDhXR6b(E9^stcB-cz?`jK^T{q6yEac|SpP=DCS))ngXHgFU1;)tH`5p* z{9RlmMZ&wng>vO<|7N=PiXM^)^fudhJ)|Sq$BTP@zytATZtkX6H!<{wJMp@+bKY2*|-I4giyS z@Wv6TiN%B=lPT-?9`Mh$@Va`=#JUjk9G`0*=r5ABSVDS2XLv1hRanrdrwRzKg@qER62U5ywaNb5BcMV}#z5e>|2B+GA`l1z$lG%=ZlP5nrW3IZA`;?UWubaW zV4>w7q3OTuT3tO5+nm_^#-0Y!PX(Q-pY}t%nhRL}JJ=Ry1E zIW7X+g{f5CQ-msN-IN($pUkezr~T_x-2ELOIi0qEJONoSR&)zkVU#18w~n$M zQ<)--8RN>|d-en_vPbDWO=t>3$}+9L-OnrhUf_JBPB($#?H;nUjf6Bf)mQN2^8<7U z7E=5i=MXIswSIpZL$;Z&+npiwgOPJqI)a4GS@))eH(VS;MX`ReMK+MQNDNIef8z>L z)8CIjKYY0#b;935rx`F!iPYquC%Ci&%SC9DUx^Nu45*C3C5xPvrTf{U|F-rp?>{j* z3jOmD(>~C&E8Pn|%u+v0XG}Hnq({0&*IB#Qp`-?Jvd!LX&&_Lx8&-#80#^EKu?wV$ zUoGS&Rw6vb#aT&M%pUqcA7zsNbOAl<=hH*)fh&wpE6D0bs*??7ddW=l%M-b*!(91S z*OdMNvo0cyHH=P45Bv1KlO<=f5ajh%Y}|7^h1GEtaSmp+-N8#K<7H}aV#agD?ONP$ER6Rn|*vsxOqZIGBH0jrt~U|49- z4(kGxX_y@@8-CZ@tjpwNJr@wQQfiqT6@y$kXO>??dox8clMPIp^Syox={#@%^7Klf zXTK*>$!Bw_Uq$UBX6-Odqo?QJF<+wLvi}IF+HN~8IrR__|MC_*HWT4*ZVvA6Akqj( zepV9M8AQUsVIG1ha1&zQ*$)`I1M{BW%@ArUEk-x>!Oru}nPfYb^Lfkds7$0wsUjqj zN-9zDX#c|Stz&Ve_B~k4a#fR3Ve=Yq;w+#3o+9uQcX~NCe(;I^$=3CPbd;i@P1E@V z9~fYcCG30G8$upf>ZQuJiA)5%zFO|SNJ&9(U*g)GgGs%9S79S7)CkL0&V=}bt z+$uIUiWDxU^?xh#3R&N)R?D@BNqd)a4*!WTpDAHYpnY$6j|a=$aw0P(>t>Ru_&P+U zG)|ds?PAVM&Q)>D-(^Hy-KZxWZgp~HhdL#WLCBblY0~~Mn>hGVn5f#E+FaSPcN8l~ z|6P~VtZLdcWmE9w+u`^y-~>~*bV6U@nbHw`#v7`UkC`|-|EB?lS0vSkDhXK?($+U< zy?E(am3Gb^-VnBs>X+O72T#czr<~B2AMUfV7RS`Sbq`mUj%4crYyF9mMhIY(Gw2%) z>7{Cu8E-+pnHpva(TL)(_?D1f(8-`MZ=)n?pCwX}$YtM`@2>rcFtrI zru1tO)7Hs~HdA1eF?a_MYaJSY^f(B`uy3z2+r$HRQ2BCb2y5GVRbL(VH8gQKt^`x6 zd)x>1gu>)}3OZO3#S;1Cn8K!`tjZ;Zg5xzEtf(bUrGxKG-{m}{h#ko6RU@>E5I_sB z?5zxpC-K3mW($p3Kd{LRJ!ao`fu?aG&h*aU4G+UyY4IRs5HrQwN6=SG| z?;l)#R4?%iq8c~sdg&^|g#G5y;)m!V45UY(`_&-i^u&HIp$X739^Ev}+QUj3UtBcw zXa7<;wIvZWu*VnIPO+eT@>Li}zy&JT&g~76j7vYEc`s$-u_l}U67+2O@HdrjXS*%O z*5EgdFT_b}PX_#}XR2fsN7aKHB2qk|54gxH%m?zaRKD1tD9Z}r3NsG3w<9e61_P)s zt`i)F#VI>n-5==>Qd`wwU{=nt3lMDToZAnd|WF_o==gW2n%O%HK%-Tp!6>H*qSs@8a1+E;Sca#!oY{>Y_Kj5M!bGkOO^LPtl{U&~%rZ7@!t8GJOVG;)0>ZrdU^}yohK%zO$mm==JzPmh=5Df3?u-8)lBs*~RYdk(NkOPKUvX(Z;PKTVgi=L)?nu z5_ox8J|^nrATflV9(SRX5n8WReZj{Sgh^h$r_j_FDzj+D3GozU*Dkk1$a+?Q*dWUz ztUP$cK{E4Kk*;p+l!&U-_%_|SPI2UEv0%suqbmvTD5I`emaep~hwa~`;&(|B(7^- z+2|BJrIs3@qv9@b`s16k36Z|a%?>$kl zcEU?Ol&ch@7uwM5YxPpPzi}r+<#JK1(wA@WxPoU?0fU4MIiR(dpcNFc z=T^ZwAX-c_%NY~?WkzOy*D4|3)alb#2-hXlvnkV1p?Ym|7z)j@agP36&lZK5E@||D zK5dGO&EkhWbB8+cvQAhd5^CSc)$H(IA+O%psA+OG=43V8+lX@!+d+tEh_itWSU z)}0|6!77Qx`&CBgVhqadc%Z9%l>}CT`|}2>X#zj2bru5z|81JZcC{54D*C}xg(f%1 z9=UqTOqBOwK$Rj%>#1K`9F>P-LbB%O!c0Cz9RU9t@TtpyeEve2jOjdj%S0kWGegO06k2#oR>dY9aur5MvNa3} z3bo|*e~JVMacAD7$O|k(oQwTwXT~0 zpQMh?P#S6m$y`1U0uN17P{B@ZXiVY#ktel5RZi4YA_}&&6SzhdCwi_B{;CFk)!7Y= zDRsJmSi$6iit8fnx7~hUtY25a_R>DKv1hR7c$7XkW1wzeU$<0K_%5q?NecVte%e=q z*tHjV?95XW%dJh=g}ajUPoD<3!%RJ!hQZo?Nlw+KqW~i(c0hS!!?=cOOL9FSI@Gi` zC4CuRq!lgyaE3fWXxF}{r>Y{6Z%M{@(L&QHBn}Hjv3ZuWKoD1e55Lax%Ru0VuYI@R z#zaMZS;a6tbm;!<5qidG6`E~&Nn!6`&K;0b1H~Np%P7^Z-tq|^aiM7#H{u#S#Y3Tm zJ&bbYoN?r=%sX2K{tm+Mbv0ExG1sFVH-}&fEQ69TM+=v1_i8a`z=^f80;Rx2ibCfx zSy+#M&AEsVe4*#H&=G~P1e)&~ETsTE$c-!}apjMEf@q*v5-teXJjT>Eux0CRSL6Ky zmmmIeJpeeuu{t?*Y^S;=Q_h_o0rQdL65@jATio1G%yGaFx8dmOz31EE{Z=T zrXbVC7w*x{%nTG6S!W8ll6vUwR43Wzhu(Uwfh;By2Na@u1S4h;~dYS{N=yK52})q^l|3@IXH*BE7{jDCIs5u(ur->#icRm+6Rk&xfnc zUWECieY91FDRkyHDjIv(F1rZu!|2LD5U)!#r=P3JHy$Cx7F9+Ic$}NTSBmH;TfZ#G zhBh2KZM@tDsi#PslvG4%et04&nY3?V6a(o%RQoM=4!+5zo(h)bOU6;_0@`Z^Aw7Vl zINBg+ztEh~b3a&wsxzzwEKMEQfK)q(mXNR5hMmMs3s8dvCsR&Pltf z2YHzne2%jBv^RdF>2fj0D?`{{iDZ;=hz|;SUFUmxp0yWVmh^5GXRUQ_M61BuB)Sy# zQV0uX;(!Wi5WalNGFyhr<5vq)w1&Gc`Q#vv`_ujE+(m7fQVE5Mf2veej(ysut0^0}(G&KeVmi|_-ev>XQIL)^V>M$B+3 zLzqa&`+YHwzQR1LzEvW^BEQ|bNEBY@4Ip&tN{kXRr*#n>o4pOM_-NMfK$ycrDo>)E z*b|>@>C5+YT6sYCd`J+9eAURqueM|;NEKK52Xr(^8oZ)UZY4eogt%5$j93ITVkQCJ zovh~_49_;5SvzzN67m%u1^bLLy@UH`9&J~QDh#Bo)Lmwsa8FlJ`2_m#GLVjo;J2Q5 z*XC^hiyJ;YhimO>4d+9Lzo#5irfhp&?#0Iniu{Pn8$y1D?P%J)6Swy&Zv14r+aJUy z>!Mt}02p97;o%dsyv3qLICVCMSNFLnGj)* z6D(t@tqmc86l5&iQ{X?cK3kdX-4cG`V|T3VD?k}%IhTw zYK4jbj$O*@+&xYnm8Ou=@tdb##l`@DD+VQi~u1PIPz@P69-en+|xw-Y{^*I|l_{PL{&9Wlx|Hz_>_Q6PdjW ze3$4VX`;>qL%jXlpx@lAQ}jB)qVNH<9K}j>?`9iOJ&VpS&=Zk7a2Ch+9aGnoOaB|e zbj~x?zW$)+!V4y@71-XTTLO9g)cx^(v2>2*#vnKwoWYW;x0b4S6+i=)*!$jgA<=)$ zYE2_oL_z`1XY&L(-UezEG>eErU9-$I+HTujop`?MxdXQs+j@Drg-{g4Eg6O3VPNfU z?znN`5l-p6;Z@#ABWJ^(XSMdMyL9G$us*Bsf~KN8Xd=gDfX)}OOFW?GaVy?m(LwpU zNu}-(zxa5$aktUK?rWAe-xD?mRIU-lB0%~$aU$d;HGF^q_V3tSB6L|o;7uuy`4Y|# z2!8C)PX<3KX_=!Z^b5v#BIostP41L@5;CLyo5=xTh2szQ5#Y@ZR{Ln03TkH3FDSC8 z7wt;Wyxu1%P`?_%uA63fq>b)u<1pPw1&Gc(Kmr{A(VZ$~JrUbzv(7CWd;E(DEG2Qd zkb;_hR?UX;fytIjAp(Q^H1HC9u2X2bu>tCBvkKuF)Y5|N*0e`gD{*jeP7C~UgN2r$ zn5%VC)BWC~+3;^aKc}B?Aq3J<>oz%49j0>Y;{fORHta`8gNb}$kqumHPZVh1udF?< z4Cb@KdE6Ak9|elpT)bJ~k@bVe8{*k!Rw(&4#_hWvI@moW08e~6%A`=>DH1i zlSYS8mfz3GJes54dM8Wmo{rM#0MGZN?d<0gvNrdE2`jCo- zYk%Wbogq0rhrZy(Q%8A~R+buL8w`E7s+uJNtXD&@YqgHFu{g}Y`V+Og3ur^0IeZWc z>1RBWu%f}yjb(|?Cr$5yH zjbrGJ+hp+hDv`93xHKHMuaV9CVL)Wr)jc}S*Pc@doH9?d2^V$RMK~DL2YlmsWZp^0W>aCXcwa#pP1lQW5c&AykBK;peGciQbWuR24O8=9?z!$M?x=G5C?80a*Vky5 z0L_Dl(|~{*Z*Z=4aY$wu|F3I`z{nz9v$gekpSFw=2IEk&JyVA>Hp(Bl>1+i7DTQz!)9SNu77e zJt)|smxFIfA~o*A7cCqTFr!Rc@;;Nd8?N`gkqSk?0)Zd@8!^ZGiI{@|Ich8n1^mRq zfrqWva7+GLS^JQp-Sm$46-Xb1xIT4zv6Vk?&w5Dkf&wrvs_^g=ZYx0so1W&J&=ANv zUewusbeNdJ#ORf9CXPd)b$OvQ2Lv3)AB1G**#(H7_>y47g=~Q{BY{io1ac*)a;DBKuR;G5_pmSBP*#06cJG4Vo9>FcCf(1x->EhpkaS ze;u7aA*nwrp^+_VL`0Srw+g^(PMq6tAM^uT&HcL|g~Fyx9+B`Fx;+|p2(yx11|oC> z%Z}BTE#>8GcL;}}Q>c5~sr8E5sxLC#5(w(C6y020)^F^^m~MgiGEf$=4|vcH@G|`M{y&i&H}gP^$YxhR z8!IevizR5xgFaLrJMy!ec(ci02u-6vg%X&7AX@)*1G4|PL4f}{+}Hk(8vuc_nDbJa z+~#@rnJ(`VzJ>JlqRYC#4HmoqD=BkVu7!gtk&k}`{*$cz*V`ZP2}#fyeAy-R6)B#Y zzl4X}twXPPRONWuk`K{zDx-^l7?D!K*Jua%zM+e|zHI@M&b_sN$-yx_+YGaV*B-I` zyz307w|>3Uzvp%H>Q{9s|N@CC_v2(lrsc(je!=T!)_{J*nn%G zPs0v3z1s|DV-y2rxdsj8q7i}7e35&%-OL%A|FRyYeE!YEGv8;-H`fE-0Qnmeoi(rZ zd4^f@RJatQyUrKJMJgqaW7&U;uLc*rWm*nd483dT=_W>@aX8(sIEEFyj?UeucxT>j zM1_kZ4zAxwTf~lA4Nq&J37a%%=yxCQsS6n+x1?4L!S6gqb#`iHVi&P%k`1L9MR=;O zeb?h%@IlC80#4J7ESFg>#F6`j>3U`u%9|wC`Bz7j~quEfc z*Yt>DM%QRPS>g^Z0+If)Xd0Z^zwOH# z887E6a3L^-)YqW_gnlDseq$#r7+d%GWZYXy#g}L;xx3Ls1!vMI)oc#wt{Qi@xteG6 zlj3-UVS!8c!CIznxZ_V~8*vBTNOmTRvsR}U5uxDLqQR@!z^zt9AD4{HR?mqP`F4DX zc?J?DXY2w}+r&Gqch?Y(KPE|5Ij?Xu{uKq#0p7y*3pl+u2;DN;*6(*65-BRrE5idR zQnuXm&OVji+Db2YLyGmONane!gD^{VW+?Akkd)a-&g?+uOpkT($02WiJxCBqnL~$$ zNTF@QwiCaMkEdYBysRYG@xq@17rhTkkw|r;C#P62byy@7sn+?!8C+2*X@!1|N1I6< z-CezIf(r?i77%mtn+{Fy+ALwp&$KcKFxSm_oyyjLk;s22Hd7p0-X;AN@xMX+iFJ^j z-d??e;JnXblzedj3c8vfh(d2YTuyHLL1lyM2-N2eW0>JjPih0L)FKKzEFtd0y8bjYHZmyY$Xye8RNk)u4Y^LnyI%0yYWb zbKVW&q}4^@s0#OXh*f6beGPv|Ho{a;{mR){?*0Yw)PRn!fJ2&dH%E`hiQI;VU=t8Yu3^saY z4hZE|;H;+NUX^%+67yO!qkA+TR61dK{(3Q~e4UszEX(p7FOfFLK}MT^!CU<#qEH}4 zpL0)mQZFQ&Xdeqbfe#k4X$lUVP?DM!< z0}0Le3P~B8hoc&uBQlZkMumA^3{Wwu0%EjXs8x^HtLB&ei2jGZYOtm$-^G4OnnDl% zXMx&Gnm>;n93r1_=$vsnCj!w^pKPMyIo&2N#+Ka8{DYHF$*HLy$JEa3Uz1nyTi99J zSBX@9f+F?&U7K5TVV6qkjn2+<;$|?cJ9!cxE2&8{D%lF>W&YKvSZy5?ue2#B=e!svk@o&WpS|KAJ3n7YM(4hA3?t46HnZ}1hN ztP3wRLays^;B;G6L63##&W+mUrR(* z7fobiu6mn!3(6rl3spitfEgW(3A(?0xEi-VRhcZmbMDy!2x@lB<>Ef5(@!iSDm0-x z6|hHOkxK<1qK6JwaWHM5`Z3;!b)tI3mw{g>l(BT*H~5~M?Nj(dNRiBU5F<#18Fq24 zVhG9l-im?qMr;7<ud?9gtOgQBANrD?1)gVNoDx$bW|s=w}%JFXDW&h4n=mAX9=@S;J<}|5%;= ze^{{&UQ$4l{aAs?{r_7DEd_$r{?`oaf2wr+pJ{_M{og8C5Bu9#sscd^qL!IAsoDgE zn_frPJ)(=Dpmdv+gC$L0^_POvxnd)~nhX7_FqUE&Gq69L;M-CvAfH(@-hc=2xP z@P9PDg{K}ot(1A?CQw;@R9YN-{zBp9vu|(3e$)8Bu%34L;_&tK6T3jd)Fu5&RR(`S zk>A6zX5{C9xd|u~b_)bY`)|L{e)^x@p_tME>R3MREA%4^uvw! z&+wxMg#p|LZ*bZ_S5@||z7X<}K`}o9d?XF=f~U^;tfQ-{*F@bIVkXuauH8SAq)%pm zUL&aZ*{J-1#AYHBlYS5;$nH5@%uZqk8MhBb+=J_%0yrwhJgrHMUk6f^di?W1Ik zv=7?FYA*MrJBiNfyVPp=|M6gO&;J?rsQ*_F{$Jk|tq26){IA)69uyb>{-}3Edj5o0 zxp#^B$Tg=xw%^Rs zg-3szz1C|e4Axu^&mjf?pk1u{TM)d^zvm=A0Tj43 zZ5~v)Hnun$Z%Qws<^&WiastJP&5;e%B$dn5@;{oogPzK2uB=!wv` z!$`mpSw`GV&rK`JQOXBaK%i>&)l|>X{1oiqNW6dNl91)b^YqnVm#Kr?@|$}UMenf5 zA?1CtWPG)NG}h<6WVdd6;1$>JiPepaC@h0iWwZny8VFjgk2d2cMB(d7g6iS;kRQ>E z+dA;JeBtv7OS4#0)$GGHvGXE8!fE*=8ES{TcL+sNx=B-g| z=7QVLj`slGj0caFGuOVuA6xIsS3vua;ym>Rok(&(5pr2+KVqhG+Ln^&C}k3NaA&c5 zfH7fp-ayZQv(dDP1t}l)akyL7B1~x86^bYGG7xNUOYvoW*r*YMR=nSY{zrbl$=bsj z1p3?<(g)Q`xPPc1vTkR4flNL{YZ=_Cyiy9Fe(23L&B%+?1)7c6AF=zyoF7!NSdI5p zhX)nyPJn<+vF`Q+ecRfD>&zzmzH7N`d7mIE`} z6Jfn2gg?^+G3)2P5xff2EsXNl|k z*-@_4v7;M-bBe#4XRQHB2xvMJHN{QY1sm0SH!q@2Y;m1nJBZ0i&obeB{Ii4=nTQS* zr|P1PEoJJY216e3;?6x4s(BuXSvgYe^ob<@&9QyPxk3m}HH`x0)>N(Wta9F9kn|#+ zvP&aq3!6g%Q86%!uspDytL_wBqF^78Iq(m?w86?J5s z<>Rs&uhMadqrk?^M(mck1%_HuF;Arw2MQcN8AuknuHDPW_0@iI?XT$=LKxZePc-YR z&2R9)H$Z08TsQX-Rjo2ozPGK|QUyZ-m8tNF#_cCvgx&%k8T2tWPM@zP389dmKTPzK z+$*%SsyoYQ(w&Z!`Am`UbnaRRNUCb15i$lbN~67TwBh0!UKcPZ)scjK^%o^c1YND<2qR)T=MLlStXUlzn85JDn6J=Enjco zZui6Y$?dWhWLdX&Zl;Z;+MlA3J$2~>v99YdC)IX%P5@2}9TbNaUo$0^($x~Icrr9v zlLWslPx^nCUchUZ*As$t+i3pjr}I_-nKw)!OCbJ5_S|%+UuGxCdP=h5l}Kv@RY~@= zXuXo(W9)tT1r@jw5a-L<{vt+6&pLbEBMjIo5};JYqZFY6-`#jwv#BoFr$E^A#c_yh zkJFCxuF8}{nzHi&lDu!7h4*jKg~%dV^Ek_Ok!zdCGj_WIdzqcTXFpL`e2k*RsI;`+ z!Bs6Yk)?pi3N|2T^v5*buLvM;;ll|qg$KrUQna=7>O@XMN~(ed(TfV3sIUa_E#64j zVj#(G=i4%x;0&ac^6&!<7Y7_nE|svT7It`3th$K|Z%W96 z#x{1Q+bwlT4$?LC+e%HSg9hDEQ~3t;9c#xw+?Aeqs!U-yTbGo{0^n-Sk$SOqA4fY^ zxUwR}KhWe=p*f^l-g&NR1bhAJdi`NGjxx5!VuS*$YG;vMbn0?6nuILhIKeSwZKVy5 zgO7yYhUs-z)4|q%uI$gh&L(V-Ex0h9>;Q0IMCS@kRm|HNf5()a*XsCf6+w;`n1!WR z7sYDz3+4;;lRm<$vUi0UzNrRVpzT9g@x}849fl0Mt3mQ0uhqp0$rXSI)a*p+QY;4c zj7Cas{Dfvc=VU@W z^^w;b`F;mSvJ+>p;JTzvA~ji*2j&xcLFP!{3?qZodh*(|`Nyj>=VYn4ba<$L_B z<+f5|-B97VbApDVJB>OufPb{ipb^~rXPXBV4er!8itRl;xb|7{u0mr+pNh{?+X}R- zvyorv0nW=BY*a!;A>^;v`C1Qq)mWbg-n33k%M%@DxHt*OH-KJm1i=4)0E$3$zx+>B zAsoaoNZWr;%_w%3bk&_hjo&8wGvm;U30uJJj-j8M*ThWu~hmt?3S4-{5l~BcrASmBXn{^i3#bm)E zrlEG2IJ;Iw?J6Nw0w7(1@ft%&CGS)J90UJ)4KiehS^ zKYnOy593G{Mr`{w;a4|q2zX9MfwNyxWXd^KAVVxihhO+J1)Y{AKV1EFl9NGm7l6E^ z-~+h0|7eXiL&#eDO|7RxGh*z2dZ>2h;yT)E*0A6b`?2-Tz!q{Xg*9H-;q%WFY{IX8WlRq$B=|RRsQ>n z<6{6_QJ1nZ;ZF^oC4LqsNragz>{1E(4E?~k|L>Ud>}OmbBrvDpNpgs^Ce>CW}{t7OjP9o^hw(FA_4Gphi%f-ku&{o0`{v=R&|T?6!fxQAuq?ps_w z>u^nb5+dz38|{xI4sVY@tN}~l3dR~D&S8K)@cvz&QLxY8} z8LseOHUwBfKbW}BnknoKx@q;JwB%nFhipw0ZVm@ujS(KW;&)r^BX+@16OrmX=}>wU z^3oF~o7z5glI?IbTug0DvHqX`XDMcQZ^k?5_-I4tw$(XldbiF;Aa$1;jtk4yim$et zw^|*1SEdj^9ay$M<3JRA!8;ZhTXTaAk3DLK!f^JtIDqWu^SZxB0ULQs8wU5$8#6k~ z^%PJnVb8lyVTk^7Y@m=EP!t)57;Te>hncI@HSoG07X~m_cxf(idGZb7<9?7l7Mbu| zsB4x%_Vz9$l`=VA<>84%*}bdFF}fm<-gemF`05hw2J%%XI?Cu#v_l<0cQvjs*pQci z556FB;ee;1L%HAA>>~mlRF(<4V&i5qdlO2Vy*Q|y&`c~;V3J&pf>o1b@rA^oP&hri z3-~8g2rK9>*~l&WQPAn)n42E-rQDm9YmdwU8p=dH9$a7%6d%r@tDPKVgzt>Am)sA_ zK)mI|sp*cglR)~$L7{qilwwj@NiJyH*)f#$N9N` zR}LuG-6Z)!1IdB$2;7vdcolCOWk;)ubOB&`%k|No%&X-0M?T*PPAQCA(<;Tk@51x? zXkq2aI29ecl>8ZKOYQC!Y_#ooC@cO1I(hGpFGA6(qPyB1_E!EHnT@jDzlwK={d z@D_bHSItK7pR7Qzes=#My*|?`jlDJ6&4tzSkYXP$?X7ryjZ)^DHFj?09$>TA7QpuB zf=p(*<3+9;lE{5$`UGTDSNVR`D-?6x$Ohx&UBCYkF4F`;KfW*HCID-@(;LmCy&VG) z{jC#>q-MS;aMvHBlkNcKPeSAWx()?bl;iJPw%2Gh*>iM(>10A|0=fNSS0p1m2BBbI z*5Qh(ebeyr9H{uSbnJV*wIj{vKJf}{BN0cY;e@{`zwlD<`e+5J!In=QKNV{#qY$D7 zEW~XADcXyrTIJi;4Q%FF^FSgpsRPz4p(q!owr%;KdN1=GGabx8iD5CH?+ONRWq_;e znj@`sWW$QNxzGx9m#O15pOyKD)hl{r($qBWZhYyRJnQ zcyfNIUY`f$1PZr}fXIrCqyPG+^3VS4umE~&q@i3+5+{BLQTaM;N8P(9W&7a;KTWS8 zG$%nUureaD?sm%net&G%8K6G zE=(W%s7^V^bQ*f%G1dS+>zSerOL`lCy+Ks%vzOOM8gOHLIdv=voJxP36uzG->nv`- zHm5)JayDcM(;R43sGullA0lnsCm{GR{!EtzOnh6s{XXArP%pu3BND&vc~eD`(-u`J zG`RLtpIL5|Ax8vC?8N`HU%dNGwINHLAdvkHoef$7uR+amII-)HnZE*(8lq6`Ai`*V z;-12EXKR2^ln)U($C3wx9XVH1UE;-dVu`*ib3~>%}Fai@yxcR*10?s~HT>~I8l~yaheOeUn9Y8GAiPA$W zHd94Cjk`T4fw?8x_0Di*H1zFzh8k#R38+7f*I;v?ZbvG6^@J@Te`C%DD3$1a$UbAh zx4e#09D%rCO`EY4I@sBX+1d*H>c{y}+wJTTA@M56s|~k3bOc~KA`csMMSx^WdH7{@ zf8^S4lgO6Bd1T&PQajICEw2!lvs)vkDwjcS3fXqQDnq-j>CjYJ0ht; zJ|A`YBZ|8ziEC_yoMC)AW>kM0*4|_JqWe$chBaaS<`DjJ_x$Kb9Vv1mh#9r9Cs+>Q z?%na}VtWeJ8v`;)xHqg8Spo;Q$Dj0!<4Q5_fz#q(~j+uIar4`!ZjbRmEfH zo=b3+=tD8oS}L(kHKA<9exWqqncncyknhhiH`f~*P0XO8>BDG6b4_-T2RCnAf_0#_ zV`Q$sG+fhWkEnj8=l`2a-5=K9gy>DEJ=s!`w@WmoQS;=61Hpc}eWjU1%tdENtccBa zqM{oBMx1x%(^*plt*a0)MPAv#>QW2kZSIHgNzwu}cQ4 z*Z|rwU-EB*3zKYWo2rBl2_3rh5{LfErX+}Zv@h*H#)!G*L3tekobw9-G&R(n9WdgA zi|RV`Of=B}q>e6ePEN!ZfRsGp@*bxkX5Fg@nSE%m18JqS%yi4ho)q1x)rP9)_eqv- zM_!jj+-;BfIqMY9g`V5etUyLjlyi7o$-)4x$1$oGl6Jt) z&VD0U>jUlu-o9}y)kaxmQHtG#Gk2ex9sLI;xx^}qN?QCe6N$i4Cnj?daUGXdtEH3? zS*lE=;z?C*a3HwkhO6@fE+~-Dk>|GGhslrFKR)X`G`)^R!U?M8U}O>qy?4pGQy!g+ zx8^jI&A1KLEc^UbSDK_E?SQ8Z`ZkIANg>ravKo|*h|NITR{6wvJy6EzJ-WJ(EqW~s zvj<^qV<)e9M$FrAJ6n%y#Vw=!$JExSJwIDG_=Rwlr0W~#MsBwHj3GnrIAidw&L`t{B~G!HrA;QwBiDQK`XhvO`4WD z?7H;nWPQ!{a{axwR^2^wf8LP|mLX(?!N0_tmPy1Kmvj7cK)2y07rT5n)FLVJX(sL~ z=6EediBToG&WN^-uxx*j;VfB1Jb`G@i{07H2fCD!+yU5AWw3+!l{pD&tcP&uSqe|; zr!vDkIzcI9^RF7K;wPb(!lACpdDR%h2ji2vYLYH|C-4dr;fhqsxv2PTIjOCC#PG7Q zpk8w7(!kn;a3`1_l}QLvat=Jw-1Q>VF1323Zm$8FuhH~}<$=@*ByUnWCHpo1i7!(U z?(N-bpA>Ni6>df-Eh_@`x;gqA}eGJm-7SKtUBarAF5uTbTq*o0({pR{Dd zXk>)J7)fdhY6=**z}^-2S-=Q6n?o%a2m_7oAp3UJaLdZzY0);Y8?AQk#BpRDaPvzD zAR)OgguJ~Ti~aERBk%I-nA6Wb>Fxt;O0$O-`&3*YOze9D@czo3 zRj#Un^)9}!Uj%u4ynO6SK1s+BQOg!$7|~}SHRvS8B0}tn> zSaj4mo_72j-9&ag6$&n-Dfi&8@CQJ&{o=z0?Rdp2SG<=KJS?*61KK%f$b|EvXuQ6! z0&s5hEccl-d%6H7<{^hsu|3zq9ThQtA$s*z9S)^quYU}v)*xY>Ys1Ku_e6Ki6h1&Q zl%KbyY~=XC@Y1pI$b;YtMh(F6^ik2o*>dRAqU%_(GhDe(Y27;=639~WLpiQx9sKM< z9VjJspX?PwqBwuyJq>j1SjvA%YBNljMHIujMx9GB0jTAivF53}XFVR7wOj+iw)St+(NI)`G`X+^L&$g6KA9X--oPnto zD0Y$A^j#9R?B*1y12WW+K*B0Jm_k@;Ea059OAL;u)eR5+U}G;_8aT^=xncahF?GjJ$slBnQY$ zwKuW$pq`{#MW9fgW{xF@vLJ^A9blCs2xN%cNQo~<1*Wy(TPH8*3|}Qkw`tm3kZ|46 zT4^IJp)Tw$0%AN7nBw%fpDAv;8MbA*CphkAFTe?jT83=knMUmj%xS5C2__|!V!OKF zPE1lxQ*IuMq^J2Kh)4bOgtKX%)uj(S8+?esbcjj^2Nm=R@h`~~Ildoubf(M@GVto# z&^B6BOgQ9K6oH=gJA4cJ{C&rvfAc5MrH0r(QPs1VA(isL6ify4j7G*7Bct6mI@?FJiP$gEy8$f8UT37;1A|H* zU4NJmZ6r*sT*HJus1ymhy-aJ%CSvzAa#-N*=no0n%V!7gb669)Wjt+{sE1VxRJ+<# z&lgbft%g1G@DKeIn67%4Rpg>^muh(!=Yk6UY(8ExZ2gH5jhOVTE>4_XPr{sm#3h)V z&|VW5h6Un38#PKOn-hP>Gfwwq;%ezaVKUz&{Q%)WjNRSUi9IGNyO z_$L+;KT+1v!@wtV@TyP^EB0e&v-P%1 zxgilD79^mIfF1}bm5L(S5ifr;%0B=qBT_U$n6x8C8gu1tY z@D^hp2t>$jZ<|+(KtQ2Tx9O<)prX96T@GBI=kko6la}-^jJb~76T|Is$SSiNB z^{m48wkLRTSdpyG+_3Y6}pqI4)t)`a{ zw3T{*5%DXIy0;a;8qOt;J#)J57HNV;`Ci#Znn&TfL>`q!aLfZf%p1O-v`5HM(L~E7 z_g4266}OrFlQzrzAn2m@2k#f|O`8|pw$V}m7A>hND6B4`Yief5l6HpCs>MC%?8}gD zUtQS9y0X}~A?8%=xbNR@0#{jy-fkxLzf7J zj$}NseJDKK?(Fcln%$&3l2;ktTah|{pO(}V%Qk(hZ>JbD6QF%?26>>QFGMog3qW)W z5N1i{isPy)zswsRa;H|_@Cc>^G{Nca$)7}KMJ{ml6-2+QuUqmABBs3^(h>p&ILX!& zoCGM0DbFWECXovOrgA#ml^6+hh3{6`B^wZI{5KLf$ACO#7R`yCa)b!0e|0qkLGwf#x$u(js* zbCp(r$fcDX?Vb+>BUd2D6>9eecZW2PqgsVzY3-Kl#lhSQfjOc&(aH@I{w!)iSMwr# z1OslSG5!#)8JcrARL5cP*7BNhGy4&xOICob-INpq+U42}x>o%IE9p*?1iiZ&aKB*X zV#@>3>>}uzSVIknyB;WjpxW%#%a4RD;Hc zFxfwzAm_)inQgD3wuOF%^KDsSIXu}*@l}HFho_3gB0MDdDHMu!%P5X0Xg&WGuzMt* ztL+Bmb!an`Mf1Es!l5g$JE(7lWp7ayS>w%3F3hlU58%wLD?Gf03mV1}l;N&;&~0)W67*e| zWVPOqMT1$M4I9??7v!;~wWo^RD88N*=-`MKw|K^tU}zk!#4!cZLbYJjs8w1bes_%| zIlDsBt#ED(6T^(#7jLH~sYDMA8RUL**)PyUcbeBPjj{c zGB;gT5K5^h#H_{%UfA&=&+8a~K<`HrIu3m8yNpmmhbEA```iN9MH^KL$Shc(O+%>s z9kpR8y&Jpi9g*ZJ3_93WX@791OifNl=^I^H?N}Sd*zNa8bfTeKY08f_d7Yo>^h{%4 z$A$rE!4uI#ESs{&Y_^bTK+{AF#bzu%Cr(1PEpQylm;qQ@=cQGUM)jt1J4KV(yX-cITBrC7+zs+OI(>JGIWQJ&!0pao zvT#1DY78lC)$&N5T%r5V#!Ho-|eKpWW_*dS`y2{cVEf_4LD4VKN2&f{&Ij z1%a(n-bo2z!;jC~)L-)zo$|3O0+$!#*7}7To4ZZsRa- zL(bxt!0jH>ZdASPVbZruiN~Z>hV86#+DDwRoN7f8X}T`Pa6QyrUTnhg{>73s|JJwU zy0#jv59f<6i_47xs&$+P^yDsEFduAHpv!>B`dchCp;5Um;Iq2CDbj1#Hg@LCIDyNm z-SWgxoAPNx;r>v&gwmW7RBPn$E@xydB`mva}3r(kP->-Z91PDiBR!#aeRqg#nFlSa8w z!Go~PZt0C-u^|ssW0kUUKtYoK+cA?rQHrGD#LM=z&BsXI+na+m5r$%~5Rm`DcM4zP zQ0_RFQa2FYP#k!k7Htm~SJ)h?1RBYeXVDk$sK+85<+fj^5kJx%6Aa+@XIH~wnil+4 zWiK}C&yvfa%utMgK-TtPR>`Ir@5o$w?K7r>vkfS(M;i$3=px(A2nIv*foqsFdvhzs znbgKr2c@XhPSWZ2dU=uW*W&7Np|pc6>Ll${M7?+UI;(79Pa;|%GE0RF3#t$-wR>myvZ%lQPu&<4>=At}P{hwmE zD$Iye9qxK=e^#=Ey5?PsuXFSWT<_u5VVLXI4t9$2&i8ws3$~r^!A-i$Jv(&6SDov= z!8Z$zu|_2tD6Eza*|5T7U>Gei8%aN7rP>vMn{22IUrDSF21#}E(bcI+&};(U_SHFm z0TxI!>t6z`ELP+bJ=Pz^+}%U+PyV|D2-v}oD{;g8F!ouHSm{>?+uTe2A~5#^X`*WC zVS5X|#E6htX$SeEim4aMOLVA_F?OTguV<%rlJ;fCQJo3Kg(;WR6ltRC14Bjhy)H7c zTBjw6JzCB)Zb3J5MA#flu(g=6m7*@{=cae*6Wq$MOCqcOSwn|1N#^!3wo}hn{zM|K zYGq?cPZd{%^rItY+stew9ib*SIjiUp@l_1F1`1q4sSF?8=q@3ie;ec(L%fA8B1#Uh z?keF!o>B;fKY$*pwfLd8I$&{5EXAZ3Fkg-Oe>P!`9-O&41?@Ai6{k*6h4LXkex6+7 z^MZK^mCfvpuI)Dn_CFnM+boKq^Q4f$@q6u=X|YXo5hB)4DwJnX%0wnL^=;XFj{9C@ z=`9}&BmyshCtmwkWUw2lidBM7EeAhhKWmnk8@|nh^ifwzy8XW`{0JTZ2n?51e_Q9@ z3ZRv@2$c6Fl4N1Azq-==5imaT#=b%V=d*oMP)yrVLp@g3Lw@R^WT0zUZf@-JFo)-r z8+DO$ zxW1Gp-~tmo@ZM?0yO))6Zsc_sQpQH2@GEMot=3DLmA%8>h)r78_Ypns#nYN zK@qMxjm57Bff1H*vaJb8fxf?M0`l+T{ttEqDJcjV3cG?S+IHDd53%9 zjMf2=jh*!=iRN)2qT?r8&6OIec%GePvoK9k)2AU(H{#BJn){{lK77$IL%&IgcIj6s zN4A&>M*4887n*pt(g|3_^YehQ^mHzHiDJ*!@>k3b!aD#nIoy+g!8?(5&Ouf?PM8Z$#IgW{ev ztHc>J7pt8it6C?Z*wZG->)n3NXzf#5VCE{xD@Juy8@tOPtvQCJVBXK;uM5dJo4k?M z%h2I9X49E(xH;L>{4s&B=;Z}mdXMr2c3b?eAlh`m>aOE#8fYOVuVlL20Hs5H$I5MyGgbIkRh(v1hc_=c4w= z^m%?{eB@V9qSr0|bv``~z7?-;G!|04<2=EqD zGXxybILTK_M+_rSCd?7`z-S9d1%!naxNmrl2;v0IqBlx3rvZ^eC?=0Vaf*{a^H$qW zA?v|K!X^+IzKI_FJJl&-Yq&Al&qXmJc_R59lWtD5gsr7__X)F4I69W3k!TmAbm%#r z;dN4Bs%@kkfhgNGwfKa2x*cB$Jq{k$7*T@=i(8QJV|cQzF1zSl9FW(>O!_VxMWGd$q1HSV*;4>ffO!ni#LQAZ^u30 zOX5OVeplA0UNk4f{eUrERi?e z$uWAtz7H6#K$EM)mOJgW7(+l%XN-^buoK2q;zj1#xyDmKpWFl>R-Ehkxr$cpUSG{z z?+!P<&DNPRWAp%Qk!;#-U?0P2FA>b~43Dc^OhV$x{q{g_i9idV`ZKWTE^lMu`JmGV zFW-`>B$HlHRoxXYAEG>snPxboNwL;d1&xkcLV<(RHQGSjaPES+oFjB~U8K(e0XY%v zFd5}o?B-t8?W;@78$$1T_sAq@iu+vaP|gd%Qb*L*I)KHD=_bMbzOe*aA+Bb%1pdwp z+wDI%67@%nbO;RK4rr=)&+D6l4ox@RTXh2V|689KbYV9I1d-sJ#aYX%4>!Q*n0~`@UPADe@DG>39X+mWc#)|tyntM*XSpHG`LD(JYr9j243=u% z#eRKUS-FORiE7E>KBs+?EOXf4{?_iO%gUeE9ge_YKxHVHKu^g-w?^)UNSAWd<{jjlb^4vvN_tc9jNK`saL@#e}*L0_c|-; z0Y<$o3>m7ZRU}u;nl9>=|8b0E!3v|;z3Xl>LkUMOtXsWkNs*Qk z(X}F3G!E82Gf9S1nb)P#GWei8L%hvM@%EeZ{27$6;B^3YAZ$OYc3=MZ!(U^>0Mqii zc8JG`5$^!6jh9pzpCf9iLi8k1>e z`^;;`tuYzzGkW+}7;EsYf47V5`lpJSO}kv zxB;&STkIhk#6yuL?yZhc@7NF@QbvD>a@P7R-J$|wKl4(Jc&m!{FxW>6>h+G!jyq%F zm-k1B7mKe?$|n7EosqqMek~2ylE-@M3plXxeTHoXnC!PQ5pmQ2q(?}00000 z8fO%eX>75`dSMp!+hw0HZ`ofe17J zh5$g4oD@cZ00jVdCaw7Z%GDJB00003^JCGGTj&mvMiFyPoyX6y_2cW`1I>#9(}>elkm%IW3Y~$;S(_~2%__>Gi6u{Gz3~f>E4blW!$`5c z#^vH6IGNib!+W1-iAC*%N4bST*{ku>4icRs&RII}*s-#w>%rH8b${P;7`~kGjH0QO0>}!q?!LF^m=PeLMn4-YnHUlr(blLVS8Efh=HC))f`wg zm$;)(?ux2l-)zKiS=6iAbab(*<`-akQC={;;ckS`gsiDQ>*+NfCd>fZph84;1E!Wg zYgM%7&-&XZJHop<%jRpH0IRnxf|!GNlm5jxW{7w|o&?n&c1nAk2hL(gdm1X|VDH}V z;_qDmdx5Dot{oN6vt85?sVY>%B-By_d=10&^4 z>y0L(0%FC~Cot`gwwEQ-T$+VmV$hQKcY+o*4+1$@dTyH-9MDc138U$o)f38B=~Zx6 zqJS$j!%eqrs;tTh^9B!KY8zn=r`||rwbTPskwmsR0^&kOIuGQ@Nf! zYtpr9*Wzl`)>IfXcWH8j?NMcPJe23?p*Qm|yH*wh>;C$_BsUIPj_>8lNa~iK+;=Kk zDSz&+3M6{gqF_l(h(jnJv-vy6mJ2Y`#dv;D;^|ozwFJ`|Yu)YNMh~%2f=4Ysoa#_i z5|3!EI?+!M=%*<=PBv?z4XN?}3k53N8f)G(17a!ataineY#WHd{(UJ07GRI|p50V% zQ=FVc?m=u=CRIaAFR{1NrwlJ*9Euw+bsg28ZYq@uk#frMe#Mql)aDkI6Bh|`ah3ZB zrb?_+;d}e~3sIYNO)-VEn*25W%@#G~Oz>os4p5(5n&<@(DFFTHa)T2z!^9H;d^tC2eVs2Nt@yTW3L9P ztaWq6OJ2Z?d$W)}#bw`+Q63;__d~Y>p}zGSRkM2qpXcDBVd$wpk*Y;V-7Ji+sOVu| z`~agt9f1g#0EPfSlAIJqfdB;nXr!(%YN5CQ000000JLM!Z#K@-qFAebj`xXcf*FR` z*O=8*c zKj?YK(g0(x4y(t1jps0WM=H)@8uvg|q+-O^HF;9Ao!bD0?N(@`eKSW;IvY2QZ_ife8Enh5$g4oB&3F00ICf%m4rY z000GHINV-#VI5KSLzyN^oPeW5LxBlk0EPfSlAIhyfdB;ndhC%dLjV&J000001Ri71 zi!L)9_dXK3u}38feKv)@a(lnnV4wS3YlydQz;&Avn3qQ2Xd$iIRKKP0Q-J#Gr!>UZ~&_@!Z?p6cd5n`n$ zNE2w9rM8sXYDghPj$$8S>1cptP;G=w|8tBWoiMD{IZgW?p8a%_QV?3rh%7DnaWO&e zS(1hPe7z5m+G57j1u=EGvdIGV{7tVv|N7Y&k5W6G($3%!{&l)3BV&rp(@;a(NVzt?1 zq*kdxIhf~=PNp-sIO?16rd!PxWi3ACZY5*QtCB`!0sl(wKC}b|IJMg6_Km=MHl}OE zamWYKE_k>t>Fh~_Kz+n&qgmQJS~P9Gwy}`@53fWGbeyH$KLT&tgiKNT8a$Iwj?Pu1 ztr=|4O@td(7{KX3h&E*UwCaUEGlx|&XiVb`%`x$i!U=!FB`vrxeOy}vf#oyfsz6Sl z(`{QcWs2Lj6PRsHIH$|!NHUFIBn}+@pp^BXKCpHD4K1f@?nZms^+c4255(y7h~0IA zrKY=+^C75iX51b(g!?T2C;!j?6>w-Dl7`yTi8sg0CS6p<`^D~2?!5$7I(4(K?etFs z9+U;@?R&V0O-E7^g6Tc4;x?bQW`da#5RPeiGY}mp9bI)YzBsbbrr}X@M{L6RJxT-f z6QwUW_G==HT#I6W)He|~T<5T@j|)Li3Zqc(d)^6|#m2r}+!CkEo+&vIlZOFLD7fN} zzCOsgy!=c)Nqs?VYp)_E(-lXjttIDofM*s5y<|>C+YQ}vt8U<^tdZ!tYJ)B=(`)np zorK%(c(`%HWpMA8lX>U|4~Zn2zo&^^StGeU{XKSe%d@(q%&7rWZt^LcBceJItsTt~ zo;>X-u%J8rEB=No3#GrmSdICGOz0LP!$O$SmO8gN8}DG?1~{w4{#@AchI=FhT6WA|CztUoTtBeY8@ky7*eGrb_sz}Cj< z;ghoG-7MArqYr}3D>h9qI! zivV&>f+{d;Op-_}W3L2AD#Ftsqe0q%3B&+~06>zQ97cfv34nI#VC(+9?Qe0d$l>p# zPd}=F00001s$=iz6iDOGf`0shC29Sknn?#g?#`L3$AZpJ9A>ZpXLA}+x)Imf(D0Kb z4(nbeHx|-caWLY!s^|z zIpc2s--y%6L2R?fq#rut{UBQ0VldwPR+tNxcpBZs3w zmo^X8VE4wfV;8|h`YZ4rAO}DkY&=dw>C2iOFMR8Vyy<`9P@RU$A^mzpr;ARagfIisUdRC4 zl0+}VpY<0d<~gs@4}fQV+!O$4)snp}&83#TfFDD)bpZeX0002OcISdJ0HYvbF@XR8 zfPzVbLI5lv9VQGoBpet}5C=ei+4;VY=XP&@lkxs9{vYB0U;XcM{ukl+pQr9~^n6dv z_5b60(|@=5Kj#0){NJDZf95|&^MB8NZ?*py;`rb3ADi<3fBeVg_@9&QfAYL1+aH_q zejoEcC*%Ad@ZO8S{$Gdw@8bAh=6o;mi0=D;d;c5$EBy=ko%Q_BX6b&@)O#OM)NBV) z|9k%5{XzXH>L54rf6V`Dc+=Cjbs+YhPH5-X?N%x`zpkc;in}+a=uVfLfN=fw)4fJF z_MI=d1(&6z<43)%AX{WWWFb08Ep3^+Bef z=DAv2QV6u~qiPbS;M!tn=JVKB_wGy3E`ScX*wmv&H`bhObt2SlWvR3wq@>DKkMuxb zG8dTpfO7_)+Wy`*Q6XIN$9=d^kWv&-OTLYxsX7)gH)aQj6`3SCw6PX58-xsAtUo*tf`zz_;<=;qss z9MRRm3!qv*GbYx7xL)Z-=5(5fY$B?zl3K_Q`_GXVVR&52x#<7EE?Zqd*u_(qeKq-uweN2u=DdwdUGyfF=>TMTW9c0&Z8?vgsb>)Kh^b! zz0nv1HziMECg=98_wMO*aX0Nyx$kB znueB9=<~$%1=W9e6PjqiTn3a}C=vh_EWNMp*Xwx6*5SKc)o22&)Im>h5v+7hynWJ*zLQ9v^@Idp(0!ZeomS90 z(h9JF!n064nfH(yav0oR$y^v~?nHwX2JZyUZ@I6#0curmjk8SIRhTm-7tHCOr^A=l z)iC(hmhqtrbPULR{+FZLdq4y!S{dw$`gm6~K8-!2$zB{cy6g`8l*MnS3M)YF!2-PZ zj$|?w7A5bY4aDkUQW)UuvVKKjS4KdW>dGlu3K#r`<@?84QfTgfHoWPY=JoXao-nra z>a+;;|t;}nqEd``GZSfHZk^>hyMt0og)-hEr*Uc zT?N0*c;^^qm4E?feT+g}^jLvu#Wj$ro|GZI;Xgb8D>Sf*w!l&0LY7pqhBTy-n4Or(oZ6Cv? zwiF~`C^DZxZy?M*bYIV|2tPKFZ3>|AChrgqrYcENnnsh6`{oyKF)J0*0 zivkxg3CpCQ(r}%E?PYgu=;MDrjAFDSE;jSD=M4WZ%0Kp+fevV!#n|a>>;m6{Q&EQ>3CuqSfoe=sqjFRI= zMl0PG72sgQdt^NVXZ>?wkK?Dv^5%>T)MgtdiW@1&md}f+?gep+gJnG;#}~1euDO0m zei%*05D>?VXu6Z$nzqUnRao_JsFz8bYBW)0Y#$%L;#s-zfTbi8DmvjbsYye&VZ@27 z7Q3(~*RW?N&gXc>LOgdJ8~9z(8?4@7-} zAY#~X&DSuBunHAiIFg+t5-4#aSvo>71bio^VtH$oTg8Ml%MZ@OmCf*Ww+)2vfS zG;Pw5y60)#cnd8f986s@ybR&|usHB;vy-xA=z;pVTtR?cshtMc(xN~=ZFFJg7NjLz z5_oT(V1qG}A?yo}M8QXXrZ4eNcdQMoBHaM+)PaGynUlSZ?@*xmdaDlK|0J7qx|I^7 zJ|p!JQ`Wo(n|uF05=yJhx|)&HwN-(B_jmNqmX`xrG+wU1Yz}Rs%(fI}?Ntfu18COc z7r9r>Lo#813`&pN_R{j8m;JkEz=Sip+HPM4DZ(VIMB~K9%gv^!%sUdcq<_hd=sag@%35y7In(FSL9hPIZ0dH&QlTY+7*qCDmZS$sw){ZZU<4h{O8oWz=?MAVQ z7Cr<<&W8z;rfIe#B{XkLC=Fe+9ut$Et3Ox+vy=N}wkQ^8E*KWm0cpT!z7;9DJQ=?n z>!whA%m`zmXUlwz!^WZ9OLc2_*Ne8`)#>ae3iZD&hEj^~UN9}@N?@Ix8hNpe5Bq$s z_?I0use(4#ZC5eY6hR!%Fs}7$eOEH5R(@8_>TwDLFM?0sTyXZsQv_}0@7FSkvtiN< zO*)Q_I({%l?vn|uP}=aXz2Hwp1W2#6U9psiWXldIGc{U+4rnmOX}XT5ycGR&K@sR) z|FnaTalh>GdUt`_JTMR(Ni3H{%)ZxsHe)p64&P}k4J&}cP3oSukR!mKm@JxtIq74t zfvn1#R4Y%DW!8N|id@$pvl`lvEzAF=8D|}uP6?>JfGBW(0swRkQ$Lp41!16kTjh{eYSJXTR%t<0gEhNQtQD_w^E-u(K3Emluy(;( z-Y$9UcgCzG^f}4_XcGfpeGp&tRFTty`O{v7*#}K&Oy?^Px9}1jDi&4=Ijp2d`CbSV zvchxtBY4RN9ZOp>ZSNX-(Fl!HjcI3DqS|4Uw+HpqxS`ZYwlx3%jW(})usO&XO*+P{ z3_D3p$0c7|Ie#|3HT%9>{r%LC6*hLMHfF?yWNNY-OZ~76LQU0~3ZMl{uMpub&+-28 zT*N-Cq$m-4 zeB0%Xzp$e+gLDCr$yWd^sSq1=6M=dl^5%|5df7)p_fna2G>wxnUmo4%2oG6^@N>3A{Ea7i-3 zc0HUY#tB-F=c6^GEe4h<>%h)*NciD`FUv6bP$b~xOVtBzM@;uJhG}U+$(jv&4<%o- z>3dycb-qmvJOkCg-#g<7Rtt8orDiZ3Uf8Rp$T9NlvEVrR_^{=3AZ#kSFL-AZhWX13 z54WLa{@P?h!uMSRo;Z02iB{p^H`uacmo_oZyy|byk?!)tx`B6ox&@aoSbk%-S|sqoVNWFjko`GwkXR|1^}~xc7#mg* zfzZ(5RbO`;(cg~^BD%s-R`v&Z)iv)84LTAFXCHQNTHGa6+0PVW3&C52V&SeOieJ7I z<2vLoYxrHk)*fLIl6sUffuhX`wYW4fTY%dm5q1{S@3*1$G z(B>Fq81sA@#e@s8UwPn<<9?%%u0NPF1qrbUZ2cWA9g7seQX?{u5+(8A`bQq?#^*&ItVTJy$X-~9V6Rz}!seNvDvS{FS z8}7S%WXu7qq5jTO(khf*rS7zt<02eu_Z0Rfnwxb0h3XI*_8LlM(^gS3JSdLsOQj?e z$A1Lj5P)aizWxN)o)cD~3M+*fU;_GDnY~3R_g5pe!pJ-9dKYySmXwKs8dVx56<&3q zZDGaKe0U$Fsma(Bj~qP^5oxkw?&{@A1ZH`l>q?5ab8N0qQSEV|#~gDU17K}_F>Qm7 z;7T@+$m3%NyoOy|Q~fB~OpZHn!ujaN1eZM0Sv6?ixNIU$)RDD=1 z7j>K*JOL*!!^>#KB%M3ij3P$KWh-0*g}5<$c2w;`?q+xWIN>u33HbB-AjihWakLo_ zVo=aR#&G}K?nrJE9c_h-RrHzh(N54N2`7l$#%-yN<90b8w-;`?>s>xQ21ohV*FI1M%EIN?og9`Zyn^PHj0cR&5?oJz?1mNx z#|&)d%i9Ad0*enAuY9vDZRFZEC}K-(-f@Em>cds7`&J`Hl@B5xeQVM0z; zYa+1y2j&05X*{dmOMg3-RNL-+Bo@+P3S+_WeMvpoPfp2hV1tVamw9};Y9!;}A9OXN z{_T}3iCffMd`)ve!E3mb_$t1AQZOnacEb|Ox=T>U;`l`<|2pY=@gQZY#i1CWL}0HG z%y&ijY9}!sIqq{`J<4>yYrX*RmAY8m%RG9ib7kswtvZG3vl=Me%5;zcf$AUP*Oi`5 zpVW*~KqEQYBCXtDHJH-+KV!k`s>C1|?<5&x<>P6y8`WzTt0V7OG}St>p38DQwNziV zpQ%fVKEtfU0t~sN+?8RGvG*fB{G1J(MiVEtF1;hk4ixK>D#dpN>Nu;f`sf7kzIu`Q z?{fEwW(&oA_;O@ws#g7l;+`gC80@X)SECSmccg;KXO1C0M?kKzdBzzE36i8Ms@x+^ zA5sg!1?vp@X;b^Tfg77$lZ8f8dSW{vL%S$`Lx2*^A}$Y!2=I>aSD;UhiU! zr)-9aqQjY(WI}-{nZ=FduxuQ|%8`9n-84Cn+dyRu&ac6I1o#&hvrf-jXhI(kF)0_E zz3Yx(;oz%DQy0yka5xBUQ2_n-70Fk_jCX-D6Po8vagdk3SC#`Yd}vGEfp5uWh=J5oj)Ha>0h^Brx`J0_TL1F5WKkN600O zx|s+J(T00m|I}*7V?G^~n=T5v(2bn6k_c1T9l zmtcngD21*gM`+eFH%kRrrFPk94<6TJ3*gw;Exed(R+&lFr1`kz<`oXIz@%4*@on%2 zV9Y@SKWgiA&8&`SmXYGp_Gm*6xi`(e#7^l_{ej33zsEaPaC$&|4#HxJpyhii8{#Ap zbVr|<@L1t%jisjM9a;D2A9!}qh}|tM-<*U*pgd=Dc)G)LbMu#k+F|rv*6a^(-GY;+ zI?=+S+Tn_(2`>0^&^{&=C@FecCzPV+&=!cPm79l4?~DuGj88SF2#*~R;24IJT!I*C zF?*UFstvmw&lP~?UZ3U=g4j5p@QaC|`2+gs{*dbLVCBGCEBaZE6Z?Yz2xME5Wy7u> z>vwEkg(8Z1dLAAyN_Kba2HLx#foyOdos^m%jdBIoUxm?WXpFMnF|6 z>l!wSfCP%8Cz^@|enND_Ct}m#R% zvy>%7`wc1+-ebV}cEeCApXG8h^3lj;blZvu0Vk-+$LA2IcoT6j>djjrwR*!%Y)*6n zmK67CMRnroBr!-?B9+V8i~H8~ej5o-SEHWAuGA3^IPEbP`V#nN{n+=;9o)6J$`~Cx zh&RqFQo8QC%ZoDD#zeV-%cQ8cfgiRoES&6Ca%M&VkXNn5q}C+VWFfkX-8(wX%Rl_Z z!V%co%Jo0`xfE9feA1lmi=jrN`XTVCDr+t&Uc`Kjpy7zcPcSJ@uM1M9H|!vnC9(&H zi#Rl_ThVQ+(`T4egTck$fS%}IB{78L+ML8NX2DdLZ9t?9UFY+0=JpD#QxM<+WIl| z>K)8IjyZ+XX!C~qn3o8{A1iI;$}g}*t)wnpBU1#u^`%BQ9a&xaCO0C@%_Z9?bA{VW z1=NBb`34Hy5M(RMa8^G8c<(i)cW5ywj2Qldq@c|)A+Upj+IkjBrUm?|<`_~N%>E`=GtJU3Z5Iqp{gQ6BDryRf) z=?ZsnaBlpP#U`TzuQP7Bpde!IJK)pHhvKD_dtW*T*bgxA1=-~{?@0D!N7j66N-hT` zILd=uf_j%tM%J{WthQyquA2k>;H?Rc4Y!6QMCeVJi*JsTdE4H?Ns|#3_6P-L<$*yN zk3)MQ51HQ}yKxkgxAG;LKA|{?0FD%3ADr{*vcBX-!A$GjI!v&s&vy6uzi%u+p+wOY zAA(q*rLn3x9OyBu*%!>>z~0H7 zbJxdJk=Ew~Xv&{YN$b1Cs-9}c1^~*B5xnAlE>G?6A{N<$c%BkuHyf@tQm7HtVkgC2 zl(jQTPowT$`CqO^i;yNg9VxVe_knc!#~p>haMEN4VYmhfqAV4!eJH)qg@GTCVyloi z;um*9;3!+17Puk~1%M{1pIuE2OPlYPr=vn|p5-wj@hj;(%`!e^uPO^6`^k2KfcdSI z^wV8RJ{A)l`NW)Jx=}XO3k5%;NTDcp?d|dmM|mXRn~|Y<{O6(?f>^Pe>QJtX5afI` zbFq0EzL`H(bF8Alkt=E_^JtT@qY-yvLt$dop{?pc`}b^s{L1KTQ_z$RD1t6)<8${l zcw!&79Yg{RbR*F3`}=aods1`2CPMvFw=ZDm!8py#2ltfUccSlpg;0X11x19u+ebqN z*V}CH!2&1~qY%-!t@iE(#8f+RWj6D?hG{)TCru)Ev3mJI75B2M(B+Y)_{|Ao-5*Y? zRZ7X0s02iJ>S&YRs|iK|uwl>xyM0dPL?ny5EQV8$2prV60%POtXQ(eVcjf&Ch*D|B zgVjWq>x4n^FVOb`Iz>hq@0DCld$!5VR%X4sRI*ts8}Lvof9Ny$RE54sIIzE}K_vo7 zFQO#9x&4_k;fTr)xeED%Y2XoWSYT+6dNB>{wjwZCX(49!JVj*gkc8VnE=F+B`;WZy z#oi*qV6KVdT*_payRVbYaa}18ui+h+=Kwjm57ZQz4ZWP$!O$ki0ck!b=q1OzNm247 zfQOr7@C)}$`4f2mY5gJ_;UWI-e4k6uE6yi4Z7?jmz+{%fym_4$o5ClKSY)x&T^jxf zA_P<;UotN{^I*VZmsU|`*>B9%K5+w3V8D#eby7KeZg8Or$QN*JRZuB#1+qm~+fj}*ssWO*mabah>QKDrU7 zd;O6zL~7-uJPNrpeIAc}=}@}*kXE8LQ}MDYu_L-9tKD#H$a4~~d6g1Mutp3|4&Zj9 zf_X}yjZ8qZ)Pl4^e6Aw@E0hI7&ed4OZTiw!j1}N+?4%e?Cr!Me=$5S&gN`cq$mL{! zR;5$^ZB|bymef5HOiun z4$x^}Z;VZAIS4s7@mw@A8n?&o=KE&k{9o+i6dPq$Bya6JNl}}ok)Xsk0B4wHhV&k) zsu%1ijd9aK!XJ&eq=2zXFU``QbLK!6!f$4DlQ@FQ96X$%-<5=xa0MA~C(cRYe`ga; zRd6msBs%#Z8*+@u>z#8sOzN{zEF+M&5Ssn$j(w;B{NoMEw8+nUC50{tSSBzg650>C zLWbLQU3!#twASx!IP^EF4+i8iZq}PgpZ|M;;D4@OL_)~3D29XIz%=l9m|Dz86|X~L zxV1amcWs@jHF5_oUp+4pDXC=$qy7qtluGdxwkx$n(!<*H86K#&M+dP5!IFTvqnd3# zMq)C6HF9IafrH}x0RYi*4QIOS_uZ%_iPVfG{0^PO-yGO*n3ChptyZ}V5BZ_BU;UeG zl8%YF`=RVb*OgTN0R>K(w2wWZW)UlbhDu}zR^4-8tFJ-%iB@_~t|xBcb4eTn*6)nY z8p1cm9aZOp(vg5FUg$dG(XK-V@HJYH^vk-Y1cyEB3v%zx5=`dmgI{c53EE^|kvg#k zgpbuX>bPGpSCg&_0=5MXyIFyiu{eRcc`v1Fhc+Ny5I)GSD=U?P2jj%cRsFc=g_I`g z>ptnk7+fMY%4kT#f=2{wlu<_p)iA%sP{PMF$ULj&3+Ia_O#bleONvTL_@rr{qm3@V_0W z&XepK65AO+C+1|5=80Gh_Mnu+_Uq;$szFe7TlJDVNGf+TmT+FALTPJ)TySxba*CLl z!(vf*p)etLJlECTj`zwbuC*y1@UUUJd8gOi+X$6=fkkw24xmvidk^a4&gs;9TF+IZ zR6tMVe7$6%#dW5lM^ZLG7sta)8yA81S|RwsvXY)9wqw^F8xmH|O(n>Rx zjUsg?hea55NX1^#q5mwC0{Imb>Kx*q9w=`=TAku?C}9-Sj+oEOf8d7jY@U^o6RW9d%M?~8 zFzC})O@iX)7d%d*`Z>P!B5$+TDo`)fQW^*b@brFuF%sCv;0uwR$o)L0tK+Qa+m2Ll zy7QA;!<(qDPJlRbsIl|KIaV*UqyL}TZOI?RbfhR4{;Pxl*SLI^D12wX)nG^W8or;( z2SNY^l6fyBywt6G55inPAF$X2ddLu~Q0|A9_bE)j@T543KHO@9e9b@X+bmJmqoVG6UdG>cgS8Eaa;dBrHJ#+@ruWXt^s=Np+oQ^3ocoox+MF0a=%jZb`x7D0yPXT#{fJOfy)nZE>{FL}e?td);ZPeqXenKt#Lnn74Ej>iKgj=70zsiLHj(L+JQ5!^9eUwmS z!q9NSE8D*kAk6p4UvfDlllSl;fw3zFBjYg6$JYn7IB6rWoP)tn{gPI7o4_=_L>yyu zo4Jg!NvB@Ax@GauU@FP)pXoGt_#`b4o-j+F%xAyqHS>-3g6xbZ6Q^*RB}pCSBwirj?CsFl=ESaeH!Naf~e;fS#Y zFJ3VVAV2>qFO9X+g+?0+pZiX{w?@;;@=mT1j#NpaOqEC=`ytDtPG3kA4TcJunrn+k zqGx)yf6?0N1TQq7Vv7n_h{9O=AS*kyWtx1qnMhLXX)KZh{Sw&uwTW-6PHnV~%853W zGFY{wgWKAJ-k>p5jkV~*EII=fZ96f{$*nBjJQD7&Q|T%&X`YoSdn5{AEIiRW)CpJo&~0%$3uA_cNNlJkKVd7ELApEPLX>J;O#nGpH|5-tmQ(FZgueMC;K(iAE&LEL(YCRx1ktBw1_e}) zzR$3@!ZJ1*8))XBra%2Z1kMA)(8!pr`OIyWnmGiD?LQQ#@14fzjp0)fg7mHdVVS_c zT-#lXOiH#3tmFuw=7oq5ekd{hxBMuq-s$^$ou1Y|g=5Ci*Xz6wDMxFRHDsJTWE-}z za3m?b8a2J^G=y1+_);AkvnJP{i_be+<~Acm%D>ztGk#xhS?}U$DQv6kB0W;CjVH?} zR-Qq2yD+YC(1TVzkc+f}1EK6FloJxq2xiSrH~%E1q?2JQ$47s3b(+SVtyk&V&j8a! zPvTfFJna_T^i*hD#7g-v*nH}7>qve9!f~93UxJb zG?cU8pd#Q`6HR6^+l!qBRn_)N8rK_#s=PFZ?-XhvU9@hE+B&kzp?t%s;~P_=D^PXc1#sevB(6fl&lGnBaF+=S0Y7WnFoASCGchm;*p2k zEY4i+xgo*4w`YQt=NrJN9F4eyso@Lfb9A%*F_AF!fR5gopmLf#++%Hve0a!oV&R}@ zxXh}GxBlH`mFJu6hEMSK`jqNmyBa!o4dBI!E53wGw`f>nv25Ww*L2r7Ks4>%`O;nP?pT^}{)d`0DKvEgiGZSy|Pjf{vmuqQ)rf zEQLdtvL#v5hVmXYr_4HSYE$8BL}TBnKqVy|0W+IN>D4qD988_#ON9Fm{!qWi^F5g! zJu86Ev*I?zrV{vN7Zd75S;|E7;$iXzt@8GXzuJ(N^fVk$Nsc4E`V#m*+R=-)=d69tJSk%h&@WRt)&1fpx;jJ%Osmn)Di2@3GNKzibTjjZ?Ghw`VS$nG+HBcGHS8S($s7TLHOmnEz^h}_Y6UnmyPB6MqA17wj|LthH zT>U@+NX4jl+zITAybR{o-)2PMcPD*}(wW*HF4<%VQPuDi{8TVzhO(ivK6fIz7Azzy zbD55)`;tve=H0s^|mGaaDG_KkQ?N2iCX;z(ao%;YYs=KG%h}1 zspAKO&LSI1&ggcrDzJ?rio4$Eu1*T}{o}!8JQ);i*a4lw(u7 zJuU`}Td)E{%(@&<2|?w;&}qz_NwkjuwCdZ2mfoIbOAp?@fsL}~)AW%j`T)R!)XeVc z_A=;X)wR;M8T0#uAB;TG; zEhb70Jxy6J^scT!w1vFQ@9Y#&S|*S$*|siBqu*XWJ6i0aVO2N4uTvHXBrH-tKt`+- zvmLONs_Ec9SAu4i95M%{v}p+Z4U*+#?gS)`#H$M0xI*CDoz?mRY;S`965XY;Ibq9? z|4vIPiNN8ca`F+7vNw`LzC7U{d}xb`0eOLOHM@N(SZ2KGVIVFr)}n3yw{CxA2o+~HA52%e|m3Z(w6iJ6MRa`Z0lo^?+ZVKDMlbR z7#0DrKa@puqM*zW&$xO-46_3}(O$IY4p9l&1Z{Z%)n@mA$wIetUVQNPX)B$68IFNc z7e=`V@jge`h|u43sAtt|VA6Il_4T-MaoE5W1F0GRlv6~K#*NrN+*(Rz3(>>Lh=qq+(lJxmJ;FsY ztV)kWo=QIyob}(JLZsFBJ^%Hs=DgVI#1)WtP3?s}=PZ|M|4+5rk4qXMWp-Knwl(7= zY_UBJwa{zvj7;Oq&y3h86XBQIFeAv6?t9@$O0>iHi%%~aiiw?H=vYcdcp!e34APhGbn`ZRCZl}9r26+N^vvxqs0%xLJ7 zJv(UM){vH@u`+qSoJ~cn9gQI^*mL*F1p2%6Lyi2+A7@SJxf{>(A%bYdG0U`d?B+!f z8Yw_qJ6^Ui%2>=E4?)kx?P+Q=ba(ZQfRTtp)9JrIfl?lZ?$UHLB8qsvZo=r7f8v{q zdC7W^HOl(hVR0Vp=j7;Wth+M4%UC~wV}0@AiW92y!(oq{0LNZbslohzS~vBurLY8g z+6>nBLO(;^+Y*YpMT$Cv2{9~zq}qo8UDlY~hQG(C!9{V_4dwoa5hfBY*(MxFryfPO z6l!O>*TWZPc2*)qNF!FkkU)C*ZxFHO%t58{QC$>o1=4CPjU8G0GqJ1Ut$&?lG*aZh z`mpN48&2!2_ACohKeMmAzu>b3@AC~#WY}BaZ<_T6B6Dio@KGkDK1~+szqRqOlHH!f zG-v(+v@qU0KeF`fSS!t!>zp@K+VTvaU!u)bb-l~69u-1=+d5Y;-331Qp#di0Ssa~+ z`3p&ZeqjTm>GFj$-L73W_xb-y+ny0&v3qWbMj1(SdC!CGY6PTehS047P5#A8&S%h zanxThq+CWzdk;r`p6lV!N%%BZmtUWlk^u@b8Y_(fO-b*kgRPRJ4|^?w@FK8F^L<vo#v z&tTdzlm-YCjxQ~3F_2>W>`1FXGx3C^wWXjvug+w2F zO0aQlW)=!vmQh$ChSA{S>3Tx$a+rJ;cVP(;s7FKu)p|Y~#YP$jvW;cx%jDZDPLt#C z09>QzFe8n#j;YNx9n68J+(6}zxVbgU(PRjsNq*A}9K!rCWv`%hGx16vZAe(3kgTBv z4n0?rK?i0Ndj`mWt@uIKsLQ18%yqVd6@fo(Cy5%7uYsr5&|OMkpKwV~W|*PJo)vr{ zlca%Cm#0p62csLWYpd1GjDq*gsdaT(fn_rVIi^{)AFQ*|>g#U63WE3{Us64*_N~nY zSy#H1_#Yu5Gz!g&%$G34qoBz}3b0|J$=^hn?Eeiqh9T6#%cyBN{ujU=9qshieukfu z&IY;ynlJ32PeHQ0yLE&F(;$$U#|VebPt;1UHXr4}^S6o{EGb5b1Oy@PiJ9NQ`APGp zw?IJJ3AVQ-8*Qsycp?h_YeAJ}ivNRrAns|5 zvR4c1vV{|(FTBh~5-TY&O$;uXA|wNxGB`!;B9EwBjK{~}2^d0J*s(l$>DvC;n!g}n zrv5+7^dXa#F3HUQiXGui+&(&y^AHdi?!Ni>E^t8kS|A8vYw>)UDkVurvBZb@p`RMc zL?n7RHT;6m-jJzKWaGSS?8ZrM2o@zp!`tIrrPjecgJfEC`0FuMRt}XL03gt;yjcFT z&hlVBFz*-{_t2I6UjA4L*bzK#ZG%*;y+Ny679ZUqp(&|kSlsd-SR{N4(Bfyy96e40 z>N?yE*(>D3HTFoU!Btjx;=w$Ec!(Rtti7;VR(5pg4pznxU<}Oa^^%Z_$wBRyHX+cjsuYK)enCTZaGt9UK!P$8$Oy9E*O2x ztB}#Gl64Sdr!nM24m3jD;!}L4F%~0;ajPUSmooKJnK_uzG3gre{T@@Lmy1X?6@9T@ z6x8q_d|AH8O>#+jhSpB|BwUAJPdvV6xqv|loC2si4Q}2#FGAMP91i{(wFB&nE?j@3 z5F~N`n!X+4u1lyV)uq6;eAqTxE;ksKZk`}MG9`C53;j5DXULMwfqV(JoSZ(iabKa& zY*w6Bo|ll--C5Ez_1>+$g?K^v5ZRGG1Sn>#xQzQ(QvA^E0}wFze6AWn?4xTOX&Oev zy{kdRKhS1wFiJ|eO7b^Y@1kCw7ARQlTN)_ab*mx?jyF)S?~WmD&N-p^P7&>(jlM)| zcL<7Vz0jsp>XqOI-B}+M3JcjiOKQavca~wLTQjMTTm<=w`0ba$ng>9&Q$x}oX-qs4 z@A6x?R#4?OAu0f3w@w zUUsRmy{L1f>yD4*tdqjX5Ipe{YE!4lz8Si%oFI)6Hic$`iSq9+N}<4kYw>JH5=JW) z_FCPcPBW2Upt1{8l(S9c5}&r5nNAkUmFjYb39$6><~<_U-GOLJue=2R_!ODXU+abE1&|5E_N5S^<+#o&{qihO&+n&UC=>8|uX z=Fi4nR%Mf3A{ERNw*8Wrs&8#Z7^C*>ZUzh0$8E7!TVZYLiEu}2eYr#uNUUi^2Rg7N z&y0QMyTfpdFjip>;HpYmWAIXRA%r~{Rg50a!8VRKEfSK_8zg+{d@M(HXZ^3{rm9Z1 z=Ek_tkxqzz@gAh5P=@{(RbR{9^lWRK@Cre2;dr{)Wn}{v%qEVW_Dm0{FT+t-TJq5) zL)p&Bv>{~Xym|a0JFcI35HEznEYH^WrMoxbl-IS}N8n+|>deNd6D=pWF z$wb5IhN0nxOr?9e@=K*9=rQ{#eXa-uq?pt^n;tq@+3rNDS$3%?OM)S>)Fh4!-E6uW zZT8o0(+MYKR>r?ttvlfzmoF*WgiS+GeZVT^6i-o3{%LU<@gJ=za_};gwSk5EC|42s zWXIISsQqP_wnY8Mr9gXv0~Ax`Wl;OIxO*pM&Z1Wz#(%Ta-bP%Ph9w!KFrE~8_P0DH zyFLQasKX-=n`(T0M zW~;}MZ>9omTfD*B$-mjXOWk@u{%=D2cjIR04Ez5WPGam!`{0aq1w<1gc~@-4JA~!l zM@M=@dhrP1KWI2-r@fwngAR?uWW-Wt^@a*UtE|4&a~quiTxkpxUlnOj@q+;g*ZpSMF|L9C7_w7m zeG#tQ$OM{m#xL=?7&oVJ1EBP{nM9ebjme_MjFhOLC7v!G@TEg*Z0B2|D5Gh}K{DBj zO;|AQ-|~C?*2((|eS1zY{As3Wa}!l8Zi!xlj7(zi70<$(8zirJE)gGw5ozimtYxvv z;3egyywCRu@3AZ3be9PuLTXhrU^I_`5RC`^(fi)uI(!Ih-V3F# zV?CcdZocQnM+-31V4r{EZIP{NXASv zPpinckXg7v!nBnD#Y{%AD#Zm))7s?U#<@`7(~Sj$!G3`h&A;8QhZVY-cwh5n3%2A2>Pr750#4#D!=;l#Tui zt|&e`#38<=AMCoREDM}fAG6kMlnDj;-{amNV1fZSk`k@&5(qmCf@JL7ihcR?@m?Hn z%Lp&!zm=1#fRi7h;(HZp+h1agK&X{79r;j&wcvJgk@}(tu4!{SX*1T1f{Nincuv-E z$C~668$%sbD?PZ4`(9D|$PT@0EIbL$FN>1Ah*YQ1xIS79qOPk5@kny^Achp zC)c$OX!cZJu#j$^Ft|<=CDO7AGAJlHVZHM}2HYj-)m%|=iay+dwAXbw^q<>kf?hB5 z=74l~Fd)Q(H7wOA#CP~_>H_vP4qEJpH?3(kChc{JX(=m!-4`9oR_HKu^xSJ0kz=^Z zJCh6Yr#C)j5+0IJxb1j?(&I=EpJw2BhAsTTmu#i&k?a5m<7}Tq-EXU^lw~5XO&43$ z^Q|jW{{+jLBEO+PjRqsd+%sBjQ&t=Aj83!Rf*eY^Wxd7hM-5gLMA<5;;CkFW4N2lv zdkk%(QPN3F$dE5zqt{Mqi*|}sC|5fa@K6+PYP+1oUmN-fC%y2|@fX-XZY7qxaCWrs8SM`jbE=}LjOMd&i;PvvJA z7@@l6XGNcZ&c}ffFdw@vORs3A^z&TiY-u*1>#?XO2jvK;aOV@WFV%(Hw1U~fBz|0z=P;wLhUImp8=wKie_az z>nGV*W{haSY)+0XsiUq>k&09&a(h4V&}tSzFvgUvFC1#)QjWjIowhb92+76zwrMez znX-(~8adgp^*047MF!#bpQ<^A5gyFh4{+iA(R)PC=fMo0DTWkUNSc)268=y}JM(|d zwnEnT%TVjp`Fwz9XlLY=ksY0TDSzTL$ z`0qIY*-GX=F$?C+LGk+u)n<#}t@D}&w_h*h7mi8S3G_>=)vOeC;@Yv;;1gaxdnUk# z1FPGKUEdJ+aIl*eeiL1XXZj@Z?#}Y#Owtr41LjkLN9N&og&7$#VyR_FeT}5MNHFY5 zANUbC{MS|mIcR`o@JiDh`IHyJQ5w4|RqrdDK#x)!BpF33lze=7x1lr${q3ec?>i;_ z%kcNTNU) z&HCtKJZP_t(|`!A|H2prHZXHK$9N&BlT)C_f0{ z62GZJFQi$-zi9yigQ9luiu460%(QO5L$zDCS@Talv%*o+Bmp*K%_+9W#@*poo&DF5 ze{uemOlESb&Zs<;b5_cr*zu;$3H%g1#*x9mf3Tv#lGOirp;xt!B=sgBmU{Jq;Wiq| zPbqNO1weIfj8#OzT=mV%f71?}8@O;Kx{^Xc()RimG#;1N9$-P5`kAiTs7*!mG{`!) zJ8`MV4V=(Fl2+FgNPTl-%NzF>cKou;pme@QSK!pqtkUYihZt zHWL(^(vnl2pHaqm}swx)t9zHS5K?rJpTX(~j zF%?Cs#t_cg0uo?&Roto;;@;nnXS=L{(z9M~L_aMA!Q_FE*~V#zKv%VlwnrZa4ygt#{0u9$+oLF7P#LpK|F;UV$kq(@kg`>I3o`8i}Kc zYu12jegTT)z5(MF+_R2zHqpK>n?1?3s~C5i&0wf*Akq~AY20g&R+Gs>DbUyb8Vv3# zb9UJjsQtOjx?TS&)7FNxDoUmZtowBFh{DgcVr=F{d zF}(=`uco?T`!>hwk}e+$V-+#hch2 z)WpUdD@NvRAB7YNzi;L857)u_GSf!rctzW?u=Kz5Ib9Qe+cHcUb3NfWTQhB2eOZC` z4ha744`}qUwu_ej%?d-KwjXqdwwW6kui;1B9p|zC9OPLQbLQ(3^L>8OSV)azi)c{n zumvOn=F02LHXIVCNy#8FQE?)moo}!unYX8P&&pe4hhx1|@iz7YJCEyUA@&okdjD%o z;_@yk?-WuWGW14O!hdZ-njjFttOwHNG${${UF<=;$mIuv0aAK4z}&Yx z%zuX|jPj{kE-Y9q=KL>DaS(W{1W zvHutje~(x2K&+TtC!c2t>-Dd`52+B1M!cx!w2Xy@-ZHGXX-n43CQaMrvz0OlDf?SFh$mqy3PIz>B7DeJ0AZr*2$HUJX+EpE}?xLdQkJ%?d#-+e7zBY zfqS;`Ha7R^F66rTbBRexu(7J+G16eNdd0ZLW3#EOra+325=R};{$I-fRS#b2Qv6#r zArJ+9zXh!DUIAt8&b6Jh#%gU4TLM&$a#i9#&eZo>= zKi?;Gwp+B`e!)(~>4yqkDdkuTjVGg+KVB0JX9+_O6>luIttST5NbyCRX z57j&zvTx|qxdr_2N5|I-J?(bT*T&Z^ei}rAIVx1kg*SyIIvf+DAMh-tMV60TQTGALZ>bLi(IGm)V$y^zIB4-^J0DmhZ*fr~fpeT_Z?S2zT|b~l=wZ^@$fy0rcRQ6!o+uo6D`0jJw^A_W}|p4GQ4sh94&CiN3_d1>gA&7`uo*8?Qy_iqT%5Ufs?wvWv{43 zI*ee7wM;(tK1(w~l#tz*iwaqLksT0>&*V2}e)q1*M6FMuh3WUH&K{Kse=u;{s!xH^ z;lIRQ4nIjVe&t6?-7hC)oS21QvES1CYp$E0g%@<);-_EcFDXP0c@ou+JMH$j%fwmp z#RCZB9z&!)FDX6=B{yEMOrO5BdqOpKn0d?H%2e~|%d!cW^K|>ew?&Gi|8LcDMX}Rs zQXnZ}gw=9A-d`N+m)uH&8X^)D^Zw{`tJ6-h?WDM=0-E(US)b7N0Uz3S1H}fHJcSQ@oG)b(4F1e8dGMD>Rs2P&;RkfE zzqYK0(GLiBCeXVn5@`SG;{8u=Vi}}snLiHhNCAH=HOUvpGA!Y}h7sl1zflL`5PCmD zPh^CL#mwAWbxuJ#((mOAi5%z$W0Cx_&oq521N*m*4o2M44MCchU7v*8?ftK}Gik#z zD<7e30i>zJ{cW|)N>HKp^z~NUX$81ZTW|Ec1s&st8vAKPGAY%4sx`-(Ms%yOdu8-e z4H07g`*3j~+~6(bsn*wFs! z`q!2M0;DS`eQlt z$0HnbvJjyVbnC^cqYMo6CXc*49+a;i3)XS4BmYVBtpwlJoHLboVCV!)^wVhYSy$YC zt)FCtTJW{%_?#SwTVw_jClVW77DGd=VQ1cem3}g?yt|nrvX-KTZ3d&@SEMNA!f5w8 z2%@>oZ`5cUqDCuXY)hFz}QlIw-BnA-#xq-vuJ$1Zjp!CCYYQIioizG`P&Km_*IR^N-D6$=vZ~jMIz#U%xoQ> z9{05O4(!1dlJ8`(P1vhgT@OR2T?XM%(+33VSZkV``r-Igkcn_SCDxe~-LC_BMy_qx zwr!Lq>?U^bBRhXVx315H*Ttgx*I~brMd+mZIe_6B zwp@lnLPuLGBH-*(F}GbRkPZPoTR_|$9LE`lx8qUZ;K=5h?BHd zk}nHT3tz{fO5py{jlqyBSLbVBD|%kb(6ps^Y$Pi8vyI?8YQk{H_)@~bhoX5><@&Mp zaPc%koVm-6x@F6OMoi_hqiU>cRV;*+LWbYJw^mHbR_<|T11DU;!JycPEVzX3f0@J< z2Z6Exp1VRec2sgVw{$8le;^KRzd+A%0OTQzRlwse;Oop~(B52MGR$`~(ck2~MxTJT z7np~Qoioq~>hpS>Ix|2rq7YW*X5aomF^g_Kv(NmdJQF`|g<68~KjI}81$c%q6lfCa zg+x5>;OMvCpvieHe(6RRXhzAWQv$`EUbDqr$6SHfl<}K8Vy8SllrNsBLDVker&T6? zTnc&dwm6}qfh?=F#k&KpQU&6R$QrIsO;m`a=a#Gh&v*Ba-004`;+3Uhrd6)s5wDB|qbU-Rs@_u(rEv?d zwo-jUHx4qhs_XMds2zk+axk+FiI(#28+DG;!|sxE;g70-(DL zQ2U8*v0_*^*^InwSoaUyxXteTWx%}thiGiuFGdcuiS=N<-|Zt3tIW;|1Ji?TU-=`Y zY$9*OfPCtWu{5_op3n+jhfCINu*Z%8Crn9QB3#z`VwGRF46flsYD~RTkSJRdt=qP3 zd$q0Awr$(CZQH%twr$(CZR_^Ff5bWGedc_~5mA*qLIDaA%l(s$Sm#UhYlD#GLdO~0=_S~Phx6pf7#4# z-tfX^GT(af{C)Bp>%&5-io|wg4|V-zF*x&Mbon~ovH1k+G`OXoOj<{gmkrO znhJvmI$skcnUF+Q(?#D?R!LSPsd_}KJzzL;dS$V@*J>!u{m7AM)A zQqUev4q#}cEHY2jV&x{`$V13p_5g@*d3?0xqgfoCdI9=^;CDweR~bN6+*L zFHB(;B#~m$C+fK3k~))E0z1{D+1Wv>qsRy=HTx}7^eT7c$~y{qs9w}1>0E!W9By`f z*1A7n)ws0uh^D&o(Vqfv-B+|x|Had05C zB^RBJuZ=XL6_a=~=f%^wIt+vMe7<0oR3)mqI^$uud}{}Bsxs9HR*qWG$cEgGOI0

8LkgkJe13$|li_hYzlp=$li^aFVyJ9y$0+aXUicM@?>gM67TZSWDdqAu|&oyyR3 zpN;1(LPYEs=Nb#zU;;<5WGSo*kXCK$shr=g37##~)Ih{ATi0Y_-BqP9A%e6ub#hGE z#VyjcLy@DKIM({8;Gt8Dec$(aX+hjx%ECv-52)|BA1}98$G)VlGwJG5|A_Zn%VeE< zKnJPw7!A z8UEF1j~ZN-p@D3W8+8WMZ!|lrkRUzjUUXoE1ptiF%{@D+(%SMyK&B6LXrdHvuA&tN zO_I@D8qkz^*2ZGjtQ49LuxSPKrWxbfOGPo|P-i74a^Wd7GRNP>%<`FFQjC0PM@f4{ zz_(0psvh@O5xbWFfM6GD1hGnyf@Wre>t^x7eTjZ!%uj%p!{~fY^(Hw6r=yJQc*@@v zT7%pRZv!VgmZUr@y6OeF3dosH8~`lUJssR(s{rZgT`xS|9O}gHa|orz**~u z5$0A;PO=+qWpi{<9Kl{%R%K#udUyzR08tDZdT7DjKawqRhxLK|4J%H%&B_#fy-AHl zH2DRhiTC-YzE*=>L4_fs29zPrY+-qXtNg{F?-q8xwj`^)K&s&wCp$UZ&kHr^H98nj z{Xt{C1ha$r=-q6P@f**Tz8iGk)&;#WiZk?p4zzvHBFA*({sUf53c&fa+-1yk(zNkP z>us2AQVuv59``|Gh!D-c<*1n?O zn##8)HH-mE4SM%Ha62Mo``8ZN^DQ%bL_UyAbBQdBt^KkC zF24Ils2+*?`rMF6bFQgkSp29g;vP{7-%_0=#rIM%H2?NLkj?%qNrX_XY7!Sli zy^7}Q=pw?9uli7x(D&FLRf{zas*PszrT?Ep)PvE13tB`7etbw@_l2>t7-z;=@ge(k z#i6`!1D5ax`owlR`@ec~$0$OI32m0Uyokw<9e%$T*KT%sOoO`BCBZQ)pMs6NydvJh zOpi|0(g!7n8(-TzZP?Ay#u*_+lZqD}bf>WD1PFmR@4uz3I}i~pd&tZa;Yd5UPMvZG zJo88yx%$jTV`V>);OUVJ*cU48z#K+t2!*VtD9`B&)*fPDMOkaZ7prjCUvY7eDiPD> z8J9itIE_ukrYlzRj(U9nQh?$1xb`%oaKe5I4MkH|;OJeIayDNJT@Y{*7Mo#f9%FcZ z&S(>^n!pJWROsk4mo}NgAoX9cU;d;FVLCf~jZ-1R?e8C%3@Q=Yhy*1~;E;*8ezNX5 z(L5u`mYK`K@#A0c)6-a$#qp%hpYQvf0i0zY-*OwQi2heQak#fM-C*m`3xNph(?)cN zp{Dk~<6?&x8zQ>K1UJz*7hd`u?GCO%dpIVmk08O)-JW`{2TEbK=n9Xx2A*n&oPUsx z04^*f?-S4F&9EnX8?tpaIDH2o*QlD6{4#y)A5@^AB4mLFp!2%A5vX-I)wE;^cB3u8 z^BOMp<{;9|lRmlV`Yu8qu985T!=dvJdJycY3v9yYUC9|Xy0(|20ES|c_7MFu$RUz6oH>X2@$i6e zhCeOZxySf@*MEZBHoCAM0h`{;Ot5euY(%ET^3Tbe4j^ZvR-?@Mr>S|TKbZ<1;l%_Z zNf*$)WrLbtFE{Z}%MBAXU|qU~_b_ffGfrXr6!^*T109Q$;2Dhy7s;^bnf=N{x5GE2 zu|KqmE&_vT5AZ4NjV7=%)JiTi+6Z)LNe(`*b!Tea?PO)$e-b?EQx3wWoxY>zOlv5ll>f4p*(5F37E^uBU)6g}K_kTV1KrFl zrsJf;7|Qx2=xbBu-(^FoDXLBvo(5eE zQ1&!mD@2%W@mx!f+ly75;UV{dOD6+C-t|(-Smu;Ir5Q*RHwH$)Rf;yFbV!jDs(Ar| z5cWZhp8!p6T~>U!0)oBIj)9f~eYa`9S6D^8(gvZ#=l^j#K7S_}io2{8?42z99s7$x zNerce3%Z`>bexbX8jY8-vb||t*o+NKGuM|zmqk{FsC!uT@*?$R6|O;sG}~welKVbu ze|?M1(DSmzd!s75KJFW0%$@J9##^+N*%as49bA9>t`T9=pGL{mLt#GM;p}>^kTmzas1O5vyQhpT zPUTrM6i0v!Bz;lvjfuroHb2=o`6(9WZcMW&;ytPEXekvE$h@T zh@9?(Aw=EiPS~UzlL+6_6ub|d>6-GHe2No2&5@lII#N|189SP+9Y-230wn>WP>v%{ z*774lioa5>TFGJB-ZyUzHfXucg2+eI%XZyYnyegf=-aa+Qg%gA(SJ%|OzyRJz)a)( z7-BF_UY0$oyRRuAfA_@pTG%CgmIbnwiH7P$!LbP)p`@?YmRUo<6<05DV`GMcvWN1n zjMb1WIo~3EF$hv0(JpZVQh90RK4dGmmc9skV~^0|i8r^(Pv2P@!Wlvg)zRb9(I6I0 z!L%aUW0UH!uCPP=N$$dKsoVY(&jrZ2!i%4MD&F*olO8``y18_y2|BS>srXuP4B{S= zZ5EODtyur&|CmYtEPGh0Ke64=Sl*?9U4eG`gsO+-_@#+wanf%U);5~N{Ug8C$>rbi0nMDSU)mCn~Cj(106Z_w{KtfsKZ4by3{w09AvOMUUm#{$!(mp58Of5S zy?`(w;dPkRpgEGQmadpozN`JG8PnrG-fV z0Lyue-`uw5I{=g-**ZR*U@oJ;>j%`?`UXJ!_q?Ju27QR9jFLMo;mfbTf(z`j5yC&+ zaSuLs=#aa8RqGWW>po!HIQY(M&~@$LGrd0fW67?@R5M-=E+XNcti@u#zd&6FCjhQw zU;b9Leal9|rSLWQT{Q+#Z`Al=~dan;M zLTgo`o*Jh{OCl_L@E2@xKSZm^FRENQdZ{$P9g%Zq$#UT0QJquSM@Wb`3)UB@%ZuAqY_AEHaMhWB=c&iY}Hk?D@9c{z{RE`^F;4LJi^P!!Kf z7AB0%-sP|$RCYlaRKkkp0QsL@lmj|_v{ZNBR8R2vN^*57xrG!#ZuD+rP*bgUoupZF z#p2%r+Wh55%s#>_r~b98*)wyz=PdGh5+)KFs1`E4r$s`xbG-Jl49sw8kQdNNkO?_E z;~9aDe6&}P$r8B<;%@~-G!VNmvS9=iN0WY?q7OqoSN55u-o~Q4H!+)nZEvrBBf4*B zW^sItM-1nWWddMWyA)@8);*S`Yv_CrA8s7LmyR7Es~oo|9H}mMr+*jqt~>VK9+`%2 zjttJ%+9(pU#eJJJF4z|DVl>UJmcB}q=kTQ~;sT%@eY3VX^1*|Fxw;Ue?1DxIO*3Y# zq=*uBRW|2IPq7FfO39zmuFj^?QCZ;7b1~NUk_}38``}O_oL_&`XB#hPdJ3-wKO_M| z{$@!7TQ<3a4`!EQp?{%-v@jS2f1RSm>6zNeA}_|!l~Mi7J%2)qI4Ib-E9vC?Dc8vg zCO@cyr`^q6!lsBH-tlC5?v|I$DK8gzatPEqSwG;pCP46SMr%t$0!)s#;m9*rQTe>D z2`G~J1GwUPkv8=k&w8qC(-+H5_>kOHVWDS3<66pT6h8=#fYCgU(D!TJ6udb|2Zrb% zX(5?OX91h{;?Al zkz{b^q^|{@i0iZ~#Y3w7Diu3DKTuycwEVdMNx0Ltec@OVb?`>+rS_`1t!enPFR))h z*+zZv_=D{*Ge=r@<;j;dv6_K);K&b$))2j*`59)D(T;en^s^6Zb1(JhXx}Dt`q3Fh z#$`~4K~JE`)Ng-=_4Tc_1AY4s+*Ld}#7SC&e5%E(%PeHhlV+cZNDw=<4yGA9l+lPL zN7kx$gM+eFZ3I82S+$H$&krOSw3&vLyNc^GZ%+Mrs#*46YRT!(m>E2WVgHv(eu#r6 zxve0k>#`f<{JJRBIGTVtIQeIHbxF&_YN15UI4_ZSB88t<;D94hCW=gD(!-gy02E|< z&K6FOUQfO#JkQ0sVAO@ep+x5E<<5;sh$3akXDMJ?xXiL`9|czR!l+(2PW>^@g%%4q zumBl0?@kOc?N=0842LY%lfIZId&nIHNL8D|j65%V*W3~N)2FQ7N*{R+KudlM}b*_vu8m2uq!(nUTZgYp_ukOGpKL^WgkxGN#A!VYSO0n<-MbU8bsWcHhGH|P zqES-R{l^&@!XuKWiB;qtWHs4{lULJET>^a4>I^4?KTKV7YdkGoqU+^50XFxJ*lNwz ziw_7a!mDN$odxRNU5BcSQ{Y$h73RA8@|>{PgU-17VdXoI_z9aNy>G2;xF4kZr*4J% zf$bSP*^Vx4NC4l%aDe@5tv`acA6EbinL+(XvMUn;24;=!CiC+!O95TK04+L(&;BUl z3|&NgUdj}md_#05&B{K=Ls8`eP@1^)#Tn7$-iZV*#GHKn>1{mj9J)93$iU!ua-0U; zzSAuU3;t(RCCFlR4MN9B@08p{lB5g5uYiBpAHeAUC1kj|e)q#MLn(SnFty?SL^sy_ z#}xofGkmU4QwI!O#nAo<0JQJAN0)I+I1!v*F9uMx3Gb)FKuspA&nJc9vJYi>^|Iu$S>i4i+IG^?%LA+=)6 z`oji^Fhw@~L)lzhMG!Ws4pX{#L@raOF<8o^5&up&Mg4q0d+SYlfSn4da$vuC85`?# z_C0iwwi4sI%Prrx`?`)!@O@PUdhwOc(Jm@?|6M$-n8Hiy{dd4gS&F4NdM;<)V!*{f zd+e|Zc^T!i9?W2kfb-Jjm|jP2LG)j4DlZ zr&2#_&juxKRev`6(+ngD&U~k-m$?e{poVSZ#?UKwlJ)kUGAF3Mb@W^V3#<+8G7Rho znA{+_QiMDyGq1cLV zlKdWI0q|{P0{+TvpuyVXcv*2f=6=G9&0E^0vPn4cFuPVUFTKh8Qm5AV4UD(@Jg zj6?JVqKWtrVlnO)iZRfvvcllB7$Uk{oo`1zIeWCaMw11%*{@aO6qa*jOSV<`*-du@5WEk~p;aHsaqFgo3kkrF<| zR9VKXr->L8Y4b~(l=L*k#<`Z80^)9hCL4A*+yoo4kk9 z*uAWy%2;E#9Fg}bNNJzb{B$Pe89=?&iPiD?bBAA{@nKVe&WmcGfQiPafn z?{hxakC?7Q3yvW;I06gfghKX|+ zI&u^k+co|+=*%6(FzJJBzMp@8<09nIxh&fr+`tcvRL2UH34PPb%M9K@BkzS172bLF zY(T|6+M4VHfXmdXe4p*uLlBHeGSywp#izve?Giyc!b(+-pRzO&_S7N=(2m~U#FQF? zq5qUgy9-VzaW`w#%k66VNW6@G39@<6X)#5_$ke}Xd`gz8J2(5mROW=Ke^C#v+d*PZ zule9W$nfIz*bwzSiSo2BRt{mOQ*sGJ-Tm-dN2 z3+w@#oS?U+PM%-}03qTB&>x=b!Il2v1ws0C2#1g{0!3*TJ=2wpqIjd9Gd5F)Ki9%N zC@Bzegh+ZhUXN!FntSwGWedeupX)YSn6?*}D2-BosB1T~!7b z4)|*5TMS+I7SsV9`5b*;5-#c0E*qq}i{1|BEF0vUm@MuLLU%h#gFDapk9qIa=3KgH z3G1Pvw4_Q%b2X2p`=NJJqCtXKyPL>)=J0_8S7W_YjO3poK?Q8Ufug*);L=QAEDRs- zW;pgNtI65re6OdN9r$Zp=O9y!#zc&MFlZgunYPE(vF=`gD3?D&U6s%P_oai{k~p!> zXR0eeU$v9<6nobnADBgc7H?o<7gTNrQ7(DePlga*H^2`>zq;Q?ul5i@cixDEpJ&&c zknYt}=VU&#KVQKT8Uom%N19M-^%oMH>+<1bnVtwwLVL^)z!&$P0!2Q1yJF{0uK9)? znVx1D>}+!kD9JG6U*RIF^SSa1Rb~}$M70<56CPX%DIR9WB)3MsYn{>Q%lY9j`!@Y; zK8DlG&tDgD^ykBV&fdh0&FJgHu%e;{Q4noM3n*h{jf2F_XheJ)@h`@FT4eE-Y1wzf zd{Ij??%b7|`6VOjI<_TM0&Bp!FAX!RG%@y0{Ty}LKy2ka5PiBQS}@R}o_FS1x7SC- z?f!itBtQrgJ7G4P-_hfpI$qVS)M1$>+$4=3en+Dn!*9rr4lesFm?$;+Ghgo zqp>=f4@&2H0aORW*MjqF1w;0M2y)3t-LVaLR&Y6q|@h@Lb-Vt{dgm zef|9&tlz3cN_Cj#AGLuO0hSGDCjYWZ=lpXVQN?s!O!336&^xI7P+0a4=-tVZGI5;@ ztowq_p6Oxp^-zvR8<~xd9`Q#K1W*mfEPuZeW>78fuMetoo^CeRnK#`E0418#btp>o zH4P{8NJ8Ew-8IObr~Vt=0v*o~k^Rm9Bs`0*I}HlAa?O{TVf*~N`sLP zP>2t|X%Ak%A1nbaV_#Ae0U2+RQ_kq&y!Qo;?51iX$puqov@6o-QE{s~t=m4X-GyvV z#;2qloASWq1;NAFIWjHEWz4zA9i;hBo{YjBehbV>TQca4rD@I9_u%DIlU$^;ijXlEL|dF){610<)(`6wI{AfSbGTbpOF7_6^E`2E z<&eV`fVB(i&P;F+xY=h2Jvyti}O=$uyZ<{bg_`2!IQX_r!3`8<@Nxyd1Hwi$Jb|)g`Z}8 z1eR0{Jm#b6{`a%7ei1wfBmRsP!7BQMt>;Z)_{lYX-jM`218HxTuTEb?+t38t--cW4 z=4tdq;k(mo<`c8?QGjFPJ(g2hx}wCZyk{T6^Pbe}oeu%1gQPqMh)Yk*+MaP8p4!_v zgSKxHy1NT~m%UQ{;TOXfA9p2kK6d%9Cl1eYjz)uM-643`aU^UA8A!9j2P_z9zS9Lk zVBvF_)bPJD?BI6;4*Ml}zH=L6npNeu-+QBkh|l_hNiMY*Ru^-k`%_R!~=1N+pTKa$Y)e zXgC}oqTCPm`NqeV8WJC=6#4Z@jB!4o#K#vk{XdPFT$2)ib+v1!Lz$;TmTc6x@ zw-zfC$<@YEqLJ7HHm>5d(!6Q@RoipEh0j+$&1?w@_!OE;`!v3QvDqBzs=oiHmRRR$uZvGm%=51{+!nan{MfWw$4R^WVOk zs9`_|L0Ol&CmMTn)|~O;RYjz6Gon0vkq{ty!=lS-dm7q%IJ2;YFE0FU8qOV}WiZn< z6Dq`#pl{NfQ1+1fv{J9re@^-bdHl`qczyxJH2AY4fUsY838P8V+0&wH^SAkwM{zx< zS5EXigB1uZ{|chEa^6lj^IuuTAyBeB92vd}CejQf9OpLx`f>)wklt2U11yM^$N{LR z?CS%AtdkC?Gl&#nRl5n7lrLY}FRpi(AoLeVTS6E&&Qr_ru=XLNxk~`6vA&j=MZ6=r zOA@}e4&*!8MFgq8CZryzlPIQ+Dfxr1d&63~z3Vzq{u8rtEb=;5H z$Y%K4);cpCa&?>G)W75vpSi2LB*mFG*C|E&qWBJ+1XN`|Jt+?biKOoM44`0nvy$#6 zvbua^D#DN|qlhFtf@E{gDbi6I+ng9m@{F)m2b%v=DRH}f>|4Zcwh?V1^J--iGFlmx zWd+yn?%wgs9_Apir#V%3!qJ%U5_E)6&BEf%`XoG))?;~&JRJkUn5EYYZeR98*X%4Mm0t<7^}ub6g6ok$VM6z5V0W$@3VNP|v(qZf(M-F2FJES0;dla%l5pS7 zB@^d~0JXWn7KD98r-Wb#5*EAIrMHx+nd6ug0O-~+Wts%0{pre;^VMhh^~P4Ulh4K< z;OenQQOG>9|M*vv?WWxw{N{-|+fwW?t!k;D#Zwi^t>W#E%vUz!7a2bmBi)9m#Gy6V zNOzJcW_m+wA>ry+BeRmsZ5#yUf|Nn6mhc@9F>*C;iKUdBw?NPKoMuCBT_p(o`|Z7v z#yqYnK`W&fyZ}LM^<@rH_K5^b>aL&g>avCkiqbEK(=;q4F>2|Z{9KI0j5BgUTA2rx z%{$o&tQqD_@~%)dn4Xg(pz-D%amB}Waa=GGZW^T2h`I0xvvNrfWV?676 zSwflDV40WHu)X^n3j*ZCX^3D0K_QthW z7F@LICKR%Iq5wi`;Zdh&fEMA4VI@kk4#}B`Sav{<{xfxQ>cof)7Nd214iz!wRd4dK ze3;5Sd8=oAg$H&KkkZ+e!cRhbsD(z_B*+|Jw=JMKARuvz!H?N@3A8Kxb#6>P@Bj!iaVdhap2Ibx zff9AU3z63WlkmY6(N{uEdoN&h4pb<=(vt#uV~?{L*N)<%Rt~;eXIh9y|In_5!5A{y z7beel8Zb>awDZXi3gv`0!CmWbI`**0S=h=gc2VLZ~+-;}Jskz^=J`TI;8& zB-4D@3z?+PRSwJaqjA|C#fT7Ka)b=8qJeKDfUHs z32VYDHqi>E?YS~ueW!cDwuSYXoPs+j95!Gax<|fF(yb!&T*};hr{l1%7YXh34jO!2 zdoLg`$RY@L=pAI;*e?*JKX_efZjfd_ZS17{_Fn8i*Xqlfq~j_e-qlm2Nt|rvdG$Xi ztqo=+4RnHPLvU5yB3F`@&F>TtAjD}jT9+kp5S#Lo?H85Iqcl)ZS}!)TS4{QzJ{+i4 zY*xg7UGDh&N&Be?9}VmumZ|-&fyD5b-F)=JY?>lI*=d#;IFoDY{58Fy^89&N8V9%j zQOS!<;3Yyt>StZfm8y04-R1iv3&S>r{Wvp_j!GMz-x(&a3&22f%Qz~Nh(fEn|Xr{`s znrYp<-vd!D9raB6aTe>V_CP|%A%-3Q@+3wFOm?mo(?r-AzD*D4ydjv8!vW+qtIPE$SGM7`!4nh&?H=_o7|=m;_Ke-#SUr{kXpL z&6nZnq=cnoQ6kW%1dfUdG2tkmWK+Igw4^)H# zVBsUf-3TNPC6QLELG9?CYV1u(T`n6@ucc7!HyA?+{ZGx%Df~g2e`qWrn0Q2Ad%;v% zxaxPslSrEoT{l4TFe+J4ER`blD)baWyuhA>0jKXe&~teWteFRc8!)nlb1kRm02+qzuTh^ zMwa|H6k}fCzd(Y)GiDNTHTg2_{^p}q{(FiCLo$!-p`HCO@#iB3^&lFg%7EDgu9J|T zCotWIxz(tj{g*`>;V8QZjNS=Pt^g2HR5HpVhQXHw|A# z-WQ!K*9>kU={l={@o6`7(XFJx>1zwdUi--lAhI>qR%U@{#ZoH)H`!F@kPnx)welb} zR}6@B4bC-$oh1^AaC9g}jiZkS%3HMXL5yWb*z%kQ&>OHtZmJ>_%_Bd-Z>+CyBln#c&YhCeVT(BrL3sQ9RhGWM-erNaZ6mY_LyuEN6QVa*+}1-@5CnFW z@#l_M2-1n-anM3l?hA1p4ip5v_p}H~IN)+ICJ^+tD*0stuWIB?{`ptMD6!|itZ$5- z)47J?M1Eid;!%=mscuU077yT~DJ^aR)%(%Uo##<-i9s$Par&^8p~ zoC#g4p+mUez-he0wp;Y4x5T1O$fo87rv^{y_D0?Ckc~milrOkfTdcX;!Y<*#2V@T% z;emxBcfB-(_Z%Rd{8(a3esotTA#SlH;OIH|x?$v@nd{-Z-kxY&0dHS_ATG=y zd%sxkCA}J!)(s(`hR3vrTzm-*N6Jj5l;yF@LI%J;$lWf_0$*b{Y2f#O@VtH5q5fDM zSeXF<5#heHy57Dp{IMLwzSw#AQDHhL6ACh?D#=71;stOvab;zQ_X85|DX%m}=UHOW z=vfEI?Ka$~f8gYy)c`sD?kMpiM%uywECdDgH)0hC8}t1XK@(`a*Rh6*FfqZU4uv9Q z;o=LR^UhMlX*QC#3Gm0R`otckN*?{^LTmm8DbKash{Jn=KLMj^Hsy)2AP-lHyBb7( zT~(e7k2-a~alpEG^Y4qVxF~J3lQb%D1A9t`5GaC6TLQMnqQ2aZBh&G8`>^AYh%t zoZ{z9+-Gr=6gBEFAqKEu?as7qUv2BKk1lk;hQt|t1YiXQWX@8?h|o{D#-~$hcMjt7 zzt3+isyt}giePWy^~CEFt`f3ttYJuDf18~I2}8=>xzYBx8KrCrdoRJQaFe~$lfEs< z&%}T@;66Koz6A-9uJxbXHYNZ$4J2cr(o*PwazjXk8(C4+_%T398kA#3gnzng#{Ucl z1kMi2n2}_drl)U$r0e_&8}nnz%k4+8>46hCO56kL( zONQ@1o$FeKB~b1Y_W;Oi{wxey45u>Of%Zb4${~!S1Se9Hxa3QIUt{yw7}bnjs)I9k}zJ8!cbV-N+^| zbiaAz2q-(gkm>`S7ues_)nYJ_{yUq(M<3yFY)219eld{`{?oRiJ!&cgBKEYy&A0Sw zyvH82KJV8SaN=FFVxG2#34W=O)TVYZuO=GnBtew;($0C^%PugPN(mBv~6w)Kpxt2*c z9aNBxGh0YB__AMgb@dOKVK6uD%u6F-`+E`&a90RpOEKbAzM{@KgmiBURq5J)kP!A` zmL8Vf8TkC5hPXDS(FmCXe>z~jhBU3pmE6qniRAO(A62GHVlnTPYhP#YA}6pVlXRUU z>bBn_y=I4c_@|Zo>)GOyl@Vow*KIWzw{Xvh=a1yMWj8w%Eo^|G8N{4sK@RCu5s#W7 z+k#6&NKA$xHX4aX=oaIU@_QYe-wbm#7_I0JRisNvvTdm!Z8$twuW2_o*I?loZ3Jlw{|NCBrHEyR#z_`dU7}bq7-4u6?4j45BNE0>qN#UgaKFUZUUmXsGvtp18Qj~C0mn-X z@+Tjqi0xlqU`Di6ma&0f(Bj8@!AXCa1{RY=c1BMItmuPH9CE2~v6AA88!a@xzcLC| zfn@W8Ui@xYWrNe(QI7@PHli2fWyn~3aF)qLS zyXknR2uO4c;7BqP?g#ialD@i&-Fb){mwM|C4lM}EwqoTDF}hVBsJtP&ooW2wXf_p# z`_CTf1mR05)Jd`~xS$;5F2NOnsd&4fKt}%%v!sZU(Ri9&s|ov?jDbSH`uY=Nj~tx1 z;?#bJ?D4z_V5cw+p3QO7ia}`&NmuwOorV2!$D8%Ll+AbvSD4A0#X)CMr2}m>w^$A} zY`e4^)IGw=b;Er!hpS%VBv5&OgV4OHrzpaQx69mksdVRqquR?-7J`Ua?^^nTgx-Se zK~;tU@r^5P%18*x*lxGJRjRosHAbGk+7BIvyGlFY^;+IuN8z%}l>X$wylJn-6WMfi zsagaFtiCs^#qNzhB!4!ZR&E54zX{YGdrGTw3GC}*44ynlm*qq4^-rhn-N8J>8!N6mIDj6w?7gC=ZB8czMz#rXFpxz*+m(Muq4tLDg0Lz4t^U;z{A3fJspSHNOrN{)1CZ zbL}cg%=A#w)HNAw<+842>VGgBttvsN&(J1ffi;}E$E!=NV7c+6V$PJ{b3DBS)RXkZoF;qkA9moPqcHou4s@4d zL2_H@OvdCiQ~pR7Qe`LPg0KpmSL%!1%~$|1Y+#LXuW`cPMkp_l$jv-y~Xgdio5f)K-X`E=rRro10-*^}(ufklPfAocqek zR@&krrGfbSQ|<#CuBBP_TbrZXEC@~H#iG92scn877op)BseA}(*z)$Gl0>j{|nUqP!s;N$-s4KSj8zxE08Ilo`80RXZQTCdYm zj)Y1w<%k0T!@Crjo1gi0T)6-5D|+R=6!Qt7fPdW|NbP^6IKO5H5I?)Aos3_+{D0+u z4g48^DMjKx-U(itFihbVrM|Vqx4!7(qcL74dgN9(o4-06H1y>|>gfFT~|N3`!itXMoQFH`Y2TO;_BRQEI;yJ8Ug02Gtb5tQo+Q zo&4}bU#8fLL>SvZLoD|Khw;*+odohZj&bSG<23suB50QPoj)0ZHtGx7y~M8tw5u=H z#IeCYGa0;`6n~bdgY0E{*t}~!giYGXaWk##x!85BA>=2 zL)oMlP&6{N2_z)$J{9Z=7N=7K$rgjxk?LF zbEr>XI`rb|dj!=#LJ6XjDOsN=sFGJTHJ>TG&@mYwNa3EpL^~`-Rw91Tuy~U3M?ydv zieZoJe^}uN3h^dtGs?8< zL&N;rR%x{$Yf1fmAt+L8ls}$^5D6PjG#im}N^&5ty8^sJ+$Nlv%hs-|0;+O{>V_M| zJ1J=JiUQ)9lw@qzBlH}=aIe6AQWB_ke{O^P{c<>ioji(_$YmKa@OK$baA#v82Q5mv^m@bjx4Bp@+x36?7Vs7V2C3n0Tgk`D?=ay!$ znrMns4_c^2d$KB{>v-%W)?6KtIh@6Na&Sy$0?!u{M zwT2-$!F?Y1qBhmL(Tv}kMpnn?;g_ENz!#R1>fhL|kBBIq6;atr=1Yz4n9B>PUtG|k zZ}@vMX9-Q1qt+f*W)Z-RnA zR>?|mjBI-8>`ipEl!Li9(n)$wMt41}nSBa3_Iky^|0?;83@=vAcmlzMR;JIKh^RCU z44|FxwkS9UA$P0aMmpQAP2G3&36FvCLG0RiSmqZ{}SP0FYFK+r7% zWQVC<2y$$!kfNaY#Cce`tPeCkVooG^%kP1(tD)4Ha=y-Ha)YpnLFMCg5mB-3*@!D4 z)Qu4WY7O07)LU1POSWd3&8I0J%;uST8|484>l~Ub-e0w<(3>~i#1;;(B5ot?S9h1R z3yGz}r~Wvn+!A>Ex+IeUmFOL}*Fg<3e40~0Ms2gwETmN{5cB=lo-!DbgnhmOS$==u zp#OE}Kl2r|pBH8g8=_9lT(E^R4aYq&0lsu@vfqF0f-W}h?ad@roUp;WQi`rHlTpWF zU6&TtFTRom#r#>F_0PadD-Iy;o}p7`RKjb9tk&G%A}Du2j&;qtGgo=|#v&UDQR0bd zp)JabGsBYaC^$&Ij&3nO%R-=+Ve!mSSs>q;PWBE7g(xVX z^VKfT_d`hV?*ypv(x>%a5mEYQJ4Hv*#}cHKYSP&R$)oXr@WaDd0g7#zJ;zzO-#(sO zH{N+wfN}U~1zw`^*Vr@A0eaDxsTU`Fs;}g9(w74@iK)$sv z>|ohyvVBHz)8nV0P!c}B?PK-aDBTylu+Fu{GQts-)YgW%5tNQ7p^8sj>wnjuP>XaG{b89Hjm4BuVm5M znoGLXPhXRgJ{EF_Xkwr-F>OJ zO`*oG1$A>I(TW?T|kidugr`D=y{+nijvZf1d0^OG;J?#q-*| z-_q(t(>UqMpM8*+x;`pbt@2Xp19#v08IeL(q}u*FV)_)PvNPpbAmID=cfn0!_>9b& zu9IVBP}B+rmm$03-}GUVtdW3Hisqk!8-%~|bzHs*XE`Z)*mu1+<4%mPNp3#@1iOXC zg-HqwK~9;jm8)#GtcHo?!Pv*pANL;Ns!Z9iJgbOpdeC`Iy_V`%1HmP;rbKmazR8_J zhg9lnlg@_UgX1o$uxVBgeN-2a?oCzjI-k?~NN6mZi9__9LZogv%p{1I&vg2b>->)U zN4yl#XI7(uUh$3Dp;WHPb!^+Vbz(c|IO*87 zZQD-A9b1$4d*_?^&odV@x93^4&#KzBFMfNks#4%fQ6MlwB=WuwnqeaJPJ<10MCz`5 zN@YMf;g1<>JRgp#`;431KFK|o!y%%6XN?S^(PjQ3GxPD;_C%{Og%XCG}5fC3gP?6^MZ6RojbXwVGs_TknBaNI+bxhRRqjIuNua-jSZvWGP%!a?RdnKwq z!`?#<#?;b>hmwU_T;2{vO)hdSNM#x(VnzCMZtVWk`Xm_+s=j$pJcXTSy%6R*vT3%d zzGvOGcLZk_E^gn1@RbiHw^-(yOle)`K$<0bR0qPbhm>2^YEx}w4kOs+cj-Mvl)U-# zRPcw+dxKQ(l)k5}VNzX)`vkSqdt+4evM?v6a}4?y7KP!roFdc8%*cAK4~gb*_s0<* zzDVo2XbaVcZH3LPcUt$8U{y23KZlqNZY7H@*CkQ1ji%Q zp;A$r0Chf%1%2W9p}9uw8wr4Vx2`oNK-96#F%sK7xp;_RLu~2eGa9;HwH4u^-2#Y9 zfHkHhggIp~#BuMsvbU8RKemrnP9%>@g;1yi)9rFX($P26SNNBiEfOTnEWS@_ z$WXNW&A|^Qmh5BU!_tP55$yPR@%tD;l-S>UEI9Mci$UKs!wmN=JKvBDXxH*p>E;tv zH;oD012Cq|m88+>P2|t3ES$>@JMmSt<5?tRCw+JaS9Aqu^injX@?SZWBZyeK;Exqc zxL=v%I|R7tLZBdAUEzP|Hx*C=gQ>r@%=0mfjTziLMe`?>!iWoI4^FxD0wi`@-FSGa zc4m;*Ic^-&3bzGw$^eUyE~L|Z2}g#0a1bagBQK6RQ#;hO=4tDCO2__+YAe})cY;&a zzH5f{lLib>z6qek=uL&d+L;nfGSQykth7)R(ZdxDFhEiK1V`$?U^7%(MGHRmsp#8t z+D-Z~WB%-Dd+$9!lM>pOy zoalE)C~(IK#rUQiGv_RxWCL}~j5P2iBfSOBe$eo?-w`~9HKYSP~SzZyy9Hz$M z?C$CS4Z3CRPNLW^aWz#~8y^|H9Zk{#308BKI4GBZ560-*f(0aQGU4*{u1Yu#V4{9{ z*;GVL%BDKzc~kF?7dS94D@zmx`5DbtLy7)^6H%ZJrnR%|5Bf!qrhj0)K{P zZPih4+_#j!(0dNzt|MqI_|;+7Eei)jm==X)jSE zZTx8b9yNXW-V?GddRs`Lh}F$Lz7qm5R%KzoXeTFHh^yu6F^q9x(t^`=%#21WKB(Qd zI-Hz-Ch=BeRG-gZJGX_wh=|$V0G$J7X1~)Sc#pMN$=JFWuqpMm`$8-BF#Yx8I1p&F zN?RkO#CUqzK-_tQGIf}E?m7_ z|G0o-3*MD8x^*ke%$^bhw@}s7`%b12Q_5%(DJTGD@lLRm|#sRrRQ6%c;O$7owrt|;JCh(M`jpD3@e9Vg)?R-3i95K zUClgsKXUyKiTvRH7Rdbq32_fa8DTiB77MR1Pu2C+DrHo~jngE)6+^xcFxXJ7 z;8MT;BhO5Fn#20b)A7Sv&fQ^)}Zmr;rZ;n7r6hSzoY8P=LdUdKt z!8FUzl3hxbQTJZ4sz=BKp_>Jlv8YBXP~m17gQxB3sdyWEbzrX&!P_^bL*0 zru9pV@$PPB3OdNof*(Pv%Z>)qyy4lP6AI-wgrR+Tcmnszl@Sbz!@OjzeEV)UNT~ZR zla7+p^ECX8k-Iio>!)&ez8{L^8&3ObX`khU+*dpctkj}Ynjz*g!8Zi4VL`jgIVf?i ziC}ByFm!+PWBm|f$VQK=)y-m5*u0PFP=#TL{oxbGi6#UOG%w!< zm@lag2^Z8x#9^xw!a?GG!3{wt<=wFZ7b~X`e4e6kN>YoO-mM-Aury~)XFKKY- zj3^r~87K9n=zE~Kh^LB|Dev47NIFZjl^ys18CIxv z&ddw zbgx%2c3vU={qE_`M9DZyj~Gd5vH;4BphaI6=uCLAZab8<*h338IZjigHsZd9&#zIe zgBoz(AufoJCZ6)EKg3B%wKuLoa>+USL@F~qG#%9ly+FqkCj6~ZrAexOqf^XS_J|+2 zk8faXC_H&5;p1|SrObDnmD1N!fG47Y;86X1up~^>79gQEg^UbhieWPJ`a>C@Ddl_x z{hNO*60(q8*c06@Mnse;k{2{0gbbs*&$-(1J;-t+#sJ)w$|r?!7zfptFQNGjGWho) zN@# zIbsDouTRvUoVOFSB!7|-j(jfgbZ-{#Rqsq8jD+X!Cp1Qw2TpA{ciTHesSmQL|U{qtq1Ft<*NJcG5-*BBRAJkU?A68 z?2|noWBrPN;>j1127(=beM9#oWa5c}0KolSpReYLG}8b1Y6itHDN?>yf#cN0VG#?z z2Oanea_e;k>le8CUMHtqaA&@~!ZJ|#P-0lbSPnfuw%5 zBWt*_0n*u#sh4e`;kijYstTj=9DIdMxuHD1l&Os)eeJCk<#khv*F17nCG`;?ALZmz zvLGV?m?Pp!_9n{z3x(ZzldEiaHMc3C0lN#2y&xegz zppc*i7GhXCoN=uDkJP*O-_1}iaakxGn2Zx21w!5n@f}|>zRZLg0rtwS*l({Ksk0pg z5$;qa9G)mmo%?T&UdR1=POk4s=j8~WL9fLI4xsfqT-_sGyW#$SU0Nr6(ambu;^w6}!Zpc?n5bYVG+S(vAPEPdtOWpxb~eSI zfnfHf(`cpI;!Ld@j`b|F`Ov8SvJT{#X|w3Cc$LIWE|uG+M=K(!(~4FI`=r#>g6ReL1N_`PD#h>3?rz;J0T4=-A%(PwvQTt}Ff^@X zqPn7ynu`AJDG;94;F9ur%woVfrapDfC0mQuQzkR~c zek#He7a@z>Yk8P~3j5ABXaawg*)LI1t-cu@WJKUBd{p{tiQF`kY=^xiItXj#TuSh| znk?_Pgq5wp7IeIyve|=m#Sp^fuVNs(v;FyC`}LX0RvX0e}NT%x723mwO6tqMJz zTkC}nr4i$mKCh;F(3(-^a|xbLF*oCx)3zUz-DW675x3!z@L^TE-sL~rK zMC>NJq4<6qhLximAad>zg5&r)vs)W6_8LQ*eOh@-zRyd{XA8t4F4s>FHU+n}p@bj9 z_rP0aF_n1t_&MHUzR;?HBe$N(0%VL#k&Q0LLv!N@xDJio^N+TJlu?zb4K)ryIY|7A zJIhOBLMS4-%b1!lC?Bv%XQK3u^1U)%3q(l4(*DdBaTKI76rY^%g_xiu2^*aqKpZEN zA}&5Jc!$udXDKL@nF=!4UAl&syjW2&`CE$siDf7s+pB?{X;aoro%<68@7%wC;r-^U z_L59^8dT7{^ZjA3@?!fzY>8cH;%2V{-TQ!loP59ZZpt$C7r>BvBDLkl&s{aY76^g% zzmMd9m$IT*?pj|pVsSc%v|VPWjH}vDyIYJxd}owc9MjG(1VXs~Yw~|ozZ$lmuAjoh z92;_Xa?V3muDqmZW*e(|1OMs=b*rtl~!k{TV{Q7kM%mTg=mAf!a z?nL+LMpeHvjq4k$^L$fs#$gbY-Q8szTGf~lCXuuA(D%yhReu|eS2f0)F}-DJ0<$qK zgjvN53PY#W?j0k^#I_fKq~a{)J*c-0L%q-D!9ax`)!@jfVcm7{C%|vSM%dmNQ3KAD z{%@w<-kvl+ay>iE24!M4@8bOL;-0r^$Uwr?E|=uHuvnXoEx$>LBmol4ifyqHAnHr@ z?IC;H;i zfm1QgzRH=_;~oA?JNt1Q9<@bC#DW^y^9=EwplX5s_CJwOvuck$S<}1GU|CnMp~$Wf zJ}&HF(MaqQDU619W!|cYY4}(@xzo2mlzsg)myvRc`Yt zgxDIfX_!a)8S&qz_X8Na?U&^BP#<(F!*FGL$M6tq)hT3MH#K2WIu$t@GK=_=+k-bV~2sIJ1A`Q)i5Tju`zB(bysAota+s&DLdQg zAO)oKUpn^)(z2U@1=-LpHKUtujsW+Kc2OESmh}QFZY36?MV|zYyZF-ZTmwq|tJPeW zoppu;jh=}tM8pT7=sLeaqpovU)W5Qp#rz6=Xxd93^$BcO9r;eSDwC2F2gdn~*Lu z3SPQ`b~9GYER%8qgwPQ;=4wf^95CBUZL*)P<4ETZUCb?g8fsLh-7#us_}7=-1yI7# zIdAdQm}p8kX6tb46UDsBbdu%BnGj|N8Qy&IJ?;IWP>s;^Yy;0%oo&XdhSD>@h2-jg zmSHnnzFhQj!?!G$d;J>pP*fVueyiuatZ6y&uZ?4g$KlP~kLChdi(?j#nD)U6AFQWF@kqZ#^1RHIg^Q4u<4QH6A0NYS~DzBJ^?S4W=q(`oWL6i_$0 z8+-dmE&A0^85Xz82BGGj+!WptlRFS)xO5PyGN3*J0HNA0cb z`AJrkSpODIrEOD#p9GytCywpU51NEPYh4V^FL0PZBm+k4QZxrm*BNI*lOj=Ibb+#mC|(@po}?U%tr0NLW{73+ z{iSz!U_hZ1- zYMhA7reLjOg>O+`Tr=mg`2)k`I~a27l{7zJ?sL~an=DL(I7?flti7E=yTZrp5MRRI zH~JXP4Ks-PT*z%%iR9~#a7Sg}MoS0kn~X$4A~bMf-wtu27A5Z6Cnop;Y5vM-k)l{@ zSY8z2Hazk>6CPFVTtDg+s9t@Td99-y2JK0#AU!;6k6 zTw2Y53AzbmY=8C8{_JYjOxh7v%~sjQ9d|koiGc#Y(e$f>I2*R?04Io?F*`i#+&R1V zEw3TS-0&$j4D$2fNvzn^@e;t0r+q`numyj-Wg=7{I+S6;%k`kWdYLJ+j^-Fn8zYLt z2{@1HixK6gh~ZVbGx&_1yl?r1{XMd&UWGh09SI zg1{;CBI5<1FKK&2-@xBQz7W_`^F$zZNl~yy>$h;%epQZ8Ml%`qkHJAcO?K1+v#(P)3t&8xb{|B z$KdyIqPD>hc=#NC_A5q)TFHs2>jBeU1@E&+E^}^L%saYXm*RRzogk1*?e&knzmgiN zHyH%&{-n>dMl{C~h#!D`1sY_~{S*D*2AQB`w3r)BSUe;Vec^>Z__cOR%VxjDelA0` zV@Z5Pv_SoIp(-qFj>caG-X#S({q#>#K*K(JGlp~fc9 zrq8wVjwuJ`my7gE>AI9CCOO8MeF@(~5vH3Qle9gfLf)?kg1n~I5RT|SCPFsW+#?J; zZ{YLE&SX-_mHMo0JHaMHlWa6s*cW33Z;Rqj$)6X)T1XsIgh#d@qV`b|qRWRBx`O^n{D)m~3yoTE<2>KD)2}W9A!gGo-gI5SkF3Ned75O`GEc3MnG4y=)DsI+J09peQUqfs}E^bxayR6ao$BI6%^z=#O_QFz5=4LI9S7#eFN;|OSHO&&ct zm!I5`p(1_NvGB2RKj=h@K>n8UUI=*;#xBoX8`WKMRW^42!5}QJ_k7qvm+cBXF{+-M zJ4<5xu|85`Tm7P+ywEoDma_bi^m8DH@h+1xnKfX}iqt8Divbi}yOTs}3zTk#AXfOy ztrGZC;+P}HBx%vam(i{f0{JCj200bsdyR0Bg4Xna`kPg->NGx+JIEyDQ*OA}=}8Dh z`DZY?5+OsflsUAJQ`an$vN^OPRSx>${h@c40qtPTk{AT$A zjA-V5qAAE?u|*B6g~qk-_^9xVHwi}BFBYY3dx$(oxQR}FTb#@}nJjSetyRY@b)mN# zhD8GLDCSyebCgt;0{Qu8%Yz*a!;|&ee=5OyNkL~xWww_)SUzQe>Fwdp1B=9*y<2z))6ziPmX;elxys7K3SaZ9r38xLu7^1 zq`zyx+(kMuu++53N;4)d_dU2cs?qOX^UwT^#|Bc7Lnb5k^6j2{gBTZi7ihr>+Pn0v zlYE|rQzZ-!%nAsvZruy0b--~*5m>WRFzzdVx|PvP5SF&H;qv*=D2{goCnn%_ie_DF zLZla@Yd!t;S3_6%Y=mf)7T51OA=6KnNCNFtXCcol%f)aP8F%S|X;3VSN9sNtU93@* zQK(tnB3aDLu_pZ^*^8l6u6S&CWOxqsG%Z?|QRGbvy60G9HXKEOQDr=5b3(ik;Sj@mtIg}#VojNmMKc8*|5A-KOE;Fy zxTSd`&&RQHk21RqdMPj%IYA61s+Alc+MOTB&&-f$*MXma3tVh_6-B#>|A zNHNRY^GLdAfz18U3^ruhQ+9oQR&V`nhRB~crog*62jo~U_$EI&6UXAI_ly}@n>$D2 zSWkUmyL@2_UbmTEE64ia^>&)BWKLT~cv;kfK2qH@yTVb_6<<<*ylYf?UjxNK!pCN! zqDk1nmjg%>(6=RK6Zrz8G1}oWI-O}h8DFRC|IOrt{vp&8F5nk&x0VMNzPfC)?wOCs zhZfmL4`?52(|(ed!NqU*zHUwn;^s}J=0qQchuMAeer<8kv7OSsqRV_78%7*zt!c*7 z7}C#q5GEaypk~V&W>sNNw#|wB?HF^uyhet?N4wO9IS+c9bxS zw!PL}4k{w`7K&}PDqM_6<#_7xfvu1gPk7LY43jb=3nUK<(eKzDVp#K|8Vpx9FG`nq zP#_#M{!Me%Ua2aK?%iBo;G)k{K*wHPT>>tcYd)U+8z94%SiRze5-6g->Nz7q9@@936 zxIUg^ycc5V(DuY55Cv+!3s%A{LG&cAW-ZYf+kov%R6p$6FC#&NSdVvK!e0gS6%_ND zPmP03daPY>{%CLLdUhP&(#gKbyvGu~uaiM<{izGdqXb;BD77Jv+N7HwG&xz(fy7GMA9*Zg77ZQNZ=% z?0$Enid4moT&M`Evk+CsReyi&p<0vv8pTUI-VMNal$|5qhxu?@yad{g?dMXoAZ`_; z;&bk1>-+p_8EZk~PuyF2kH*5HHu9WPu^Ej1~jcG*b`#_j2nS0VZk^gD42J^^2L;*%nbM~Et%mO_fOXN%E@;mrM%1vL^ex8I9; zzsdAU>LkS2uJ^;E$qM%oJ3Au8Ydf+Yc?8t;@0^tWG89x_KI` zUP0H#|AA&PsIBcbE49a{=&$I zzPq|yx4y>}q4=q?By==GeksZ;>QW!=x%D~YZ=2G(5I_AB>rDpGA)KL1@1nkvLnj%^ z*t@N)iYI&3QX|DMKa+4Llp)93((0|qB;XU@5=%SKZqACh&ctW}KAL=%5Ji>ZG-WdC z?}NP8=EnWiOPV*wMJI%cMv6beaO(x<^+`62JLTC&oqaj%Kij5CmQWkIC2F}z{e1$%Y$9j({392k!zx!b()NU2I_ z(-$T0FVkl}3`y^OrXbTdLtB#gQ?UUPMI19F99+F5y=y#!+fO%;Xf*fV?$BGzxW4lk zp5H+n7&W?`$)+$RApgBj+~{ot9S0LJlo#e7?dE>26~B5f9Py#(3ikBuC_uTR!x*Pa zOME4E-jirJ-Tuzg_#)6hi9MajKSt}Wb*%jZx8f{0Q_dTvlsizuw>74P12@>HMd&rQ zQD>QcsV&`(BPeq*MjWKTd*tRDmKGHkZ3GW?_93Z|%S*5Z4WfOgq~6}hRNj)IO3ILc zVL#8Yqi=c1hu2c7O~dD7uF?ax@%MIs*YP7iv&hpTyx$%e=Q_TPA6i?LJ#Pzja7|qG z`27AGDLKs6AZ&=ursCoJ^gb4i)+jE~tz7+HvxDk5f@9K>ft)&(X)O2tL?=Ng)FI+u zk=ZzGcIg2ceq87l$JJ#bpgLuy;vPu=8^>@|9_SQeMn) zewxwRfS~;Z<dU{a}Q_ze!kRmsi1y{$|G!Cs&2X9{a(@T}zW|~(BADYOq zuLodEQ*)i^Y)@n0H;E43aYI8B6#3Iubz~2UI4q=YJsInPIcb{{JYVDCp~nSQqH_Jt zcIk;7|76D24Ex)?6UkBv*4v^#E-Hn+=M>9%g5s?5`IdaN2x?NeMg__#Q6cGX_+dk9 z<@b_%Dvre8tQQ#@kmk5clLlIqy{ZKI{X>P< zbVoln6M-DDMBduVl1m)(RZF1`kQF*$%k;r>dr>Mg@HctDzhY?wf+AaGSd%<#yhZhi zV1jYA1%{}dMqXE+SSU*{K3$K`e->@JO|XLftSoFC=?~D}eUB@mAsyC6GK>6&^w{F1 z->SE@W12<--_tG~fW8d(w%W2c;E?$}h>6P`=AEoiKPU)M%j_*q3`KU)6)|?PIvWr) zXefi=OhIm9WfSy6r6Qq)38}YL)F7xi3oKAA{Ik|s0 zeY^1Hf+^juqiKpYWONq|b5czjfOYAqSV`vNn<`Vb2VGIUqnTXLNzW)WJSPbgIa41l zcJovjf4RD)3+bREV0qo5ut2qgzFr8_w@ygZdc5*_JY;d7Im=rg3Jcsy(1}D=R6ghh z60&#NZx&eaGR-o_SKMthu)Y&Nff?YaZu?>3O2$6g?wM)d$)+`z93T88+ln>99%)G> zf3%=PxQ*8g)f=Fit|bu=eIxFPP~KlulbKdzK4D%BIXA`}*IUHz|Jb}fHe?VqC~hzB zxois7bqB{dTMF{W%T_0N%Vz0v;@wjuzkeU#%p>|N8Jz^#g!1zvz%eb~!)i%8! zr6)#C?%!LxzJ}9wvYQ$Yt@CY5&8-WWcytY1N&80yrnD^ApUA$qtzEk?HIsdcXEgU^ z!oLzjFm|;JEI=78FhhGV9MBRpQiLFJ+fet7YUZ^t?Q7%C-^{uS#^w3a!BR6nWGQvv zz`rBU5*MeLB%6C=Wk`sDbBkqf=&uQRD$VD7cYJZee?&1+aMoUd*6M2nuAUjR9M#iA zc-Y+HfaxWEmMpwF3&RV~v=pYt|Je#aZtR+EZ1j=D$_)x}Kp$rt!@EmRrHMo+T5z}H z9tmD!$P~j&gZ&A28E~FtMt~vg3+>h^6#PmeG{h8&g^Wt^l14a=5;F!vqvGmqeI)Jj z;(oyWi{M-IWQjgOGHLjQ$G072T6$m1ot$y(EXDq`*-+wSkaFs@-#ue)Ftt7FdQY!AbXzo)N?^)>Nihsbdf2x79M#t&>lJU|f(Tm|x zBPRZtEZz z;dA3rz~O6z&j7a_y{+^ZOY?Y_n&)o|rj@}zv{hv_hNz7l*ib1~Qdt07#0=-4qx#|$ z!u z8OcXFYW2wzHISdPF926hTWFL!Ll#p>7033!1C!4*Qm1Zf{2CG(sRr-=kOQ?wPivla z755l^_FG7F;CID+U-R;uqnzfI1nZ4?-v}^#`7@oR;@3#`mld)K-oOS}(zl^md8~fnT7e88S0#1)`c1@)|IQuPek~zAMyS zvC`?>Y^Ih79H~GnQ=59C?-?~F*q%Qgarrnus-GvE&+!PZwS;RTOT@@Jk&eUuk#-Mvz9!L2>=%vW-?j|<%%xOxedvIddj9xqZ^xsEVCcfYMMCUfv{}YZBlc?+_;S&Y}k8U>wOF3 zlJ35gC_HEWP_%13;sUYyr;6{g#kmbvGvhLHTSQ$}?MMQ1n0Zr=JBOQ4f?knW%*3{_@tB1m>s<_%6?`lf zOm`v!zVBW;*e5b>o5JXE@K>Eto2f*=!X7UGPp-;iJ27TzF&GL3g$^xdj=;i$&Xri7 z7K9ts-1@eStq+gMAk|j3yCl3%z#k&{-8ilfMB))Ge;+Re`6*%hp?6z3b!w`Z_wX9J z)1!B%i5t|~kw~)oaInt&A$^#!)+iF$2M@FPdQBY9C{0PP3G&@@KxHB7ytFBz8wRDi zHAEI;1zcbA-;g2U@K-e>O5{r+r6U(ISVJLrJSox z>k9+hi*-|~^vr4gw%E~jj2ugc?*yjOuZGIYJ)=Uei;@(FD$_RGA1kTfWVOmR<%5rE z%DKz6khX1*@ZRQZ0Jj~w0dKg97N7%O4yFJ{B`W)C!h0$w?qWAOWjf;kv#9FzDRgk>pHp>nAa0?}kcYkQ}#hHuvIw2hc5~^0um(8jT(( z>cXv3ZNL^Q87KEkMI=0}F*K2-VDA*!r#=lUC%w8TjZ2!;S{bRaP_inhgLp3}p$`?3 zt+bYguIS~5?DA5TOxg*%HaN(U3Am@sd6MNEXjK=U{`AXDN?oHINi7qKW%mAeb6R3k z)y@7f)7Yk<1*Hz1nkJ~tdPuA^fi`v6@v0~lwyC?9U?V`jz%UR};NK^2G;u)ysK5TR zz&{!lK)U7DEfYuf=T=;DZ6CECW*JzC>~4wO;C0?QboTQIg!i%#sB4twynuPL)+*+QBTy7tpOfc#D%WWoP*q@d;Yd2qm&ssIZ5Uvu#PFh~9}hwThuH_|5S9(NG+ zTmbxI)_nN}Y$VB_0YX{-Yw}NZ=zsqsqoGq#GmBoa3+G7SX~H&{a=M{g7f(kZ0j_4Y zhW>nsNp>C{?F8OC{{u6URbR?Dz!1I%^4o3n#bsQ+KmZVG=4;6>@fxit$p2c>;EM%3 zI$EqlLB;*P0ZW!oF<6uIO9J?tQNl=MOI_h#-;#KB0(w7V*ftf(O_4!d7H-fxIOB`b z$o@&G2p52OMaU;I?@KY9O6FcP4iUVCw?~Tz8{I_2{#x3SDD&@@5aAWd! z^6P-mtpB=&^k0%EVj2H`65=Zq-zW+*(yUu<+oo-9J8Ye8N}yC~5*%e}0r_P>=+u90 z{*g)jcPQXYTAL(!9`X_dVs~sxK&T1gl$ibVOMuXC|6>1Bi~(bqNYaUhZIJL!JicmM zo*L!z1^j_9`u{@z>3k0IUpxQ+Lqq5ARAB;|#aqaRmYdJ-&f+9P6J7O)j%N^AT$|V@ZvpLEj)y8a^-u-1pwZpZAdTc$5sy^Pm2DR zXY&H&Y_(XT+es5^di&$@G75{erdp-|PKfuqGfp-WTjE$Kd}X$Iwh#Yx7aFZ3}6r%$b&= zI=I{jelq&xZ)A$%rTq~HKLLF08@&Jj&Eh}l{`bBW0^tw-KZq0pzdG5600a`E{vU23 zRQwk#^Zx-uMEd`OIsd<5cuMV7Apf=10J8SjdLW=V;t>dP9RSLI1q5r4uMc1bG)MmP NOCYG9#uX6!e*nKu!`c7< literal 0 HcmV?d00001 diff --git a/assets/blog/first-release/new-mod.webm b/assets/blog/first-release/new-mod.webm new file mode 100644 index 0000000000000000000000000000000000000000..bb78a96caf4747f52cd3774efdbc1f9a6ca15d30 GIT binary patch literal 37693 zcmd41Q?w|{vMoAn+qP}nwr$(CZQJ&k!?x`?Y+HBjvsXLq-H-eKvQ<`#sOmi;dRBf# z7MAEh_cx( z0^G9Q(aO~!sFIat$~A$~tK=bc_rP>Vp5bFA^Cc&{pw3YW}kj z|FQ+@{x#Uw0s);z0s(UZ0f<_2f?e%Q!a~*b)f6~`0|AK-gF`@{4*>T6#X>g(0S$Ep z0cvLj0{v$d|9w2{?EJ4qXWaj<1ze>mmm3=SK9Yp^mo1V zdq4THdw%-iFMWFl`H2_$zpvgwPehQu*1I2l#+M!7byr*6F4A@BcbuiT;E(weznsPS z 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 T(SR3;duWoaNK(~JG}*rZqwWe^ literal 0 HcmV?d00001 diff --git a/assets/blog/first-release/return-completion.webm b/assets/blog/first-release/return-completion.webm new file mode 100644 index 0000000000000000000000000000000000000000..d10b30b82204ef898a292cf0d970f98ec1abceae GIT binary patch literal 65924 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
I6uAs-D6T=zI7*C?aC@l4rC z8}4lm%yw@yQ(Z$F<9$qZNL}`9Z}?aS7UqaO`X{_ZQWY>oUtraCGr3iYvb7u;q(&qn zrComAwukikR8d5I4+B2kfwqNa_(<0>pyQa6r1Hd^G;)HGE1eFI)V>KPNw;%V!iF9j zxAzQRa5*w6>b(rv?TlVw|F~M3y1{&b;+R^0M7Tf+kPmAaPNn z@1%A+JRD$D=d*4Lo4-1c3fE*@d`~BL+L3CZx%`-58xw%WtR8}hE2dXY&UYr?3o-5Y z8x^RAO#szDKo;NWWPb*Y|9^mfipKuI694=!iW}XFJH8YYM#ba%=7*PWbZT4{^Di)q z4b^fXXQC4thpi`kJci3|)_a`B19Y8+v6vBq)ji z@S_z`I@mkR9s{38yHD+)kvR9Jg3y$yC#dwDY$At{n9@&ickSvAuW^5N8KpMy*e*=1v7iOie!uIU^LYCN`; zZJQ@fBhyTzV$oo>?$j_-ZHXj*wF~c=n#mqLYS4@)s6ji%oh^4IREYB3`^40ut;ngvF!RiHDAj$6p5S z%v?%>1HY!Z)H3EfBSG$~!LImK+Ys!K#v}1)YWmTl8Q6r$h0at5VnXgL>9*o;NAD7} z+jxAMpBrFq5XHk+U|^(q@gzI3!N(D=m-HBjAH>ApPbqklXnZ^2{7lOc!e@?qufO2} zRKJq+{$kU6S;HKAy?6o;jK+;jMU<>YqnBK)Os_zfS}CGJdldRj$&>K(yA;y^GF?HW z2-&P+<3lXr)5yviZc zDPA*2?YYPPRJxT25Xt5A@ZfCBf+A4OxPy`E2HugV+Ot^{;1-%IA2sA&7I%v-&vAuh z_radklUY}&kS8?hl6|6@zrR*NzqpVur($0AtW3wGu90hZhT?N8;ybOfTnbOJq1UD3 z&}Wt;!-vP#I{BG}PFk1Jph71GMkU4{K`4uX0Q5=|Rh(u)*jc2@O2vXmduz}hYkePv zh3^d}1#04*2$}1oRT%HhpK#4;=V&^*r=jC#YNA>}WaVY1$X&?8(Vw{8->#GcNl(;W z*5OmbDGuKYL;FJ!h)}|Az#Vt=)h*MhmNwYm6I+ka`!6~@kMA1SVJ8D%P#EMI6o{5ixfeFgt%fEh!uRB@kp zq;Lmh70fOYECsb|)Dzl!kuwhj%{|QFMNVh8p?o3#An&?&#>{g-RKttXkkKx8R=nzy z)*F|&ls#xGf4MuZy#-K3AgMP!gtOn=B`R6E=cN*Y`S*m)mm~k1yMTB(0ys}6*}pi< z%jO|!68!+1yqwF*|zjJI&Qvz6EVrKdpr^BJ*$e^+{el#SM(iTQZvGUA>G=;&r21< zUoa5`f~eGkTOwIe4?i4d`>lhiG9kF>ze`Y9!Npt2@!n(mqW_>iqo6-`^pW3wIj7@mf};v)lsRzHfSTd ziJF5Zk$vxXLOiENYG-1Y@sLsOieNYSaf>A@?w9vpL+in11er{jV}&T}e6%}X(MCO= z>0eVQx1HH%ok=R}!Fxu#B^RGA#I-@dq@s>wlA35Q}STC2m*u%-PA8OAI)l1eS3aWXeNo7#l)djhyHdLf<|YCkZGEMTVghmJRye5V{;;sdi#X-s z*@~ZfF>!M*EPf}GrP+~F_Oz#8i6>((g8t7OnxgRAmIKPjhH^$wV^ zgPR2jH`#Zul@mQ%g6$~yM66`JtJNePBRyCQQG?R}zEx`2AyIIReyqg`xj~N))H;qF zonY?C=xR^oBq-0lsJo{0VTrHouGm<^>Lz|xZMrM`NYcVKHhG0q_ zLsz@KxPOJnjDnf>e(&zN?dZ@qqf_1$mpAEUyewesE~3107Jh~;QosK}_@2eUsj)2$ z<|z0u8P4NnJ-;)T&(X<3GPK3s5sqo0)#wza9#~tjvx~fK3k~?5@FF)<8a*VeX`#A~ zc67Mmm+8Ep;f{as{lPUl=3S7W{_a8kuSmx4?~f3=bVRENa2$W*3Vyzh{=*!kE**~! zWgL0J@4%mF*S{P5@4%A39uWS`;>TYZ*uOg!%(sgw&3=C+0r zpGmL3!yt4SbDBXqyXbzI%m1G3`f@k@C+X?-vv7w)XfpHpeTPFJc9kC|BJAv)?mN)_V;9U=KP0Lh8rF7-e_ zb`$eeFI2p3QXkTOuQjDOYZ{+v;z}7$Ql$$BHno}2Ra(~``cz*TvQNkea}Ly-86}i# z_-?2ghVGMY91zt76QZ(Eo-#J$jLoCy?$R(P;haaZztYgDay2@Dex@XK6IS(szAu1W zKvP4fr?(?12Xl~R?kco|F$t?9odkcHjx&gF%z{(nJ~*y(i8w7#w1 z^TyL{V@wSyTR$b`C+AJMByD6F>>$i?NF%*pvmq$sjbQqHyZ<&F-~g_*gp0y#z$!1~pp z888tZ_XIoUXz|%(@$AUNT=8ZYkJz`zR=$-_J(?qq&taETVCiPBvl0+{n1tW8Z|>CQ zTi9ZVmJe1Xpz2)X@{RM6vGEDwS%VO{!ZeWh(upffF7$0jD(-a$6v#(<#G5@@=u(;)^eY&gTGqj){ciM2UBw z{LW@1RzFK9DMOee0!!F+0bQ#-q4<>@vFOL;7Uhn94XNBGedZeChD~(kd-?1AGq&>k z_V)9yx0!mt%6otp(9hiFKZCwyH@~Fg{TcKv!15ov>Hlf&XMp98mXO;2KP({={r`Z1 z{tfi^lRqWtj*o1`%aFWmHvj%1KOXG=G$i~mzn<*BfA04i0KZ1&`lcG`JbnAJ*hHJDZpzTBz<`l~~SxHRajdok6yY(HoEWe~q1UbX{Bb z_hZ{=Y&W)T+h$|?#Aef|v28R)V>@ZA#%9Aey|=yNKKR}DIsctAK4Y!D*PdsMz2^MR zIb|4{xKP6pxdVj6=Y-_)z#9r+YKK~Q%+Ci(i^pWFgP4(l z@4XDfS??qQawV_Moq{O=_)G$tdrT`|*1edw$>FG>zCt&9%4$;+Xt#8@@3M|M9LQu{ zSY4AcKj3Ap8&Vi!xM}vFIS`ygDbH8137k3)le6wG`MF3NXRYVwPSP=j*r}@Be|t0>02L_3Y&31AYf5erhy;e?^`kw6ePbK>W4l z|FTHnpW%r&WBWVxA9nOR(f1#r-vNq$hJHmT{t@~k-S^G5{{a&C@!MVhFI0h6_LLTM zFclKvGSqk-UV7xLb}21s+~BxW@RMG>m92=WD|zyh6W$79Gf`EVcO5DY$L0qs*0PfI z?A-R#ab03hNHB-AN*Jqw{o3@4p1X<0jZfp#{;KfACf6T|+OckYiD$D_Sd_5dg5*|e zfXuVGT%uZoGLf-NzX8fC`>T)Qe_5cHag8BOW^9n`Ew1Fg@t=Fn@0{lU0?%8<<=4Hv zJikGIh9v%FF@KxEFGvXKul{>KU$Mdb9V%FW#hGin-u}VB722vPa23*aVh&elZ0Crc zhd^qq`|N_a>O$bFQP2g#K5L+;gpGTLU@EO5yZuGqCW|B574{HiL4{!0m}}WqW>42S zP72ucBqCct&zsRzg*L!D%fDlBH^YD9DrB5}erzAr^~}2-i~NGH)sQ+s^eH{SCBa^xhdgFxvH~IpCWiuTK^t?f2ckMxJZ02EO&`%h`zv&U2LW_ z$a2DbVhd^0dDU3(Q42mszI+X{w(#>TqZ7D6G@@%6J?JWTClblMlZq-*#W=-!Q>JB+ zF<%`HSrv6`NW|ApU#ngFd1rV31wNxDW1#-e(P$qt!uC$@{X*_MpL=-g)pTFe`lCWO zn}I&`J~VJ>J50;1b{YEJ7KO=F#LJoxy3ev*!MSe3euEC`^LM`F+?;5wKTBmp9J*I()bF|y zqi1j5j*(Z~Gzi`_-Fws=868?~Ytu}@%cXpXpT_hZ6AN0Pz>Ho0SE{}XNdc36i90(x6Ov;4`}7j zE&g91eTHMMjlZD$e+gRrmW;feig}h~=nQ@j^+x6Y=TJYX`S8fUjrF^Y+utYrFVrtT z_`g$spHZ&yuU2k9jh+C=8@4`1n96cZ`Q6dpi+=JCK6&v2=CbGD;Yi9|0FfNM)3T)OC;x`332+Zd5}fQ(Myhr@S= z&k^n^dv#v|2HUgj9Pknd>Nq8qUGs8=9I4(>)Y$Clnt9xmPFBC!iHWsM7`tTv7)$QMnX5T@PM&Z^cMUZWdugLfFv^ zOfgYQ`3JN-^7iW~?76^OR^osVE(ayqjY*IiS6}><_oWYC+YVRBo(=%gB;`S+FGa(^ z(cjpUb|AD><&^{lSPE2F$jS7Fj1D0kG-sUW-7n%-s2++j!-PAT@d(Z1bmj4Bf1y#N`4_b#6u*}tO%CLow*sx~k8=c*c0ZLOrI zaBCeRZ{E^S?lM5GBjRlQ2!EQI6r){q7z@Q`258^Yu1U%4UT5YxT>OxI!4dnolvaY_ zX}e@{V)|)!)tT{XAQYJ@TG8*8)ZpUa#hmAXhKGh9n6NspjIn8uP~$h)UE+9)nEw^Kp4^HZFl z$qH!MwYO?#EP$?Z2%N~eA*xnbjx6+j6!tkoEN^tZ%`R3_RPjGrj*if%h1#h|aZNnz zOWj=+-us{y+<$nWm#~+1!|kOa&ukEv`2qx{XiIeq9et?ed#V7Oiq`Y9gD=<)RTf34a8F77qUo(!Bpxg)(;d2aK5?-`c|EQ{03%;? zj2iCc{m6MG!p5Mg1V^x97d)i`43p1WXToXqArRbk==;;u2QwZO&^|PQ8lbB{WTfx5 zqxOzbzSfdxrF+p0#nVPeka8C0A%;UBV6yG-WgP8b>-A@$IuMLpz0}!PisV`* z<#1R5CDoPjTHz_+V70(W48UnVHjECu3?bruWpSZ-|iibj#2Y$;;jX z4w<(Zd0w_|M~d8;8L}1*EKrfpk|QjWaR z6t6na=T#ywYX`}k@JB-StE49pemAdOmdX6;JyLYMz7VAveMp6B$W4P~E!v8M(n_k4P^v<}H2 zK$v;YYI~Q?Rl%6cj7nk1;w6WYYa-_+0%+zt>L?s1Bp*?y{LM&fwFp)~=S|7O6zX?( ztaO}RtP*!3QPlCF50|nEiUOoxVq3(Ym>S+sNTY2ugfZH`Rct?^UEfH{xj~ah1HN-e zEHvqu?Feh{`qjL*_>R2`D?FlvR%l!ga%}fr;y#v z;7)aQpl$0*n87>l1lr)!SO;T80lzRh`#Xfi2;~C9iA7wTtM6dc5atMA(ny01fz-L} zky{|!WhM;}Yo~$-J5!gdq6Hl+t%j&P{PG2>3H;J^X<4FLx{AjJ+-G^?=I5c5%y%^> ziQO&1^!E~tXVzm`!#kGPTjY*|L6@ZirycF3=Nx=WH+op6Z*j z5mnSf9H!xVaWRa@+L9}!LH*n$`)0G+9(E8M6~TG-pRx(rwBgRea&18px1Z zoLHR&&Bu#)-Ah8yZ(dLGV&pHy7h5tW`{Y{DKgDweG*hj53mj|d>~YC)B`vr2f@VBl z(BcPzV=Cp2=Dlv%qw=Q9rFjfFL<#iT(CY2#rZ_3E6AW82v&yVq#oYp?pUM~bwA-Y& z8$}%5p@9p0VU#N^|GqSC*pzvaz~)C399cS}KZG_@rA$07f5jS=S9CPsDy67u4h(?e z-VUp|m*!%=mqz8L>_Fz|DswrLfKq|a02ThDq2WG>h~>`DY)fz5eRD+)_(3GIT>GU8 zJ#m=TpOQIh)Ez!4-aUI_LYj(5Xm>=fJ*>u)l{_plxGV*>hm{`y(gu{4u4WgiG^Q(I zz7g#R$0d6^@Er2c=KM_IDXV32OCFPxcXV0k9`xij#Z3@Ex2E2UP6~yA>{}wQzz;a{ z3lR<|oE@WCG4cA!Q4wV0;z`w#^hLZFNTIuebWcxZe^IuO!`21nU3=$AxUUW*-O=D% zPG8BRtn3q0#!}=x5eS)&3VB-`7Jp>_H))2bj*E?XlDyO5phjH1PeJL;V%FY zeY+U<$N_QYe9vT+7Bv(ZWGfJPo3FY z8~13Bf|WpuDWNT_0!l4jxPnJl`LaB`z3Dd^0SBXe${vtG6@i|~G+#wYl1uxo3UmkK z0bkk5PyM%R>XeX(jSKVVWBI+Kh~Mog3&e5C4<%J}6)eBP)ZiDoMdz)=;h!nFUk_EF zGtN}&#u&h$)QFSl;XXDT4h#a3*E=*9mm0zn^+_;Tk)|Ic`Mo2>huse0`O3UU?-G)Y zRlu{(H#IrS7e$by21?%qjtKeGq?R~YE$Tc6%evnV%7&Q%avF)gH}XStjL_o-%u5AK zCBl|&fI{oJ7Gj&h4H6`CSprE1KyCC54*4#&g@Sc-N9g{20jwDR#1QjassESvTM+QY z@xA;c`aMe@ZDk9%hCtf!-HNZl^&=Tf1)W%`nRV)2&Am$&12$&k1yAz{`uuLNb+1Cp z26B@bbF{v7t_O>{8&jc#bOBdkWIv-a)L@APzM75(JT&Vl12LcWUW+fsT=MVvS#Alw zCviW8&gmND@ZSL|>Kc|$kNFHv85}VdKY`AgnAQrM_T0yHB6K6C^wncGc)S+Y>eN8% z+x6yiK^xOzMo$QfTNgS|gB{-dOnx+P7#5w1$BW$($golq8>uB; z94C{jl<=tCEd+NN+4gYGE2xd>I6?=zrR1@7OB4&uyW zc5%?&%ZAyD$wpPD-zNV3gz!_=b!>7$XLlKu<{6vW&M|AhfPI-i_CS<8Df)x$B#r0u zjZQvi+QnQp@=Sr&)Z?`EcA;>TC5q({$^jOsHkkrA9?Z95Zci<}WW5?+^${Q!U8!i` zGOX-%;|=&5$E(Zlk(Ei)7F0$W`PRU)){*GEV7$B3tQhVy_M0Q+ob{<&)AGI>;OIqnY}+M&q-?wMGy6 z#*Rp$$;*v#V4va=aRJT1BW8W_?X9r1MfN1-O6!bgHSu=5HIiO^J-W5d0L`$#_a9-P z^f`}t;MO${r>AnKAr4%0+>3_%?Y8H$%^1l}m+U-3^6HFVGL=ZQ zK`kaer5}+6!YqISR(y9zcl^IN3ocZ>)C^C0JoTszf!HGvZP{FMU!J(UJhv(4$Bf+A zq}7lR@#V#zIg8bo!`2(|f$|gV`n;0|-+2Q?C&l8~e4c*whrk$|kzk!)c&ICr9LmMdB}X2w(TdxYGO-t=mt!KD z2#F!*-@M4pUni1Jk)yfcAFfwnzN@FV;-G(0utylKJ(a+Li-Vo!J?(QOB_dB<9`lHC z!yvV&%b}Z)r9{ER{u*RuK^b2*_|DHZ8NK^s#Q(Hx4o&IDFzXO_w)- zT^y6h)opY{GLc*sjf=K`#ze(W{}py&T`Hz$Y8ki0NZ3khds#U0<`88mCm4RCJVw&* z0RDZH8&*-cV(j*Zz{LKTsm9PmIT&7^>0CmtqP`;2{Zvq$qtDk_2 zuOoIMq20LTK_HA@o#4`UJ3^Xn9@w(b`)oE6<6xL*5g*$raBRUod`>24)F$I@e=ie9 zE71{LDw!cv%dunG@NzCJX$iQgHru#@vjZTUeq>)}?k;u$(Md<^EAn=4{v7|lQT!fv zf3`d8vJ&x(O{#u?9P_Z8l*3s&ITTeXE)#zsmp;njp%tfLfKp|JE^MaAhsH>v3G~HE z1_48>nkL9m?xJJus6C`|$~kQ!g-`zQ05PRq*(XKFUYW|irio^Z|6Ta((kU~g1n(uu zP~_c(8d%)Ml`lrkP+WDXn*9ob2}1m`@H(5rx}Kh4X&E{UQ9QoX?b=AHN^xs^$OOTO)b9m&S?hV?wr*l4^zhu<8Pz~qn7{P%+oQ;QrBPxRqUSXdF>~-tAU{i>RxB*vwqp@?38&lc0P6b!NOUz8OoY|g3GGDC z@HaEgpo+!7=#MK{=V8KZq3Bu~qZjvj(i)`+&rAz=l}cPS4mqS}!(R-v$zT`f@-D7x zC>ex}0!yOo+OgISt%n?VcuUVDZDNY;=S;KH>9r7xi9I+5o(S&cKwVgE{N_`qQQ$*R zEXnjznTx9j)KHJwxQ4bRC6RqbL5F&awIlK}s4^8K8MkA!y2$>yL_o}~TLqZ9FlJ;^ z!_zLst};|AF*~WgS`dc-hK<@{AwO=wV@{F57OP3~)^3rX7C7pLt3~O=ru6+=*FbT0 z&2*rr5eZe^C!j>ggcM2MZ&#<^@IO{LcBb>T1~y2UhUqZ7?&oOYFU2`?L{RVcv%KuR zB)JpOfe$0jzP0n6DZFUb&~p3+ki?(XgHhL=U~pD4Oe{XSdQeQ>3D586X?88(Dfe5i zZH3Q}e%;=Sh*V8DAy&R0NkrIcJb3A~&?QoL5+~hMblrMX0bEALd1LUi1Rxk3D}RyN z#{jkPS@49z!idcB4fls<>$tml4_anBARA5vJ1GKo*crIz-aDEtz%jH)f{agaTiTkNr6_*FLWI@J54 zDy43x&uNr;G3gh)qwO?-7ksDD`@Xa`0JFevu>gU!(`3CMz+t)hsj4e>yaQ0QTEzHA zOS^Z)ah^;_DO>4GZ|;(IDOuR4vl7b2IrM(M1KPge1zlwdZ+88?8N-c@+#-gYLEuPg zal+%rE2ibd6_X+ly?wt{O=&^MUnbl*V#6k|2)1ibrUm)X?|g=*NXTgWo#?K+>S70D#HnGmr%;JFOVbJZ zUcR;LJlf@BE4Fa9Ya{gjdwmiz%VO)w{k`{FkyyG%3v0s{q%c+SgM_2Bq@`n*0dff) zE#N4=`d7mC(i93~Abg^IL^or8Eu^(ymfas?-FqH(PaFEtYS7FPTk4z3HbPs^aym_t z`y0Hlu|4=`Q?bWEs7*aB0=)Vw3BorxZlg4?b-nA?rYS-ePb15=2tjY&MO3TtB{qB< z35(G$eC$-Tv^e(R1}|3vO)rg*_X!Q^2Q%>ZOThV2$`4^E`_$BGC?Ma>*~dl@upvsA z>`7Go!}7&9fa=0IwHG%5)ry|m3MUrp6!8?lk|SFh6e%1!AV7g!vE!EfT3}l%*V{Jx zNBX`zd&1*4_S$LK$Uv~PuT=8=qe&?tNMjcsrOBcyC&O?}T!^fy5o#S&cdT8&2(x=+ z!+UBZ-H+1k1EIZ9Onew~Sa!?IwvLRUewR0k^46fHwFtI&B47nZH1=0c>VqZ?>^@nd zl+vR4Cy_qcfyNnGBw1bZ51}@+-)Q8`_g_%@fGz6MtsrA`cr5w6X6UShg9AO`ci^;j zUA*|4gt3OdVqton?2FpU=?ABIV|II9T#tlodAX4$i6FlgJlV+a?9gz@>(~?3%c4X`rc9R#p zy4ezeYOP_BY2hTa8?3KNo`Kx+Kq~6klB=tM*!>(MMO(3Qr|T_p?Ty1eE=%rRmjbNjCWNS|PhS%l@uhk2%uUX-C6%GyEhP zh>__)0z}$Af~i1kvBp_ZTCmULv%B$T_VTUdu}$mdr30-~NL%)E>*@1H0vfElYos<` zckn~N+6>yoiCST!`DtMx#engln`z|?9AvstAut| zrj?l@wDT>)Y+7I4V3x%?g-nL;X&KcmZ>b0N4*KSHyi<;B)ju_@c8?u}dqOBp#+?1f zt#lX=p*CX_xPuT{stLjR4)_O1AmYkUnut?R)9ZK;9bIIq&6#~W+8(b-XL*45r(pFp zu>0NM07jV!%d!u*+e#MTD^@|Sa`y3M7ziz2@tTfg!cLPQNJ5#39|LG$ov z$+X~N4MA@*Ip<@H%+H`8#}RW7W|~exTOFtgUr|j0M2N3Tmj!^#l6E0p;XpZp=?JUR za=tF2@NTdXwq@{?5-3M`Q6CR*Q}HIr!3U#wQGdq0;PwtyV3QFfcV@%h5GL~uwo37` zs?1bHED0>UrBz;6tn0gzg~hDEQrHnn5!3FGBhhPz<}C<*RWWQ5Nb!c|tQmV+?@Yz` z?A+}_7H7w8yib;_6j~YnEL&n@3c#eeA5zrm3V45d49Pc%DHI)#JI2=fi3;wrODMO! znZustJK;cJ)J@F>sSsx`B_?9jWCDT$zT1Z<;qkm>KF8jPM)&>&4vaT%4_V(=0~Z%h ztb=VQ2S(%}UzXMu9ltzH2OH||pVHzNnzc~Wl?A~k#SgC$^c-FO#=m2vMS zub8*^WPosfKvuS-&q*KK`Z;0+W40zpHiu^8)k)*`C1!qNQJDr@4xr5`HXbfclU`9c z;SV340P9bRE@QsSgCn*X3xR7g20q1B>v+9$Btf@i zPl15U>h1W0Lkoh^1a08`nt%)6VIT=kBtX;1s5q~%3@0=wx9Cbx zZcnI)ciaDA##yd(oUDz2!2nMsp{8x`NQI3*`Es1?v7*vNL21HUU-~7EDk7F>APZ@T z)Oruchg;2`4T9*$kI6hHk8}2~BR0~!sU!yeYESkvnF{1De+`AX{5u<<>Jdb6TuSin9eooe z18ooFBLy=u&Dy8@C@6>0_4PG01_Kj7CO)Kg*LmJs;=r#&jz0xIfBI@*OdPd4lt77Y z=Yakqi~cPW;ZG9UL=Vpy;&_3R@Gr3N-*OTD1ffhsEd5v0_DKK6{jQ<)cQ?_0<(mJL zas2o|t4YP982bX|Sdt4Oset(1IfGx3MMd)3Fjt#pNP6?zi~%AE7_Qx4)k0|GAjIYn%M@NWa9l{|NmS-~Kc7OMLr(L+_MZt$}|U q9uN>|Yiu0=s43zO0DKVu!ha3`ZH=!BU;=82{NtB2kMjUS|EY+k7V literal 0 HcmV?d00001 diff --git a/assets/blog/first-release/run.webm b/assets/blog/first-release/run.webm new file mode 100644 index 0000000000000000000000000000000000000000..37bddb00e8f737e9e55fcaa811776e8e6845239d GIT binary patch literal 107719 zcmd3MQ?MvHv*xmGTYK5IZQHhO+qP|cFWa_ld(HXpJ#%a3VcsW|q`K4nrBSI$DhZaz zZV@2Be-(Ve&;UTe*MHhW0EpmY0EA#*u$zgYjbK;+kYGpv5QdV!*?*}57RMvXWI6M5 z%XCF4RRyC;RG2DN2OP_EMgPO0Dc4#lRR;nR|2K=IJZSbG)=s7?<{v4JQrADyAi!d$ ztADL#{L20G);d0J8%Ch+49PTx^X)Lsa!ti?GlFdO@q!V)P86Ok2?6Bbbv4*S1d`yU+d|KLE3 z{_*91uw?%yHshZ#js6Lff&M>@p1|6|(AD0Z#?_wVf9B!*f6PN9QWP$%q9~v&Atx&w zmP}92`Jc*4OaH$M006#FtIL0R3~23o8URp4P&F9<0N@`e5hMs8U{A&h!cKyNVTu9V z?zjBG`@73^_I<@`=lAZ1|GxVfH~7|fz>EK(2mJ*f@&3bh^6B*>w())XyZW2^<#*(3 zH~Zc9i2w9E{mb%8bJsWgrRSt~r}wCL_q+SfchF0I@TRx9*E|24^6Pb__wv2RGj+!o zca8tpH}UCp?-wtuxB2P!JbJG?y5vW=%;T1omgVGZ*u%2$11|ED{0x8jq4ef=%1M_L zxA?_0K8mgO@ z>3H$AqE*5sKJWJt+Tw=0-hYmqxweE*l{2i7l9 ziO;e838HKRQP@|=sVq4ozg+nEP+tE5U|CP{!Axzdet6F@_+=~~N;RzjO~;=-=m%Vf zNgBeg?kjBtAk%W+aGKlY#;`3*@^Agr;f+`)XUz_cNAO4(SRk_Y6FhT>hVZ;q?}rf; z(~|53+pv7d=I)!}|%HpQ@-yTCL_|dn!VU`UNOdX5i zlxp-1Vno#uAe-}#fb0mNAEtb>BwUSiajlSDm|`J7s@vlp zW#5>}gAY!a&Ft4nRqwBxB}Wc6>W)r&_4kwbZF%~g7Ym?A<8E}^jzcO;QZ(CIxO&_o zDMYKyGGWbx+Xxz=@DUc3mg5Gv3yzap#nAabj`1MNF6hceER0UOJ;E4c#~jMIP?C=N zN0zo@1jA%Fj}{_4^3QCvX2}RK#4^c=*4|%bdd=`KW9F#OaQTSXo&{eIUc| z_?uY7p%y&AIP}dCf6>Xh8)GJpx)6DladnRrp!z@tqFpDQ~^@cw9!Uu^QBF^|+%| z#ID@>9Qlo_^<+kRL@I)qy$X!Yr1^h(H@O3IVmV#iKmliWIgyqxsl0VkcFYVBB36!y z$5@h&)H!W{Ryj;{HLR1}7dR@Y?qn$4+z}P_EjR$doH4};On*CK(%TQZTG!o+w$yY` zOF_aku`9aGK7NiV)K>^|F;ri}p;5@Wx^BsSeu_ zMca9%<%+<#pCHE?Mf?0vJOK12127}xzZ4t$y?Q;8?5)vb6*62GH+vL>w!7Jk&&p9C zabJ}_M4nSiYICBq8!xF25EyLj4s?OjU*Wl}Fe)Sgz)QswrL^AHF;uk4eMi1GlQ?;t$*T^AY9Qb8Kg6l|oM!C6r|nt2&wEjsXu~dVKBEk_ti)R+OZ8nG6_c*qPMu-; zUb9>qMChExW$z5ZG{Boe_sq@>`lMBYRda-d`b1%Usb8@(PKL_3;8$@@>$+LH z*0Y*g0JSljxn{5^e2Q5xS@MI1G|M8+t^Rca$Bgg(5JWhwIKLRspyaqU7>L%u1k}E( zjZTj0CR{2F9C1w5s=#h=ust!trA5A`cPf_x@EJ{y&Ja@aZ*|S;{U7qb-GH?t&j8h8 zBDcDr=p%>RrnOU>o%tSlN5)SX5zxGtYi2(X3$MH{xK_vLlJOBKwr44Q;Sa5Oaq*~h zWyG?U1vcx)bvZ2Yf?A+I<%oSm zx7vqUpzcldXetkP_}FfhyM4?)cB5|ASDS<284yZle^3{gHVofpzmDCu-lesRKvb-w zVez{10EapfXg3+`ASi*$vv^=sS8>9+Ktt2`u47laJn9!|GS*2#J!{*|xm%&oK;542 zCKLve%!5e08~$FduDVdr(I_!`pr&(Er4${04dPL`ZP!BXOY3Q&;);gjIAsixl{W>~ z!(l5}1un%Y)1<#e8>wjNY9X8hBSX4b)(xQV5{e;4 zGgU)i(Z=Br`h~T9cECF3VnV02%=7DLwrbf?t)h z&aXGp1ysEn)6s*SFfB66Sk zM~wMQPr|CdE$!1_kR)@<*WhvzSa0}W3}Nc!!aUWEy0mZ|>T4oFuk1S|0Y9I39kau; zEfMx%GvwGEQ>+oAbYbW4gB1G8jie#)MpKp8;Satw>qJcy8!a~aW_c_X53AcQ9TyM^Wb#6@Y#- zPpdYJ@C<&`I8NqO(`B1;ET)ChCRSP9cV`6*3i8UW4nL=;Rc1ii=4aeAQUO(GBv4Om z-@oY(4p(fZ?9RrN-``rS&s97Q9<$AGTshd?+3~?WI({gQI!}HHLnSia)xA%JMXhAq zgJS`8KO@`qp4xvR7%AyI`48f{vsTHLc35Vus^A^=iX4X#}bog1^AdHbrnuhD$(L?73^!ra@><_Iwn+dJO~kSeu!` zp%>$=KeYgQTfEQ<=tm9xwZ{XagUbhP-E>8`H07L`o3PDu7wX_cerjYJZ3^3kA0PnM zS#ItdS6Lwx5rr$k;8jI#Ow+9=F9qn$3aU?YtveS+{RN^OsK~gD)?(x}!-s#rC_?Oz zv~5jEvxwe(9K$Qkudr+k0Np zagRzPyQayF10263!%UzgfGFoWDF^Zj#}dJmGc-J~AD$McAJOcwmB0^|dilCzjHZk5 zEYSVwvwI%qGzD2bRQ>vZ*kbhP~)uJhntWPWeEh`F9!E%P;263_ZG3FN38mj6kW-cZgRB z4K1FaGL?lYoLu_V@F3~j;Q3+>_#7@ry%{|2BDe_|7BCWjU?R#b!$!8ioVGxD`%%WN z^fb!VZNs0Z{*R?&9_lI-B9Vz{m}_#S10J%HRGusZI(Q$B2h7CL{+RV1Xk6D{3kN7A zJ-jU6NZj8n3cI8f$xymrZBR_i*6Z+6?D`_9Ktugt8voJBLV9dNgj!KbC?ob91GL5( zqX>s56^_gYTtmBg#COU=IH}o@K=()5j@v&HK#91tm^G}TvY0j92|Jvh`Z4JPS$_Gd z8R$9NE8*D8rYbS&Y4vE1U;{tK-kM)8)fM2j#m>>?WAeVo@2^)%VQ?jTofnHc2XpYw z-$UPbnEg_tV?{L^=oR~&p=3RYE6|9XQ};mEdD?uUb(WCZ;-e0(n{FjNwoDtdRSx&4 zK~pnpkvqAQkjEu;uR0p;=)m5tIZBzj<)-Er%vCCy{J&&nEh5rdPlYrOP9tk3Ia7x; z89|Xe4mg1Z0vD|U`FTo`ktldilmMp0K~l@Yuo8_>FgkcV;umk2WV54Vf7$lrWP2}M4X(GI51esV}yAIKvhWbiu zcXemA14{?s&KUXp_Cb@Bl8LW;Oe%!N*@`GN2}Iee;FzeD&J%3t9RS}V5&PVj6=q>X z-wQyZ981>Rs=JKyNdr{ki3f^~Ctk|?LH^K+?odGjXCd8#^SHTRB}xGT-m-37L;B^| z@lU+)Gi&>2zd@Jl=s;Z9z07U#Q%6O9PAiu$cn`Npe;8mujh>DyhIo6Qf1|JRB4k!- zyAQ}cdOCzmrkpf0Zo|U3RM?i8C9y8af(nop3a~Q<)X_FSw&G3JokVM-di3i5yOdyi zx*^{ecMp2pJ@7k0K)15+jc9%sOnzTY9{jxdlHfq@>0YH_GIvQs&vdy3PlCNKfxgzG z9#!z1F@P-Cwi1E!@JrJ^E2-y_*S(uT(nRhQQLSD6o7_K$Zc#fH)sQg)wYWyAZyN|W z?Y-62t>pYq_0nYc&jNlEc1Q(SxOl{FRA*1P@+4t-izjdkgS z+lh{(TcjpFnQLgrLX2jj#SN^gxrjI6pVbG{Lp`bMB;lveb}S8S;sX#@C zqsoxFgX!pVOoEHg^sJ2gW(TgsuBgo{g`pv^@@=OC(nohlqLY5{iWGpdC&N097vj0^ zc8eFN+Un`n?$4vtm6qCYWwc-NrHsW3j+ZQ2ahUWslON|JP+$V&SpVRU4C>JUSK#<| ztI7%`tWDM%?VXQkP@9PHul^wb%)DjpoUdb4oLgNYrNV4wy``pk5=OIP$Rs$^hEwkm z`&=c9iOd{bjNq)Z58}A2a?~cS1n}tr`vYz7hR`Avb130t%IXgIr0%p zQ-duS)wlvb#EigM622|ceDxq??4MfPgK)0mq3=gdvEK$toq$Yj5hwjbi$#xOG7$5Dbar0H3l)*4`l} zS8WI$922M8yXdDI{k-D^R$%hh2%Qy!LMK)B*+Ld~Hv2qI3Wg8Ex;C4x${6{B^ZBxs zS3T(Ap3-Ft2I>Rt;=YF9U>Q>AK`F3(9ji*eE~VFfwsp>aF16>M&?Pn@!-3pPU4m|r znZ!j>p&TsiPmTa7UBG_q!ArFE!+J<7pCHWb`gG+gA6iUSGSH0rE%q1bh4}L>Z>7(i z^oLyy{S$GWM)G?(0s0LW;jz0#x6Ka4CYt`2W5iklYU7krdGhbEoz)uMiOPMjx5^)= zq2E7776pSG9;1M*>sC$(e)+>}XzsR1VXzC~V9#$ZXqO#v3UDXqEGWKPZGC@37vAqW zTSdSmuz;?PX|QwsH_{IsL2zjntKR}+1g zprhU|L|=yj`5) zoA7}?wduv0s~?n<$b_wQEjymlA|oQK1=8f*_IlDuDG$uKN?jn~3hq>LsOu^T&#GT5 zY>{6s@`v&Ta@^#p!U+JW2Jd`2#+NL&8qOCmaoIEQSPj`}l*GN#ppCFxn|pQ#j4II_ zJ_6ffo2=Q!*>P(z@cP;CSrC_NW+vsU<#xKyNPWNoDLu7uM2jD(FcX37P#f}xAfI_J z5so8^Vo{wiL#i)LtCT@r5U}y0I4|c71UXB2jjPWKBWF>5DbR7q)ODTsymcVO&jOJq zUU$x!&5$l;e7amz-D@BO3@ z@~fUC==)r<1w-=zX3_v$n>HBwYtx~tlEtR+5oM^WeJ9u2xauleUJ()m6h8>yGOoY+ z207#nf0~;Ff}_IRtyYYsZVA^-c+cwrnV}2AKy7>+qwk zE8cM=6hd%9HDbl+pto8_eS9G}3Fm>uA3wKO(&)baActJg2QJ}t*gMQOV(_(sd)5og z;C2(mA1p4(u`w~k6FlJy?Nvw`giaG0!?@s9P0WcL#XCUBO%_CxBK@WpU2iF9xAa;}<%_BpQQW_puw& z@%%U>Z-*u9fjq35Gp%MfjVsJ0I#HUcnAaDmGEJ-wD$V8{v_J^+n~jd}hn=~;0RspV zKiW+o(`VBM(Ebo6E4CrBnLy+MyRCTgI44NK+8VR!)Ej`q&Q1Q*c3U+ZtauIHkvq

OS`lPf4aQzYO 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

AjLsGluWKj_%9>tWOD;o!jJ!uNBY>|KJ7Ry;_5 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�pcR)YSpI@_a!g9kUa1)%sX-GD7PN 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 literal 0 HcmV?d00001 diff --git a/assets/blog/how-to-make-a-light-bulb/bulb1.png b/assets/blog/how-to-make-a-light-bulb/bulb1.png new file mode 100644 index 0000000000000000000000000000000000000000..4d415597e98fa665dbe0e65dcad1962407ceded8 GIT binary patch literal 33010 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 literal 0 HcmV?d00001 diff --git a/assets/blog/how-to-make-a-light-bulb/bulb2.png b/assets/blog/how-to-make-a-light-bulb/bulb2.png new file mode 100644 index 0000000000000000000000000000000000000000..170f3ff293c1fe6154f3fd808879bc9a9974ac1a GIT binary patch literal 41494 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 Sf`$Qr`l%>rysDA24E+z=mFiUh literal 0 HcmV?d00001 diff --git a/assets/blog/how-to-make-a-light-bulb/emacs-helm.png b/assets/blog/how-to-make-a-light-bulb/emacs-helm.png new file mode 100644 index 0000000000000000000000000000000000000000..f70dddd3fad2f90b76896ee84ceea0fac05228f2 GIT binary patch literal 65574 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 + + + + + #ffc40d + + + diff --git a/assets/fav/android-chrome-192x192.png b/assets/fav/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c5f532144b77683e39fd27719a283cb3dd63bf GIT binary patch literal 2156 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 literal 0 HcmV?d00001 diff --git a/assets/fav/favicon-16x16.png b/assets/fav/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe7937edda1f33ed710874e8a145f779276836a GIT binary patch literal 694 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>s&BGv~}ZdhEoXKYwZ( znjb%Yl8~D5_wQe0OFL&z-+c!Ttz5ls*@{*F|NlQ@W@rj@kaS6qUoeB_@%)P_I}Z2o zrZT4qJ~%J=!=2q@#mcPb8FwxB#w-IWV@&dPchOhAq96$5a29w(7Bes~%?4q{*;#3u zfP(BLp1!W^PZ;?HHm^mXdBGBc=4NHqa)*TWOJ1Q## zqkjBgm0)3Mz2GBs%plrDgy+Zurbm|&6dH9Dl(pNH6xJ_T(W0cVe9fXRr3K5@EnL~E zvtaGw)ys7oZ;N?y8cbkfIQ@y^q{k6SQ1qylxJHzuB$lLFB^RXvDF!10BLiInLtR7D z5JNL7V*@J#6Kw-SD+7abRj-v%H00)|WTsW(*05hacs@{rB*=!~{Irtt#G+J&^73-M z%)IR4hddb|v%EI20MVN&ZTpCOcr!XsT4pBIL!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+081EWZQPlzi}0X>1Ds-cpW zj)I1^vX;K8wt&QOCI=Idp=ic$aMbl^N zU2E|tDQqHkN%4E0?Rc=`>62`Y>p-21N#5=*77N&yUITJC3p^r=85meiL734)V7&uS zkiEpy*OmPVBfo$g>m2??pMXNAJY5_^EKVmUNXRry?ChM`I<;4DIa3**t)HH)ZQdQX z4=+A``uLjjL9l|x5gnZ-|3;0v@J}x~9VH$KO$xeEqqyw&Q5D{#lP_MLO#0j^BXFWQ zf~%{_>xXV|*g}(lMu$*d$rZ_37cRK7&6>frg=a#e*;x?@DaqM09t9?(nQGyP$M)LE-if2i6|AeCYIT_W4Zl-1h$&xIa70;p%Ce$HBFY z2XThSa#p7fW-$u^eWhCB8c~vxSdwa$T$Bo=7>o>z z40H_)bq!5J49%>J4Xg}IwG9ld3=A@OA52Hlkei>9nO2EggJeL2Hc*2k$cEtjw370~ zqEv?R@^Zb*yzJuS#DY}4{G#;P?`))iio&ZxB1(c1%M}WW^3yVNQWZ)n3sMy_3rdn1 z7%JvG{=~yk7^b0d%K!8k&!<5Q%*xz)$=t%q!rqfbn1vNw8cYtSFe`5kQ8<0$%84Uq kj>sHgKi%N5z)O$emAGKZCnwXXKr0wLUHx3vIVCg!0A=7fH2?qr literal 0 HcmV?d00001 diff --git a/assets/fav/favicon.ico b/assets/fav/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c80c07c5ecc6982df69edc138a1bfbc8c904934b GIT binary patch literal 15086 zcmeHO3v3is6dlB1;wPdpF=!0Sr=_wj{UD{L*a8(OP^x?@5uqVas|W-eKtX6z1jP_B zCSVGPCMp#CBu3Gq2&hps0n0}OOn_nwRRam6e73UXdd_s;WV&qk)9!Q!GB-JU=Y8*a zckj-;dGD>Jb<#R(DJdGXORJ32v~*3=TrOX_tEQbmURP+A7vHLBD^MW;bL5@67ZRi6+>m!#_L^IR3vr_MG?$FLqcfRQybMVwB8& zZl)B^m?lF8r5nHV$1>8Sa7uw>J=)*MQ}+Nn_AG6I zh+|W{m5w$4K?74|fAu~y^%mEcE?qRzTQ+}aJO1>&S+;%gxl9_DC-djcmcLHbn2Th} zQ{!#Nzi9e1EjXHEgkw;0<;s=oxHE=g9Y4c|WD2<{*}Zdzj2f1$bDcA*NM+0A%a?4) zpFUi+4&@kDd8*47_K4yZvi9dE&V4Yhy6J3%m1I_d}(J4bGIM zix(Qh;C)DynRTq=UvVj(StteL#uyw2XAaQ64>f=@r|XO|)rQ&*{P_%Eyi+b*I4^u& zQJZCJ3^@POpzWZ9NKH>^t()bukGIIX>)w%< z7rYp7-lJm34)LS7v_(7oqc?wc{2#tA+ftLU+7=%NYvaU!_}|2hzJ3+{NS&IF2eez@ zgJj^L82REY*gf6~3PNzY6Xm}G0(gN1Ku60a7^M9`m>Gi1T)%ezA$@O%HqkE5L5F34 znLpD-0Jj!`$r2Qr+wuCrU=1uPOZ4NxbU5NdrL%w z;?JMkRyUIP^XEN@LVr&5p$ju?D*pU=AISjj090)EwJCSfGV{NNbQ5q9CK|E zDD7%aOQTOy1+lLeo67kzN4LZqvdshWpk8G`s zd>#Ak_dp>3bI<|>$Z08_(sN#$rYY4p>RK5og*LztL%Tj>pR`v54(2?_iU$5o~WlA z8yk(WTWP;we7>BjIjP(9csz3M+}RGb&#`g;m*=Y%WB>8}jq43A>btjc{OtSf)vIJ- z$y}NH!n0EK)t9<`o@3|;`*|aVUblD5^B+qVE$9&Y9OIagIr7r{c{qo%Ov+0a%fzvH zEo@uuf3u%kySD20*P1>5{F}#quN?!^k|a{3xZ}>W|LLP?sc}8B68rX?9x2=ju4&P* zAEQ3H!0vrfwq1z+{P#yP1K8l2O&x$4r#2%%d0VrFqTwEZ{r&?~01pHHl7|e|A-4G! zwliJg>z6!Q6R!7E0X4wmKr}_!-y6+NBj`)n=N?x)kP5sG+zxbvDEnNSJq)}F@O$RE zt<_Qp17`u+TLUl#Rh;GH+G=6^Gv*2Uo$HIA0^0$WIpTOAsvZz2!x~L{p-*r1kMmxU z^WIWvgyzyk<1P_THu8W5z+bpd!DR^-V60PcCoDoqPK+xakeXN@2>p}#@R=4=Qrz*+ z`_Io*ntcXsj6&6(^IpDp@vP(4%1!z_IFk0u%3hJW+FIe+TfQ&y{~?jI=lk`>4Hfds z&p(OR>(%Gnk+kRgBG0>5@7pVX9R5Ax_Vn5K{E;$!>SW_xKN9=O=Vl#F`+n|TxsN2f zD+3`dsn3=W-`{N^%2hGvA~irY&<&ta^Z$Y)mlQBpSp`|n>acQSgBUM^yOWj3XPv+q~oQLytUe9l>{rmRbYkzC6wZFA@1{UL{ zt+8JN003>YI}#^H#^0u{B>zQ)x|woNzJl;V06=q&<`zLk9z!m>>uYPW=-7mfjg7x1 zB#%2fYwGID{!#h)^K2XMpYSstBcm_fF}PQ+$I{ZXwzjrByz!OQ>=y&V*7nDo-~Z_C z>+j%q`pjWa$rDa4%gf6W$=j|c zJ;^C)p18B~^9%Kj&AA2lolzcGzrYEJWVx1MR2;?^0PRuK3w!uZCgmqU6;_ZMSsQetk>S0P zCN-swY{!UjgC&o=qJh@i=JVU?2-B&rKOOAaM3+Y;pEGkPIVMO?Gw~w2S#c|k{Z~IZ zy=+F^O(~7b3?aZ~hbTK$w2E3t{MwiE;A^ZlO+MUjTi#XS(vNOPdKPCFDG$`BXfKr7 zw1N)EL_@2o^D+P^#i5Z1e4Kbr{MBEZV5qjxT-_ep?53A-=x}1o>}GMYB*?x$$~Tl( zlV6jcU(c|=TB&|;Q#a6M&FPKgZ3Acg3zgac6CM@H?!)Gz%c3WQMYhWwwlXag0cxnF zn%Wf%-HoZmlYG5=>n>D;Sc2Ky7Isk^lFGQ1?`7=QGyJ@m9l)oD=ih2yJz229N{oZ} z_Ov2gF$l4`K5@A45xINS{XsXqG6rv3<|Z~WB!^ui%fbels<`aS>vO3O5K6B*xwAX2DnjI5~6?;O)W zA`zi@a54r-JJV`gKiHs5J8XK2H({;_uV~9rv5Gj;Wqz@$z7XA8BVm(Oik~f&P5-id zjGy>f)O(&8Z`63z(eY=+MuDb@UGAUu-Sn3rXy)Ud;acHX-1ypNtjt*N-0 zBF+l2C74GXJiqtKM3QOz4`nKv29|3JKPe9IgXOdRFi&K6v9}L)`W|mre4LA)mqz}Qe!eVwS`Stz%d)~CN^bE0K)8aW;Oqd%l zFF+Jw2rBLUPKCo#hA=S0`>?wEAPG78-1{I+5=VT+6i083lYRyhf<}iCB)dJ@`GX- z+vJQjXYw@I80mb|r`I=c5ywmF)IEUgyzyiP+2N-rVar-&ED7m((t6)l-sH%Y)qCZE zC5?v33JMmlx*NZbuX;2bsUjH}tAbiep9wF*naScc2aeYW^AsEindg@;!ePz z=r7swwfvrn3ZN1RRFcExD3Tli8>kJ`5^8N}ZI8D;?qCabu!bImT020YYvsa*{~(Yf ziJ>9!|DABBJ62at@K3-8P;rD<2qh{qBs81^p~h24kWdO$egfi3rk1qSubnkFf9@^6 zSMPCvlBuTEWlgXt_{U%Ml)w-q&F%?N$&`bK2wso&J$>=i=&723=Far60zMh+p)R@D Q7sy)xXcPw7;1W##7n@QvYybcN literal 0 HcmV?d00001 diff --git a/assets/fav/mstile-310x150.png b/assets/fav/mstile-310x150.png new file mode 100644 index 0000000000000000000000000000000000000000..a53aa63934a598397569d9f3900aaf22de429ccc GIT binary patch literal 6108 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 literal 0 HcmV?d00001 diff --git a/assets/fav/mstile-310x310.png b/assets/fav/mstile-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..72159e87f1706bb1d3f0cf5eac25490362590186 GIT binary patch literal 5590 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 literal 0 HcmV?d00001 diff --git a/assets/fav/mstile-70x70.png b/assets/fav/mstile-70x70.png new file mode 100644 index 0000000000000000000000000000000000000000..793442936db3b3658dc3a6369d93bf0d471f969b GIT binary patch literal 1664 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&v7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xB0oAoIF#H0kf5E^|YQVtoDuIE)Y6b&?c)^@qfi?^bOjZFtA+A6LBNHg7=qjq} z$g67uy|19At!HAXXJVzMV`yMzt*&e2;TKd@*SKiu^20}u-M|0f@sp?b?%&_BYfn%A zBv&tg58uEg%U3>r{N(@t|9}4c*|>SDy{nhAr|;jtf1kg2>FF1I;^gU@w{9C**fun` z)i$=+IeUEj_Wjc3D+`w_D=MoDjf%5za(D6a%PA;1f8o-hBS%fF>`kp5Zrr@}_T9VQ z36smJYRzq(>Y7@Yu2^;S*om{}&R@HJBe$^h-@ktrcFueD?Kd>H`Sj`YuV23wFIy3l zm}+ckS6W$f6 z@gKXPxOrP#!W7GnLyL-P{v2E$@I542FPvxk^DhD_X~EMhl(pHyZoOyC*~ldRBT~?4 zUH$R+kDfulr#2_wIN9LJ-5 z_xyqBxX#nXF{I+w+nMS4mjguF&gxun$XIyBfIGEWGF5+b`pvW@YYe#9qNJF%^h}8j z^O(7mRmx1aI{%;aw)J<_`X=Zo&Tl^QyXM1Q^XG?upZI2bJxGNUXb~6`cy4~C8?`NK zuA}75WosAAwLAZ1YdEjf4^CFARZTjcr{1NUwGO_=80~QOWBJDAv5_phO1GzH@q0DS zYjn^z-dY~E*g@WlaqhmfEc?fo?62?OOAx#uIYXV-=-9y+CTA5zgDIW~GgMgGgrDDL zQg(awIdGFsf0~el^W4`W5~pbjSxyTHIz)E()3Ws~Q;o$2tnFh{5$J2*x8>g7I5}=X#`V0lown8A1Gz<}XK23BUs}iVFof}~ zLrcVi1db<{Pq}`}DQ3c$tG|i|>LUo953? zm|Vs6;<)1bjyl;eg`ax7@^(Ymf>*1Gr7v;Cc)xPKep-TMjakX#XKNq5dXUT3C}nIE zm#8Pfl6CZVxbPF99m-1YyRO=9T%{z^(RE^1%SMg8`eFPWtV;ZAqd%Om@Yk3uJ zKZUMkzdWMN$tpEZ-F?5nVeeCZKeSfzA78Y-_aX1w$Pe4jb=7~j6ZEOMU@vGdB=5F$ zzFj@%_4>bRW%s|!+e@G5e{9dh$l(ACiVr>uE~xI`Bb4y(I14C&JXrsO_xzm0{w6NB zGl5*y64!{5l*E!$tK_0oAjM#0U}T_cV5nWo%$&V4-bbXk}o)d8;uTMMG|W zN@iLmZVeUfmal;t!mC0eN`ey06$*;-(=u~X6-p`#QWY`_N|G5ED&{=?#KTb-rlE1l z|MVHpr$G$N%G`R%+``Jj-jhX`g%w;HOb(|oD{l@_IDO;Fi6du@$Q)rm-QcmnOON4| XxM0aAC)24wD;PXo{an^LB{Ts5Fpp=u literal 0 HcmV?d00001 diff --git a/assets/fav/ra.svg b/assets/fav/ra.svg new file mode 100644 index 00000000..12282d2a --- /dev/null +++ b/assets/fav/ra.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + diff --git a/assets/fav/safari-pinned-tab.svg b/assets/fav/safari-pinned-tab.svg new file mode 100644 index 00000000..0be70508 --- /dev/null +++ b/assets/fav/safari-pinned-tab.svg @@ -0,0 +1,25 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + + + diff --git a/assets/ferrous-logo.png b/assets/ferrous-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ba696ba6f5bbb65d15ffcdde4303b36244753d12 GIT binary patch literal 4614 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 icon \ No newline at end of file diff --git a/assets/mstile-150x150.png b/assets/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..fbcedaa43cbe153d0cad4414c35b45bf6bda60a7 GIT binary patch literal 2164 zcmeHI_fyl^9{nQvkOg%S_qmH%UY3jy#b6=?2qYjig%T1%F~BNae6Yk21VWKVU3!UB zK|!i3WfVaONLT4d5UCniAQWk#mq1?pWq01p+j;-MJ2Q7a_jBf)`OLj%?%Ws)bL^>a zT0f0Puwaz~U_c(8>gW^Ryf`2@L?pURan?j6{O}k)UubBmW4v0Kp<#tZNKSq8)rt^-Q7JrJXA+tA08QPX?vrJ(n(3nNXyJ7 z5GhATN88&wSX0vb0nYUF%)8F6$`>ymKPh~aUpO`~5gnT_GCG!>o9A}t7i~Rbdq-F9 zcWzzWE;D@f}*M4r`6GVCBK#3@upi*f2J|~UpKWN zG|+|wbKczC!NI}Hn%edC4Nn^5GnZ>^cavmo=j8s+x%q|P$|@Y3+_ZEJpA?pulC2}6 zWBcE8%q?xgqhkDn?rZ88T)v7_QPV_I&mI%y;lv=DTLQA!o32C+sRvmeExV0pwMXTQ$&dN{&o>Kl@eShoEkhw2-4V&~R1Ez-)?>guB|y#3oRZpb_HA9N3F zHkERfc`K{?q4<+AZI2vI50!N1OAZe{)q`Je)?}dyMAO8aOt6N5L{7Cp)JQP!W=0Y- zVrRaUmkNB9v;_d-D|kaaivQU1#NIex_3qd! zoX#StzD>_h=%h+_C3|^Fj%HjTMWikZX{)&#m>uci@Ppd^xwYV?kWAEE&)(EVuRM{=Z`ls=R49rC=2IU531Y;RK5iBakvO+1Dpvtf)+NG1nl%=%h#8dS8HG zkW&@ITeE`4$ELNGq!nRh`$%s}sjwhkpfOWz3N)19?tlzJ7JlWc7%;!YF-`%#l$E@e z^ZKZL?h`V|S7agMPT-`2%XeDi@>jQt=2H7)Hp$^p#zFI?DVz549Rs!aNqs05w(uOC z4B@*P%$6!)(k19>$Q)2_;k(p+KH<&#NFMAM0he^~@wC+fsiC=3hD&CiyGo-sC}Lui zG*Mk9#NQ=nppzj!FA28~nHLruF{}cw`bo^PHZJK)0_g6x*^k=z{x6XrtDN4>3%NxS z>HVZ?y1x?Fh^ismmqd-q) zPY(ZM>wgl}!Oue(Cmhjwu>UA2jNeMSAnZI|?qe!oa9p~*x<2%8_99?IY=g1g1vU?^ z`$}O~!C@HmLkitimC>7mQY9zes6zHS_DLSqWFE{ml-NOcz z);@zlP~8_xg%y*np665NyA`50#zt$eH%5-aTBzPow?L+|HcNqYCod_L`_kn#Ak^IiBr8 zna-STMOFw}yJ1z6A02`+XMcv8VSL%mI#-lz>Os68zEtq$cNXEQ!iLvj!sOuOe8V-I_+!O3WWA{22%zq+x74#dCfbE?m(UeXsu;llgTg=t&Gk?xpS) zk@_OT$d=*a$Z*wirn`y?a1DM94ud0L2qXoeuB8gsLLijk2rW3=V!mDOKMY>pE*@?H ze{J}wI;dD=uwhbc8DvL4Fpci*=HclIW(3e&!5%b*GXVJKOs`9yylV}Gb`iUK@Uvt< z93rLSEF}w(HDR3-mjxS!s + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/site.webmanifest b/assets/site.webmanifest new file mode 100644 index 00000000..fa0f0654 --- /dev/null +++ b/assets/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "rust analyzer", + "short_name": "rust analyzer", + "icons": [ + { + "src": "/assets/fav/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/assets/fav/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/blog.html b/blog.html new file mode 100644 index 00000000..bd30308d --- /dev/null +++ b/blog.html @@ -0,0 +1,164 @@ + + + + + + + + + + rust-analyzer + + + + + + + + + + + + + + + + + + + + + +

+ +
+ + +
+

Posts

+ + + +
+ + + + + diff --git a/blog/2019/10/16/finance.html b/blog/2019/10/16/finance.html new file mode 100644 index 00000000..ec8dc6da --- /dev/null +++ b/blog/2019/10/16/finance.html @@ -0,0 +1,188 @@ + + + + + + + + + + Cost of rust-analyzer + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Cost of rust-analyzer

+ +
+

In this post, we’ll talk about financial side of the rust-analyzer project. +The goal is to find out how much rust-analyzer costs now, formulate financial goals for speeding up the development and document the Open Collective expenses policy.

+
+
+

Note that "rust-analyzer" here refers to the umbrella project of "making great Rust IDE from first-principles", and not to the specific rust-analyzer binary. +The long term plan is to merge all of rustc, rls and rust-analyzer into a single tool, and there are already some first steps in this direction.

+
+
+

At the moment, the de-facto project lead is me, @matklad. +I do both engineering tasks (code, design, mentoring) as well as project-management tasks (like writing this post). +I am employed by Ferrous Systems, and dedicate half of my time to rust-analyzer. +No one else at Ferrous is involved in rust-analyzer on a daily basis, but I do occasionally ask other folks for help in non-coding areas. +Most notably, processing of open-collective donations needs help from a professional accountant. +I would estimate this additional load on Ferrous as roughly two work days per month.

+
+
+

If we take 4500 EUR as a base monthly salary (this is roughly the Blue Card level salary for Berlin), the cost of rust-analyzer for Ferrous Systems would be

+
+
+
+
1
+2
+3
+
4500 * 0.5            my work
++ 4500 * (2 / 20)     work of other folks at Ferrous
+= 2700 EUR / Month
+
+
+
+
+

If I were to work full time, the cost would be

+
+
+
+
1
+
4500 + 4500 * (2 / 20) = 4950 EUR / Month
+
+
+
+
+

There is a large number of absolutely awesome contributors to rust-analyzer, not employed by Ferrous Systems! +It would be fair to reward their work as well. +It’s unclear exactly how rewarding should work like, but I would like to allocate at least 20% of the budget for payouts to people not affiliated with Ferrous Systems or Mozilla. +The current scheme for payouts is as follows:

+
+
+
    +
  • +

    contributors who make recurring, significant changes, influence design and co-maintain subsystems are eligible for payouts

    +
  • +
  • +

    the exact conditions are discussed on the case by case bases

    +
  • +
  • +

    the decision requires consensus from @matklad, @flodiebold, @skade and the contributor

    +
  • +
  • +

    the final arrangement is made public

    +
  • +
+
+
+

The biggest weakness of this scheme is that the decision quorum is not well-balanced. +We hope to overcome this issue by being transparent and tweaking the descision process if it doesn’t work well.

+
+
+

We also need to pay taxes from the money we receive via Open Collective. +The VAT is 19%, but donations from EU-based companies are exempt from VAT. +Additionally, total transaction processing fee (Open Collective + Stripe) is 8%;

+
+
+

So, the final formula for the yearly budget looks like this:

+
+
+
+
1
+
(cost * 10/8 payouts * 119/100 VAT * 108/100 transaction fee) * 12
+
+
+
+
+

Pluggin the costs from above, we get the following budget targets:

+
+
+

52050 EUR / Year: I dedicate half of my time for rust-analyzer, 20% of the budget is spend funding people outside of Ferrous Systems.

+
+
+

95245 EUR / Year: I work on rust-analyzer full-time (yay!), 20% of the budget is spend funding people outside of Ferrous Systems.

+
+
+

We are currently at 22280 EUR / Year, which is a good start (and roughly pays for one quarter of my time)! The work on rust-analyzer up to this point was sponsored by Mozilla and Ferrous Systems.

+
+
+

The road map for the next year is not ready yet. +It will be published by the end of October. +The preliminary plan is to focus on library-ification of two areas of the compiler: type system and parsing.

+
+
+

Support rust-analyzer on Open Collective. +If you are finding rust-analyzer useful in your work, consider talking to management about sponsoring rust-analyzer. +We are specifically seeking sponsorship from companies that use Rust!

+
+
+ +
+ + + + + diff --git a/blog/2019/11/13/find-usages.html b/blog/2019/11/13/find-usages.html new file mode 100644 index 00000000..8375be9a --- /dev/null +++ b/blog/2019/11/13/find-usages.html @@ -0,0 +1,406 @@ + + + + + + + + + + Find Usages + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Find Usages

+ +
+
+
+

Last month, rust-analyzer gained an exciting new feature: find usages. It was implemented by @viorina in #1892.

+
+
+

This post describes how the feature works under the hood. +It’s an excellent case study to compare approaches of traditional compilers with IDE-oriented compilers (shortened to IDE from now on).

+
+
+
+
+

Definitions and Usages

+
+
+

Let’s start with a simple example:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
fn foo() {
+    let x = 92;
+    let y = 62;
+
+    if condition {
+        y + 1
+    } else {
+        x + 2
+    };
+}
+
+
+
+
+

Suppose that a user invoked find usages (also known as reference search) on x. +An IDE should highlight x in x + 2 as a usage.

+
+
+

But lets start with a simpler problem: goto definition (which is the reverse of find usages). +How does a compiler or an IDE understands that x in x + 2 refers to let x = 92;?

+
+
+

Terminology Note: we will call the x in let x = 92 a definition, and the x in x + 2 a reference.

+
+
+

Note: the following presentation is oversimplified and is not based directly on any existing compiler or IDE. +Consider it a text-book illustration, and not a fossil specimen.

+
+
+
+
+

Compiler’s Approach

+
+
+

A typical compiler works by building a symbol table. +It does a depth-first traversal of the syntax tree of a program, maintaining a hash-map of definitions. +For the above example, the compiler does the following steps, in order:

+
+
+
    +
  1. +

    Create an empty map.

    +
  2. +
  3. +

    Visit let x = 92. Records this definition in the map under the "x" key.

    +
  4. +
  5. +

    Visit let y = 62. Records this definition in the map under the "y" key.

    +
  6. +
  7. +

    Visit condition.

    +
  8. +
  9. +

    Visit "then" branch of the if expression. Lookup "y" in the map and record association between a reference and a definition.

    +
  10. +
  11. +

    Visit "else" branch of the if expression. Lookup "x" in the map and record association between a reference and a definition.

    +
  12. +
+
+
+

After the end of the traversal, the compiler knows, for each reference, what definition this reference points to. +If a reference is unresolved, the compiler emits an error.

+
+
+

We may say that a compiler processes a program top-down.

+
+
+
+
+

IDE Approach

+
+
+

To figure out where the x in x + 2 points to, a typical IDE does something different. +Instead of starting from the root of the tree, it starts from the usage, and proceeds upwards.

+
+
+

So, the IDE would do the following:

+
+
+
    +
  1. +

    Start at x + 2.

    +
  2. +
  3. +

    Look at the parent "else" branch, notice that there are no definitions there.

    +
  4. +
  5. +

    Look at the parent "if" expression.

    +
  6. +
  7. +

    Look at the parent block, notice that it has x defined, return this definition as an answer.

    +
  8. +
+
+
+

The crucial point here is that IDE skips "then" branch completely. +It doesn’t look like a big deal with this small branch which contains a single expression only. +However, the real world programs are much more complicated, and an IDE can skip quite a lot of code by only climbing the tree up.

+
+
+

This is the bottom-up approach.

+
+
+
+
+

Which Way is Better?

+
+
+

It depends! +Let’s do a quick estimation of work required to find, for each reference, a definition it points to.

+
+
+

The compiler’s case is easy: we just traverse a program once, doing hashmap operations along the way. +That would be O(program_size).

+
+
+

The IDE’s case is more tricky: we still need to traverse a program to find all references. +Then, for each reference, we need to launch the "traverse tree upwards" procedure. +Which gives us O(program_size + n_references * program_depth). +This is clearly worse!

+
+
+

But let’s now look at the time we need to resolve one specific reference. +A compiler still has to construct the symbol table, so it’s still O(program_size). +An IDE, however, can launch only a single upward traversal, and that would be only O(program_depth)!

+
+
+

These observations are exactly the reason why compilers prefer the first approach, while IDEs favor the second one. +A compiler has to check and compile all the code anyway, so it’s important to do all the work as efficiently as possible. +For IDEs however, the main trick is to ignore as much code as feasible. +An IDE needs to know only about usages under one specific reference under the cursor in the currently opened file. +It doesn’t care what is the definition of a spam variable used in the frobnicate function somewhere in the guts of the standard library.

+
+
+

More generally, an IDE would like +- to know everything about a small droplet of code that is currently on the screen and +- to know nothing about the vast ocean of code that is off-screen.

+
+
+
+
+

Find Usages

+
+
+

Let’s get back to the original problem, find usages.

+
+
+

If a compiler has already constructed a symbol table, the solution is trivial: just enumerate all the usages. +It might need a little bit of extra bookkeeping (storing the list of usages in the symbol table), but basically this is just "print the answer we already have".

+
+
+

For an IDE, something else is required. +The trivial solution of doing a bottom-up traversal from every reference is worse than just launching the compiler from scratch.

+
+
+

Instead, IDEs do a cute trick, which can be called a hack even! +IntelliJ, Type Script, and, since last month, rust-analyzer work like this.

+
+
+

First thing an IDE does is a text search across all files, which finds the set of potential matches. +As text search is much simpler than code analysis, this phase finishes relatively quickly. +Then the IDE filters out false positives, by doing bottom-up traversal from candidate matches.

+
+
+

The text-based pre filtering again allows the IDE to skip over most of the code, and complete find-usages in less time than it would the compiler to build a symbol table.

+
+
+
+
+

Incrementality vs Laziness

+
+
+

Can we make the top-down approach as effective as bottom-up (and maybe even more so), by just making the calculation of symbol table incremental? +The idea is to maintain a data structure that connects references and definitions and, when a user changes a piece of code, apply the diff to the data structure, instead of re-computing it from scratch.

+
+
+

The fundamental issue with this approach is that it solves the problem an IDE doesn’t have in the first place. +From that symbol data structure, only a tiny part is interesting for an IDE at any given moment of time. +Most of the code is private implementation details of dependencies, and they are completely irrelevant for IDE tasks, unless a user invokes "go to definition" on a symbol from library and actively studies these details.

+
+
+

On the other hand, building and updating such data structure takes time. +Specifically, because the data is intricate and depends on the language semantics, small changes to the source code (change of a module name, for example) might necessitate big rearrangement of computed result.

+
+
+

In general, laziness (ability to ignore most of the code) and incrementality (ability to quickly update derived data based on source changes) are orthogonal features. +First and foremost, an IDE requires laziness, although incrementality can be used as well to speed some things up.

+
+
+

In particular, it is possible to make the text-based phase of reference search incremental. +An IDE can maintain a trigram index: for each three-byte sequence, a list of files and positions where this sequence occurs. +Unlike symbol tables, such index is easy to maintain, as any change in a file can only affect trigrams from this file. +The index can then be used to speedup text search. +The result is the following find usages funnel:

+
+
+
    +
  1. +

    First, an IDE finds all positions where identifier’s trigrams match,

    +
  2. +
  3. +

    Then, the IDE checks if a trigram match is in fact a full identifier match,

    +
  4. +
  5. +

    Finally, IDE uses semantic analysis to prune away remaining false-positives.

    +
  6. +
+
+
+

This is optimization is not implemented in rust-analyzer yet. +It definitely is planned, but not for the immediate future.

+
+
+
+
+

Tricks

+
+
+

Let’s look at a couple of additional tricks an IDE can employ.

+
+
+

First, the IDE can add yet another step to the funnel: pruning the set of files worth searching. +These restrictions can originate from the language semantics: it doesn’t make sense to look for pub(crate) declaration outside of the current crate or for pub declaration among crate dependencies. +They also can originate from the user: it’s often convenient to exclude tests from search results, for example.

+
+
+

The second trick is about implementing warnings for unused declarations effectively. +This is a case where a top-down approach is generally better, as an IDE needs to process every declaration, and that would be slow with a bottom-up approach. +However, with a trigram index the IDE can apply an interesting optimization: only check those declarations which have few textual matches. +This will miss an used declaration with a popular name, like new, but will work ok for less-popular names, with a relatively good performance.

+
+
+
+
+

Real World

+
+
+

Now it’s time to look at what actually happens in rust-analyzer. First of all, I must confess, it doesn’t use the bottom-up approach :)

+
+
+

Rust type-inference works at a function granularity: statements near the end of a function can affect statements at the beginning. +So, it doesn’t make sense to do name resolution at the granularity of an expression, and indeed rust-analyzer builds a per-function +symbol table. +This is still done lazily though: we don’t look into the function body unless the text search tells us to do so.

+
+
+

Name resolution on the module/item level in Rust is pretty complex as well. +The interaction between macros, which can bring new names into the scope, and glob imports, which can tie together namespaces of two modules, requires not only top-down processing, but a repeated top-down processing (until a fixed point is reached). +For this reason, module-level name resolution in rust-analyzer is also implemented using the top-down approach. +We use salsa to make this phase of name resolution incremental, as a substitute for laziness +(see this module for details). +The results look promising so far: by processing function bodies lazy, we greatly reduce the amount of data the fixed-point iteration algorithm has to look at. +By adding salsa on-top, we avoid re-running this algorithm most of the time.

+
+
+

However, the general search funnel is there!

+
+
+
    +
  1. +

    Here’s the entry point for find usages. +Callee can restrict the SearchScope. +For example, when the editor asks to highlight all usages of the identifier under the cursor, the scope is restricted to a single file.

    +
  2. +
  3. +

    The first step of find usages is figuring out what to find in the first place. +This is handled by find_name functions. +There are two cases to consider: the cursor can be either on the reference, or on the definition. +We handle the first case by resolving the reference to the definition and converging to the second case.

    +
  4. +
  5. +

    Once we’ve figured out the definition, we compute it’s search scope and intersect it with the provided scope: source.

    +
  6. +
  7. +

    After that, we do a simple text search over all files in the scope: source. +This is the place where trigram index should be added.

    +
  8. +
  9. +

    If there’s a match, we parse the file, to make sure that it is indeed a reference, and not a comment or a string literal: source. +Note how we use a local Lazy value to parse only those files, which have at least one match.

    +
  10. +
  11. +

    Finally, we check that the candidate reference indeed resolves to the definition we have started with: source.

    +
  12. +
+
+
+

That’s all for the find usages, thank you for reading!

+
+
+
+
+ +
+ + + + + diff --git a/blog/2020/02/11/2019-financial-report.html b/blog/2020/02/11/2019-financial-report.html new file mode 100644 index 00000000..51b9976c --- /dev/null +++ b/blog/2020/02/11/2019-financial-report.html @@ -0,0 +1,128 @@ + + + + + + + + + + 2019 Financial Report + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

2019 Financial Report

+ +
+

This is a short financial report for Open Collective money for 2019.

+
+
+

We’ve got 9933 EUR on open collective after fees. +We’ve rounded that number up to 10000 (using some funds from this year) and split it into two buckets:

+
+
+
    +
  • +

    80% for Ferrous Systems

    +
  • +
  • +

    20% for contributors, not affiliated with Ferrous

    +
  • +
+
+
+

Ferrous share went to paying for part of @matklad's time (thats me!), and for administrative tasks. +The remaining 2000 EUR were payed to @flodiebold for implementing and maintaining type inference infrastructure of rust-analyzer.

+
+
+

Our biggest Open Collective sponsors in 2019 were:

+
+
+ +
+
+

<3

+
+
+

If you use rust-analyzer professionally, consider asking your company to sponsor the development of this project.

+
+
+

As a reminder, we publish weekly changelog to report the progress on rust-analyzer and explain where the money go.

+
+
+ +
+ + + + + diff --git a/blog/2020/03/30/macros-vs-rename.html b/blog/2020/03/30/macros-vs-rename.html new file mode 100644 index 00000000..f1aad9f9 --- /dev/null +++ b/blog/2020/03/30/macros-vs-rename.html @@ -0,0 +1,235 @@ + + + + + + + + + + Macros vs Rename + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Macros vs Rename

+ +
+

I’ve already written before about how precise code completion is impossible to do inside Rust macros: +https://github.com/matklad/proc-caesar. Today I’d like to write a short note about another impossibility result:

+
+
+
+
+

Correct automatic rename is not possible in a language with rust-style macros.

+
+
+
+
+

Consider the following example:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+
macro_rules! call_foo {
+    () => { foo() };
+}
+
+mod a {
+    fn foo() {}
+
+    fn main() {
+        call_foo!();
+    }
+}
+
+mod b {
+    fn foo() {}
+
+    fn main() {
+        call_foo!();
+    }
+}
+
+
+
+
+

What is the expected result for renaming a::foo to bar? +There isn’t one, as the same macro refers to different foo at different call-sites!

+
+
+

But the problem is even deeper than ambiguity. +Consider this (silly) crate:

+
+
+
+
1
+2
+3
+4
+5
+6
+7
+
#[doc(hidden)]
+pub const HELLO: &str = "hello";
+
+#[macro_export]
+macro_rules! say_hello {
+    () => { println!("{}", $crate::HELLO) }
+}
+
+
+
+
+

In this case, it is pretty clear what we want to get after renaming HELLO to GREETING:

+
+
+
+
1
+2
+3
+4
+5
+6
+7
+
#[doc(hidden)]
+pub const GREETING: &str = "hello";
+
+#[macro_export]
+macro_rules! say_hello {
+    () => { println!("{}", $crate::GREETING) }
+}
+
+
+
+
+

Unfortunately, it is impossible to formalize this transformation. +To the human reader, it is obvious that the right hand side of a macro should be parsed as an expression. +But this intuition is flawed — the right hand side is just a sequence of tokens, and it receives a meaning only when we call the macro. +And there’s no guarantee, in general case, that it would be interpreted as an expression:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
#[doc(hidden)]
+pub const HELLO: &str = "hello";
+
+macro_rules! m {
+    ($($tt:tt)*) => { $($tt)*($crate::HELLO) };
+}
+
+fn main() {
+    let expr = m!(std::convert::identity);
+    let tt = m!(stringify!);
+    println!("expr = {},tt = {}", expr, tt)
+}
+
+
+
+
+

Together this means that the theoretically best definition of correct automated rename we can get in Rust is limited. +We can handle code outside the macros and code inside macro calls. +For macro definitions, at best we can give a list of locations that require manual intervention.

+
+
+

It also seems plausible that, with some heuristic, we can infer renames in macro definitions as well. +For example, we can look at all call sites of the macro, and see if they all agree that a certain token in the macro definition needs change.

+
+
+ +
+ + + + + diff --git a/blog/2020/04/20/first-release.html b/blog/2020/04/20/first-release.html new file mode 100644 index 00000000..1b7720b6 --- /dev/null +++ b/blog/2020/04/20/first-release.html @@ -0,0 +1,474 @@ + + + + + + + + + + First Release + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

First Release

+ +
+
+
+

I am pleased to announce the first alpha release of rust-analyzer — a new "IDE backend" for the Rust programming language. +Support rust-analyzer on Open Collective.

+
+
+

Wait a second…​ Haven’t people been using rust-analyzer for a long time now? +Well, yes, but we’ve never actually made a release announcement, so here’s one! +Better late than never :-)

+
+
+
+
+

What exactly is rust-analyzer?

+
+
+

Broadly speaking, rust-analyzer is a new compiler front-end for the Rust programming language, aimed at drastically improving IDE integration. +If you are familiar with C# ecosystem, rust-analyzer is to rustc what Roslyn is to the original C# compiler.

+
+
+

More specifically the goal of rust-analyzer project is improving Rust IDE support to the standard expected of a modern language. +Under this umbrella project the following activities take place:

+
+
+
    +
  • +

    We build the rust-analyzer binary, an implementation of the language server protocol, which can provide a basic IDE experience for Rust today.

    +
  • +
  • +

    We use rust-analyzer as a workbench and a laboratory for investigating approaches to lazy and incremental compilation.

    +
  • +
  • +

    We try to modularize the existing rustc compiler and extract production ready components for sharing with rust-analyzer.

    +
  • +
+
+
+

For the users, the most immediately relevant facet is the first one — a language server you can install to get smart code completion in Emacs your favorite editor. +This is what this post focuses on.

+
+
+
+
+

What is its relationship with RLS?

+
+
+

Rust had a language server for quite some time now — the RLS. +RLS and rust-analyzer use fundamentally different architectures for understanding Rust. +RLS works by running a compiler on the whole project and dumping a huge JSON file with facts derived during the compilation process. +rust-analyzer works by maintaining a persistent compiler process, which is able to analyze code on-demand as it changes. +Concretely, after every keystroke RLS looks at every function body and re-typechecks it; rust-analyzer generally processes only the code in the currently opened file(s), reusing name resolution results if possible.

+
+
+

rust-analyzer started as an experiment and a proof-of-concept, but today it is becoming increasingly clear that:

+
+
+
    +
  • +

    rust-analyzer already provides a better experience than RLS for many users.

    +
  • +
  • +

    rust-analyzer is further ahead on the road towards the envisioned end-state of a fully on-demand, fully incremental Rust compiler.

    +
  • +
+
+
+

So we’ve opened RFC 2912. +That RFC proposes a process of replacing RLS with rust-analyzer as the official LSP implementation for Rust.

+
+
+
+
+

What is its relationship with IntelliJ Rust?

+
+
+

IntelliJ Rust is a plugin providing Rust support for IDEs build on top of IntelliJ Platform. +The rust-analyzer project is indebted to IntelliJ Rust: it builds on the same architectural ideas and patterns, and is directly inspired by the experience of developing IntelliJ Rust.

+
+
+

IntelliJ Rust contains its own implementation of an IDE-ready compiler frontend, implemented in Kotlin. +This engine is very advanced, but, by design, does not use LSP. +IntelliJ Rust is a production ready Rust IDE and is wholly recommended for users of JetBrains' products.

+
+
+
+
+

Quick Start

+
+
+

The manual contains detailed documentation, so in this blog post I want to just quickly run through the most exciting features.

+
+
+

rust-analyzer is compatible with any editor that supports LSP, and has dedicated plugins for +Vim, +Emacs +and VS Code. +Support for VS Code is maintained in-tree and in general is expected to be the most complete. +For this reason, the following info takes a VS Code-centric point of view, but should be translatable to equivalent concepts in other editors.

+
+
+

To add rust-analyzer to VS Code:

+
+
+
    +
  • +

    Remove existing rls extension, if you have one.

    +
  • +
  • +

    Install the rust-analyzer extension from the marketplace.

    +
  • +
+
+
+

To check that everything is working open a "Hello World" Rust application. +You should see the Run | Debug code lens, and editor symbols should show the main function:

+
+
+
+80090876 7b49a500 8560 11ea 8abc b4b5f786c026 +
+
+
+
+
+

Features

+
+
+

Now that rust-analyzer is successfully installed, what are some of the most important features?

+
+
+

I suggest, first and foremost, to familiarize oneself with many navigation capabilities, as we spend more time reading code than writing it. +Here’s an inexhaustive list of features.

+
+
+
+
Definition F12
+
+

The most famous navigation shortcut. +One rust-analyzer specific trick is that F12 on an mod submodule; brings you to the submodule.rs file. +This is useful in combination with:

+
+
Parent module (no default keybinding)
+
+

This action brings to the mod declaration which declared the current module. +It doesn’t have a shortcut assigned by default, as there’s no corresponding built-in action, but it is highly recommended to assign one.

+
+
Workspace Symbol Ctrl+T
+
+

This is probably the shortcut I use most often. +It is a fuzzy-search interface for all "symbols" (structs, enums, functions, field) in the project, its dependencies and the standard library. +The search tries to be smart, in that, by default, it looks only for types in your project, and, failing that, for functions. +It is possible to force search in dependencies by adding # to the query string, and search for all symbols by adding *. +Unfortunately, this doesn’t work in VS Code at the moment, as it stopped passing these symbols to the language server since the last update.

+
+
+
+
+
+ +
+
+
+
+
Document Symbol Ctrl+Shift+O
+
+

Like workspace symbol, but for things in the current file. +The same underlying LSP request powers file outline and breadcrumbs.

+
+
+
+
+
+80090645 1e4def00 8560 11ea 901d d1cdc0ab8f50 +
+
+
+
+
Implementation Ctrl+F12
+
+

This shortcut works on structs, enums and traits, and will show you the list of corresponding impls.

+
+
Syntax Highlighting
+
+

While not exactly about navigation, semantic syntax highlighting helps with reading code. +Rust analyzer underlines mutable variables, distinguishes between modules, traits and types and +provides helpful type and parameter hints.

+
+
+
+
+
+80091615 b5677680 8561 11ea 82de e1517e4fef18 +
+
+
+
+
Run (no default keybinding)
+
+

After navigation, the feature I use most is probably the Run button. +This action runs the test function, test module or main function at the given cursor position. +It is also available as a code-lens, but I personally exclusively use ctrl+r for it, as I need this action all the time. +What’s more, with a short cut you can re-run the last command, which is hugely useful when you are debugging a failing test. +This action is pretty smart in that it does the following things for you:

+
+
    +
  • +

    determines the appropriate --package argument for Cargo,

    +
  • +
  • +

    uses the full path to the test, including the module,

    +
  • +
  • +

    sets the --no-capture argument, so that debug prints are visible,

    +
  • +
  • +

    sets the RUST_BACKTRACE environmental variable, so that you don’t have to re-run on panic.

    +
  • +
+
+
+
+
+
+

Sadly, such context-dependent run configurations are not a part of the LSP protocol yet, so this feature is implemented using a custom protocol extension.

+
+
+
+ +
+
+
+
+
Punctuation-aware code completion
+
+

Naturally, rust-analyzer helps with writing code as well. +When completing return, it checks if the return type is (). +When completing function and method calls, rust-analyzer places the cursor between parentheses, unless the function has zero arguments. +When typing let, rust-analyzer tries to helpfully add the semicolon.

+
+
+
+
+
+ +
+
+
+
+
Extend selection Shift+Alt+
+
+

This is again a feature which is relatively simple to implement, but a huge helper. +It progressively selects larger and larger expressions, statements and items. +It works exceptionally well in combination with multiple cursors. +One hidden capability of this feature is a navigation help: if you are in a middle of a function, you can get to the beginning of it by extending seleciton several times, and then pressing .

+
+
+
+
+
+ +
+
+
+
+
Fixit for missing module
+
+

Another disproportionally nice feature — to create a new file, type mod file_name; and use ctrl+. to add the file itself.

+
+
+
+
+
+ +
+
+
+
+
Assists
+
+

More generally, there are a lot of cases where the light bulb can write some boring code for you. +Some of my favorites are impl generation:

+
+
+
+
+
+ +
+
+
+

And filling match arms:

+
+
+
+ +
+
+
+
+
+

Drawbacks

+
+
+

rust-analyzer is a young tool and comes with a lot of limitations. +The most significant one is that we are not at the moment using rustc directly, so our capabilities for detecting errors are limited.

+
+
+

In particular, to show inline errors we are doing what Emacs has been doing for ages — running cargo check after the file is saved. +If auto-save is enabled in the editor, the result is actually quite nice for small projects.

+
+
+

For bigger projects though, I feel like cargo check in background gets in the way. +So for rust-analyzer I have rust-analyzer.checkOnSave.enabled = false; in the settings. +Instead, I use the Run functionality to run check / test and keyboard shortcuts to navigate between errors.

+
+
+

Another big issue is that at the moment we, for simplicity, don’t persist caches to disk. +That means that every time you open a project with rust-analyzer, it needs to analyze, from source:

+
+
+
    +
  • +

    all sysroot crates (std, core, alloc, etc)

    +
  • +
  • +

    all crates.io dependencies

    +
  • +
  • +

    all crates in your workspace

    +
  • +
+
+
+

This takes time, tens of seconds for medium sized projects.

+
+
+

Similarly, because we never save anything to disk, we need to keep analysis results for all crates in memory. +At the moment, rust-analyzer process might requires gigabytes of ram for larger projects.

+
+
+

Finally, because analysis is not complete, features are not working correctly every time. +Sometimes there are missing completions, sometimes goto definition is wrong, we may even show false-positive errors on occasion.

+
+
+

This is an alpha release. +We have a long road ahead of us towards solid and reliable IDE support. +Luckily (and this is the instance where a life of an IDE writer is simpler than that of a compiler writer) an IDE doesn’t have to be 100% correct to be useful.

+
+
+
+
+

How can I help?

+
+
+

If you find rust-analyzer useful and use it professionally, please consider asking your company to sponsor rust-analyzer via our Open Collective. +Sponsorships from individuals are also accepted (and greatly appreciated!).

+
+
+

For other financial support options, customization requests, or extended support, please write an email to rust-analyzer@ferrous-systems.com.

+
+
+

Many people like starting contributing to the project with docs, and we certainly can use some help as well. +For user-visible documentation, we have a manual which is pretty bare bones at the moment. +In particular, it doesn’t talk about features of rust-analyzer yet. +The primary document for developers is architecture.md.

+
+
+

If you want to contribute code, the best way to start is the aforementioned architecture document. +In general, rust-analyzer code base is comparatively easy to contribute to: it is a standard Rust crate, which builds with stable compiler. +The best first issue to fix is something that you personally find lacking. +If you are already perfectly happy with rust-analyzer, we have a bunch of issues others have reported :-)

+
+
+
+
+ +
+ + + + + diff --git a/blog/2020/05/18/next-few-years.html b/blog/2020/05/18/next-few-years.html new file mode 100644 index 00000000..deff83a4 --- /dev/null +++ b/blog/2020/05/18/next-few-years.html @@ -0,0 +1,406 @@ + + + + + + + + + + Next Few Years + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Next Few Years

+ +
+
+
+

rust-analyzer is a new "IDE backend" for the Rust programming language. +Support rust-analyzer on Open Collective.

+
+
+

During the past several months, I’ve been swamped with in-the-trenches rust-analyzer work. +Today, I spontaneously decided to take a step back and think about longer-term "road map" for rust-analyzer.

+
+
+

What follows is my (@matklad) personal thoughts on the matter, they not necessary reflect the consensus view of ide or compiler teams :-)

+
+
+
+
+

Unexpected Success

+
+
+

One of the most surprising aspects of rust-analyzer for me is how useful it already is. +Today, I write Rust code enjoying fast code-completion, mostly correct go to definition and plethora of assists. +Even syntax highlighting inside macros works!

+
+
+

My original plan for rust-analyzer was to write a quick one-to-two-year hack to demonstrate a proof-of-concept IDE support, something to strive for rather than a finished product. +Obviously, we have massively overshot this goal: people depend on rust-analyzer for productive Rust programming today. +This creates its own opportunities and dangers, which inform this planning document.

+
+
+
+
+

Official LSP Server

+
+
+

People write a ton of Rust today, and they deserve at least a baseline level of IDE support. +I think our immediate goal is to make rust-analyzer easier to use in its current state, effectively implementing RFC2912.

+
+
+

The amount of programming work on rust-analyzer side is relatively small here: +we need to fix various protocol conformance issues, +clean up various defaults to be less experimental, +write documentation which doesn’t require a lot of enthusiasm to understand, etc. +The amount of org stuff is much bigger — we need to package rust-analyzer with rustup, merge the RLS and rust-analyzer VS Code extensions, figure out repository structure, etc.

+
+
+

Separately, I want to make sure that rust-analyzer is usable inside large non-Cargo based monorepos. +We have some initial support for this already, but there’s a bunch of details we need to iron out.

+
+
+
+
+

Dangers of Accidental Architecture

+
+
+

The main danger I see is that rust-analyzer can ossify in its present state. +This would be bad, because, although current rust-analyzer architecture is right in broad strokes, a lot of important and hard-to-change details are wrong. +After we push rust-analyzer to the general public, we should focus on boring implementation & design work, with relatively few shiny gifs and a lot of foundational work for the next decade.

+
+
+
+
+

Bringing Chalk to Rustc

+
+
+

rust-analyzer has been using chalk as its trait solver for a long time now. +It would be good to finish the work, and integrate it into rustc as well, and give people their GATs.

+
+
+
+
+

Single Parser and Syntax Tree

+
+
+

We should share the parser between rustc and rust-analyzer already. +Parsing is one of the most interesting bits of the compiler, from the IDE point of view. +By transitioning rustc to a lossless syntax we’ll cross the most important barrier, and it will be a downhill road from that point on. +The design space here I think is well-understood, but the amount of work to do is large. +At some point, I should take a break from actively hacking on rust-analyzer and focus on sharing the parser.

+
+
+
+
+

Virtual File System

+
+
+

The most fundamental data structure in rust-analyzer, even more fundamental than a syntax tree, is the VFS, or Virtual File System. +It serves two dual goals:

+
+
+
    +
  • +

    providing consistent immutable snapshots of the file system,

    +
  • +
  • +

    applying transactional changes to the state of the file system.

    +
  • +
+
+
+

This abstraction is the boundary between the pure-functional universe of rust-analyzer, and the messiness of the external world. +It needs to bridge case-insensitive file systems, symlinks and cycles to a simpler model of "tree with utf8 paths" we want inside. +Additionally it should work with non-path files: there are use-cases where we want to do analysis of Rust code, which doesn’t really reside on the file system.

+
+
+

One specific aspect I am struggling with is dynamism. +On the one hand, it seems that a good design is to require to specify the set of files in VFS upfront, as a set of globs. +This is important because, to properly register file watchers without losing updates, you need to crawl the file-system eagerly. +However, specifying a set of globs up-front makes changing this set later messy.

+
+
+

I would be curious to hear about existing solutions in this area. +One specific question I have is: "How does watchman handle dynamic addition/removal of projects?". +If you have any experience to share, please comment on the VFS issue in rust-analyzer. +Ideally, we turn VFS into just a crates.io crate, as it seems generally useful, and can encapsulate quite a bit of complexity.

+
+
+

The current VFS is …​ not great, I don’t feel comfortable building rust-analyzer on top of it.

+
+
+
+
+

WASM proc macros

+
+
+

At the moment, proc-macros are implemented as dynamic libraries, loadable into the compiler process. +This works ok-enough for the compiler, but is a pretty bad fit for an IDE:

+
+
+
    +
  • +

    if a proc-macro crashes, it brings down the whole process,

    +
  • +
  • +

    it’s hard to limit execution time of proc-macro,

    +
  • +
  • +

    proc-macros can be non-deterministic, which breaks internal IDE invariants.

    +
  • +
+
+
+

At the moment, we paper over this by running proc-macros in a separate process and never invalidating proc-macro caches, but this feels like a hack and has high implementation complexity. +it would be much better if proc-macros were deterministic and controllable by definition, and WASM can give us that.

+
+
+

I am slightly worried that this will get push-back from folks who want to connect to databases over TCP at compile time :) +Long term, I believe that guaranteeing deterministic compilation is hugely important, irrespective of IDE story.

+
+
+
+
+

Language Design for Locality

+
+
+

There’s a very important language property that an IDE can leverage to massively improve performance:

+
+
+

What happens inside a function, stays inside the function

+
+
+

If it is possible to type-check the body of a function without looking at the bodies of other functions, you can speed up an IDE by drastically reducing the amount of work it needs to do.

+
+
+

Rust mostly conforms to this property, but there are a couple of annoying violations:

+
+
+
    +
  • +

    local inherent impls with publicly visible methods.

    +
  • +
  • +

    local trait impls for non-local types.

    +
  • +
  • +

    #[macro_export] local macros.

    +
  • +
  • +

    local out-of-line modules.

    +
  • +
+
+
+

If we want to have fast & correct IDE support, we should phase out those from the language via edition mechanism.

+
+
+

Note that auto-trait leakage of impl Trait is not nearly as problematic, as you only need to inspect a function’s body if you call the function. +Of course, as an IDE author I’d love to require specifying auto-traits, but, as a language user, I much prefer the current design.

+
+
+
+
+

Compact Data Structures

+
+
+

rust-analyzer uses a novel and rather high-tech query-based architecture for incremental computation. +Today, it is clear that this general approach fits an IDE use-case really well. +However, I have a lot of doubts about specific details. +I feel that today rust-analyzer lacks mechanical sympathy and leaves a ton of performance on the table. +A lot of internal data structures are heap-allocated Arc-droplets, we overuse hashing and underuse indexing, we don’t even intern identifiers!

+
+
+

To get a feeling of how blazingly fast compiler front-ends can be, I highly recommend checking out Sorbet, type checker for Ruby. +You can start with these two links:

+
+ +
+

I am very inspired by this work, but also embarrassed by how far rust-analyzer is from that kind of raw performance and simplicity.

+
+
+

Part of that I think is essential complexity — Rust’s name resolution and macro expansion are hard. +But I also wonder if we can change salsa to use Vec-based arenas, rather than Arcs in HashMaps.

+
+
+
+
+

Parallel and Fast > Persistence

+
+
+

One of the current peculiarities of rust-analyzer is that it doesn’t persist caches to disk. +Opening project in rust-analyzer means waiting a dozen seconds while we process standard library and dependencies.

+
+
+

I think this "limitation" is actually a very valuable asset! +It forces us to keep the non-incremental code-path reasonably fast.

+
+
+

I think it is plausible that we don’t actually need persistent caches at all. +rust-analyzer is basically text processing, and the size of input is in tens of megabytes (and we ignore most of those megabytes anyway). +If we just don’t lose performance here and there, and throw the work onto all the cores, we should be able to load projects from scratch within a reasonable time budget.

+
+
+

The first step here would be establishing the culture of continuous benchmarking and performance tuning.

+
+
+

We’ve already successfully used rust-analyzer for forging an architecture which works in IDE at all. +Now it’s time to experiment with architecture which works, fast, just as all Rust code should :-)

+
+
+
+
+

Optimizing Build Times

+
+
+

In my opinion the two important characteristics that determine long-term success of a project are:

+
+
+
    +
  • +

    How long does it take to execute most of the tests?

    +
  • +
  • +

    How long does it take to build a release version of the project for testing?

    +
  • +
+
+
+

I am very happy with the testing speed of rust-analyzer. +One of my mistakes in IntelliJ was adding a lot of tests that use Rust’s standard library and are slow for that reason. +In rust-analyzer, there are only three uber-integrated tests that need the real libstd, all others work from in-memory fixtures which contain only the relevant bits of std.

+
+
+

But the build times leave a lot to be desired. +And this is hugely important — the faster you can build the code, the faster you can do everything else. +Heck, even for improving build times you need fast build times! +I was trying to do some compile-time optimizations in rust-analyzer recently, and measuring “is it faster to compile now?” takes a lot of time, so one has to try fewer different optimizations!

+
+
+

The biggest problem here is that Rust, as a language, is hard to compile fast. +One specific issue I hit constantly is that changing a deep dependency recompiles the world. +This is in contrast to C/C++ where, if you don’t touch any .h files, changing a dependency requires only re-linking. +In theory, we can have something like this in Rust, by automatically deriving public headers from crates. +Though I fear that without explicit, physical “this is ABI” boundary, it will be much less effective at keeping compile times under control.

+
+
+

As an aside, if Rust stuck with .crate files, implementing IDE support would have been much easier :-)

+
+
+
+
+

Optimizing rustc Build

+
+
+

Nonetheless, rust-analyzer is much easier to build than rustc. +I believe there’s a lot we can do for rustc build as well.

+
+
+

I’ve written at length about this on irlo. +The gist is that I think we can split rustc into a front-end "text-processing" part, and backend "LLVM, linkers and real world" part. +The front bit then could, in theory, be a bog standard Rust project, which doesn’t depend on IO, external tools or C++ code at all.

+
+
+

One wrinkle here is that rustc test suite at the moment consists predominantly of UI and run-pass tests integration, which work by building the whole compiler. +Such a test suite is ideal for testing conformance and catching regressions, but is not really well suited for rapid TDD. +I think we should make an effort to build a unit test suite a-la rust-analyzer, such that it’s easy, for example, to test name resolution without building the type checker, and which doesn’t require stdlib.

+
+
+
+
+

Scaling Maintainance

+
+
+

Finally, all changes here represent deep cuts into an existing body of software. +Pushing such ambitious projects to completion require people, who can dedicate significant amounts of their time and energy. +To put it bluntly, we need more dedicated folks working on the IDE tooling as a full time, paid job. +I am grateful to my colleagues at Ferrous Systems who put a lot of energy into making this a reality.

+
+
+

If you find rust-analyzer useful and use it professionally, please consider asking your company to sponsor rust-analyzer via our Open Collective. +Sponsorships from individuals are also accepted (and greatly appreciated!).

+
+
+
+
+ +
+ + + + + diff --git a/blog/2020/07/20/three-architectures-for-responsive-ide.html b/blog/2020/07/20/three-architectures-for-responsive-ide.html new file mode 100644 index 00000000..604395fc --- /dev/null +++ b/blog/2020/07/20/three-architectures-for-responsive-ide.html @@ -0,0 +1,581 @@ + + + + + + + + + + Three Architectures for a Responsive IDE + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Three Architectures for a Responsive IDE

+ +
+
+
+
+
+

rust-analyzer is a new "IDE backend" for the Rust programming language. +Support rust-analyzer on Open Collective.

+
+
+
+
+

In this post, we’ll learn how to make a snappy IDE, in three different ways :-) +It was inspired by this excellent article about using datalog for semantic analysis: https://petevilter.me/post/datalog-typechecking/ +The post describes only the highest-level architecture. +There’s much more to implementing a full-blown IDE.

+
+
+

Specifically, we’ll look at the backbone infrastructure of an IDE which serves two goals:

+
+
+
    +
  • +

    Quickly accepting new edits to source files.

    +
  • +
  • +

    Providing type information about currently opened files for highlighting, completion, etc.

    +
  • +
+
+
+
+
+

Map Reduce

+
+
+

The first architecture is reminiscent of the map-reduce paradigm. +The idea is to split analysis into relatively simple indexing phase, and a separate full analysis phase.

+
+
+

The core constraint of indexing is that it runs on a per-file basis. +The indexer takes the text of a single file, parses it, and spits out some data about the file. +The indexer can’t touch other files.

+
+
+

Full analysis can read other files, and it leverages information from the index to save work.

+
+
+

This all sounds way too abstract, so let’s look at a specific example — Java. +In Java, each file starts with a package declaration. +The indexer concatenates the name of the package with a class name to get a fully-qualified name (FQN). +It also collects the set of methods declared in the class, the list of superclasses and interfaces, etc.

+
+
+

Per-file data is merged into an index which maps FQNs to classes. +Note that constructing this mapping is an embarrassingly parallel task — all files are parsed independently. +Moreover, this map is cheap to update. +When a file change arrives, this file’s contribution from the index is removed, the text of the file is changed and the indexer runs on the new text and adds the new contributions. +The amount of work to do is proportional to the number of changed files, and is independent from the total number of files.

+
+
+

Let’s see how FQN index can be used to quickly provide completion.

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+
// File ./mypackage/Foo.java
+package mypackage;
+
+import java.util.*;
+
+public class Foo {
+    public static Bar f() {
+        return new Bar();
+    }
+}
+
+// File ./mypackage/Bar.java
+package mypackage;
+
+public class Bar {
+    public void g() {}
+}
+
+// File ./Main.java
+import mypackage.Foo;
+
+public class Main {
+    public static void main(String[] args) {
+        Foo.f().
+    }
+}
+
+
+
+
+

The user has just typed Foo.f()., and we need to figure out that the type of receiver expression is Bar, and suggest g as a completion.

+
+
+

First, as the file Main.java is modified, we run the indexer on this single file. +Nothing has changed (the file still contains the class Main with a static main method), so we don’t need to update the FQN index.

+
+
+

Next, we need to resolve the name Foo. +We parse the file, notice an import and look up mypackage.Foo in the FQN index. +In the index, we also find that Foo has a static method f, so we resolve the call as well. +The index also stores the return type of f, but, and this is crucial, it stores it as a string "Bar", and not as a direct reference to the class Bar.

+
+
+

The reason for that is import java.util.* in Foo.java. +Bar can refer either to java.util.Bar or to mypackage.Bar. +The indexer doesn’t know which one, because it can look only at the text of Foo.java. +In other words, while the index does store the return types of methods, it stores them in an unresolved form.

+
+
+

The next step is to resolve the identifier Bar in the context of Foo.java. +This uses the FQN index, and lands in the class mypackage.Bar. +There the desired method g is found.

+
+
+

Altogether, only three files were touched during completion. +The FQN index allowed us to completely ignore all the other files in the project.

+
+
+

One problem with the approach described thus far is that resolving types from the index requires a non-trivial amount of work. +This work might be duplicated if, for example, Foo.f is called several times. +The fix is to add a cache. +Name resolution results are memoized, so that the cost is paid only once. +The cache is blown away completely on any change — with an index, reconstructing the cache is not that costly.

+
+
+

To sum up, the first approach works like this:

+
+
+
    +
  1. +

    Each file is being indexed, independently and in parallel, producing a "stub" — a set of visible top-level declarations, with unresolved types.

    +
  2. +
  3. +

    All stubs are merged into a single index data structure.

    +
  4. +
  5. +

    Name resolution and type inference work primarily off the stubs.

    +
  6. +
  7. +

    Name resolution is lazy (we only resolve a type from the stub when we need it) and memoized (each type is resolved only once).

    +
  8. +
  9. +

    The caches are completely invalidated on every change

    +
  10. +
  11. +

    The index is updated incrementally:

    +
    +
      +
    • +

      if the edit doesn’t change the file’s stub, no change to the index is required.

      +
    • +
    • +

      otherwise, old keys are removed and new keys are added

      +
    • +
    +
    +
  12. +
+
+
+

Note an interesting interplay between "dumb" indexes which can be updated incrementally, and "smart" caches, which are re-computed from scratch.

+
+
+

This approach combines simplicity and stellar performance. +The bulk of work is the indexing phase, and you can parallelize and even distribute it across several machine. +Two examples of this architecture are IntelliJ and Sorbet.

+
+
+

The main drawback of this approach is that it works only when it works — not every language has a well-defined FQN concept. +I think overall it’s a good idea to design name resolution and module systems (mostly boring parts of a language) such that they work well with the map-reduce paradigm.

+
+
+
    +
  • +

    Require package declarations or infer them from the file-system layout

    +
  • +
  • +

    Forbid meta-programming facilities which add new top-level declarations, or restrict them in such way that they can be used by the indexer. +For example, preprocessor-like compiler plugins that access a single file at a time might be fine.

    +
  • +
  • +

    Make sure that each source element corresponds to a single semantic element. +For example, if the language supports conditional compilation, make sure that it works during name resolution (like Kotlin’s expect/actual) and not during parsing (like conditional compilation in most other languages). +Otherwise, you’d have to index the same file with different conditional compilation settings, and that is messy.

    +
  • +
  • +

    Make sure that FQNs are enough for most of the name resolution.

    +
  • +
+
+
+

The last point is worth elaborating. Let’s look at the following Rust example:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+
// File: ./foo.rs
+trait T {
+    fn f(&self) {}
+}
+// File: ./bar.rs
+struct S;
+
+// File: ./somewhere/else.rs
+impl T for S {}
+
+// File: ./main.s
+use foo::T;
+use bar::S
+
+fn main() {
+    let s = S;
+    s.f();
+}
+
+
+
+
+

Here, we can easily find the S struct and the T trait (as they are imported directly). +However, to make sure that s.f indeed refers to f from T, we also need to find the corresponding impl, and that can be roughly anywhere!

+
+
+
+
+

Leveraging Headers

+
+
+

The second approach places even more restrictions on the language. +It requires:

+
+
+
    +
  • +

    a "declaration before use" rule,

    +
  • +
  • +

    headers or equivalent interface files.

    +
  • +
+
+
+

Two such languages are C++ and OCaml.

+
+
+

The idea of the approach is simple — just use a traditional compiler and snapshot its state immediately after imports for each compilation unit. +An example:

+
+
+
+
1
+2
+3
+4
+5
+
#include <iostream>
+
+void main() {
+    std::cout << "Hello, World!" << std::
+}
+
+
+
+
+

Here, the compiler fully processes iostream (and any further headers included), snapshots its state and proceeds with parsing the program itself. +When the user types more characters, the compiler restarts from the point just after the include. +As the size of each compilation unit itself is usually reasonable, the analysis is fast.

+
+
+

If the user types something into the header file, then the caches need to be invalidated. +However, changes to headers are comparatively rare, most of the code lives in .cpp files.

+
+
+

In a sense, headers correspond to the stubs of the first approach, with two notable differences:

+
+
+
    +
  • +

    It’s the user who is tasked with producing a stub, not the tool.

    +
  • +
  • +

    Unlike stubs, headers can’t be mutually recursive. +Stubs store unresolved types, but includes can be snapshotted after complete analysis.

    +
  • +
+
+
+

The two examples of this approach are Merlin of OCaml and clangd.

+
+
+

The huge benefit of this approach is that it allows re-use of an existing batch compiler. +The two other approaches described in this article typically result in compiler re-writes. +The drawback is that almost nobody likes headers and forward declarations.

+
+
+
+
+

Intermission: Laziness vs Incrementality

+
+
+

Note how neither of the two approaches is incremental in any interesting way. +It is mostly "if something has changed, let’s clear the caches completely". +There’s a tiny bit of incrementality in the index update in the first approach, but it is almost trivial — remove old keys, add new keys.

+
+
+

This is because it’s not the incrementality that makes and IDE fast. +Rather, it’s laziness — the ability to skip huge swaths of code altogether.

+
+
+

With map-reduce, the index tells us exactly which small set of files is used from the current file and is worth looking at. +Headers shield us from most of the implementation code.

+
+
+
+
+

Query-based Compiler

+
+
+

Welcome to my world…​

+
+
+

Rust fits the described approaches like a square peg into a round hole.

+
+
+

Here’s a small example:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
#[macro_use]
+extern crate bitflags;
+
+bitflags! {
+    struct Flags: u32 {
+        const A = 0b00000001;
+        const B = 0b00000010;
+        const C = 0b00000100;
+        const ABC = Self::A.bits | Self::B.bits | Self::C.bits;
+    }
+}
+
+
+
+
+

bitflags is macro which comes from another crate and defines a top-level declaration. +We can’t put the results of macro expansion into the index, because it depends on a macro definition in another file. +We can put the macro call itself into an index, but that is mostly useless, as the items, declared by the macro, would miss the index.

+
+
+

Here’s another one:

+
+
+
+
1
+2
+3
+4
+
mod foo;
+
+#[path = "foo.rs"]
+mod bar;
+
+
+
+
+

Modules foo and bar refer to the same file, foo.rs, which effectively means that items from foo.rs are duplicated. +If foo.rs contains the declaration struct S;, then foo::S and bar::S are different types. +You also can’t fit that into an index, because those mod declarations are in a different file.

+
+
+

The second approach doesn’t work either. +In C++, the compilation unit is a single file. +In Rust, the compilation unit is a whole crate, which consists of many files and is typically much bigger. +And Rust has procedural macros, which means that even surface analysis of code can take an unbounded amount of time. +And there are no header files, so the IDE has to process the whole crate. +Additionally, intra-crate name resolution is much more complicated (declaration before use vs. fixed point iteration intertwined with macro expansion).

+
+
+

It seems that purely laziness based models do not work for Rust. +The minimal feasible unit of laziness, a crate, is still too big.

+
+
+

For this reason, in rust-analyzer we resort to a smart solution. +We compensate for the deficit of laziness with incrementality. +Specifically, we use a generic framework for incremental computation — salsa.

+
+
+

The idea behind salsa is rather simple — all function calls inside the compiler are instrumented to record which other functions were called during their execution. +The recorded traces are used to implement fine-grained incrementality. +If after modification the results of all of the dependencies are the same, the old result is reused.

+
+
+

There’s also an additional, crucial, twist — if a function is re-executed due to a change in dependency, the new result is compared with the old one. +If despite a different input they are the same, the propagation of invalidation stops.

+
+
+

Using this engine, we were able to implement a rather fancy update strategy. +Unlike the map reduce approach, our indices can store resolved types, which are invalidated only when a top-level change occurs. +Even after a top-level change, we are able to re-use results of most macro expansions. +And typing inside of a top-level macro also doesn’t invalidate caches unless the expansion of the macro introduces a different set of items.

+
+
+

The main benefit of this approach is generality and correctness. +If you have an incremental computation engine at your disposal, it becomes relatively easy to experiment with the way you structure the computation. +The code looks mostly like a boring imperative compiler, and you are immune to cache invalidation bugs (we had one, due to procedural macros being non-deterministic).

+
+
+

The main drawback is extra complexity, slower performance (fine-grained tracking of dependencies takes time and memory) and a feeling that this is a somewhat uncharted territory yet :-)

+
+
+
+ +
+ +
+ + + + + diff --git a/blog/2020/08/20/financial-report.html b/blog/2020/08/20/financial-report.html new file mode 100644 index 00000000..1188a70a --- /dev/null +++ b/blog/2020/08/20/financial-report.html @@ -0,0 +1,147 @@ + + + + + + + + + + 2020[..6] Financial Report + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

2020[..6] Financial Report

+ +
+

This is a short financial report for Open Collective for the first half of 2020, from 01-01-2020 until 30-06-2020.

+
+
+

As we haven’t noted the exact date of the previous report, the numbers in this one will be approximate :( +It probably is good that @matklad didn’t choose accounting as a career. +The next report should be exact though.

+
+
+

We’ve got about 14000 EUR on open collective after fees. +Of which we distributed 12000 EUR by splitting it into two buckets:

+
+
+
    +
  • +

    50% for Ferrous Systems

    +
  • +
  • +

    50% for contributors, not affiliated with Ferrous

    +
  • +
+
+
+

We were able to pay more than our usual 20% to contributors because we managed to do some direct contracting work for rust-analyzer.

+
+
+

Ferrous share went to paying for part of @matklad's time and for administrative tasks. +3000 EUR were paid to @flodiebold for chalk integration and various other type system improvements. +3000 EUR were paid to @edwin0cheng for implementing most of declarative and procedural macro support.

+
+
+

Our biggest Open Collective sponsors in the first half of 2020 are:

+
+
+ +
+
+

<3

+
+
+

If you use rust-analyzer professionally, consider asking your company to sponsor the development of this project. +We are also planning to announce a couple of new ways to support rust-analyzer development soon, stay tuned!

+
+
+

As a reminder, we publish weekly changelogs to report the progress on rust-analyzer and explain where the money goes.

+
+
+ +
+ + + + + diff --git a/blog/2020/09/16/challeging-LR-parsing.html b/blog/2020/09/16/challeging-LR-parsing.html new file mode 100644 index 00000000..ce4781a5 --- /dev/null +++ b/blog/2020/09/16/challeging-LR-parsing.html @@ -0,0 +1,443 @@ + + + + + + + + + + Challenging LR Parsing + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Challenging LR Parsing

+ +
+
+
+

This post is a direct response to Which Parsing Approach?. +If you haven’t read that article, do it now — it is the best short survey of the lay of the land of modern parsing techniques. +I agree with conclusion — LR parsing is the way to go if you want to do parsing “properly”. +I reasoned the same a couple of years ago: Modern Parser Generator.

+
+
+

However, and here’s the catch, rust-analyzer uses a hand-written recursive descent / Pratt parser. +One of the reasons for that is that I find existing LR parser generators inadequate for production grade compiler/IDE. +In this article, I want to list specific challenges for the authors of LR parser generators.

+
+
+
+
+

Error Resilience

+
+
+

Consider this incomplete snippet of Rust code:

+
+
+
+
1
+2
+3
+4
+5
+
fn foo(
+
+struct S {
+   f: u32
+}
+
+
+
+
+

I want to see an LR parser which produces the following syntax tree +(from Show Syntax Tree rust-analyzer command, with whitespace nodes elided for clarity):

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+
SOURCE_FILE@0..32
+  FN@0..7
+    FN_KW@0..2 "fn"
+    NAME@3..6
+      IDENT@3..6 "foo"
+    PARAM_LIST@6..7
+      L_PAREN@6..7 "("
+  STRUCT@9..31
+    STRUCT_KW@9..15 "struct"
+    NAME@16..17
+      IDENT@16..17 "S"
+    RECORD_FIELD_LIST@18..31
+      L_CURLY@18..19 "{"
+      RECORD_FIELD@23..29
+        NAME@23..24
+          IDENT@23..24 "f"
+        COLON@24..25 ":"
+        PATH_TYPE@26..29
+          PATH@26..29
+            PATH_SEGMENT@26..29
+              NAME_REF@26..29
+                IDENT@26..29 "u32"
+      R_CURLY@30..31 "}"
+
+
+
+
+

The most error-resilient LR-style parser I know, tree sitter, produces this instead (tree sitter is GLR, this is not the style of parsing advocated by the article):

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
source_file [0, 0] - [5, 0])
+  ERROR [0, 0] - [4, 1])
+    identifier [0, 3] - [0, 6])
+    struct_pattern [2, 0] - [4, 1])
+      type: type_identifier [2, 0] - [2, 6])
+      ERROR [2, 7] - [2, 8])
+        identifier [2, 7] - [2, 8])
+      field_pattern [3, 3] - [3, 9])
+        name: field_identifier [3, 3] - [3, 4])
+        pattern: identifier [3, 6] - [3, 9])
+
+
+
+
+

Note two things about the rust-analyzer’s tree:

+
+
+
    +
  • +

    There’s an (incomplete) “function” node for fn foo(. +Unclosed parenthesis doesn’t preclude the parser from recognizing parameter list.

    +
  • +
  • +

    Incomplete function does not prevent struct definition from being recognized.

    +
  • +
+
+
+

These are important for IDE support.

+
+
+

For example, suppose that the cursor is just after (. +If we have rust-analyzer’s syntax tree, than we can figure out that we are completing a function parameter. +If we are to get fancy we might find the calls to the (not yet fully written) foo, run type inference to figure out the type of the first argument, and than suggest parameter name & type based on that (not currently implemented — there’s soooooo much yet to be done in rust-analyzer). +And correctly recognizing struct S is important to not break type-inference in the code which uses S.

+
+
+

There’s a lot of literature about error recovery for LR parsers, how come academics haven’t figured this out already? +I have a bold claim to make: error-recovery research in academia is focusing on a problem irrelevant for IDEs. +Specifically, the research is focused on finding “minimal cost repair sequence”:

+
+
+
    +
  • +

    a set of edit operations is defined (skip, change or insert token),

    +
  • +
  • +

    a “cost” metric is defined to distinguish big and small edits,

    +
  • +
  • +

    an algorithm is devised to find the smallest edit which makes the current text parse.

    +
  • +
+
+
+

This is a very academia-friendly problem — there’s a precise mathematical formulation, there’s an obvious brute force solution (try all edits), and there’s ample space for finding polynomial algorithm.

+
+
+

But IDEs don’t care about actually guessing & repairing the text! +They just need to see as much of (possibly incomplete) syntax nodes in the existing text as possible. +When rust-analyzer’s parser produces

+
+
+
+
1
+2
+3
+
  PARAM_LIST@6..7
+    L_PAREN@6..7 "("
+STRUCT@9..31
+
+
+
+
+

it doesn’t think “Oh, I need to insert ) here to complete the list of parameters”. +Rather, it sees struct and thinks “Oh wow, didn’t expect that! I guess I’ll just stop parsing parameter list right here”.

+
+
+

So, here’s

+
+
+ + + + + +
+ + +
First Challenge
+Design error resilient (and not just error recovering) LR parsing algorithm. +
+
+
+

Note that error resilience is a topic orthogonal to error reporting. +I haven’t payed much attention to error reporting (in my experience, synchronous reporting of syntax errors in the editor compensates for bad syntax error messages), but it might be the case that MCRS are a good approach to there.

+
+
+
+
+

Expressions Grammar

+
+
+

Next challenge concerns expressing operator precedence and associativity. +Today, the standard solution is to write the grammar like this:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
%start Expr
+%%
+Expr: Expr "-" Term
+    | Term
+    ;
+Term: Term "*" Factor
+    | Factor
+    ;
+Factor: "INT"
+    ;
+
+
+
+
+

I argue that this is a nice solution for the machine, but is a terrible UX for a human. +Rust has 13 levels of precedence — no way I can come up with 13 different names like Term and Factor. +A much more readable formulation here is precedence table. +Interestingly, this is the case where hand-written Pratt parser is more declarative:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
fn infix_binding_power(op: char) -> Option<(u8, u8)> {
+    let res = match op {
+        '=' => (2, 1),
+        '?' => (4, 3),
+        '+' | '-' => (5, 6),
+        '*' | '/' => (7, 8),
+        '.' => (14, 13),
+        _ => return None,
+    };
+    Some(res)
+}
+
+
+
+
+ + + + + +
+ + +
Second Challenge
+Incorporate precedence and associativity tables into the surface syntax of the grammar. +
+
+
+
+
+

IDE Support

+
+
+

Finally, please provide decent IDE support ^^ +Here are the features I’d consider simple and essential:

+
+
+ +
+
+

A somewhat more complex, but also crucial feature is live preview. +It should be possible to edit the grammar or the sample text, and immediately see the resulting parse tree. +Like this: https://www.youtube.com/watch?v=gb1MJnTcvds&feature=youtu.be (but, of course, the update should be instant). +For UX, I suggest using doctest syntax:

+
+
+
+
1
+2
+
/// fn foo() { }
+Fn = 'fn' Name ParamList Block
+
+
+
+
+

Today, it takes only a day to implement a basic LSP server and get all the basic features working in most popular editors. +Implementing live-preview would be more involved as there’s no existing LSP request for this. +But writing a custom extension isn’t hard either, so add another day for live preview.

+
+
+ + + + + +
+ + +
Third Challenge
+Implement LSP server which provides basic IDE features, as well as live preview. +
+
+
+
+
+

Challenge Responses

+
+
+

Folks fom Galois develop a classy-named DaeDaLus — a flexible data description language for generating parsers with data dependencies. +DaeDaLus makes an impressive attempt at solving the second challenge. +The language is powerful enough to just +directly encode +Pratt-style precedence table. +Even a +more declarative +encoding might be possible, although it doesn’t fully work at the time of writing.

+
+
+
+
+ +
+ + + + + diff --git a/blog/2020/09/28/how-to-make-a-light-bulb.html b/blog/2020/09/28/how-to-make-a-light-bulb.html new file mode 100644 index 00000000..98bcd54c --- /dev/null +++ b/blog/2020/09/28/how-to-make-a-light-bulb.html @@ -0,0 +1,358 @@ + + + + + + + + + + How to Make a 💡? + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

How to Make a 💡?

+ +
+
+
+
+
+

rust-analyzer is a new "IDE backend" for the Rust programming language. +Support rust-analyzer on Open Collective or GitHub Sponsors.

+
+
+
+
+

My favorite IDE feature is a light bulb — a little 💡 icon that appears next to a cursor which you can click on to apply a local refactoring. +In the first part of this post, I’ll talk about why this little bulb is so dear to my heart, and in the second part I’ll go into some implementation tips and tricks. +First part should be interesting for everyone, while the second part is targeting folks implementing their own IDEs / language serves.

+
+
+
+
+

The Mighty 💡

+
+
+

Post-IntelliJ IDEs, with their full access to syntax and semantics of the program, can provide almost an infinite amount of smart features. +The biggest problem is not implementing the features, the biggest problem is teaching the users that a certain feature exists.

+
+
+

One possible UI here is a fuzzy-searchable command palette:

+
+
+
+emacs helm +
+
+
+

This helps if the user (a) knows that some command might exist, and (b) can guess its name. +Which is to say: not that often.

+
+
+

Contrast it with the light bulb UI:

+
+
+

First, by noticing a 💡 you see that some feature is available in this particular context:

+
+
+
+bulb1 +
+
+
+

Then, by clicking the 💡 (ctrl+. in VS Code / Alt+Enter in IntelliJ) you can see a short list of actions applicable in the current context:

+
+
+
+bulb2 +
+
+
+

This is a rare case where UX is both:

+
+
+
    +
  • +

    Discoverable, which makes novices happy.

    +
  • +
  • +

    Efficient, to make expert users delighted as well.

    +
  • +
+
+
+

I am somewhat surprised that older editors, like Emacs or Vim, still don’t have the 💡 concept built-in. +I don’t know which editor/IDE pioneered the light bulb UX; if you know, please let me know the comments!

+
+
+
+
+

How to Implement a 💡?

+
+
+

If we squint hard enough, an IDE/LSP server works a bit like a web server. +It accepts requests like “what is the definition of symbol on line 23?”, processes them according to the language semantics and responds back. +Some requests also modify the data model itself ("here’s the new text of foo.rs file: '…​'"). +Generally, the state of the world might change between any two requests.

+
+
+
+
+

In single-process IDEs (IntelliJ) requests like code completion generally modify the data directly, as the IDE itself is the source of truth.

+
+
+

In client-server architecture (LSP), the server usually responds with a diff and receives an updated state in a separate request — client holds the true state.

+
+
+
+
+

This is relevant for 💡 feature, as it usually needs two requests. +The first request takes the current position of the cursor and returns the list of available assists. +If the list is not empty, the 💡 icon is shown in the editor.

+
+
+

The second request is made when/if a user clicks a specific assist; this request calculates the corresponding diff.

+
+
+

Both request are initiated by user’s actions, and arbitrary events might happen between the two. +Hence, assists can’t assume that the state of the world is intact between list and apply actions.

+
+
+

This leads to the following interface for assists (lightly adapted +IntentionAction +from IntelliJ +)

+
+
+
+
1
+2
+3
+4
+5
+
interface IntentionAction {
+  val name: String
+  fun isAvailable(position: CursorPosition): Boolean
+  fun invoke(position: CursorPosition): Diff
+}
+
+
+
+
+

That is, to implement a new assist, you provide a class implementing IntentionAction interface. +The IDE platform then uses isAvailable and getName to populate the 💡 menu, and calls invoke to apply the assist if the user asks for it.

+
+
+

This interface has exactly the right shape for the IDE platform, but is awkward to implement.

+
+
+
+
+

This is a specific instance of a more general phenomenon. +Each abstraction has two faces — one for the implementer, one for the user. +Two sides often have slightly different requirements, but tend to get implemented in a single language construct by default.

+
+
+
+
+

Almost always, the code at the start of isAvailable and invoke would be similar. +Here’s a bigger example from PyCharm: +isAvailable +and +invoke.

+
+
+

To reduce this duplication in Intellij Rust, I introduced a convenience base class RsElementBaseIntentionAction:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
class RsIntentionAction<Ctx>: IntentionAction {
+  fun getContext(position: CursorPosition): Ctx?
+  fun invoke(position: CursorPosition, ctx: Ctx): Diff
+
+  override fun isAvailable(position: CursorPosition) =
+    getContext(position) != null
+
+  override fun invoke(position: CursorPosition) =
+    invoke(position, getContext(position)!!)
+}
+
+
+
+
+

The duplication is removed in a rather brute-force way — common code between isAvailable and invoke is reified into (assist-specific) Ctx data structure. +This gets the job done, but defining a Context type (which is just a bag of stuff) is tedious, as seen in, for example, InvertIfIntention.kt.

+
+
+

rust-analyzer uses what I feel is a slightly better pattern. +Recall our original analogy between an IDE and a web server. +If we stretch it even further, we may say that assists are similar to an HTML form. +The list operation is analogous to the GET part of working with forms, and apply looks like a POST. +In an HTTP server, the state of the world also changes between GET /my-form and POST /my-form, so an HTTP server also queries the database twice.

+
+
+

Django web framework has a nice pattern to implement this — function based views.

+
+
+
+
1
+2
+3
+4
+5
+6
+7
+
+def my_form(request):
+  ctx = fetch_stuff_from_postgress()
+  if request.method == 'POST':
+    # apply changes ...
+  else:
+    # render template ...
+
+
+
+
+

A single function handles both GET and POST. +Common part is handled once, differences are handled in two branches of the if, a runtime parameter selects the branch of if.

+
+
+
+
+

See Django Views — The Right Way for the most recent discussion why function based views are preferable to class based views.

+
+
+
+
+

This pattern, translated from a Python web framework to a Rust IDE, looks like this:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+
enum MaybeDiff {
+  Delayed,
+  Diff(Diff),
+}
+
+
+fn assist(position: CursorPosition, delay: bool)
+    -> Option<MaybeDiff>
+{
+  let ctx = compute_common_context(position)?;
+  if delay {
+    return Some(MaybeDiff::Delayed);
+  }
+
+  let diff = compute_diff(position, ctx);
+  Some(MaybeDiff::Diff(diff))
+}
+
+
+
+
+

The Context type got dissolved into a set of local variables. +Or, equivalently, Context is a reification of control flow — it is a set of local variables which are live before the if. +One might even want to implement this pattern with coroutines/generators/async, but there’s no real need to, as there’s only one fixed suspension point.

+
+
+

For a non-simplified example, take a look at invert_if.rs.

+
+
+
+
+ +
+ + + + + diff --git a/blog/2020/10/24/introducing-ungrammar.html b/blog/2020/10/24/introducing-ungrammar.html new file mode 100644 index 00000000..b5b40f09 --- /dev/null +++ b/blog/2020/10/24/introducing-ungrammar.html @@ -0,0 +1,391 @@ + + + + + + + + + + Introducing Ungrammar + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Introducing Ungrammar

+ +
+
+
+
+
+

rust-analyzer is a new "IDE backend" for the Rust programming language. +Support rust-analyzer on Open Collective or GitHub Sponsors.

+
+
+
+
+

This post introduces ungrammars: a new formalism for describing concrete syntax trees. +The ideas behind ungrammar are simple, and are more valuable than a specific implementation. +Nonetheless, an implementation is available here:

+
+ +
+

At a glance, ungrammar looks a lot like EBNF notation:

+
+
+
+
1
+2
+3
+4
+
Module =
+  Attr* Visibility?
+  'mod' Name
+  (ItemList | ';')
+
+
+
+
+

The two differ at a fundamental level though:

+
+
+ + + + + +
+ + +
+

EBNF specifies a language — a set of strings.

+
+
+

Ungrammar describes concrete syntax tree — a set of data types (or a set of trees, if you will).

+
+
+
+
+

That’s why it is called ungrammar!

+
+
+
+
+

Motivation

+
+
+

So, what exactly does “describing syntax trees” mean and why is it useful? +When writing an IDE, one of the core data structure is the concrete syntax tree. +It is a full-fidelity tree which represents the original source code in detail, including parenthesis, comments, and whitespace. +CSTs are used for initial analysis of the language. +They are also a vocabulary type for refactors. +Although the ultimate result of a refactor is a text diff, tree modification is a more convenient internal representation.

+
+
+
+
+

If you want to learn more about concrete syntax trees, check out this guide, check out these two links:

+
+ +
+
+
+

At the lowest level, the CST is typically unityped: there’s some Node superclass, which has a collection of Node children and an optional Node parent. +On top of this raw layer, a more AST-like API is provided: Struct has a .name() and a list of .fields(), etc. +This typed API is huge! +For rust-analyzer, it is comprised of more than 130 types! +And it is also more detailed than a typical AST: Struct also has .l_curly() and .r_curly().

+
+
+

What’s worse, this API changes a lot, especially at the beginning. +You may start with nesting .fields() directly under the Struct, but then introduce a StructFields node for everything between the curly braces to share the code with enum variants.

+
+
+

In short, writing this by hand sucks :-) +Ungrammar is a notation to concisely describe the structure of the syntax tree, which can be used by a code generator to build an API in the target language. +If you’ve heard about ASDL, ungrammar is ASDL for concrete syntax trees. +For rust-analyzer’s case, that means taking the following input:

+
+
+
+
1
+2
+3
+4
+
Module =
+  Attr* Visibility?
+  'mod' Name
+  (ItemList | ';')
+
+
+
+
+

And generating the following output:

+
+
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
impl ast::AttrsOwner      for Module {}
+impl ast::VisibilityOwner for Module {}
+impl ast::NameOwner       for Module {}
+impl Module {
+    pub fn mod_token(&self)       -> Option<SyntaxToken> { ... }
+    pub fn item_list(&self)       -> Option<ItemList>    { ... }
+    pub fn semicolon_token(&self) -> Option<SyntaxToken> { ... }
+}
+
+
+
+
+

In typical parser generators, something similar can be achieved by generating both the parser and the syntax tree from the same grammar. +This works to some extent, but has an inherent problem that the shape of the tree you want for the programmatic API, and the shape of the grammar you need to implement the parser are often different. +“Technical” transformations like left-recursion elimination don’t affect the language described by the grammar, but completely change the shape of the parse tree. +In contrast, ungrammar focuses solely on the second task, which radically reduces the complexity of the grammar. +In rust-analyzer, it is paired with a hand-written parser.

+
+
+

Treated as an ordinary (context free) grammar, ungrammar describes a superset of the language. +For example, for programmatic API it might be convenient to treat commas in comma-separate lists as a part of the list element +(rust-analyzer doesn’t do this yet, but it should). +This leads to the following ungrammar, which obviously doesn’t treat commas precisely:

+
+
+
+
1
+2
+3
+4
+5
+
FieldList =
+  '{' Field* '}'
+
+Field:
+  Name ':' Type ','?
+
+
+
+
+

Similarly, ungrammar defines binary and unary expressions, but doesn’t specify their relative precedence and associativity.

+
+
+

An interesting side-effect is that the resulting grammars turn out to be pretty human readable. +For example, a full production ready Rust grammar takes about 600 short lines:

+
+ +
+

This might be a good fit for reference documentation!

+
+
+
+
+

Nuts and Bolts

+
+
+

Now that we’ve answered the “why” question, let’s look at how ungrammar works.

+
+
+

Like grammars, ungrammars operate with a set of terminals and non-terminals. +Terminals are atomic indivisible tokens, like keyword fn or a semicolon ;. +Non-terminals are composite internal nodes consisting of other nodes and tokens.

+
+
+

Tokens (terminals) are spelled using single quotes: '+', 'fn', 'ident', 'int_number'. +Tokens are defined outside of an ungrammar, and don’t need to be declared to use them. +By convention, keywords and punctuation are represented using themselves, other tokens use lower_snake_case. +Because ungrammar describes trees, it uses parser tokens rather then lexer tokens. +What this means is that context-sensitive keywords like default are recognized as separate tokens ('default'). +The same goes for composite tokens like '<<'.

+
+
+

Nodes (non-terminals) are defined within the grammar by associating node name and a rule. +The ungrammar itself is a set of node definitions. +By convention, nodes are named using UpperCamelCase. +Each node must be defined exactly once. +Rules are regular expressions over the set of tokens and nodes.

+
+
+

Here’s ungrammar which describes ungrammar syntax:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
Grammar =
+  Node*
+
+Node =
+  name:'ident' '=' Rule
+
+Rule =
+  'ident'                // Alphabetic identifier
+| 'token_ident'          // Single quoted string
+| Rule*                  // Concatenation
+| Rule ('|' Rule)*       // Alternation
+| Rule '?'               // Zero or one repetition
+| Rule '*'               // Kleene star
+| '(' Rule ')'           // Grouping
+| label:'ident' ':' Rule // Labeled rule
+
+
+
+
+

The only unusual thing are optional labels. +By default, the names in the generated code are derived automatically from the type, but a label can be used as an override, or if there’s an ambiguity:

+
+
+
+
1
+2
+3
+
Expr =
+  literal
+| lhs:Expr op:('+' | '-' | '*' | '/') rhs:Expr
+
+
+
+
+

By convention, ungrammar is indented with two spaces, leading | is not indented.

+
+
+

Ungrammar doesn’t specify any particular way to lower rules to syntax node definitions. +It’s up to the generator to pattern-match rules to target language constructs: Java would use inheritance, Rust enums and TypeScript — union types. +The generator can accept only a subset of all possible rules. +An example of restriction might be: “Alternation (|) is only allowed at the top level. Alternatives must be other nodes”. +With this restriction, an alternative can be lowered to an interface definition with a number of subclasses.

+
+
+

The ungrammar crate provides a Rust API for parsing ungrammars, use it if your code generator is implemented in Rust. +Alternatively, ungrammar2json binary converts ungrammar syntax into equivalent JSON. +For an example of generator, take a look at gen_syntax in rst-analyzer.

+
+
+
+
+

Designing ungrammar

+
+
+

The concluding section briefly mentions some lessons learned.

+
+
+

The Node and Token terminology is inherited from rowan, rust-analyzer’s syntax library. +A better choice would be Tree and Token, as nodes contain other nodes and are trees.

+
+
+

Always single-quoting terminals is a nice concrete syntax for grammars. +Some parser generators I’ve worked with required only some terminals to be quoted, which, without knowing the rules by heart, reduced readability. +Similarly, spelling PLUS instead of '+' is not very readable.

+
+
+

“Recursive regular expressions” feels like a convenient syntax for CFGs. +Not restricting right-hand-side to be a flat list of alternatives, using () for grouping and allowing basic conveniences like * and ? subjectively makes the resulting grammars quiet readable. +The catch is that one needs union types and anonymous records to faithfully lower arbitrary regex-represented rule. +Placing restrictions into the specific generator, rather then the base language, feels like a better division of responsibility.

+
+
+

By quoting terminals, using punctuation (: = () | * ?) for syntax and completely avoiding keywords, ungrammar avoids clashes between names of productions and the syntax of ungrammar itself.

+
+
+
+
+ +
+ + + + + diff --git a/blog/2020/12/04/measuring-memory-usage-in-rust.html b/blog/2020/12/04/measuring-memory-usage-in-rust.html new file mode 100644 index 00000000..b5f62175 --- /dev/null +++ b/blog/2020/12/04/measuring-memory-usage-in-rust.html @@ -0,0 +1,262 @@ + + + + + + + + + + Measuring Memory Usage in Rust + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Measuring Memory Usage in Rust

+ +
+
+
+
+
+

rust-analyzer is a new "IDE backend" for the Rust programming language. +Support rust-analyzer on Open Collective or GitHub Sponsors.

+
+
+
+
+

This post documents a couple of fun tricks we use in rust-analyzer for measuring memory consumption.

+
+
+

In general, there are two broad approaches to profiling the memory usage of a program.

+
+
+

The first approach is based on “heap parsing”. +At a particular point in time, the profiler looks at all the memory currently occupied by the program (the heap). +In its raw form, the memory is just a bag of bytes, Vec<u8>. +However the profiler, using some help from the language’s runtime, is able to re-interpret these bytes as collections of object (“parse the heap”). +It then traverses the graph of objects and computes how many instances of each object are there and how much memory they occupy. +The profiler also tracks the ownership relations, to ferret out facts like “90% of strings in this program are owned by the Config struct”. +This is the approach I am familiar with from the JVM ecosystem. +Java’s garbage collector needs to understand the heap to search for unreachable objects, and the same information is used to analyze heap snapshots.

+
+
+

The second approach is based on instrumenting the calls to allocation and deallocation routines. +The profiler captures backtraces when the program calls malloc and free and constructs a flamegraph displaying “hot” functions which allocate a lot. +This is how, for example, heaptrack works (see also alloc geiger).

+
+
+

The two approaches are complementary. +If the problem is that the application does too many short-lived allocations (instead of re-using the buffers), it would be invisible for the first approach, but very clear in the second one. +If the problem is that, in a steady state, the application uses too much memory, the first approach would work better for pointing out which data structures need most attention.

+
+
+

In rust-analyzer, we are generally interested in keeping the overall memory usage small, and can make better use of heap parsing approach. +Specifically, most of the rust-analyzer’s data is stored in the incremental computation tables, and we want to know which table is the heaviest.

+
+
+

Unfortunately, Rust does not use garbage collection, so just parsing the heap bytes at runtime is impossible. +The best available alternative is instrumenting data structures for the purposes of measuring memory size. +That is, writing a proc-macro which adds fn total_size(&self) → usize method to annotated types, and calling that manually from the root of the data. +There is Servo’s malloc_size_of crate for doing that, but it is not published to crates.io.

+
+
+

Another alternative is running the program under valgrind to gain runtime introspectability. +Massif and and DHAT work that way. +Running with valgrind is pretty slow, and still doesn’t give Java-level fidelity.

+
+
+

Instead, rust-analyzer mainly relies on a much simpler approach for figuring out which things are heavy. +This is the first trick of this article:

+
+
+
+
+

Archimedes' Method

+
+
+

It’s relatively easy to find out the total memory allocated at any given point in time. +For glibc, there’s mallinfo function, a similar API exists for jemalloc. +It’s even possible to implement a GlobalAlloc which tracks this number.

+
+
+

And, if you can measure total memory usage, you can measure memory usage of any specific data structure by:

+
+
+
    +
  1. +

    measuring the current memory usage

    +
  2. +
  3. +

    dropping the data structure

    +
  4. +
  5. +

    measuring the current memory usage again

    +
  6. +
+
+
+

The difference between the two values is the size of the data structure. +And this is exactly what rust-analyzer does to find the largest caches: source.

+
+
+

Two small notes about this method:

+
+
+
    +
  • +

    It’s important to ask the allocator about the available memory, and not the operating system. +OS can only tell how many pages the program consumes. +Only the allocator knows which of those pages are free and which hold allocated objects.

    +
  • +
  • +

    When measuring relative sizes, it’s important to note the unaccounted-for amount in the end, such that the total adds up to 100%. +It might be the case that the bottleneck lies in the dark matter outside of explicit measurements!

    +
  • +
+
+
+
+
+

Amdahl’s Estimator

+
+
+

The second trick is related to the Amdahl’s law. +When optimizing a specific component, it’s important to note not only how much more efficient it becomes, but also overall contribution of the component to the system. +Making an algorithm twice as fast can improve the overall performance only by 5%, if the algorithm is only 10% of the whole task.

+
+
+

In rust-analyzer’s case, the optimization we are considering is adding interning to Name. +At the moment, a Name is represented with a small sized optimized string (24 bytes inline + maybe some heap storage):

+
+
+
+
1
+2
+3
+
struct Name {
+    text: SmolStr,
+}
+
+
+
+
+

Instead, we can use an interned index (4 bytes):

+
+
+
+
1
+2
+3
+
struct Name {
+    idx: u32
+}
+
+
+
+
+

However, just trying out this optimization is not easy, as an interner is a thorny piece of global state. +Is it worth it?

+
+
+

If we look at the Name itself, it’s pretty clear that the optimization is valuable: it reduces memory usage by 6x! +But how important is it in the grand scheme of things? +How to measure the impact of Names on overall memory usage?

+
+
+

One approach is to just apply the optimization and measure the improvement after the fact. +But there’s a lazier way: instead of making the Name smaller and measuring the improvement, we make it bigger and measure the worsening. +Specifically, its easy to change the Name to this:

+
+
+
+
1
+2
+3
+4
+5
+
struct Name {
+    text: SmolStr,
+    // Copy of `text`
+    _ballast: SmolStr,
+}
+
+
+
+
+

Now, if the new Name increases the overall memory consumption by N, we can estimate the total size of old Names as N as well, as they are twice as small.

+
+
+

Sometimes, quick and simple hacks works better than the finest instruments :).

+
+
+
+
+ +
+ + + + + diff --git a/blog/2021/08/03/financial-report-3.html b/blog/2021/08/03/financial-report-3.html new file mode 100644 index 00000000..c4089000 --- /dev/null +++ b/blog/2021/08/03/financial-report-3.html @@ -0,0 +1,147 @@ + + + + + + + + + + Financial Report #3 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Financial Report #3

+ +
+
+
+

This is the third financial status report of the rust-analyzer project.

+
+
+

Since the last update, we’ve set up a GitHub Sponsors profile in addition to the OpenCollective. You can support the project on whichever platform suits you best.

+
+
+

rust-analyzer has also grown from an experimental Ferrous Systems project to one that is slated to become Rust’s official solution for IDE support, with multiple companies directly funding work on it. +For that reason, we’ll be posting future financial updates on the Ferrous Systems blog, as Ferrous runs the OpenCollective and GitHub Sponsors fundraising.

+
+
+

(side note: if your company would like to support rust-analyzer, but these platforms don’t fit into your procurement process or are otherwise too hard to deal with, you can contact Ferrous Systems to figure out a solution)

+
+
+
+
+

2020-07-01 to 2021-02-28

+
+
+

In these 8 months, you’ve supported the project with approximately 32500€ on OpenCollective, and 6500€ on GitHub Sponsors.

+
+
+

Host share, payment processing, and bank account fees amounted to around 6000€, leaving us with 33000€.

+
+
+

We’ve paid 15000€ of that to rust-analyzer contributors, while the rest went towards funding Jonas' time on the project.

+
+
+
+
+

2021-03-01 to now

+
+
+

Since March, you’ve supported rust-analyzer with around 21000€ on OpenCollective and 6500€ on GitHub Sponsors, while the fees add up to around 1000€ so far.

+
+
+

We haven’t yet completed the contributor payouts for this time frame and will update when they happen.

+
+
+

Hired contributor: Lukas Wirth

+
+

Your constant funding enabled us to hire Lukas Wirth as a working student! Lukas is being coached by Jonas.

+
+
+
+ +
+

We’ve also received a generous 50000€ grant from Kraken during this time. This enabled us to hire with confidence. You can read their announcement here blog post. Thank you, Kraken!

+
+
+
+
+
+

Next Steps

+
+
+

In the coming months, we’ll complete the next batch of contributor payouts and follow up with another quick update.

+
+
+
+
+ +
+ + + + + diff --git a/blog/2021/11/21/ides-and-macros.html b/blog/2021/11/21/ides-and-macros.html new file mode 100644 index 00000000..12febaff --- /dev/null +++ b/blog/2021/11/21/ides-and-macros.html @@ -0,0 +1,479 @@ + + + + + + + + + + IDEs and Macros + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

IDEs and Macros

+ +
+
+
+

In this article, we’ll discuss challenges that language servers face when supporting macros. +This is interesting, because for rust-analyzer, macros are the hardest nut to crack.

+
+
+

While we use Rust as an example, the primary motivation here is to inform future language design. +As this is a case study rather than a thorough analysis, conclusions should be taken with a grain of salt. +In particular, I know that Scala 3 has a revamped macro system which might contain all the answers, but I haven’t looked at it deeply. +Finally, note that the text is unfairly biased against macros:

+
+
+
    +
  • +

    I write IDEs, so macros for me are a problem to solve, rather than a tool to use.

    +
  • +
  • +

    My personal code style tends towards preferring textual verbosity over using advanced language features, so I don’t use macros that often.

    +
  • +
+
+
+
+
+

Meta Challenges

+
+
+

The most important contributing factor to complexity is non-technical. +Macros are disproportionally hard to support in an IDE. +That is, if adding macros to a batch compiler takes X amount of work, making them play nicely with all IDE features takes . +This crates a pull for languages to naturally evolve more complex macro systems than can be reasonably supported by dev tooling. +The specific issues are as follows:

+
+
+
+
+

Mapping Back

+
+
+

First, macros can compromise the end-user experience, because some IDE features are just not well-defined in the presence of macros. +Consider this code, for example:

+
+
+
+
1
+2
+3
+4
+5
+
struct S { x: u32, y: u32 }
+
+fn make_S() -> S {
+  S { x: 92 } 💡
+}
+
+
+
+
+

Here, a reasonable IDE feature (known as intention, code action, assist or just 💡) is to suggest adding the rest of the fields to the struct literal:

+
+
+
+
1
+2
+3
+4
+5
+
struct S { x: u32, y: u32 }
+
+fn make_S() -> S {
+  S { x: 92, y: todo!() }
+}
+
+
+
+
+

Now, let’s add a simple compile-time reflection macro:

+
+
+
+
1
+2
+3
+4
+5
+6
+7
+
struct S { x: u32, y: u32 }
+
+reflect![
+  {
+    { 29 :x } S 😂
+  } S <- ()S_ekam nf
+];
+
+
+
+
+

What the macro does here is just to mirror every token. +The IDE has no troubles expanding this macro. +It also understands that, in the expansion, the y field is missing, and that y: todo!() can be added to the expansion as a fix. +What the IDE can’t do, though, is to figure out what should be changed in the code that the user wrote to achieve that effect. +Another interesting case to think about is: What if the macro just encrypts all identifiers?

+
+
+

This is where “disproportionally hard” bit lies. +In a batch compiler, code generally moves only forward through compilation phases. +The single exception is error reporting (which should say which source code is erroneous), but that is solved adequately by just tracking source positions in intermediate representations. +An IDE, in contrast, wants to modify the source code, and to do that precisely just knowing positions is not enough.

+
+
+

What makes the problem especially hard in Rust is that, for the user, it might not be obvious which IDE features are expected to work. +Let’s look at a variation of the above example:

+
+
+
+
1
+2
+3
+4
+
#[tokio::main]
+async fn main() {
+  S { x: 92 }; 💡
+}
+
+
+
+
+

What a user sees here is just a usual Rust function with some annotation attached. +Clearly, everything should just work, right? +But from an IDE point of view, this example isn’t that different from the reflect! one. +tokio::main is just an opaque bit of code which takes the tokens of the source function as an input, and produces some tokens as an output, which then replace the original function. +It just happens that the semantics of the original code is mostly preserved. +Again, tokio::main could have encrypted every identifier!

+
+
+

So, to make thing appear to work, an IDE necessarily involves heuristics in such cases. +Some possible options are:

+
+
+
    +
  • +

    Just completely ignore the macro. +This makes boring things like completion mostly work, but leads to semantic errors elsewhere.

    +
  • +
  • +

    Expand the macro, apply IDE features to the expansion, and try to heuristically lift them to the original source code +(this is the bit where “and now we just guess the private key used to encrypt an identifier” conceptually lives). +This is the pedantically correct approach, but it breaks most IDE features in minor and major ways. +What’s worse, the breakage is unexplainable to users: “I just added an annotation to the function, why I don’t get any completions?”

    +
  • +
  • +

    In the semantic model, maintain both the precisely analyzed expanded code and the heuristically analyzed source code. +When writing IDE features, try to intelligently use precise analysis from the expansion to augment knowledge about the source. +This still doesn’t solve all the problems, but solves most of them good enough such that the users are now completely befuddled by those rare cases where the heuristics break down.

    +
  • +
+
+
+ + + + + +
+ + +
First Lesson
+
+

Design meta programming facilities to be “append only”. +Macros should not change the meaning of existing code.

+
+
+

Avoid situations where what looks like normal syntax is instead an arbitrary language interpreted by a macro in a custom way.

+
+
+
+
+
+
+

Parallel Name Resolution

+
+
+

The second challenge is performance and phasing. +Batch compilers typically compile all the code, so the natural solution of just expanding all the macros works. +Or rather, there isn’t a problem at all here, you just write the simplest code to do the expansion and things just work. +The situation for an IDE is quite different — the main reason why the IDE is capable of working with keystroke latency is that it cheats. +It just doesn’t look at the majority of the code during code editing, and analyses the absolute minimum to provide a completion widget. +To be able to do so, an IDE needs help from the language to understand which parts of code can be safely ignored.

+
+
+

Read this other article to understand specific tricks IDEs can employ here. +The most powerful idea there is that, generally, an IDE needs to know only about top-level names, and it doesn’t need to look inside e.g. function bodies most of the time. +Ideally, an IDE processes all files in parallel, noting, for each file, which top-level names it contributes.

+
+
+

The problem with macros, of course, is that they can contribute new top-level names. +What’s worse, to understand which macro is invoked, an IDE needs to resolve its name, which depends on the set of top-level names already available.

+
+
+

Here’s a rather convoluted example which shows that in Rust name resolution and macro expansion are interdependent:

+
+
+
main.rs
+
+
1
+2
+
mod foo;
+foo::declare_mod!(bar, "foo.rs");
+
+
+
+
+
foo.rs
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
pub struct S;
+use super::bar::S as S2;
+
+macro_rules! _declare_mod {
+  ($name:ident, $path:literal) => {
+    #[path = $path]
+    pub mod $name;
+  }
+}
+pub(crate) use _declare_mod as declare_mod;
+
+
+
+
+

Semantics like this are what prevents rust-analyzer to just process every file in isolation. +Instead, there are bits in rust-analyzer that are hard to parallelize and hard to make incremental, where we just accept high implementation complexity and poor runtime performance.

+
+
+

There is an alternative — design meta programming such that it can work “file at a time”, and can be plugged into an embarrassingly parallel indexing phase. +This is the design that Sorbet, a (very) fast type checker for Ruby chooses: https://youtu.be/Gdx6by6tcvw?t=804. +I really like the motivation there. +It is a given that people would love to extend the language in some way. +It is also given that extensions wouldn’t be as carefully optimized as the core compiler. +So let’s make sure that the overall thing is still crazy fast, even if a particular extension is slow, by just removing extensions from the hot path. +(Compare this with VS Code architecture with out-of-process extensions, which just can’t block the editor’s UI).

+
+
+

To flesh out this design bit:

+
+
+
    +
  • +

    All macros used in a compilation unit must be known up-front. +In particular, it’s not possible to define a macro in one file of a CU and use it in another.

    +
  • +
  • +

    Macros follow simplified name resolution rules, which are intentionally different from the usual ones to allow recognizing and expanding macros before name resolution. +For example, macro invocations could have a unique syntax, like name!, where name identifies a macro definition in the flat namespace of known-up-front macros.

    +
  • +
  • +

    Macros don’t get to access anything outside of the file with the macro invocation. +They can simulate name resolution for identifiers within the file, but can’t reach across files.

    +
  • +
+
+
+

Here, limiting macros to local-only information is a conscious design choice. +By limiting the power available to macros, we gain the properties we can use to make the tooling better. +For example, a macro can’t know a type of the variable, but because it can’t do that, we know we can re-use macro expansion results when unrelated files change.

+
+
+

An interesting hack to regain the full power of type-inspecting macros is to move the problem from the language to the tooling. +It is possible to run a code generation step before the build, which can use the compiler as a library to do a global semantic analysis of the code written by the user. +Based on the analysis results, the tool can write some generated code, which would then be processed by IDEs as if it was written by a human.

+
+
+ + + + + +
+ + +
Second Lesson
+
+

Pay close attention to the interactions between name resolution and macro expansions. +Besides well-known hygiene issues, another problem to look out for is accidentally turning name resolution from an embarrassingly parallel problem into an essentially sequential one.

+
+
+
+
+
+
+

Controllable Execution

+
+
+

The third problem is that, if macros are sufficiently powerful, the can do sufficiently bad things. +To give a simple example, here’s a macro which expands to an infinite number of “no”:

+
+
+
+
1
+2
+3
+4
+
macro_rules! m {
+	($($tt:tt)*) => { m!($($tt)* $($tt)*); }
+}
+m!(no);
+
+
+
+
+

The behavior of the command-line compiler here is to just die with an out-of-memory error, and that’s an OK behavior for this context. +Of course it’s better when the compiler gives a nice error message, but if it misbehaves and panics or loops infinitely on erroneous code, that is also OK — the user can just ^C the process.

+
+
+

For a long-running IDE process though, looping or eating all the memory is not an option — all resources need to be strictly limited. +This is especially important given that an IDE looks at incomplete and erroneous code most of the time, so it hits far more weird edge cases than a batch compiler.

+
+
+

Rust procedural macros are all-powerful, so rust-analyzer and IntelliJ Rust have to implement extra tricks to contain them. +While rustc just loads proc-macros as shared libraries into the process, IDEs load macros into a dedicated external process which can be killed without bringing the whole IDE down. +Adding IPC to an otherwise purely functional compiler code is technically challenging.

+
+
+

A related problem is determinism. +rust-analyzer assumes that all computations are deterministic, and it uses this fact to smartly forget about subsets of derived data, to save memory. +For example, once a file is analyzed and a set of declarations is extracted out of it, rust-analyzer destroys its syntax tree. +If the user than goes to a definition, rust-analyzer re-parses the file from source to compute precise ranges, highlights, etc. +At this point, it is important the tree is exactly the same. +If that’s not the case, rust-analyzer might panic because various indices from previously extracted declarations get out of sync. +But in the presence of non-deterministic procedural macros, rust-analyzer actually can get a different syntax tree. +So we have to specifically disable the logic for forgetting syntax trees for macros.

+
+
+ + + + + +
+ + +
Third Lessons
+
+

Make sure that macros are deterministic, and can be easily limited in the amount of resources they consume. +For a batch compiler, it’s OK to go with optimistic best-effort guarantees: “we assume that macros are deterministic and can crash otherwise”. +IDEs have stricter availability requirements, so they have to be pessimistic: “we cannot crash, so we assume that any macro is potentially non-deterministic”.

+
+
+
+
+

Curiously, similar to the previous point, moving metaprogramming to a code generation build system step sidesteps the problem, as you again can optimistically assume determinism.

+
+
+
+
+

Recap

+
+
+

When it comes to metaprogramming, IDEs have a harder time than the batch compilers. +To paraphrase Kernighan, if you design metaprogramming in your compiler as cleverly as possible, you are not smart enough to write an IDE for it.

+
+
+

Some specific hard macro bits:

+
+
+
    +
  • +

    In a compiler, code flows forward through the compilation pipeline. +IDE features generally flow back, from desugared code into the original source. +Macros can easily make for an irreversible transformation.

    +
  • +
  • +

    IDEs are fast because they know what to not look at. +Macros can hide what is there, and increase the minimum amount of work necessary to understand an isolated bit of code.

    +
  • +
  • +

    User-written macros can crash. +IDEs must not crash. +Running macros from an IDE is therefore fun :-)

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/blog/2021/12/30/2021-recap.html b/blog/2021/12/30/2021-recap.html new file mode 100644 index 00000000..137c0e57 --- /dev/null +++ b/blog/2021/12/30/2021-recap.html @@ -0,0 +1,393 @@ + + + + + + + + + + rust-analyzer in 2021 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

rust-analyzer in 2021

+ +
+
+
+ + + + + +
+ + +
+

In case this post piques your interest in contributing, consider checking out the Explaining rust-analyzer series on YouTube, the development docs on GitHub or visit our Zulip stream.

+
+
+
+
+

A lot has happened this year, so we want to take a brief look back at what we have achieved and what has yet to come.

+
+
+

Unfortunately, we did not manage to make rust-analyzer an official Rust project in 2021. But if all goes well this should change at the start of the coming year.

+
+
+

We started the year out by trying out a different meeting style from our usual weekly syncs on Zulip. We now have six-weeks sprints, with a steering meeting between them, where the working group gets together and discusses what topics and issues to focus on next.

+
+
+
+
+

(Proc-)Macros and Attributes

+
+
+

Probably one of the biggest improvements that landed this year was attribute +proc-macro support, implemented in #9128. Attributes are used pervasively in some Rust codebases, usually expanding to enough new items (functions, impl blocks etc.), and are essential in making the IDE work without significantly degrading the user experience. It took us roughly four months until we felt comfortable enough to enable their expansion by default, the main reason being the amount of code that had to be adapted to properly support them. +While this feature mostly works nowadays, there is still one big problem we are facing, that of how attributes can interact with incomplete code. This is described in issue #11014 in more detail, but attribute proc macros fail to expand when they encounter syntax errors, as is often the case when the user is typing. Of course, function-like proc macros are affected in a similar way. We are still unsure about how to address this problem, so if you have any thoughts on the matter please comment on the linked issue.

+
+
+

Attributes aside, a lot of improvements landed for proc-macros in general. We enabled proc-macros by default, started loading proc-macros asynchronously and added support for multiple proc-macro ABIs, a finicky feature. The Rust proc-macro ABI is deliberately outside of usual stability guarantees. It constantly evolves, but with every change it breaks our proc-macro server. To counteract this we now try to at least support ~3 ABI versions which nominally correspond to the latest stable, beta and nightly toolchains. In practice, we support much older versions: 1.47 and later, at this moment.

+
+
+

It’s worth pointing out that parts of our proc macro infrastructure are used by IntelliJ Rust. It’s a great example of cross-pollination of ideas between the two projects — our proc_macro_srv is based on a design originally implemented in IntelliJ Rust!

+
+
+

Finally, declarative macros also saw some love. We switched to an NFA parser which brings us closer to how rustc handles them, added basic support for macro 2.0 and type position macros.

+
+
+
+
+

Local Item Resolution

+
+
+

Rust offers the ability to define new items inside of functions, consts and statics, making them effectively unnameable outside of these items. This idiom is seldom seen but is still useful at times. This is another piece of the language that is tricky to support, as an IDE wants to be lazy and only look at the big picture to understand a file’s structure. Unfortunately, local items require us to look inside function bodies and the like.

+
+
+

As such, finding a compromise took some work: +#7336, #7359, #7366, #7375, #7426, #7431, #7466, #7480, #7481, #7482, #7485, #7518, #7525, #7541, #7544, #7554, #7555, #7557, #7559, #7561, #7568, #7575, #7627, #9244. +The final piece, enabling it all, landed in #7614.

+
+
+
+
+

Chalk integration

+
+
+

We managed to switch our type representation to the one used by chalk, avoiding the need to convert between them every time we invoke the trait solver.

+
+
+

This work was done over a bunch of different pull requests: #7804, #7813, #7814, #7816, #7823, #7826, #7833, #7870, #8016, #7998, #8001, #8018, #8038, #8136, #8190, #8139, #8309, #8327, #8856, #8921, #8938, #8856, and we were finally able to fully move over in #8419.

+
+
+
+
+

Const Generic Params

+
+
+

We started working on basic const generics support, tracking issue #8655. This is one of the major pieces left for us to properly support, but also one of the more difficult ones. This problem becomes more and more apparent as libraries are switching over to using them. A notable example being nalgebra, which rust-analyzer is completely confused by.

+
+
+

For an ideal experience we would need to evaluate expressions in const generic position like rustc does. Unlike rustc though, we are unable to use miri. The reason for that is the fact that we do not share the internal data structures that the compiler and miri make use of, nor do we plan to do so in the near future. Because of this, we are required to build our own basic evaluator.

+
+
+

This isn’t the only problem we have. As it currently stands, the majority of rust-analyzer’s type checking codebase doesn’t even know about const generics (or lifetimes), and just assumes that only type parameters exist.

+
+
+
+
+

Mutable Immutable Syntax Trees

+
+
+

Rowan, our concrete syntax tree crate, has been adjusted to allow creating mutable copies of the immutable syntax trees. For more in-depth information behind this, check out this issue.

+
+
+

To put it short, the assists like to take existing syntax in a file, modify it slightly, then paste back the result, changing only a few parts of the code. What most assists did before was to reconstruct the output syntax trees out of the original tree nodes, with the changes inserted or left out. This is unfortunately a tedious process depending on the type of syntax node that has to be edited. These mutable immutable trees now allow us to instead mutably clone a tree, modify it in-place and paste this modified tree back as is.

+
+
+

This does not come without its own problems of course, with the main one being that iterating while mutating, which is now possible, will now panic or produce an incorrect tree.

+
+
+
+
+

The Code extension and server downloads

+
+
+

The final releases of the year brought two important changes to the way the language server binary is acquired. Until now, the extension called the GitHub API to find a matching release, and downloaded the server from there. In addition, if you opted in to the nightly channel, every day the extension would search for an updated VSIX.

+
+
+

While this suited us well for a long time, it had some downsides:

+
+
+
    +
  • +

    edge cases like MITM HTTPS proxies with untrusted certificates never worked

    +
  • +
  • +

    not being able to replace running executable on Windows (in case you had two running instances) has been a major source of complaints

    +
  • +
  • +

    Code checks for extension updates automatically, but the server was downloaded on activation. Many users had an unpleasant surprise when opening a Rust project without a working Internet connection.

    +
  • +
  • +

    GitHub Actions has been increasingly unreliable lately causing the nightly builds to fail very often. This broke the extension for users running the nightlies.

    +
  • +
  • +

    the download and update code brought a lot of non-essential complexity and even exposed a Node.js bug

    +
  • +
  • +

    the required client-side dependencies increased the surface for supply chain attacks

    +
  • +
+
+
+

So when the Marketplace added support for platform-specific and pre-release extensions, we starting using it with #11053, #11071 and #11106. On a related note, we also replaced the client-side unit testing framework with a bit of custom code, dropping our transitive dependencies by the dozens.

+
+
+

Unfortunately, the update changes exposed some issues with both the Code Marketplace and Open VSX (used by open-source builds of Code). This is discussed in detail here, the gist being that you currently need to take manual action when installing or updating the extension. The two issues have been reported upstream, so we hope they will be fixed soon.

+
+
+
+
+

General IDE Experience Improvements

+
+
+

We now support standalone Rust files (#8955), so just opening a single file should allow you to use most of rust-analyzer’s functionality that is not reliant on cargo.

+
+
+

We also improved and added a bunch of smaller features, some noteworthy ones are:

+
+ +
+

An impressive ~37 new assists have been implemented, some by the main contributors, but most by newcomers:

+
+ +
+
+
+

Conclusion

+
+
+

We made a bunch of progress this year, finishing up work on important functionality pieces as well as quality of life changes. But there is still a lot more to be done, as a quick look at the issue tracker may tell.

+
+
+

A big thanks to everyone supporting the project, be it through donations, contributions or cheers. We wish you a fortunate next year 🎉.

+
+
+
+
+ +
+ + + + + diff --git a/blog/2023/07/24/durable-incrementality.html b/blog/2023/07/24/durable-incrementality.html new file mode 100644 index 00000000..b5a7752d --- /dev/null +++ b/blog/2023/07/24/durable-incrementality.html @@ -0,0 +1,263 @@ + + + + + + + + + + Durable Incrementality + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Durable Incrementality

+ +
+

Salsa is an incremental computation engine used by rust-analyzer. +In this post, I will describe a particular optimization implemented in Salsa — durability system. +It was implemented quite a while ago, but only now it occurred to me that this is a nice self-contained trick, which I haven’t seen discussed elsewhere, and which is worth writing about.

+
+
+

Let’s start with a bird’s eye overview of how Salsa works. +Instrumentation is the first major component. +When a Salsa-based program is executed, it records dependencies between between function calls. +Afterwards, salsa gets a complete call graph like this:

+
+
+
+22d029d0 86f1 429d b8c6 9eefd46d0ed0 +
+
+
+

Here, square nodes signify inputs explicitly provided by the user, and round nodes are derived data computed using arbitrary Rust code. +Round node include both the function name, as well as the value of all arguments. +We call such bundle of function with arguments a query. +So, f("foo") and f("bar") are two different queries.

+
+
+

This query graph is then used to make computation incremental. +When just one input changes, it is clear that we don’t need to recompute the whole graph. +Salsa’s job is to figure out which queries have to be re-run.

+
+
+

Salsa’s particular approach enjoys two extra properties.

+
+
+

First, Salsa implements early cutoff optimization. +The most direct implementation of incremental computation would invalidate all queries that transitively depend on the changed input, and then re-run those queries (re-using results which do not depend on that input). +But it is possible to do better. +It may be the case that, even if one input to a query changes, the result is still the same. +For example, when parsing a file into an AST, changing the input source code to include an extra whitespace does not change the AST structure. +Early cutoff takes advantages of that, and re-uses results which depend on the AST, but not on the original source file.

+
+
+

AST computation “shields” the code higher in the stack from changes in the source code. +That is, of course, if you don’t store positions in the AST. +The bulk of work using an incremental system such as Salsa is figuring out things like this — introducing effective early cutoff shields and preventing volatile details like positions from accidentally sneaking in.

+
+
+

The second Salsa property is laziness. +When changing the input, one can go and eagerly mark reverse-dependencies as “this might have changed”. +This could create redundant work — if two modifications arrive one-after-another in a row, invalidating everything twice is wasteful. +Or there might be some top-level queries whose results are no longer interesting (e.g., we computed syntax highlighting for a file, but this file is no longer in the foreground in the editor). +Instead, in Salsa the work for tracking invalidation is done when a fresh result for a query is request.

+
+
+

More concretely, Salsa has a global version number. +Whenever an input changes, Salsa does only two things (so, O(1)):

+
+
+
    +
  • +

    change the input,

    +
  • +
  • +

    increment the global version.

    +
  • +
+
+
+

The rest of the work happens when Salsa runs a query. +It compares the version in the query with the global version. +If it is smaller, the query needs to be re-validated.

+
+
+ + + + + +
+ + +
+

To support early cutoff, the actual implementation is a bit more complex. +Each query carries two versions:

+
+
+
    +
  • +

    the latest version when we ensured that the result is up-to-date,

    +
  • +
  • +

    a potentially earlier version number when the result of the query was actually different.

    +
  • +
+
+
+

I’ll leave it at that, as going deeper into the Salsa algorithm isn’t the today’s topic.

+
+
+
+
+

The bottom line is that, when computing a top-level query after a change, Salsa does two graph traversals.

+
+
+

First, we flood the graph forward starting from the query, and reaching all the way down to the inputs. +If we realize that no inputs to the current top-level query have changed, we just increment version numbers of all flooded queries.

+
+
+

However, if at some point we hit an input that was changed since we looked at it last time, we start flooding the graph backwards, propagating the change and recomputing the queries. +This backward flooding stops when we hit a query whose result is unchanged despite a changed input (early cutoff).

+
+
+

And now we finally approach the topic of today’s article, durabilities. +Imagine a mostly no-op build (some input was changed, but no query looked at this particular input). +The only work Salsa needs to do here is to traverse the graph of queries and increment version numbers, no queries will be executed. +But the problem is that even just the graph of queries can be pretty large! +In the context of rust-analyzer, you could expect every function and type to create a bunch of queries, and there are a lot of functions and types in the standard library.

+
+
+

And this creates a feeling that there’s still room for optimization. +Imagine a typical rust-analyzer session, where a user types in their src/lib.rs. +With the Salsa described so-far (and with the actual Salsa before durability system was implemented), any change to src/lib.rs necessitates checking all the queries related to standard library (which adds up to about 300ms). +This seem wasteful: of course changing my local file can’t affect the standard library. +But how to explain this to Salsa? +What actually prevents stdlib from depending on local files? +Somebody could have sneaked up a stray

+
+
+
+
1
+2
+
#[path = "/home/your-user-name/projects/crab-life/src/lib.rs"]
+mod we_are_watching_you;
+
+
+
+
+

The high level idea is to divide queries into more durable and more volatile, and let the Salsa optimize accordingly. +We can expect the queries related to the standard library change less than the queries related to the user’s code. +Queries related to crates.io dependencies are somewhere in-between. +Note again that a “query” includes both a particular query function and its arguments. +We compute the same facts about stdlib code as about user’s code. +It’s just that the facts about stdlib depend on other stdlib facts, while user code facts depend on both stdlib and user facts.

+
+
+

To implement this idea, we go from a single version number to a version vector. +E.g., if we have three durability levels (volatile, normal, durable), then our version is a tuple of three numbers. +Additionally, every time we increment a particular component, we also need to increment all less durable components. +So, incrementing volatile increments just volatile, but incrementing normal increments both volatile and normal.

+
+
+

Then, we manually assign a durability level to each input. +Source files of standard library are marked as durable, source files of the current project are marked as volatile. +For derived queries, their durability is computed as the minimum durability among the immediate inputs (which is the same as minimal durability of the ground input queries of the transitive closure).

+
+
+

With this setup, the update-then-revalidate flow becomes:

+
+
+
    +
  • +

    Change an input.

    +
  • +
  • +

    Depending on the input’s durability, change one or more entries in the global version vector.

    +
  • +
  • +

    When checking a derived query, note its durability, and compare its version against the corresponding number from the versions vector.

    +
  • +
+
+
+

Let’s re-visit the example where the user types in lib.rs. +That’s a volatile input, so only one component of the version vector is incremented. +Files from the standard library are marked as durable. +So, when we subsequently try to validate any query related to standard library (e.g., give me all Clone impls in std), we notice that the durable version is the same (because this query ultimately depends only on files in the standard library), and skip over the entire query subgraph.

+
+
+

And that’s it! That’s the durability subsystem of Salsa. If we look at it from afar, it looks a bit like we took just a step back on laziness. +By adding just a tiny bit of invalidation which is computed eagerly (the durabilities vector), we significantly improved the efficiency of the system.

+
+
+ +
+ + + + + diff --git a/css/asciidoctor.css b/css/asciidoctor.css new file mode 100644 index 00000000..434aeecb --- /dev/null +++ b/css/asciidoctor.css @@ -0,0 +1,426 @@ +/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ +/* Uncomment @import statement to use as custom stylesheet */ +@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CDroid+Sans+Mono:400,700"; +article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block} +audio,video{display:inline-block} +audio:not([controls]){display:none;height:0} +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%} +a{background:none} +a:focus{outline:thin dotted} +a:active,a:hover{outline:0} +h1{font-size:2em;margin:.67em 0} +abbr[title]{border-bottom:1px dotted} +b,strong{font-weight:bold} +dfn{font-style:italic} +hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0} +mark{background:#ff0;color:#000} +code,kbd,pre,samp{font-family:monospace;font-size:1em} +pre{white-space:pre-wrap} +q{quotes:"\201C" "\201D" "\2018" "\2019"} +small{font-size:80%} +sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sup{top:-.5em} +sub{bottom:-.25em} +img{border:0} +svg:not(:root){overflow:hidden} +figure{margin:0} +fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em} +legend{border:0;padding:0} +button,input,select,textarea{font-family:inherit;font-size:100%;margin:0} +button,input{line-height:normal} +button,select{text-transform:none} +button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer} +button[disabled],html input[disabled]{cursor:default} +input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0} +button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} +textarea{overflow:auto;vertical-align:top} +table{border-collapse:collapse;border-spacing:0} +*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box} +html,body{font-size:100%} +body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Open Sans","DejaVu Sans",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased} +a:hover{cursor:pointer} +img,object,embed{max-width:100%;height:auto} +object,embed{height:100%} +img{-ms-interpolation-mode:bicubic} +.left{float:left!important} +.right{float:right!important} +.text-left{text-align:left!important} +.text-right{text-align:right!important} +.text-center{text-align:center!important} +.text-justify{text-align:justify!important} +.hide{display:none} +img,object,svg{display:inline-block;vertical-align:middle} +textarea{height:auto;min-height:50px} +select{width:100%} +.center{margin-left:auto;margin-right:auto} +.stretch{width:100%} +.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em} +div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr} +a{color:#2156a5;text-decoration:underline;line-height:inherit} +a:hover,a:focus{color:#1d4b8f} +a img{border:0} +p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility} +p aside{font-size:.875em;line-height:1.35;font-style:italic} +h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em} +h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0} +h1{font-size:2.125em} +h2{font-size:1.6875em} +h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em} +h4,h5{font-size:1.125em} +h6{font-size:1em} +hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0} +em,i{font-style:italic;line-height:inherit} +strong,b{font-weight:bold;line-height:inherit} +small{font-size:60%;line-height:inherit} +code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)} +ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit} +ul,ol{margin-left:1.5em} +ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em} +ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit} +ul.square{list-style-type:square} +ul.circle{list-style-type:circle} +ul.disc{list-style-type:disc} +ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0} +dl dt{margin-bottom:.3125em;font-weight:bold} +dl dd{margin-bottom:1.25em} +abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help} +abbr{text-transform:none} +blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd} +blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)} +blockquote cite::before{content:"\2014 \0020"} +blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)} +blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)} +@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2} +h1{font-size:2.75em} +h2{font-size:2.3125em} +h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em} +h4{font-size:1.4375em}} +table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede} +table thead,table tfoot{background:#f7f8f7} +table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left} +table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)} +table tr.even,table tr.alt{background:#f8f8f7} +table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6} +h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em} +h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400} +.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table} +.clearfix::after,.float-group::after{clear:both} +:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word} +:not(pre)>code.nobreak{word-wrap:normal} +:not(pre)>code.nowrap{white-space:nowrap} +pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed} +pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit} +pre>code{display:block} +pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal} +em em{font-style:normal} +strong strong{font-weight:400} +.keyseq{color:rgba(51,51,51,.8)} +kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap} +.keyseq kbd:first-child{margin-left:0} +.keyseq kbd:last-child{margin-right:0} +.menuseq,.menuref{color:#000} +.menuseq b:not(.caret),.menuref{font-weight:inherit} +.menuseq{word-spacing:-.02em} +.menuseq b.caret{font-size:1.25em;line-height:.8} +.menuseq i.caret{font-weight:bold;text-align:center;width:.45em} +b.button::before,b.button::after{position:relative;top:-1px;font-weight:400} +b.button::before{content:"[";padding:0 3px 0 2px} +b.button::after{content:"]";padding:0 2px 0 3px} +p a>code:hover{color:rgba(0,0,0,.9)} +#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em} +#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table} +#header::after,#content::after,#footnotes::after,#footer::after{clear:both} +#content{margin-top:1.25em} +#content::before{content:none} +#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0} +#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf} +#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px} +#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap} +#header .details span:first-child{margin-left:-.125em} +#header .details span.email a{color:rgba(0,0,0,.85)} +#header .details br{display:none} +#header .details br+span::before{content:"\00a0\2013\00a0"} +#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)} +#header .details br+span#revremark::before{content:"\00a0|\00a0"} +#header #revnumber{text-transform:capitalize} +#header #revnumber::after{content:"\00a0"} +#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem} +#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em} +#toc>ul{margin-left:.125em} +#toc ul.sectlevel0>li>a{font-style:italic} +#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0} +#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none} +#toc li{line-height:1.3334;margin-top:.3334em} +#toc a{text-decoration:none} +#toc a:active{text-decoration:underline} +#toctitle{color:#7a2518;font-size:1.2em} +@media screen and (min-width:768px){#toctitle{font-size:1.375em} +body.toc2{padding-left:15em;padding-right:0} +#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto} +#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em} +#toc.toc2>ul{font-size:.9em;margin-bottom:0} +#toc.toc2 ul ul{margin-left:0;padding-left:1em} +#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em} +body.toc2.toc-right{padding-left:0;padding-right:15em} +body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}} +@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0} +#toc.toc2{width:20em} +#toc.toc2 #toctitle{font-size:1.375em} +#toc.toc2>ul{font-size:.95em} +#toc.toc2 ul ul{padding-left:1.25em} +body.toc2.toc-right{padding-left:0;padding-right:20em}} +#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px} +#content #toc>:first-child{margin-top:0} +#content #toc>:last-child{margin-bottom:0} +#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em} +#footer-text{color:rgba(255,255,255,.8);line-height:1.44} +#content{margin-bottom:.625em} +.sect1{padding-bottom:.625em} +@media screen and (min-width:768px){#content{margin-bottom:1.25em} +.sect1{padding-bottom:1.25em}} +.sect1:last-child{padding-bottom:0} +.sect1+.sect1{border-top:1px solid #e7e7e9} +#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400} +#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em} +#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible} +#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none} +#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221} +details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em} +details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em} +.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Open Sans","DejaVu Sans",serif;font-size:1rem;font-style:italic} +table.tableblock.fit-content>caption.title{white-space:nowrap;width:0} +.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)} +table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit} +.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%} +.admonitionblock>table td.icon{text-align:center;width:80px} +.admonitionblock>table td.icon img{max-width:none} +.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase} +.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)} +.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0} +.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px} +.exampleblock>.content>:first-child{margin-top:0} +.exampleblock>.content>:last-child{margin-bottom:0} +.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px} +.sidebarblock>:first-child{margin-top:0} +.sidebarblock>:last-child{margin-bottom:0} +.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center} +.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0} +.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em} +@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}} +@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}} +.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8} +.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)} +.listingblock>.content{position:relative} +.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5} +.listingblock:hover code[data-lang]::before{display:block} +.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5} +.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"} +.listingblock pre.highlightjs{padding:0} +.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px} +.listingblock pre.prettyprint{border-width:0} +.prettyprint{background:#f7f7f8} +pre.prettyprint .linenums{line-height:1.45;margin-left:2em} +pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0} +pre.prettyprint li code[data-lang]::before{opacity:1} +pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none} +table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none} +table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal} +table.linenotable td.code{padding-left:.75em} +table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em} +pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em} +pre.pygments .lineno::before{content:"";margin-right:-.125em} +.quoteblock{margin:0 1em 1.25em 1.5em;display:table} +.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em} +.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify} +.quoteblock blockquote{margin:0;padding:0;border:0} +.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)} +.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0} +.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right} +.verseblock{margin:0 1em 1.25em} +.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility} +.verseblock pre strong{font-weight:400} +.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex} +.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic} +.quoteblock .attribution br,.verseblock .attribution br{display:none} +.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)} +.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none} +.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0} +.quoteblock.abstract{margin:0 1em 1.25em;display:block} +.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center} +.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf} +.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0} +.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem} +.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0} +table.tableblock{max-width:100%;border-collapse:separate} +p.tableblock:last-child{margin-bottom:0} +td.tableblock>.content>:last-child{margin-bottom:-1.25em} +td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0} +table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede} +table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0} +table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0} +table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0} +table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px} +table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0} +table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0} +table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0} +table.frame-all{border-width:1px} +table.frame-sides{border-width:0 1px} +table.frame-topbot,table.frame-ends{border-width:1px 0} +table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7} +th.halign-left,td.halign-left{text-align:left} +th.halign-right,td.halign-right{text-align:right} +th.halign-center,td.halign-center{text-align:center} +th.valign-top,td.valign-top{vertical-align:top} +th.valign-bottom,td.valign-bottom{vertical-align:bottom} +th.valign-middle,td.valign-middle{vertical-align:middle} +table thead th,table tfoot th{font-weight:bold} +tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7} +tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold} +p.tableblock>code:only-child{background:none;padding:0} +p.tableblock{font-size:1em} +ol{margin-left:1.75em} +ul li ol{margin-left:1.5em} +dl dd{margin-left:1.125em} +dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0} +ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em} +ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none} +ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em} +ul.unstyled,ol.unstyled{margin-left:0} +ul.checklist{margin-left:.625em} +ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em} +ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em} +ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em} +ul.inline>li{margin-left:1.25em} +.unstyled dl dt{font-weight:400;font-style:normal} +ol.arabic{list-style-type:decimal} +ol.decimal{list-style-type:decimal-leading-zero} +ol.loweralpha{list-style-type:lower-alpha} +ol.upperalpha{list-style-type:upper-alpha} +ol.lowerroman{list-style-type:lower-roman} +ol.upperroman{list-style-type:upper-roman} +ol.lowergreek{list-style-type:lower-greek} +.hdlist>table,.colist>table{border:0;background:none} +.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none} +td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em} +td.hdlist1{font-weight:bold;padding-bottom:1.25em} +.literalblock+.colist,.listingblock+.colist{margin-top:-.5em} +.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top} +.colist td:not([class]):first-child img{max-width:none} +.colist td:not([class]):last-child{padding:.25em 0} +.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd} +.imageblock.left{margin:.25em .625em 1.25em 0} +.imageblock.right{margin:.25em 0 1.25em .625em} +.imageblock>.title{margin-bottom:0} +.imageblock.thumb,.imageblock.th{border-width:6px} +.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em} +.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0} +.image.left{margin-right:.625em} +.image.right{margin-left:.625em} +a.image{text-decoration:none;display:inline-block} +a.image object{pointer-events:none} +sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super} +sup.footnote a,sup.footnoteref a{text-decoration:none} +sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline} +#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em} +#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0} +#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em} +#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em} +#footnotes .footnote:last-of-type{margin-bottom:0} +#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0} +.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0} +.gist .file-data>table td.line-data{width:99%} +div.unbreakable{page-break-inside:avoid} +.big{font-size:larger} +.small{font-size:smaller} +.underline{text-decoration:underline} +.overline{text-decoration:overline} +.line-through{text-decoration:line-through} +.aqua{color:#00bfbf} +.aqua-background{background:#00fafa} +.black{color:#000} +.black-background{background:#000} +.blue{color:#0000bf} +.blue-background{background:#0000fa} +.fuchsia{color:#bf00bf} +.fuchsia-background{background:#fa00fa} +.gray{color:#606060} +.gray-background{background:#7d7d7d} +.green{color:#006000} +.green-background{background:#007d00} +.lime{color:#00bf00} +.lime-background{background:#00fa00} +.maroon{color:#600000} +.maroon-background{background:#7d0000} +.navy{color:#000060} +.navy-background{background:#00007d} +.olive{color:#606000} +.olive-background{background:#7d7d00} +.purple{color:#600060} +.purple-background{background:#7d007d} +.red{color:#bf0000} +.red-background{background:#fa0000} +.silver{color:#909090} +.silver-background{background:#bcbcbc} +.teal{color:#006060} +.teal-background{background:#007d7d} +.white{color:#bfbfbf} +.white-background{background:#fafafa} +.yellow{color:#bfbf00} +.yellow-background{background:#fafa00} +span.icon>.fa{cursor:default} +a span.icon>.fa{cursor:inherit} +.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default} +.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c} +.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111} +.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900} +.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400} +.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000} +.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold} +.conum[data-value] *{color:#fff!important} +.conum[data-value]+b{display:none} +.conum[data-value]::after{content:attr(data-value)} +pre .conum[data-value]{position:relative;top:-.125em} +b.conum *{color:inherit!important} +.conum:not([data-value]):empty{display:none} +dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility} +h1,h2,p,td.content,span.alt{letter-spacing:-.01em} +p strong,td.content strong,div.footnote strong{letter-spacing:-.005em} +p,blockquote,dt,td.content,span.alt{font-size:1.0625rem} +p{margin-bottom:1.25rem} +.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em} +.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc} +.print-only{display:none!important} +@page{margin:1.25cm .75cm} +@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important} +html{font-size:80%} +a{color:inherit!important;text-decoration:underline!important} +a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important} +a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em} +abbr[title]::after{content:" (" attr(title) ")"} +pre,blockquote,tr,img,object,svg{page-break-inside:avoid} +thead{display:table-header-group} +svg{max-width:100%} +p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3} +h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid} +#toc,.sidebarblock,.exampleblock>.content{background:none!important} +#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important} +body.book #header{text-align:center} +body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em} +body.book #header .details{border:0!important;display:block;padding:0!important} +body.book #header .details span:first-child{margin-left:0!important} +body.book #header .details br{display:block} +body.book #header .details br+span::before{content:none!important} +body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important} +body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always} +.listingblock code[data-lang]::before{display:block} +#footer{padding:0 .9375em} +.hide-on-print{display:none!important} +.print-only{display:block!important} +.hide-for-print{display:none!important} +.show-for-print{display:inherit!important}} +@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem} +.sect1{padding:0!important} +.sect1+.sect1{border:0} +#footer{background:none} +#footer-text{color:rgba(0,0,0,.6);font-size:.9em}} +@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}} diff --git a/css/main.css b/css/main.css new file mode 100644 index 00000000..2c9bfff3 --- /dev/null +++ b/css/main.css @@ -0,0 +1,205 @@ +body { + display: flex; + flex-direction: column; + align-items: center; + min-height: 100vh; +} + +header { + width: 100%; + box-shadow: 0 0 7px rgba(0, 0, 0, 0.15); +} + +#header-inner, #footer-inner { + display: flex; + justify-content: space-between; + width: 100%; + max-width: 80ch; + padding: 1ch 0; + margin: 0 auto; +} + +#header-left, #header-right, #footer-links { + display: flex; + margin: 0 1ch; + flex-wrap: wrap; + align-content: center; + justify-content: center; + line-height: 2rem; +} + +#header-logo { + display: block; + width: calc(17vw + 4rem); + max-width: 200px; +} + +#header-logo:hover, #header-logo:focus { + opacity: 0.8; +} + +a.nav-link, a.site-title, a.footer-link { + display: flex; + align-items: center; + justify-content: center; +} + +a.nav-link { + min-height: 40px; + font-family: "Open Sans", "DejaVu Sans", sans-serif; + font-weight: 400; + font-style: normal; + color: rgba(0, 0, 0, .8); + text-decoration: none; + padding: 0 10px; +} + +a.nav-link:hover { + text-decoration: underline; +} + +#logo { + width: calc(20% + 13rem); + max-width: 95%; +} + +main { + flex-grow: 1; + width: 100%; + max-width: 80ch; + padding-left: 2ch; + padding-right: 2ch; + margin: 0 auto; +} + +footer { + width: 100%; + margin-top: 3rem; + box-shadow: 0 0 7px rgba(0, 0, 0, 0.15); +} + +.footer-by { + margin: 0 1ch; + padding: 10px 0; + text-align: center; +} + +.ferrous-logo { + width: 2rem; + height: 2rem; +} + +.footer-link { + margin: 0 1ch; + font-weight: 600; + font-style: normal; + text-decoration: none; + white-space: nowrap; +} +.footer-link > .fa { + margin-right: 0.4em; + color: rgba(0, 0, 0, .8) +} +footer > p { + margin-top: 0; +} + +.greeting { + margin: 5rem 0 1rem 0; + text-align: center; +} + +.greeting > p { + font-size: 1.5rem; + line-height: 2.2rem; + margin: 2.3em 0 1.25rem; +} + +.source > img { + width: 1.4rem; + height: 1.4rem; + vertical-align: -0.11rem; +} + +a.source { + color: black; + text-decoration: none; + font-size: 1.4rem; +} +a.source:hover { + text-decoration: underline; + text-decoration-thickness: 2px; +} + +.sponsors { + font-size: 1.21875em; + margin: 0 0 1.25em; + display: flex; + flex-direction: row; + align-items: center; + justify-content: stretch; + flex-wrap: wrap; +} + +.sponsors li { + list-style-type: none; + white-space: nowrap; + margin: 0 0.75em; + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.post-list { + margin: 0; + padding: 0; + list-style-type: none; +} + +.post { + margin: 0 0 1.5rem 0; +} + +.post .post-date { + font-size: 1.25rem; + color: #666666; + font-weight: 300; +} + +.post .post-link { + font-size: 1.7rem; + line-height: 2.4rem; + font-weight: 400; +} + +.all-posts-link { + font-size: 1.25rem; +} + +.post .post-link, .all-posts-link { + text-decoration: none; +} + +.post .post-link:hover, .all-posts-link:hover { + text-decoration: underline; +} + +video { + display: block; + max-width: 100%; +} + +@media (max-width: 600px) { + #header-inner { + flex-direction: column; + padding: 1ch 0 0 0; + } + + a.nav-link { + padding: 0 5px; + } + + #footer-inner { + flex-direction: column; + } +} diff --git a/css/rouge-github.css b/css/rouge-github.css new file mode 100644 index 00000000..cfdb22a8 --- /dev/null +++ b/css/rouge-github.css @@ -0,0 +1,209 @@ +pre.rouge table td { padding: 5px; } +pre.rouge table pre { margin: 0; } +pre.rouge .cm { + color: #999988; + font-style: italic; +} +pre.rouge .cp { + color: #999999; + font-weight: bold; +} +pre.rouge .c1 { + color: #999988; + font-style: italic; +} +pre.rouge .cs { + color: #999999; + font-weight: bold; + font-style: italic; +} +pre.rouge .c, pre.rouge .ch, pre.rouge .cd, pre.rouge .cpf { + color: #999988; + font-style: italic; +} +pre.rouge .err { + color: #a61717; + background-color: #e3d2d2; +} +pre.rouge .gd { + color: #000000; + background-color: #ffdddd; +} +pre.rouge .ge { + color: #000000; + font-style: italic; +} +pre.rouge .gr { + color: #aa0000; +} +pre.rouge .gh { + color: #999999; +} +pre.rouge .gi { + color: #000000; + background-color: #ddffdd; +} +pre.rouge .go { + color: #888888; +} +pre.rouge .gp { + color: #555555; +} +pre.rouge .gs { + font-weight: bold; +} +pre.rouge .gu { + color: #aaaaaa; +} +pre.rouge .gt { + color: #aa0000; +} +pre.rouge .kc { + color: #000000; + font-weight: bold; +} +pre.rouge .kd { + color: #000000; + font-weight: bold; +} +pre.rouge .kn { + color: #000000; + font-weight: bold; +} +pre.rouge .kp { + color: #000000; + font-weight: bold; +} +pre.rouge .kr { + color: #000000; + font-weight: bold; +} +pre.rouge .kt { + color: #445588; + font-weight: bold; +} +pre.rouge .k, pre.rouge .kv { + color: #000000; + font-weight: bold; +} +pre.rouge .mf { + color: #009999; +} +pre.rouge .mh { + color: #009999; +} +pre.rouge .il { + color: #009999; +} +pre.rouge .mi { + color: #009999; +} +pre.rouge .mo { + color: #009999; +} +pre.rouge .m, pre.rouge .mb, pre.rouge .mx { + color: #009999; +} +pre.rouge .sb { + color: #d14; +} +pre.rouge .sc { + color: #d14; +} +pre.rouge .sd { + color: #d14; +} +pre.rouge .s2 { + color: #d14; +} +pre.rouge .se { + color: #d14; +} +pre.rouge .sh { + color: #d14; +} +pre.rouge .si { + color: #d14; +} +pre.rouge .sx { + color: #d14; +} +pre.rouge .sr { + color: #009926; +} +pre.rouge .s1 { + color: #d14; +} +pre.rouge .ss { + color: #990073; +} +pre.rouge .s, pre.rouge .sa, pre.rouge .dl { + color: #d14; +} +pre.rouge .na { + color: #008080; +} +pre.rouge .bp { + color: #999999; +} +pre.rouge .nb { + color: #0086B3; +} +pre.rouge .nc { + color: #445588; + font-weight: bold; +} +pre.rouge .no { + color: #008080; +} +pre.rouge .nd { + color: #3c5d5d; + font-weight: bold; +} +pre.rouge .ni { + color: #800080; +} +pre.rouge .ne { + color: #990000; + font-weight: bold; +} +pre.rouge .nf, pre.rouge .fm { + color: #990000; + font-weight: bold; +} +pre.rouge .nl { + color: #990000; + font-weight: bold; +} +pre.rouge .nn { + color: #555555; +} +pre.rouge .nt { + color: #000080; +} +pre.rouge .vc { + color: #008080; +} +pre.rouge .vg { + color: #008080; +} +pre.rouge .vi { + color: #008080; +} +pre.rouge .nv, pre.rouge .vm { + color: #008080; +} +pre.rouge .ow { + color: #000000; + font-weight: bold; +} +pre.rouge .o { + color: #000000; + font-weight: bold; +} +pre.rouge .w { + color: #bbbbbb; +} +/* pre.rouge { + background-color: #f8f8f8; +} */ diff --git a/feed.xml b/feed.xml new file mode 100644 index 00000000..3b5e0a2c --- /dev/null +++ b/feed.xml @@ -0,0 +1,841 @@ + + + + rust-analyzer + rust-analyzer: building a better Rust IDE + https://rust-analyzer.github.io// + + Mon, 16 Oct 2023 08:00:46 +0000 + Mon, 16 Oct 2023 08:00:46 +0000 + Jekyll v3.9.0 + + + Changelog #203 + Mon, 16 Oct 2023 00:00:00 +0000 + https://rust-analyzer.github.io//thisweek/2023/10/16/changelog-203.html + https://rust-analyzer.github.io//thisweek/2023/10/16/changelog-203.html + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Commit: <a href="https://github.com/rust-analyzer/rust-analyzer/commit/6572ec8d94c83f8cc6afe0069269abeddc37c25e"><code>6572ec8</code></a><br> +Release: <a href="https://github.com/rust-analyzer/rust-analyzer/releases/2023-10-16"><code>2023-10-16</code></a> (<code>v0.3.1697</code>)</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="new-features"><a class="anchor" href="#new-features"></a>New Features</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15728"><code>#15728</code></a> (first contribution) VS Code: support opening local documentation if available:</p> +<div class="videoblock"> +<div class="content"> +<video src="https://user-images.githubusercontent.com/9659253/273422126-715b84dd-4f14-4ba0-a904-749b847eb3d5.webm" controls loop> +Your browser does not support the video tag. +</video> +</div> +</div> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15743"><code>#15743</code></a>, <a href="https://github.com/rust-analyzer/rust-analyzer/pull/15752"><code>#15752</code></a>, <a href="https://github.com/rust-analyzer/rust-analyzer/pull/15755"><code>#15755</code></a> (first contribution) add assist to convert <code>is_some</code> / <code>is_ok</code> and to <code>if let</code>:</p> +<div class="imageblock"> +<div class="content"> +<img src="https://user-images.githubusercontent.com/71162630/275121299-a7866efe-2d54-488b-903e-9df039f34a7e.gif" alt="&quot;Screen recording showing an assist that rewrites `if a.is_some()` to `if let Some(_tmp) = a`" width="and similarly for `is_ok`"> +</div> +</div> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15681"><code>#15681</code></a> (first contribution) add <code>rust-analyzer.rust.analyzerTargetDir</code> option to use <code>rust-analyzer</code> specific target directory.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15696"><code>#15696</code></a> add tuple return to tuple struct assist:</p> +<div class="videoblock"> +<div class="content"> +<video src="https://user-images.githubusercontent.com/52933714/271883958-2803ff58-fde3-4144-9495-7c7c7e139075.webm" controls loop> +Your browser does not support the video tag. +</video> +</div> +</div> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="fixes"><a class="anchor" href="#fixes"></a>Fixes</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15744"><code>#15744</code></a> (first contribution) add diagnostics for char and byte literal errors:</p> +<div class="imageblock"> +<div class="content"> +<img src="https://user-images.githubusercontent.com/308347/275412431-12ddaf06-1d10-4e77-b566-ba8a1b9aff0d.png" alt="Screenshot showing errros on invalid char and byte literal"> +</div> +</div> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15713"><code>#15713</code></a> offer prefix match flyimport completions for one and two character paths:</p> +<div class="imageblock"> +<div class="content"> +<img src="https://user-images.githubusercontent.com/308347/275410445-6db5ecf5-8ba2-47fb-82fb-508176a5207a.png" alt="Screenshot showing `IpAddr`, `Ipv4Addr` and `Ipv6Addr` completions for `Ip`"> +</div> +</div> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="internal-improvements"><a class="anchor" href="#internal-improvements"></a>Internal Improvements</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15745"><code>#15745</code></a> (first contribution) add Zed to the manual IDE list.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15725"><code>#15725</code></a> fix automatic <code>rustc</code> / <code>rustdoc</code> lint generation.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15618"><code>#15618</code></a> port <code>anymap</code> to <code>stdx</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15760"><code>#15760</code></a> make some <code>mir::ProjectionStore</code> methods public.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15762"><code>#15762</code></a> try to use deploy key in the metrics workflow.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15691"><code>#15691</code></a> update <code>rustc_abi</code> dependency.</p> +</li> +</ul> +</div> +</div> +</div> + + + + Changelog #202 + Mon, 09 Oct 2023 00:00:00 +0000 + https://rust-analyzer.github.io//thisweek/2023/10/09/changelog-202.html + https://rust-analyzer.github.io//thisweek/2023/10/09/changelog-202.html + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Commit: <a href="https://github.com/rust-analyzer/rust-analyzer/commit/b1f89a84ab350091e6c20cfe30c2fab8d76b80e4"><code>b1f89a8</code></a><br> +Release: <a href="https://github.com/rust-analyzer/rust-analyzer/releases/2023-10-09"><code>2023-10-09</code></a> (<code>v0.3.1689</code>)</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="new-features"><a class="anchor" href="#new-features"></a>New Features</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15668"><code>#15668</code></a> (first contribution) add backtick to surrounding and auto-closing pairs.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15700"><code>#15700</code></a> add assist for applying De Morgan&#8217;s law to <code>Iterator::all</code> and <code>Iterator::any</code>:</p> +<div class="videoblock"> +<div class="content"> +<video src="https://user-images.githubusercontent.com/52933714/271883841-aad1a299-6620-432b-9106-aafd2a7fa9f5.webm" controls loop> +Your browser does not support the video tag. +</video> +</div> +</div> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15707"><code>#15707</code></a> allow configuring the status bar click action in VS Code.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="fixes"><a class="anchor" href="#fixes"></a>Fixes</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15690"><code>#15690</code></a> (first contribution) fix line and column regex in the VS Code problem matcher.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15701"><code>#15701</code></a> strip base prefix in <code>layout_scalar_valid_range</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15698"><code>#15698</code></a> allow more kinds of <code>if-let</code> patterns in guarded return assist.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15709"><code>#15709</code></a> recognize <code>#[export_name = "main"]</code> function as binary entrypoint for runnables.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15641"><code>#15641</code></a> fix path syntax produced by the <code>into_to_qualified_from</code> assist.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15600"><code>#15600</code></a> ensure <code>rustfmt</code> runs when configured with <code>./</code>.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="internal-improvements"><a class="anchor" href="#internal-improvements"></a>Internal Improvements</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15721"><code>#15721</code></a> shrink <code>PatPtr</code> by swapping its <code>AstPtr</code> and <code>Either</code> wrap order.</p> +</li> +</ul> +</div> +</div> +</div> + + + + Changelog #201 + Mon, 02 Oct 2023 00:00:00 +0000 + https://rust-analyzer.github.io//thisweek/2023/10/02/changelog-201.html + https://rust-analyzer.github.io//thisweek/2023/10/02/changelog-201.html + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Commit: <a href="https://github.com/rust-analyzer/rust-analyzer/commit/0840038f02daec6ba3238f05d8caa037d28701a0"><code>0840038</code></a><br> +Release: <a href="https://github.com/rust-analyzer/rust-analyzer/releases/2023-10-02"><code>2023-10-02</code></a> (<code>v0.3.1681</code>)</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="new-features"><a class="anchor" href="#new-features"></a>New Features</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15659"><code>#15659</code></a>, <a href="https://github.com/rust-analyzer/rust-analyzer/pull/15693"><code>#15693</code></a> add <code>unused_variables</code> native diagnostic:</p> +<div class="imageblock"> +<div class="content"> +<img src="https://user-images.githubusercontent.com/308347/271902902-1eb755d3-3ee0-40bb-b83c-428ce03c7f5a.png" alt="A screenshot showing a native rust-analyzer warning on an unused variable"> +</div> +</div> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="fixes"><a class="anchor" href="#fixes"></a>Fixes</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15662"><code>#15662</code></a> fix panic in wrapping and unwrapping <code>Result</code> return type assists.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15667"><code>#15667</code></a> make <code>bool_to_enum</code> assist create enum at top-level.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15682"><code>#15682</code></a> recover better on missing parameter in parameter list.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15688"><code>#15688</code></a> make <code>rustc_layout_scalar_valid_range</code> attributes work for non-decimal literals.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15692"><code>#15692</code></a> don&#8217;t trigger completion when typing underscore in types or patterns.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="internal-improvements"><a class="anchor" href="#internal-improvements"></a>Internal Improvements</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15680"><code>#15680</code></a> (first contribution) re-generate <code>lints.rs</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15633"><code>#15633</code></a> allow customizing SCIP config.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15677"><code>#15677</code></a> allocate AST ids for parameters.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15686"><code>#15686</code></a> only run tests on Linux for pull requests.</p> +</li> +</ul> +</div> +</div> +</div> + + + + Changelog #200 + Mon, 25 Sep 2023 00:00:00 +0000 + https://rust-analyzer.github.io//thisweek/2023/09/25/changelog-200.html + https://rust-analyzer.github.io//thisweek/2023/09/25/changelog-200.html + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Commit: <a href="https://github.com/rust-analyzer/rust-analyzer/commit/862a3004e958082d0e9cbdf1172c5fe2bab6cf2d"><code>862a300</code></a><br> +Release: <a href="https://github.com/rust-analyzer/rust-analyzer/releases/2023-09-25"><code>2023-09-25</code></a> (<code>v0.3.1673</code>)</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="new-features"><a class="anchor" href="#new-features"></a>New Features</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15582"><code>#15582</code></a> (first contribution) add option to show full signatures in completion docs.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15484"><code>#15484</code></a> add "bool to enum" assist, to replace variables, fields, constants and statics with a new enum.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="fixes"><a class="anchor" href="#fixes"></a>Fixes</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15621"><code>#15621</code></a> (first contribution) give <code>unmerge_use</code> a label explaining what it will affect.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15651"><code>#15651</code></a> wrap inlined closures in parentheses.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15635"><code>#15635</code></a> compute <code>inlayHint.textEdit</code> eagerly for VS Code.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15587"><code>#15587</code></a> fix autoimport on traits already imported <code>as _</code>.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="internal-improvements"><a class="anchor" href="#internal-improvements"></a>Internal Improvements</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15615"><code>#15615</code></a> (first contribution) fix some Clippy lints.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15620"><code>#15620</code></a> (first contribution) change <code>exclude_labels</code> to <code>exclude_titles</code> in triagebot config.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15632"><code>#15632</code></a> use <code>load_workspace_at</code> for <code>rust-analyzer scip</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15492"><code>#15492</code></a> extend <code>check.overrideCommand</code> and <code>buildScripts.overrideCommand</code> docs.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15616"><code>#15616</code></a> use in-tree rustc dependencies with a <code>cfg</code> flag.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15637"><code>#15637</code></a> update <code>chalk</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15432"><code>#15432</code></a>, <a href="https://github.com/rust-analyzer/rust-analyzer/pull/15594"><code>#15594</code></a> de-<code>unwrap</code> <code>inline_call</code>, <code>add_missing_match_arms</code>, <code>convert_comment_block</code> and <code>desugar_doc_comment</code>.</p> +</li> +</ul> +</div> +</div> +</div> + + + + Changelog #199 + Mon, 18 Sep 2023 00:00:00 +0000 + https://rust-analyzer.github.io//thisweek/2023/09/18/changelog-199.html + https://rust-analyzer.github.io//thisweek/2023/09/18/changelog-199.html + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Commit: <a href="https://github.com/rust-analyzer/rust-analyzer/commit/05666441bafd6010787a4097a6bd44266ad21018"><code>0566644</code></a><br> +Release: <a href="https://github.com/rust-analyzer/rust-analyzer/releases/2023-09-18"><code>2023-09-18</code></a> (<code>v0.3.1665</code>)</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="fixes"><a class="anchor" href="#fixes"></a>Fixes</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15597"><code>#15597</code></a> (first contribution) update field shorthands in <code>promote_local_to_const</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15232"><code>#15232</code></a> disallow renaming of non-local items.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15601"><code>#15601</code></a> "temporarily" skip declaration checks in derive expansions.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15625"><code>#15625</code></a> don&#8217;t skip closure captures after <code>let-else</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15611"><code>#15611</code></a> prefer stable paths in import path.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15606"><code>#15606</code></a> fix <code>above_whole_item</code> lens location breaking lenses.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="internal-improvements"><a class="anchor" href="#internal-improvements"></a>Internal Improvements</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15431"><code>#15431</code></a> de-<code>unwrap</code> <code>extract_function</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15609"><code>#15609</code></a> remove most of the duplication from <code>Semantics{,Impl}</code> using <code>deref</code>.</p> +</li> +</ul> +</div> +</div> +</div> + + + + Changelog #198 + Mon, 11 Sep 2023 00:00:00 +0000 + https://rust-analyzer.github.io//thisweek/2023/09/11/changelog-198.html + https://rust-analyzer.github.io//thisweek/2023/09/11/changelog-198.html + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Commit: <a href="https://github.com/rust-analyzer/rust-analyzer/commit/326f37ef1f53575fd38e768065b6bcfcebdce462"><code>326f37e</code></a><br> +Release: <a href="https://github.com/rust-analyzer/rust-analyzer/releases/2023-09-11"><code>2023-09-11</code></a> (<code>v0.3.1657</code>)</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="new-features"><a class="anchor" href="#new-features"></a>New Features</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15578"><code>#15578</code></a> diagnose mismatched argument count for tuple struct patterns:</p> +<div class="imageblock"> +<div class="content"> +<img src="https://user-images.githubusercontent.com/308347/266911785-8ab15830-e25b-4a9d-8a38-15e14f91e4df.png" alt="A screenshot showing an error on `let S(a, b) = todo!()`"> +</div> +</div> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15584"><code>#15584</code></a> diagnose private fields in record constructor:</p> +<div class="imageblock"> +<div class="content"> +<img src="https://user-images.githubusercontent.com/308347/266912247-cd84cb65-0afc-4f4a-a972-edefc932bf2e.png" alt="A screenshot showing an error when using a private field in a pattern"> +</div> +</div> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15557"><code>#15557</code></a> parse <code>builtin#</code> syntax and add type checking for <code>builtin#offset_of</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15559"><code>#15559</code></a> implement <code>builtin#format_args</code>, using rustc&#8217;s <code>format_args</code> parser.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15532"><code>#15532</code></a> on-type format <code>(</code>, by adding closing <code>)</code> automatically.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15573"><code>#15573</code></a> add "into to qualified from" assist.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15524"><code>#15524</code></a> add "Bind unused parameter" assist.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15528"><code>#15528</code></a> enable <code>cfg(rust_analyzer)</code> when code is being analyzed.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="fixes"><a class="anchor" href="#fixes"></a>Fixes</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15574"><code>#15574</code></a> use crate name for <code>CARGO_CRATE_NAME</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15577"><code>#15577</code></a> clear native diagnostics for closed files.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="internal-improvements"><a class="anchor" href="#internal-improvements"></a>Internal Improvements</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15568"><code>#15568</code></a> replace <code>format_args</code> parser with upstream fork.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15565"><code>#15565</code></a> implement <code>write_via_move</code> intrinsic for MIR eval.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15571"><code>#15571</code></a> remove allocation on MIR eval memory write.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15567"><code>#15567</code></a> ignore enum variants in analysis stats of MIR bodies.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15575"><code>#15575</code></a> intern projections in MIR place.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15430"><code>#15430</code></a> de-<code>unwrap</code> <code>wrap_return_type_in_result</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15529"><code>#15529</code></a> do not send inlay hint refresh requests on file edits.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15522"><code>#15522</code></a> resolve inlay hint data lazily.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15586"><code>#15586</code></a>, <a href="https://github.com/rust-analyzer/rust-analyzer/pull/15592"><code>#15592</code></a> shrink some stuff.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15564"><code>#15564</code></a> use current folder&#8217;s <code>rustfmt.toml</code> with custom configurations.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15560"><code>#15560</code></a> when using <code>rust-project.json</code>, prefer the sysroot-defined rustc over discovery in <code>$PATH</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15558"><code>#15558</code></a> remove <code>rust-analyzer.discoverProjectCommand</code> in favor of a companion VS Code extension.</p> +</li> +</ul> +</div> +</div> +</div> + + + + Changelog #197 + Mon, 04 Sep 2023 00:00:00 +0000 + https://rust-analyzer.github.io//thisweek/2023/09/04/changelog-197.html + https://rust-analyzer.github.io//thisweek/2023/09/04/changelog-197.html + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Commit: <a href="https://github.com/rust-analyzer/rust-analyzer/commit/2df30e1e07eafc1de0359566423f471920693a34"><code>2df30e1</code></a><br> +Release: <a href="https://github.com/rust-analyzer/rust-analyzer/releases/2023-09-04"><code>2023-09-04</code></a> (<code>v0.3.1649</code>)</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="fixes"><a class="anchor" href="#fixes"></a>Fixes</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15527"><code>#15527</code></a> respect <code>#[allow(unused_braces)]</code>.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="internal-improvements"><a class="anchor" href="#internal-improvements"></a>Internal Improvements</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15465"><code>#15465</code></a> fix cargo handle logging in flycheck.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15542"><code>#15542</code></a> less <code>once_cell</code>, more <code>std</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15543"><code>#15543</code></a> remove some allocations in borrowck.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15544"><code>#15544</code></a> shuffle some locking around.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15549"><code>#15549</code></a> add a few more <code>db.unwind_if_cancelled()</code> calls.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15548"><code>#15548</code></a> restructure some modules in the <code>rust-analyzer</code> crate.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15551"><code>#15551</code></a> move doc-comment handling into <code>ide-db</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15552"><code>#15552</code></a> bump <code>rustc-perf</code> checkout for metrics, replace <code>webrender</code>, <code>diesel</code> and <code>ripgrep</code> with newer versions.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15553"><code>#15553</code></a> add <code>hyper</code> 0.14.18 to metrics.</p> +</li> +</ul> +</div> +</div> +</div> + + + + Changelog #196 + Mon, 28 Aug 2023 00:00:00 +0000 + https://rust-analyzer.github.io//thisweek/2023/08/28/changelog-196.html + https://rust-analyzer.github.io//thisweek/2023/08/28/changelog-196.html + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Commit: <a href="https://github.com/rust-analyzer/rust-analyzer/commit/144526c90840e84e799ee06c6cea5c573cf4fdf2"><code>144526c</code></a><br> +Release: <a href="https://github.com/rust-analyzer/rust-analyzer/releases/2023-08-28"><code>2023-08-28</code></a> (<code>v0.3.1641</code>)</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="new-features"><a class="anchor" href="#new-features"></a>New Features</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15374"><code>#15374</code></a> (first contribution) implement extern crate completion.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="fixes"><a class="anchor" href="#fixes"></a>Fixes</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15512"><code>#15512</code></a> update <code>offset</code> intrinsic to match 1.72.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15517"><code>#15517</code></a> fix unknown label diagnostics for <code>while let</code> loop with label in condition.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="internal-improvements"><a class="anchor" href="#internal-improvements"></a>Internal Improvements</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15385"><code>#15385</code></a> (first contribution) pass target in <code>proc-macro-test</code> to fix cross-compilation on Darwin hosts.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15490"><code>#15490</code></a> fix help text for <code>rust-analyzer.check.invocation{Strategy,Location}</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15503"><code>#15503</code></a> report the rust-analyzer version in the SCPI metadata.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15494"><code>#15494</code></a> sync from downstream.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15523"><code>#15523</code></a> use <code>RUSTC_BOOTSTRAP</code> when running <code>analysis-stats</code> on the standard library.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15495"><code>#15495</code></a> unpin <code>serde</code>.</p> +</li> +</ul> +</div> +</div> +</div> + + + + Changelog #195 + Mon, 21 Aug 2023 00:00:00 +0000 + https://rust-analyzer.github.io//thisweek/2023/08/21/changelog-195.html + https://rust-analyzer.github.io//thisweek/2023/08/21/changelog-195.html + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Commit: <a href="https://github.com/rust-analyzer/rust-analyzer/commit/83b3ba1b8191c065bb0dacc79e5896f7f21e4611"><code>83b3ba1</code></a><br> +Release: <a href="https://github.com/rust-analyzer/rust-analyzer/releases/2023-08-21"><code>2023-08-21</code></a> (<code>v0.3.1631</code>)</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="new-features"><a class="anchor" href="#new-features"></a>New Features</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15477"><code>#15477</code></a> record import aliases in symbol index.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15446"><code>#15446</code></a> add status bar button to toggle check on save.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="fixes"><a class="anchor" href="#fixes"></a>Fixes</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15463"><code>#15463</code></a> show generic constant defaults in hover.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15473"><code>#15473</code></a> honor <code>#[doc(hidden)]</code> in auto-import and completions.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15383"><code>#15383</code></a> suggest type completions for type arguments and constant completions for constant arguments.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15418"><code>#15418</code></a> fix signature help of methods generated by macros.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15410"><code>#15410</code></a> rewrite De Morgan&#8217;s assist to avoid string manipulation.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15179"><code>#15179</code></a> substitute default values of const params in "Add missing members".</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15420"><code>#15420</code></a> increase the buffer size for the discover project command.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="internal-improvements"><a class="anchor" href="#internal-improvements"></a>Internal Improvements</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15466"><code>#15466</code></a> add offset param to token <code>descend</code> API.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15472"><code>#15472</code></a> record import origins in <code>ItemScope</code> and <code>PerNs</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15426"><code>#15426</code></a>, <a href="https://github.com/rust-analyzer/rust-analyzer/pull/15429"><code>#15429</code></a>, <a href="https://github.com/rust-analyzer/rust-analyzer/pull/15434"><code>#15434</code></a> de-<code>unwrap</code> <code>convert_to_guarded_return</code>, <code>generate_delegate_methods</code> and <code>generate_derive</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15461"><code>#15461</code></a> always collect memory usage info in <code>analysis-stats</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15482"><code>#15482</code></a> pin <code>serde</code> to the last non-blobby release.</p> +</li> +</ul> +</div> +</div> +</div> + + + + Changelog #194 + Mon, 14 Aug 2023 00:00:00 +0000 + https://rust-analyzer.github.io//thisweek/2023/08/14/changelog-194.html + https://rust-analyzer.github.io//thisweek/2023/08/14/changelog-194.html + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Commit: <a href="https://github.com/rust-analyzer/rust-analyzer/commit/2fbe69d117ff8e3ffb9b21c4a564f835158eb67b"><code>2fbe69d</code></a><br> +Release: <a href="https://github.com/rust-analyzer/rust-analyzer/releases/2023-08-14"><code>2023-08-14</code></a> (<code>v0.3.1623</code>)</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="new-features"><a class="anchor" href="#new-features"></a>New Features</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15262"><code>#15262</code></a> (first contribution) add <code>rust-analyzer.check.ignore</code> setting to ignore specific <code>check</code> diagnostics.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="fixes"><a class="anchor" href="#fixes"></a>Fixes</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15350"><code>#15350</code></a> handle <code>#[cfg]</code>s on generic parameters.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15405"><code>#15405</code></a> support doc links that resolve to fields.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15416"><code>#15416</code></a> correctly display fully-qualified associated types correctly.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15419"><code>#15419</code></a> add MIR lowering support for tuple destructing assignment.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15415"><code>#15415</code></a> fix float parser hack creating empty <code>NameRef</code> tokens.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15250"><code>#15250</code></a> don&#8217;t use control flow when keeping the tail expression of the original function.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15445"><code>#15445</code></a> fix <code>only_types</code> config filtering out traits from world symbols.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15438"><code>#15438</code></a> fix parser getting stuck in eager macro inputs.</p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="internal-improvements"><a class="anchor" href="#internal-improvements"></a>Internal Improvements</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15217"><code>#15217</code></a> (first contribution) convert <code>unwrap</code> to <code>expect</code> in <code>lsp-server</code> and add a debug log.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15422"><code>#15422</code></a> record import source IDs.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15435"><code>#15435</code></a> derive block attributes from block item tree.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15436"><code>#15436</code></a> preserve <code>resolve_obligations_as_possible</code> allocation across calls.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15423"><code>#15423</code></a>, <a href="https://github.com/rust-analyzer/rust-analyzer/pull/15433"><code>#15433</code></a> de-<code>unwrap</code> <code>convert_named_struct_to_tuple_struct</code> and <code>remove_unused_imports</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15417"><code>#15417</code></a> use <code>Cast::cast()</code> instead of explicit interning.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15428"><code>#15428</code></a> fix pinned version of <code>lsp-types</code>.</p> +</li> +<li> +<p><a href="https://github.com/rust-analyzer/rust-analyzer/pull/15421"><code>#15421</code></a> add more error context when failing to invoke the Rust toolchain.</p> +</li> +</ul> +</div> +</div> +</div> + + + + diff --git a/generated_assists.html b/generated_assists.html new file mode 100644 index 00000000..a0e8ecc2 --- /dev/null +++ b/generated_assists.html @@ -0,0 +1,5628 @@ + + + + + + + + + + rust-analyzer + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+

add_braces

+
+

Source: add_braces.rs

+
+
+

Adds braces to lambda and match arm expressions.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn foo(n: i32) -> i32 {
+    match n {
+        1 => n + 1,
+        _ => 0
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
fn foo(n: i32) -> i32 {
+    match n {
+        1 => {
+            n + 1
+        },
+        _ => 0
+    }
+}
+
+
+
+

add_explicit_type

+ +
+

Specify type for a let binding.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let x = 92;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    let x: i32 = 92;
+}
+
+
+
+

add_hash

+
+

Source: raw_string.rs

+
+
+

Adds a hash to a raw string literal.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    r#"Hello,┃ World!"#;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    r##"Hello, World!"##;
+}
+
+
+
+

add_impl_default_members

+ +
+

Adds scaffold for overriding default impl members.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
trait Trait {
+    type X;
+    fn foo(&self);
+    fn bar(&self) {}
+}
+
+impl Trait for () {
+    type X = ();
+    fn foo(&self) {}
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
trait Trait {
+    type X;
+    fn foo(&self);
+    fn bar(&self) {}
+}
+
+impl Trait for () {
+    type X = ();
+    fn foo(&self) {}
+
+    fn bar(&self) {}
+}
+
+
+
+

add_impl_missing_members

+ +
+

Adds scaffold for required impl members.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
trait Trait<T> {
+    type X;
+    fn foo(&self) -> T;
+    fn bar(&self) {}
+}
+
+impl Trait<u32> for () {
+
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+
trait Trait<T> {
+    type X;
+    fn foo(&self) -> T;
+    fn bar(&self) {}
+}
+
+impl Trait<u32> for () {
+    type X;
+
+    fn foo(&self) -> u32 {
+        todo!()
+    }
+}
+
+
+
+

add_label_to_loop

+ +
+

Adds a label to a loop.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    loop {
+        break;
+        continue;
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    'l: loop {
+        break 'l;
+        continue 'l;
+    }
+}
+
+
+
+

add_lifetime_to_type

+ +
+

Adds a new lifetime to a struct, enum or union.

+
+
+
Before
+
+
1
+2
+3
+4
+
struct Point {
+    x: &u32,
+    y: u32,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
struct Point<'a> {
+    x: &'a u32,
+    y: u32,
+}
+
+
+
+

add_missing_match_arms

+ +
+

Adds missing clauses to a match expression.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } => todo!(),
+        Action::Stop => todo!(),
+    }
+}
+
+
+
+

add_return_type

+
+

Source: add_return_type.rs

+
+
+

Adds the return type to a function or closure inferred from its tail expression if it doesn’t have a return +type specified. This assists is useable in a functions or closures tail expression or return type position.

+
+
+
Before
+
+
1
+
fn foo() { 42i32 }
+
+
+
+
+
After
+
+
1
+
fn foo() -> i32 { 42i32 }
+
+
+
+

add_turbo_fish

+
+

Source: add_turbo_fish.rs

+
+
+

Adds ::<_> to a call of a generic method or function.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn make<T>() -> T { todo!() }
+fn main() {
+    let x = make();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn make<T>() -> T { todo!() }
+fn main() {
+    let x = make::<${0:_}>();
+}
+
+
+
+

apply_demorgan

+
+

Source: apply_demorgan.rs

+
+
+

Apply De Morgan’s law. +This transforms expressions of the form !l || !r into !(l && r). +This also works with &&. This assist can only be applied with the cursor +on either || or &&.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    if x != 4 || y < 3.14 {}
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    if !(x == 4 && y >= 3.14) {}
+}
+
+
+
+

apply_demorgan_iterator

+
+

Source: apply_demorgan.rs

+
+
+

Apply De Morgan’s law to +Iterator::all and Iterator::any.

+
+
+

This transforms expressions of the form !iter.any(|x| predicate(x)) into +iter.all(|x| !predicate(x)) and vice versa. This also works the other way for +Iterator::all into Iterator::any.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let arr = [1, 2, 3];
+    if !arr.into_iter().┃any(|num| num == 4) {
+        println!("foo");
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let arr = [1, 2, 3];
+    if arr.into_iter().all(|num| num != 4) {
+        println!("foo");
+    }
+}
+
+
+
+

auto_import

+
+

Source: auto_import.rs

+
+
+

If the name is unresolved, provides all possible imports for it.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let map = HashMap::new();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
use std::collections::HashMap;
+
+fn main() {
+    let map = HashMap::new();
+}
+
+
+
+

bind_unused_param

+ +
+

Binds unused function parameter to an underscore.

+
+
+
Before
+
+
1
+
fn some_function(x: i32) {}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn some_function(x: i32) {
+    let _ = x;
+}
+
+
+
+

bool_to_enum

+
+

Source: bool_to_enum.rs

+
+
+

This converts boolean local variables, fields, constants, and statics into a new +enum with two variants Bool::True and Bool::False, as well as replacing +all assignments with the variants and replacing all usages with == Bool::True or +== Bool::False.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    let bool = true;
+
+    if bool {
+        println!("foo");
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
#[derive(PartialEq, Eq)]
+enum Bool { True, False }
+
+fn main() {
+    let bool = Bool::True;
+
+    if bool == Bool::True {
+        println!("foo");
+    }
+}
+
+
+
+

change_visibility

+ +
+

Adds or changes existing visibility specifier.

+
+
+
Before
+
+
1
+
fn frobnicate() {}
+
+
+
+
+
After
+
+
1
+
pub(crate) fn frobnicate() {}
+
+
+
+

convert_bool_then_to_if

+ +
+

Converts a bool::then method call to an equivalent if expression.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    (0 == 0).then(|| val)
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    if 0 == 0 {
+        Some(val)
+    } else {
+        None
+    }
+}
+
+
+
+

convert_for_loop_with_for_each

+ +
+

Converts a for loop into a for_each loop on the Iterator.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let x = vec![1, 2, 3];
+    for v in x {
+        let y = v * 2;
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let x = vec![1, 2, 3];
+    x.into_iter().for_each(|v| {
+        let y = v * 2;
+    });
+}
+
+
+
+

convert_if_to_bool_then

+ +
+

Converts an if expression into a corresponding bool::then call.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    if cond {
+        Some(val)
+    } else {
+        None
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    cond.then(|| val)
+}
+
+
+
+

convert_integer_literal

+ +
+

Converts the base of integer literals to other bases.

+
+
+
Before
+
+
1
+
const _: i32 = 10;
+
+
+
+
+
After
+
+
1
+
const _: i32 = 0b1010;
+
+
+
+

convert_into_to_from

+ +
+

Converts an Into impl to an equivalent From impl.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
impl Into<Thing> for usize {
+    fn into(self) -> Thing {
+        Thing {
+            b: self.to_string(),
+            a: self
+        }
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
impl From<usize> for Thing {
+    fn from(val: usize) -> Self {
+        Thing {
+            b: val.to_string(),
+            a: val
+        }
+    }
+}
+
+
+
+

convert_iter_for_each_to_for

+ +
+

Converts an Iterator::for_each function into a for loop.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let iter = iter::repeat((9, 2));
+    iter.for_each(|(x, y)| {
+        println!("x: {}, y: {}", x, y);
+    });
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let iter = iter::repeat((9, 2));
+    for (x, y) in iter {
+        println!("x: {}, y: {}", x, y);
+    }
+}
+
+
+
+

convert_let_else_to_match

+ +
+

Converts let-else statement to let statement and match expression.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let Ok(mut x) = f() else { return };
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let mut x = match f() {
+        Ok(x) => x,
+        _ => return,
+    };
+}
+
+
+
+

convert_match_to_let_else

+ +
+

Converts let statement with match initializer to let-else statement.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn foo(opt: Option<()>) {
+    let val = match opt {
+        Some(it) => it,
+        None => return,
+    };
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn foo(opt: Option<()>) {
+    let Some(val) = opt else { return };
+}
+
+
+
+

convert_named_struct_to_tuple_struct

+ +
+

Converts struct with named fields to tuple struct, and analogously for enum variants with named +fields.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
struct Point { x: f32, y: f32 }
+
+impl Point {
+    pub fn new(x: f32, y: f32) -> Self {
+        Point { x, y }
+    }
+
+    pub fn x(&self) -> f32 {
+        self.x
+    }
+
+    pub fn y(&self) -> f32 {
+        self.y
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
struct Point(f32, f32);
+
+impl Point {
+    pub fn new(x: f32, y: f32) -> Self {
+        Point(x, y)
+    }
+
+    pub fn x(&self) -> f32 {
+        self.0
+    }
+
+    pub fn y(&self) -> f32 {
+        self.1
+    }
+}
+
+
+
+

convert_nested_function_to_closure

+ +
+

Converts a function that is defined within the body of another function into a closure.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    fn foo(label: &str, number: u64) {
+        println!("{}: {}", label, number);
+    }
+
+    foo("Bar", 100);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    let foo = |label: &str, number: u64| {
+        println!("{}: {}", label, number);
+    };
+
+    foo("Bar", 100);
+}
+
+
+
+

convert_to_guarded_return

+ +
+

Replace a large conditional with a guarded return.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    if cond {
+        foo();
+        bar();
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    if !cond {
+        return;
+    }
+    foo();
+    bar();
+}
+
+
+
+

convert_tuple_return_type_to_struct

+ +
+

This converts the return type of a function from a tuple type +into a tuple struct and updates the body accordingly.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn bar() {
+    let (a, b, c) = foo();
+}
+
+fn foo() -> (u32, u32, u32) {
+    (1, 2, 3)
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
fn bar() {
+    let FooResult(a, b, c) = foo();
+}
+
+struct FooResult(u32, u32, u32);
+
+fn foo() -> FooResult {
+    FooResult(1, 2, 3)
+}
+
+
+
+

convert_tuple_struct_to_named_struct

+ +
+

Converts tuple struct to struct with named fields, and analogously for tuple enum variants.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
struct Point(f32, f32);
+
+impl Point {
+    pub fn new(x: f32, y: f32) -> Self {
+        Point(x, y)
+    }
+
+    pub fn x(&self) -> f32 {
+        self.0
+    }
+
+    pub fn y(&self) -> f32 {
+        self.1
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
struct Point { field1: f32, field2: f32 }
+
+impl Point {
+    pub fn new(x: f32, y: f32) -> Self {
+        Point { field1: x, field2: y }
+    }
+
+    pub fn x(&self) -> f32 {
+        self.field1
+    }
+
+    pub fn y(&self) -> f32 {
+        self.field2
+    }
+}
+
+
+
+

convert_two_arm_bool_match_to_matches_macro

+ +
+

Convert 2-arm match that evaluates to a boolean into the equivalent matches! invocation.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    match scrutinee {
+        Some(val) if val.cond() => true,
+        _ => false,
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    matches!(scrutinee, Some(val) if val.cond())
+}
+
+
+
+

convert_while_to_loop

+ +
+

Replace a while with a loop.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
fn main() {
+    while cond {
+        foo();
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
fn main() {
+    loop {
+        if !cond {
+            break;
+        }
+        foo();
+    }
+}
+
+
+
+

destructure_tuple_binding

+ +
+

Destructures a tuple binding in place.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn main() {
+    let t = (1,2);
+    let v = t.0;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn main() {
+    let (_0, _1) = (1,2);
+    let v = _0;
+}
+
+
+
+

desugar_doc_comment

+ +
+

Desugars doc-comments to the attribute form.

+
+
+
Before
+
+
1
+2
+
/// Multi-line┃
+/// comment
+
+
+
+
+
After
+
+
1
+2
+
#[doc = r"Multi-line
+comment"]
+
+
+
+

expand_glob_import

+ +
+

Expands glob imports.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
mod foo {
+    pub struct Bar;
+    pub struct Baz;
+}
+
+use foo::*;
+
+fn qux(bar: Bar, baz: Baz) {}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
mod foo {
+    pub struct Bar;
+    pub struct Baz;
+}
+
+use foo::{Bar, Baz};
+
+fn qux(bar: Bar, baz: Baz) {}
+
+
+
+

extract_expressions_from_format_string

+ +
+

Move an expression out of a format string.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    print!("{var} {x + 1}┃");
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    print!("{var} {}", x + 1);
+}
+
+
+
+

extract_function

+ +
+

Extracts selected statements and comments into new function.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    let n = 1;
+    let m = n + 2;
+    // calculate
+    let k = m + n;
+    let g = 3;
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
fn main() {
+    let n = 1;
+    fun_name(n);
+    let g = 3;
+}
+
+fn fun_name(n: i32) {
+    let m = n + 2;
+    // calculate
+    let k = m + n;
+}
+
+
+
+

extract_module

+
+

Source: extract_module.rs

+
+
+

Extracts a selected region as separate module. All the references, visibility and imports are +resolved.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn foo(name: i32) -> i32 {
+    name + 1
+}
+
+fn bar(name: i32) -> i32 {
+    name + 2
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
mod modname {
+    pub(crate) fn foo(name: i32) -> i32 {
+        name + 1
+    }
+}
+
+fn bar(name: i32) -> i32 {
+    name + 2
+}
+
+
+
+

extract_struct_from_enum_variant

+ +
+

Extracts a struct from enum variant.

+
+
+
Before
+
+
1
+
enum A { One(u32, u32) }
+
+
+
+
+
After
+
+
1
+2
+3
+
struct One(u32, u32);
+
+enum A { One(One) }
+
+
+
+

extract_type_alias

+ +
+

Extracts the selected type as a type alias.

+
+
+
Before
+
+
1
+2
+3
+
struct S {
+    field: (u8, u8, u8),
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
type Type = (u8, u8, u8);
+
+struct S {
+    field: Type,
+}
+
+
+
+

extract_variable

+ +
+

Extracts subexpression into a variable.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    (1 + 2) * 4;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn main() {
+    let var_name = (1 + 2);
+    var_name * 4;
+}
+
+
+
+

fix_visibility

+
+

Source: fix_visibility.rs

+
+
+

Makes inaccessible item public.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
mod m {
+    fn frobnicate() {}
+}
+fn main() {
+    m::frobnicate();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
mod m {
+    pub(crate) fn frobnicate() {}
+}
+fn main() {
+    m::frobnicate();
+}
+
+
+
+

flip_binexpr

+
+

Source: flip_binexpr.rs

+
+
+

Flips operands of a binary expression.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let _ = 90 + 2;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    let _ = 2 + 90;
+}
+
+
+
+

flip_comma

+
+

Source: flip_comma.rs

+
+
+

Flips two comma-separated items.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    ((1, 2), (3, 4));
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    ((3, 4), (1, 2));
+}
+
+
+
+

flip_trait_bound

+ +
+

Flips two trait bounds.

+
+
+
Before
+
+
1
+
fn foo<T: Clone + Copy>() { }
+
+
+
+
+
After
+
+
1
+
fn foo<T: Copy + Clone>() { }
+
+
+
+

generate_constant

+ +
+

Generate a named constant.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
struct S { i: usize }
+impl S { pub fn new(n: usize) {} }
+fn main() {
+    let v = S::new(CAPACITY);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
struct S { i: usize }
+impl S { pub fn new(n: usize) {} }
+fn main() {
+    const CAPACITY: usize = ;
+    let v = S::new(CAPACITY);
+}
+
+
+
+

generate_default_from_enum_variant

+ +
+

Adds a Default impl for an enum using a variant.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
enum Version {
+ Undefined,
+ Minor,
+ Major,
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
enum Version {
+ Undefined,
+ Minor,
+ Major,
+}
+
+impl Default for Version {
+    fn default() -> Self {
+        Self::Minor
+    }
+}
+
+
+
+

generate_default_from_new

+ +
+

Generates default implementation from new method.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
struct Example { _inner: () }
+
+impl Example {
+    pub fn new() -> Self {
+        Self { _inner: () }
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+
struct Example { _inner: () }
+
+impl Example {
+    pub fn new() -> Self {
+        Self { _inner: () }
+    }
+}
+
+impl Default for Example {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+
+
+

generate_delegate_methods

+ +
+

Generate delegate methods.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
struct Age(u8);
+impl Age {
+    fn age(&self) -> u8 {
+        self.0
+    }
+}
+
+struct Person {
+    age: Age,
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+
struct Age(u8);
+impl Age {
+    fn age(&self) -> u8 {
+        self.0
+    }
+}
+
+struct Person {
+    age: Age,
+}
+
+impl Person {
+    fn age(&self) -> u8 {
+        self.age.age()
+    }
+}
+
+
+
+

generate_delegate_trait

+ +
+

Generate delegate trait implementation for `StructField`s.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+
trait SomeTrait {
+    type T;
+    fn fn_(arg: u32) -> u32;
+    fn method_(&mut self) -> bool;
+}
+struct A;
+impl SomeTrait for A {
+    type T = u32;
+
+    fn fn_(arg: u32) -> u32 {
+        42
+    }
+
+    fn method_(&mut self) -> bool {
+        false
+    }
+}
+struct B {
+    a: A,
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+
trait SomeTrait {
+    type T;
+    fn fn_(arg: u32) -> u32;
+    fn method_(&mut self) -> bool;
+}
+struct A;
+impl SomeTrait for A {
+    type T = u32;
+
+    fn fn_(arg: u32) -> u32 {
+        42
+    }
+
+    fn method_(&mut self) -> bool {
+        false
+    }
+}
+struct B {
+    a: A,
+}
+
+impl SomeTrait for B {
+    type T = <A as SomeTrait>::T;
+
+    fn fn_(arg: u32) -> u32 {
+        <A as SomeTrait>::fn_(arg)
+    }
+
+    fn method_(&mut self) -> bool {
+        <A as SomeTrait>::method_( &mut self.a )
+    }
+}
+
+
+
+

generate_deref

+
+

Source: generate_deref.rs

+
+
+

Generate Deref impl using the given struct field.

+
+
+
Before
+
+
1
+2
+3
+4
+
struct A;
+struct B {
+   a: A
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
struct A;
+struct B {
+   a: A
+}
+
+impl core::ops::Deref for B {
+    type Target = A;
+
+    fn deref(&self) -> &Self::Target {
+        &self.a
+    }
+}
+
+
+
+

generate_derive

+
+

Source: generate_derive.rs

+
+
+

Adds a new #[derive()] clause to a struct or enum.

+
+
+
Before
+
+
1
+2
+3
+4
+
struct Point {
+    x: u32,
+    y: u32,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
#[derive()]
+struct Point {
+    x: u32,
+    y: u32,
+}
+
+
+
+

generate_doc_example

+ +
+

Generates a rustdoc example when editing an item’s documentation.

+
+
+
Before
+
+
1
+2
+
/// Adds two numbers.┃
+pub fn add(a: i32, b: i32) -> i32 { a + b }
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
/// Adds two numbers.
+///
+/// # Examples
+///
+/// ```
+/// use test::add;
+///
+/// assert_eq!(add(a, b), );
+/// ```
+pub fn add(a: i32, b: i32) -> i32 { a + b }
+
+
+
+

generate_documentation_template

+ +
+

Adds a documentation template above a function definition / declaration.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
pub struct S;
+impl S {
+    pub unsafe fn set_len(&mut self, len: usize) -> Result<(), std::io::Error> {
+        /* ... */
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
pub struct S;
+impl S {
+    /// Sets the length of this [`S`].
+    ///
+    /// # Errors
+    ///
+    /// This function will return an error if .
+    ///
+    /// # Safety
+    ///
+    /// .
+    pub unsafe fn set_len(&mut self, len: usize) -> Result<(), std::io::Error> {
+        /* ... */
+    }
+}
+
+
+
+

generate_enum_as_method

+ +
+

Generate an as_ method for this enum variant.

+
+
+
Before
+
+
1
+2
+3
+4
+
enum Value {
+ Number(i32),
+ Text(String),
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+
enum Value {
+ Number(i32),
+ Text(String),
+}
+
+impl Value {
+    fn as_text(&self) -> Option<&String> {
+        if let Self::Text(v) = self {
+            Some(v)
+        } else {
+            None
+        }
+    }
+}
+
+
+
+

generate_enum_is_method

+ +
+

Generate an is_ method for this enum variant.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
enum Version {
+ Undefined,
+ Minor,
+ Major,
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
enum Version {
+ Undefined,
+ Minor,
+ Major,
+}
+
+impl Version {
+    /// Returns `true` if the version is [`Minor`].
+    ///
+    /// [`Minor`]: Version::Minor
+    #[must_use]
+    fn is_minor(&self) -> bool {
+        matches!(self, Self::Minor)
+    }
+}
+
+
+
+

generate_enum_try_into_method

+ +
+

Generate a try_into_ method for this enum variant.

+
+
+
Before
+
+
1
+2
+3
+4
+
enum Value {
+ Number(i32),
+ Text(String),
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+
enum Value {
+ Number(i32),
+ Text(String),
+}
+
+impl Value {
+    fn try_into_text(self) -> Result<String, Self> {
+        if let Self::Text(v) = self {
+            Ok(v)
+        } else {
+            Err(self)
+        }
+    }
+}
+
+
+
+

generate_enum_variant

+ +
+

Adds a variant to an enum.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
enum Countries {
+    Ghana,
+}
+
+fn main() {
+    let country = Countries::Lesotho;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Countries {
+    Ghana,
+    Lesotho,
+}
+
+fn main() {
+    let country = Countries::Lesotho;
+}
+
+
+
+

generate_from_impl_for_enum

+ +
+

Adds a From impl for this enum variant with one tuple field.

+
+
+
Before
+
+
1
+
enum A { One(u32) }
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
enum A { One(u32) }
+
+impl From<u32> for A {
+    fn from(v: u32) -> Self {
+        Self::One(v)
+    }
+}
+
+
+
+

generate_function

+ +
+

Adds a stub function with a signature matching the function under the cursor.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
struct Baz;
+fn baz() -> Baz { Baz }
+fn foo() {
+    bar("", baz());
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct Baz;
+fn baz() -> Baz { Baz }
+fn foo() {
+    bar("", baz());
+}
+
+fn bar(arg: &str, baz: Baz) ${0:-> _} {
+    todo!()
+}
+
+
+
+

generate_getter

+ +
+

Generate a getter method.

+
+
+
Before
+
+
1
+2
+3
+
struct Person {
+    name: String,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct Person {
+    name: String,
+}
+
+impl Person {
+    fn name(&self) -> &str {
+        self.name.as_ref()
+    }
+}
+
+
+
+

generate_getter_mut

+ +
+

Generate a mut getter method.

+
+
+
Before
+
+
1
+2
+3
+
struct Person {
+    name: String,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct Person {
+    name: String,
+}
+
+impl Person {
+    fn name_mut(&mut self) -> &mut String {
+        &mut self.name
+    }
+}
+
+
+
+

generate_impl

+
+

Source: generate_impl.rs

+
+
+

Adds a new inherent impl for a type.

+
+
+
Before
+
+
1
+2
+3
+
struct Ctx<T: Clone> {
+    data: T,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
struct Ctx<T: Clone> {
+    data: T,
+}
+
+impl<T: Clone> Ctx<T> {
+    
+}
+
+
+
+

generate_is_empty_from_len

+ +
+

Generates is_empty implementation from the len method.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
struct MyStruct { data: Vec<String> }
+
+impl MyStruct {
+    #[must_use]
+    pub fn len(&self) -> usize {
+        self.data.len()
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+
struct MyStruct { data: Vec<String> }
+
+impl MyStruct {
+    #[must_use]
+    pub fn len(&self) -> usize {
+        self.data.len()
+    }
+
+    #[must_use]
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+}
+
+
+
+

generate_new

+
+

Source: generate_new.rs

+
+
+

Adds a fn new for a type.

+
+
+
Before
+
+
1
+2
+3
+
struct Ctx<T: Clone> {
+     data: T,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
struct Ctx<T: Clone> {
+     data: T,
+}
+
+impl<T: Clone> Ctx<T> {
+    fn new(data: T) -> Self { Self { data } }
+}
+
+
+
+

generate_setter

+ +
+

Generate a setter method.

+
+
+
Before
+
+
1
+2
+3
+
struct Person {
+    name: String,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct Person {
+    name: String,
+}
+
+impl Person {
+    fn set_name(&mut self, name: String) {
+        self.name = name;
+    }
+}
+
+
+
+

generate_trait_from_impl

+ +
+

Generate trait for an already defined inherent impl and convert impl to a trait impl.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+
struct Foo<const N: usize>([i32; N]);
+
+macro_rules! const_maker {
+    ($t:ty, $v:tt) => {
+        const CONST: $t = $v;
+    };
+}
+
+impl<const N: usize> Foo<N> {
+    // Used as an associated constant.
+    const CONST_ASSOC: usize = N * 4;
+
+    fn create() -> Option<()> {
+        Some(())
+    }
+
+    const_maker! {i32, 7}
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+
struct Foo<const N: usize>([i32; N]);
+
+macro_rules! const_maker {
+    ($t:ty, $v:tt) => {
+        const CONST: $t = $v;
+    };
+}
+
+trait ${0:TraitName}<const N: usize> {
+    // Used as an associated constant.
+    const CONST_ASSOC: usize = N * 4;
+
+    fn create() -> Option<()>;
+
+    const_maker! {i32, 7}
+}
+
+impl<const N: usize> ${0:TraitName}<N> for Foo<N> {
+    // Used as an associated constant.
+    const CONST_ASSOC: usize = N * 4;
+
+    fn create() -> Option<()> {
+        Some(())
+    }
+
+    const_maker! {i32, 7}
+}
+
+
+
+

generate_trait_impl

+
+

Source: generate_impl.rs

+
+
+

Adds a new trait impl for a type.

+
+
+
Before
+
+
1
+2
+3
+
struct Ctx<T: Clone> {
+    data: T,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
struct Ctx<T: Clone> {
+    data: T,
+}
+
+impl<T: Clone>  for Ctx<T> {
+
+}
+
+
+
+

inline_call

+
+

Source: inline_call.rs

+
+
+

Inlines a function or method body creating a let statement per parameter unless the parameter +can be inlined. The parameter will be inlined either if it the supplied argument is a simple local +or if the parameter is only accessed inside the function body once.

+
+
+
Before
+
+
1
+2
+3
+
fn foo(name: Option<&str>) {
+    let name = name.unwrap();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn foo(name: Option<&str>) {
+    let name = match name {
+            Some(val) => val,
+            None => panic!("called `Option::unwrap()` on a `None` value"),
+        };
+}
+
+
+
+

inline_const_as_literal

+ +
+

Evaluate and inline const variable as literal.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
const STRING: &str = "Hello, World!";
+
+fn something() -> &'static str {
+    STRING
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
const STRING: &str = "Hello, World!";
+
+fn something() -> &'static str {
+    "Hello, World!"
+}
+
+
+
+

inline_into_callers

+
+

Source: inline_call.rs

+
+
+

Inline a function or method body into all of its callers where possible, creating a let statement per parameter +unless the parameter can be inlined. The parameter will be inlined either if it the supplied argument is a simple local +or if the parameter is only accessed inside the function body once. +If all calls can be inlined the function will be removed.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
fn print(_: &str) {}
+fn foo(word: &str) {
+    if !word.is_empty() {
+        print(word);
+    }
+}
+fn bar() {
+    foo("안녕하세요");
+    foo("여러분");
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+
fn print(_: &str) {}
+
+fn bar() {
+    {
+        let word = "안녕하세요";
+        if !word.is_empty() {
+            print(word);
+        }
+    };
+    {
+        let word = "여러분";
+        if !word.is_empty() {
+            print(word);
+        }
+    };
+}
+
+
+
+

inline_local_variable

+ +
+

Inlines a local variable.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn main() {
+    let x = 1 + 2;
+    x * 4;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    (1 + 2) * 4;
+}
+
+
+
+

inline_macro

+
+

Source: inline_macro.rs

+
+
+

Takes a macro and inlines it one step.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
macro_rules! num {
+    (+$($t:tt)+) => (1 + num!($($t )+));
+    (-$($t:tt)+) => (-1 + num!($($t )+));
+    (+) => (1);
+    (-) => (-1);
+}
+
+fn main() {
+    let number = num!(+ + + - + +);
+    println!("{number}");
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
macro_rules! num {
+    (+$($t:tt)+) => (1 + num!($($t )+));
+    (-$($t:tt)+) => (-1 + num!($($t )+));
+    (+) => (1);
+    (-) => (-1);
+}
+
+fn main() {
+    let number = 1+num!(+ + - + +);
+    println!("{number}");
+}
+
+
+
+

inline_type_alias

+ +
+

Replace a type alias with its concrete type.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
type A<T = u32> = Vec<T>;
+
+fn main() {
+    let a: A;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
type A<T = u32> = Vec<T>;
+
+fn main() {
+    let a: Vec<u32>;
+}
+
+
+
+

inline_type_alias_uses

+ +
+

Inline a type alias into all of its uses where possible.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
type A = i32;
+fn id(x: A) -> A {
+    x
+};
+fn foo() {
+    let _: A = 3;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
+fn id(x: i32) -> i32 {
+    x
+};
+fn foo() {
+    let _: i32 = 3;
+}
+
+
+
+

into_to_qualified_from

+ +
+

Convert an into method call to a fully qualified from call.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
//- minicore: from
+struct B;
+impl From<i32> for B {
+    fn from(a: i32) -> Self {
+       B
+    }
+}
+
+fn main() -> () {
+    let a = 3;
+    let b: B = a.into();
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
struct B;
+impl From<i32> for B {
+    fn from(a: i32) -> Self {
+       B
+    }
+}
+
+fn main() -> () {
+    let a = 3;
+    let b: B = B::from(a);
+}
+
+
+
+

introduce_named_generic

+ +
+

Replaces impl Trait function argument with the named generic.

+
+
+
Before
+
+
1
+
fn foo(bar: impl Bar) {}
+
+
+
+
+
After
+
+
1
+
fn foo<B: Bar>(bar: B) {}
+
+
+
+

introduce_named_lifetime

+ +
+

Change an anonymous lifetime to a named lifetime.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
impl Cursor<'_> {
+    fn node(self) -> &SyntaxNode {
+        match self {
+            Cursor::Replace(node) | Cursor::Before(node) => node,
+        }
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
impl<'a> Cursor<'a> {
+    fn node(self) -> &SyntaxNode {
+        match self {
+            Cursor::Replace(node) | Cursor::Before(node) => node,
+        }
+    }
+}
+
+
+
+

invert_if

+
+

Source: invert_if.rs

+
+
+

This transforms if expressions of the form if !x {A} else {B} into if x {B} else {A} +This also works with !=. This assist can only be applied with the cursor on if.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    if !y { A } else { B }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    if y { B } else { A }
+}
+
+
+
+

line_to_block

+ +
+

Converts comments between block and single-line form.

+
+
+
Before
+
+
1
+2
+
   // Multi-line┃
+   // comment
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
  /*
+  Multi-line
+  comment
+  */
+
+
+
+

make_raw_string

+
+

Source: raw_string.rs

+
+
+

Adds r# to a plain string literal.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    "Hello,┃ World!";
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    r#"Hello, World!"#;
+}
+
+
+
+

make_usual_string

+
+

Source: raw_string.rs

+
+
+

Turns a raw string into a plain string.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    r#"Hello,┃ "World!""#;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    "Hello, \"World!\"";
+}
+
+
+
+

merge_imports

+
+

Source: merge_imports.rs

+
+
+

Merges two imports with a common prefix.

+
+
+
Before
+
+
1
+2
+
use std::fmt::Formatter;
+use std::io;
+
+
+
+
+
After
+
+
1
+
use std::{fmt::Formatter, io};
+
+
+
+

merge_match_arms

+ +
+

Merges the current match arm with the following if their bodies are identical.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move(..) => foo(),
+        Action::Stop => foo(),
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move(..) | Action::Stop => foo(),
+    }
+}
+
+
+
+

move_arm_cond_to_match_guard

+
+

Source: move_guard.rs

+
+
+

Moves if expression from match arm body into a guard.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } => if distance > 10 { foo() },
+        _ => (),
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } if distance > 10 => foo(),
+        _ => (),
+    }
+}
+
+
+
+

move_bounds_to_where_clause

+
+

Source: move_bounds.rs

+
+
+

Moves inline type bounds to a where clause.

+
+
+
Before
+
+
1
+2
+3
+
fn apply<T, U, F: FnOnce(T) -> U>(f: F, x: T) -> U {
+    f(x)
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn apply<T, U, F>(f: F, x: T) -> U where F: FnOnce(T) -> U {
+    f(x)
+}
+
+
+
+

move_const_to_impl

+ +
+

Move a local constant item in a method to impl’s associated constant. All the references will be +qualified with Self::.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct S;
+impl S {
+    fn foo() -> usize {
+        /// The answer.
+        const C: usize = 42;
+
+        C * C
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct S;
+impl S {
+    /// The answer.
+    const C: usize = 42;
+
+    fn foo() -> usize {
+        Self::C * Self::C
+    }
+}
+
+
+
+

move_from_mod_rs

+ +
+

Moves xxx/mod.rs to xxx.rs.

+
+
+
Before
+
+
1
+2
+3
+4
+
//- /main.rs
+mod a;
+//- /a/mod.rs
+fn t() {}
+
+
+
+
+
After
+
+
1
+
fn t() {}
+
+
+
+

move_guard_to_arm_body

+
+

Source: move_guard.rs

+
+
+

Moves match guard into match arm body.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } if distance > 10 => foo(),
+        _ => (),
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } => if distance > 10 {
+            foo()
+        },
+        _ => (),
+    }
+}
+
+
+
+

move_module_to_file

+ +
+

Moves inline module’s contents to a separate file.

+
+
+
Before
+
+
1
+2
+3
+
mod foo {
+    fn t() {}
+}
+
+
+
+
+
After
+
+
1
+
mod foo;
+
+
+
+

move_to_mod_rs

+
+

Source: move_to_mod_rs.rs

+
+
+

Moves xxx.rs to xxx/mod.rs.

+
+
+
Before
+
+
1
+2
+3
+4
+
//- /main.rs
+mod a;
+//- /a.rs
+fn t() {}
+
+
+
+
+
After
+
+
1
+
fn t() {}
+
+
+
+

promote_local_to_const

+ +
+

Promotes a local variable to a const item changing its name to a SCREAMING_SNAKE_CASE variant +if the local uses no non-const expressions.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
fn main() {
+    let foo = true;
+
+    if foo {
+        println!("It's true");
+    } else {
+        println!("It's false");
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
fn main() {
+    const FOO: bool = true;
+
+    if FOO {
+        println!("It's true");
+    } else {
+        println!("It's false");
+    }
+}
+
+
+
+

pull_assignment_up

+ +
+

Extracts variable assignment to outside an if or match statement.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
fn main() {
+    let mut foo = 6;
+
+    if true {
+        foo = 5;
+    } else {
+        foo = 4;
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
fn main() {
+    let mut foo = 6;
+
+    foo = if true {
+        5
+    } else {
+        4
+    };
+}
+
+
+
+

qualify_method_call

+ +
+

Replaces the method call with a qualified function call.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
struct Foo;
+impl Foo {
+    fn foo(&self) {}
+}
+fn main() {
+    let foo = Foo;
+    foo.foo();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
struct Foo;
+impl Foo {
+    fn foo(&self) {}
+}
+fn main() {
+    let foo = Foo;
+    Foo::foo(&foo);
+}
+
+
+
+

qualify_path

+
+

Source: qualify_path.rs

+
+
+

If the name is unresolved, provides all possible qualified paths for it.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let map = HashMap::new();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    let map = std::collections::HashMap::new();
+}
+
+
+
+

reformat_number_literal

+ +
+

Adds or removes separators from integer literal.

+
+
+
Before
+
+
1
+
const _: i32 = 1012345;
+
+
+
+
+
After
+
+
1
+
const _: i32 = 1_012_345;
+
+
+
+

remove_dbg

+
+

Source: remove_dbg.rs

+
+
+

Removes dbg!() macro call.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let x = dbg!(42 * dbg!(4 + 2));
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    let x = 42 * (4 + 2);
+}
+
+
+
+

remove_hash

+
+

Source: raw_string.rs

+
+
+

Removes a hash from a raw string literal.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    r#"Hello,┃ World!"#;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    r"Hello, World!";
+}
+
+
+
+

remove_mut

+
+

Source: remove_mut.rs

+
+
+

Removes the mut keyword.

+
+
+
Before
+
+
1
+2
+3
+
impl Walrus {
+    fn feed(&mut self, amount: u32) {}
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
impl Walrus {
+    fn feed(&self, amount: u32) {}
+}
+
+
+
+

remove_parentheses

+ +
+

Removes redundant parentheses.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    _ = (2) + 2;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    _ = 2 + 2;
+}
+
+
+
+

remove_unused_imports

+ +
+

Removes any use statements in the current selection that are unused.

+
+
+
Before
+
+
1
+2
+3
+4
+
struct X();
+mod foo {
+    use super::X;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
struct X();
+mod foo {
+}
+
+
+
+

remove_unused_param

+ +
+

Removes unused function parameter.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
fn frobnicate(x: i32) {}
+
+fn main() {
+    frobnicate(92);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
fn frobnicate() {}
+
+fn main() {
+    frobnicate();
+}
+
+
+
+

reorder_fields

+
+

Source: reorder_fields.rs

+
+
+

Reorder the fields of record literals and record patterns in the same order as in +the definition.

+
+
+
Before
+
+
1
+2
+
struct Foo {foo: i32, bar: i32};
+const test: Foo = Foo {bar: 0, foo: 1}
+
+
+
+
+
After
+
+
1
+2
+
struct Foo {foo: i32, bar: i32};
+const test: Foo = Foo {foo: 1, bar: 0}
+
+
+
+

reorder_impl_items

+ +
+

Reorder the items of an impl Trait. The items will be ordered +in the same order as in the trait definition.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
trait Foo {
+    type A;
+    const B: u8;
+    fn c();
+}
+
+struct Bar;
+impl Foo for Bar {
+    const B: u8 = 17;
+    fn c() {}
+    type A = String;
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
trait Foo {
+    type A;
+    const B: u8;
+    fn c();
+}
+
+struct Bar;
+impl Foo for Bar {
+    type A = String;
+    const B: u8 = 17;
+    fn c() {}
+}
+
+
+
+

replace_arith_with_checked

+ +
+

Replaces arithmetic on integers with the checked_* equivalent.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+  let x = 1 + 2;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+  let x = 1.checked_add(2);
+}
+
+
+
+

replace_arith_with_saturating

+ +
+

Replaces arithmetic on integers with the saturating_* equivalent.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+  let x = 1 + 2;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+  let x = 1.saturating_add(2);
+}
+
+
+
+

replace_arith_with_wrapping

+ +
+

Replaces arithmetic on integers with the wrapping_* equivalent.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+  let x = 1 + 2;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+  let x = 1.wrapping_add(2);
+}
+
+
+
+

replace_char_with_string

+ +
+

Replace a char literal with a string literal.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    find('{┃');
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    find("{");
+}
+
+
+
+

replace_derive_with_manual_impl

+ +
+

Converts a derive impl into a manual one.

+
+
+
Before
+
+
1
+2
+
#[derive(Debug, Display)]
+struct S;
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
#[derive(Display)]
+struct S;
+
+impl Debug for S {
+    fn fmt(&self, f: &mut Formatter) -> Result<()> {
+        f.debug_struct("S").finish()
+    }
+}
+
+
+
+

replace_if_let_with_match

+ +
+

Replaces a if let expression with a match expression.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    if let Action::Move { distance } = action {
+        foo(distance)
+    } else {
+        bar()
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } => foo(distance),
+        _ => bar(),
+    }
+}
+
+
+
+

replace_is_some_with_if_let_some

+ +
+

Replace if x.is_some() with if let Some(_tmp) = x or if x.is_ok() with if let Ok(_tmp) = x.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn main() {
+    let x = Some(1);
+    if x.is_some() {}
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn main() {
+    let x = Some(1);
+    if let Some(${0:_tmp}) = x {}
+}
+
+
+
+

replace_let_with_if_let

+ +
+

Replaces let with an if let.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
+fn main(action: Action) {
+    let x = compute();
+}
+
+fn compute() -> Option<i32> { None }
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
+fn main(action: Action) {
+    if let Some(x) = compute() {
+    }
+}
+
+fn compute() -> Option<i32> { None }
+
+
+
+

replace_match_with_if_let

+ +
+

Replaces a binary match with a wildcard pattern and no guards with an if let expression.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } => foo(distance),
+        _ => bar(),
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    if let Action::Move { distance } = action {
+        foo(distance)
+    } else {
+        bar()
+    }
+}
+
+
+
+

replace_named_generic_with_impl

+ +
+

Replaces named generic with an impl Trait in function argument.

+
+
+
Before
+
+
1
+
fn new<P: AsRef<Path>>(location: P) -> Self {}
+
+
+
+
+
After
+
+
1
+
fn new(location: impl AsRef<Path>) -> Self {}
+
+
+
+

replace_qualified_name_with_use

+ +
+

Adds a use statement for a given fully-qualified name.

+
+
+
Before
+
+
1
+
fn process(map: std::collections::HashMap<String, String>) {}
+
+
+
+
+
After
+
+
1
+2
+3
+
use std::collections::HashMap;
+
+fn process(map: HashMap<String, String>) {}
+
+
+
+

replace_string_with_char

+ +
+

Replace string literal with char literal.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    find("{┃");
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    find('{');
+}
+
+
+
+

replace_try_expr_with_match

+ +
+

Replaces a try expression with a match expression.

+
+
+
Before
+
+
1
+2
+3
+
fn handle() {
+    let pat = Some(true)?;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn handle() {
+    let pat = match Some(true) {
+        Some(it) => it,
+        None => return None,
+    };
+}
+
+
+
+

replace_turbofish_with_explicit_type

+ +
+

Converts ::<_> to an explicit type assignment.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn make<T>() -> T { ) }
+fn main() {
+    let a = make::<i32>();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn make<T>() -> T { ) }
+fn main() {
+    let a: i32 = make();
+}
+
+
+
+

replace_with_eager_method

+ +
+

Replace unwrap_or_else with unwrap_or and ok_or_else with ok_or.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn foo() {
+    let a = Some(1);
+    a.unwrap_or_else(|| 2);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn foo() {
+    let a = Some(1);
+    a.unwrap_or(2);
+}
+
+
+
+

replace_with_lazy_method

+ +
+

Replace unwrap_or with unwrap_or_else and ok_or with ok_or_else.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn foo() {
+    let a = Some(1);
+    a.unwrap_or(2);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn foo() {
+    let a = Some(1);
+    a.unwrap_or_else(|| 2);
+}
+
+
+
+

sort_items

+
+

Source: sort_items.rs

+
+
+

Sorts item members alphabetically: fields, enum variants and methods.

+
+
+
Before
+
+
1
+
struct Foo { second: u32, first: String }
+
+
+
+
+
After
+
+
1
+
struct Foo { first: String, second: u32 }
+
+
+
+
+
+
Before
+
+
1
+2
+3
+4
+
trait Bar {
+    fn second(&self) -> u32;
+    fn first(&self) -> String;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
trait Bar {
+    fn first(&self) -> String;
+    fn second(&self) -> u32;
+}
+
+
+
+
+
+
Before
+
+
1
+2
+3
+4
+5
+
struct Baz;
+impl Baz {
+    fn second(&self) -> u32;
+    fn first(&self) -> String;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
struct Baz;
+impl Baz {
+    fn first(&self) -> String;
+    fn second(&self) -> u32;
+}
+
+
+
+
+
+

There is a difference between sorting enum variants:

+
+
+
Before
+
+
1
+2
+3
+4
+
enum Animal {
+  Dog(String, f64),
+  Cat { weight: f64, name: String },
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
enum Animal {
+  Cat { weight: f64, name: String },
+  Dog(String, f64),
+}
+
+
+
+
+

and sorting a single enum struct variant:

+
+
+
Before
+
+
1
+2
+3
+4
+
enum Animal {
+  Dog(String, f64),
+  Cat { weight: f64, name: String },
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
enum Animal {
+  Dog(String, f64),
+  Cat { name: String, weight: f64 },
+}
+
+
+
+

split_import

+
+

Source: split_import.rs

+
+
+

Wraps the tail of import into braces.

+
+
+
Before
+
+
1
+
use std::collections::HashMap;
+
+
+
+
+
After
+
+
1
+
use std::{collections::HashMap};
+
+
+
+

toggle_ignore

+
+

Source: toggle_ignore.rs

+
+
+

Adds #[ignore] attribute to the test.

+
+
+
Before
+
+
1
+2
+3
+4
+
#[test]
+fn arithmetics {
+    assert_eq!(2 + 2, 5);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
#[test]
+#[ignore]
+fn arithmetics {
+    assert_eq!(2 + 2, 5);
+}
+
+
+
+

unmerge_match_arm

+ +
+

Splits the current match with a | pattern into two arms with identical bodies.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move(..) | Action::Stop => foo(),
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move(..) => foo(),
+        Action::Stop => foo(),
+    }
+}
+
+
+
+

unmerge_use

+
+

Source: unmerge_use.rs

+
+
+

Extracts single use item from use list.

+
+
+
Before
+
+
1
+
use std::fmt::{Debug, Display};
+
+
+
+
+
After
+
+
1
+2
+
use std::fmt::{Debug};
+use std::fmt::Display;
+
+
+
+

unnecessary_async

+ +
+

Removes the async mark from functions which have no .await in their body. +Looks for calls to the functions and removes the .await on the call site.

+
+
+
Before
+
+
1
+2
+
pub async fn foo() {}
+pub async fn bar() { foo().await }
+
+
+
+
+
After
+
+
1
+2
+
pub fn foo() {}
+pub async fn bar() { foo() }
+
+
+
+

unqualify_method_call

+ +
+

Transforms universal function call syntax into a method call.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    std::ops::Add::add(1, 2);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    1.add(2);
+}
+
+
+
+

unwrap_block

+
+

Source: unwrap_block.rs

+
+
+

This assist removes if…​else, for, while and loop control statements to just keep the body.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
fn foo() {
+    if true {
+        println!("foo");
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn foo() {
+    println!("foo");
+}
+
+
+
+

unwrap_result_return_type

+ +
+

Unwrap the function’s return type.

+
+
+
Before
+
+
1
+
fn foo() -> Result<i32> { Ok(42i32) }
+
+
+
+
+
After
+
+
1
+
fn foo() -> i32 { 42i32 }
+
+
+
+

unwrap_tuple

+
+

Source: unwrap_tuple.rs

+
+
+

Unwrap the tuple to different variables.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let (foo, bar) = ("Foo", "Bar");
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn main() {
+    let foo = "Foo";
+    let bar = "Bar";
+}
+
+
+
+

wrap_return_type_in_result

+ +
+

Wrap the function’s return type into Result.

+
+
+
Before
+
+
1
+
fn foo() -> i32 { 42i32 }
+
+
+
+
+
After
+
+
1
+
fn foo() -> Result<i32, ${0:_}> { Ok(42i32) }
+
+
+
+
+ + + + + diff --git a/generated_config.html b/generated_config.html new file mode 100644 index 00000000..e79a4637 --- /dev/null +++ b/generated_config.html @@ -0,0 +1,1705 @@ + + + + + + + + + + rust-analyzer + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+
+
rust-analyzer.assist.emitMustUse (default: false)
+
+
+
+
+

Whether to insert #[must_use] when generating as_ methods +for enum variants.

+
+
+
+
+
rust-analyzer.assist.expressionFillDefault (default: "todo")
+
+
+
+
+

Placeholder expression to use for missing expressions in assists.

+
+
+
+
+
rust-analyzer.cachePriming.enable (default: true)
+
+
+
+
+

Warm up caches on project load.

+
+
+
+
+
rust-analyzer.cachePriming.numThreads (default: 0)
+
+
+
+
+

How many worker threads to handle priming caches. The default 0 means to pick automatically.

+
+
+
+
+
rust-analyzer.cargo.autoreload (default: true)
+
+
+
+
+

Automatically refresh project info via cargo metadata on +Cargo.toml or .cargo/config.toml changes.

+
+
+
+
+
rust-analyzer.cargo.buildScripts.enable (default: true)
+
+
+
+
+

Run build scripts (build.rs) for more precise code analysis.

+
+
+
+
+
rust-analyzer.cargo.buildScripts.invocationLocation (default: "workspace")
+
+
+
+
+

Specifies the working directory for running build scripts. +- "workspace": run build scripts for a workspace in the workspace’s root directory. + This is incompatible with rust-analyzer.cargo.buildScripts.invocationStrategy set to once. +- "root": run build scripts in the project’s root directory. +This config only has an effect when rust-analyzer.cargo.buildScripts.overrideCommand +is set.

+
+
+
+
+
rust-analyzer.cargo.buildScripts.invocationStrategy (default: "per_workspace")
+
+
+
+
+

Specifies the invocation strategy to use when running the build scripts command. +If per_workspace is set, the command will be executed for each workspace. +If once is set, the command will be executed once. +This config only has an effect when rust-analyzer.cargo.buildScripts.overrideCommand +is set.

+
+
+
+
+
rust-analyzer.cargo.buildScripts.overrideCommand (default: null)
+
+
+
+
+

Override the command rust-analyzer uses to run build scripts and +build procedural macros. The command is required to output json +and should therefore include --message-format=json or a similar +option.

+
+
+

If there are multiple linked projects/workspaces, this command is invoked for +each of them, with the working directory being the workspace root +(i.e., the folder containing the Cargo.toml). This can be overwritten +by changing rust-analyzer.cargo.buildScripts.invocationStrategy and +rust-analyzer.cargo.buildScripts.invocationLocation.

+
+
+

By default, a cargo invocation will be constructed for the configured +targets and features, with the following base command line:

+
+
+
+
1
+
cargo check --quiet --workspace --message-format=json --all-targets
+
+
+
+
+

.

+
+
+
+
+
rust-analyzer.cargo.buildScripts.useRustcWrapper (default: true)
+
+
+
+
+

Use RUSTC_WRAPPER=rust-analyzer when running build scripts to +avoid checking unnecessary things.

+
+
+
+
+
rust-analyzer.cargo.cfgs (default: {})
+
+
+
+
+

List of cfg options to enable with the given values.

+
+
+
+
+
rust-analyzer.cargo.extraArgs (default: [])
+
+
+
+
+

Extra arguments that are passed to every cargo invocation.

+
+
+
+
+
rust-analyzer.cargo.extraEnv (default: {})
+
+
+
+
+

Extra environment variables that will be set when running cargo, rustc +or other commands within the workspace. Useful for setting RUSTFLAGS.

+
+
+
+
+
rust-analyzer.cargo.features (default: [])
+
+
+
+
+

List of features to activate.

+
+
+

Set this to "all" to pass --all-features to cargo.

+
+
+
+
+
rust-analyzer.cargo.noDefaultFeatures (default: false)
+
+
+
+
+

Whether to pass --no-default-features to cargo.

+
+
+
+
+
rust-analyzer.cargo.sysroot (default: "discover")
+
+
+
+
+

Relative path to the sysroot, or "discover" to try to automatically find it via +"rustc --print sysroot".

+
+
+

Unsetting this disables sysroot loading.

+
+
+

This option does not take effect until rust-analyzer is restarted.

+
+
+
+
+
rust-analyzer.cargo.sysrootSrc (default: null)
+
+
+
+
+

Relative path to the sysroot library sources. If left unset, this will default to +{cargo.sysroot}/lib/rustlib/src/rust/library.

+
+
+

This option does not take effect until rust-analyzer is restarted.

+
+
+
+
+
rust-analyzer.cargo.target (default: null)
+
+
+
+
+

Compilation target override (target triple).

+
+
+
+
+
rust-analyzer.cargo.unsetTest (default: ["core"])
+
+
+
+
+

Unsets the implicit #[cfg(test)] for the specified crates.

+
+
+
+
+
rust-analyzer.checkOnSave (default: true)
+
+
+
+
+

Run the check command for diagnostics on save.

+
+
+
+
+
rust-analyzer.check.allTargets (default: true)
+
+
+
+
+

Check all targets and tests (--all-targets).

+
+
+
+
+
rust-analyzer.check.command (default: "check")
+
+
+
+
+

Cargo command to use for cargo check.

+
+
+
+
+
rust-analyzer.check.extraArgs (default: [])
+
+
+
+
+

Extra arguments for cargo check.

+
+
+
+
+
rust-analyzer.check.extraEnv (default: {})
+
+
+
+
+

Extra environment variables that will be set when running cargo check. +Extends rust-analyzer.cargo.extraEnv.

+
+
+
+
+
rust-analyzer.check.features (default: null)
+
+
+
+
+

List of features to activate. Defaults to +rust-analyzer.cargo.features.

+
+
+

Set to "all" to pass --all-features to Cargo.

+
+
+
+
+
rust-analyzer.check.ignore (default: [])
+
+
+
+
+

List of cargo check (or other command specified in check.command) diagnostics to ignore.

+
+
+

For example for cargo check: dead_code, unused_imports, unused_variables,…​

+
+
+
+
+
rust-analyzer.check.invocationLocation (default: "workspace")
+
+
+
+
+

Specifies the working directory for running checks. +- "workspace": run checks for workspaces in the corresponding workspaces' root directories. + This falls back to "root" if rust-analyzer.cargo.check.invocationStrategy is set to once. +- "root": run checks in the project’s root directory. +This config only has an effect when rust-analyzer.cargo.check.overrideCommand +is set.

+
+
+
+
+
rust-analyzer.check.invocationStrategy (default: "per_workspace")
+
+
+
+
+

Specifies the invocation strategy to use when running the check command. +If per_workspace is set, the command will be executed for each workspace. +If once is set, the command will be executed once. +This config only has an effect when rust-analyzer.cargo.check.overrideCommand +is set.

+
+
+
+
+
rust-analyzer.check.noDefaultFeatures (default: null)
+
+
+
+
+

Whether to pass --no-default-features to Cargo. Defaults to +rust-analyzer.cargo.noDefaultFeatures.

+
+
+
+
+
rust-analyzer.check.overrideCommand (default: null)
+
+
+
+
+

Override the command rust-analyzer uses instead of cargo check for +diagnostics on save. The command is required to output json and +should therefore include --message-format=json or a similar option +(if your client supports the colorDiagnosticOutput experimental +capability, you can use --message-format=json-diagnostic-rendered-ansi).

+
+
+

If you’re changing this because you’re using some tool wrapping +Cargo, you might also want to change +rust-analyzer.cargo.buildScripts.overrideCommand.

+
+
+

If there are multiple linked projects/workspaces, this command is invoked for +each of them, with the working directory being the workspace root +(i.e., the folder containing the Cargo.toml). This can be overwritten +by changing rust-analyzer.cargo.check.invocationStrategy and +rust-analyzer.cargo.check.invocationLocation.

+
+
+

An example command would be:

+
+
+
+
1
+
cargo check --workspace --message-format=json --all-targets
+
+
+
+
+

.

+
+
+
+
+
rust-analyzer.check.targets (default: null)
+
+
+
+
+

Check for specific targets. Defaults to rust-analyzer.cargo.target if empty.

+
+
+

Can be a single target, e.g. "x86_64-unknown-linux-gnu" or a list of targets, e.g. +["aarch64-apple-darwin", "x86_64-apple-darwin"].

+
+
+

Aliased as "checkOnSave.targets".

+
+
+
+
+
rust-analyzer.completion.autoimport.enable (default: true)
+
+
+
+
+

Toggles the additional completions that automatically add imports when completed. +Note that your client must specify the additionalTextEdits LSP client capability to truly have this feature enabled.

+
+
+
+
+
rust-analyzer.completion.autoself.enable (default: true)
+
+
+
+
+

Toggles the additional completions that automatically show method calls and field accesses +with self prefixed to them when inside a method.

+
+
+
+
+
rust-analyzer.completion.callable.snippets (default: "fill_arguments")
+
+
+
+
+

Whether to add parenthesis and argument snippets when completing function.

+
+
+
+
+
rust-analyzer.completion.fullFunctionSignatures.enable (default: false)
+
+
+
+
+

Whether to show full function/method signatures in completion docs.

+
+
+
+
+
rust-analyzer.completion.limit (default: null)
+
+
+
+
+

Maximum number of completions to return. If None, the limit is infinite.

+
+
+
+
+
rust-analyzer.completion.postfix.enable (default: true)
+
+
+
+
+

Whether to show postfix snippets like dbg, if, not, etc.

+
+
+
+
+
rust-analyzer.completion.privateEditable.enable (default: false)
+
+
+
+
+

Enables completions of private items and fields that are defined in the current workspace even if they are not visible at the current position.

+
+
+
+
+
rust-analyzer.completion.snippets.custom
+
+
+
+
+

Default:

+
+
+
+
{
+            "Arc::new": {
+                "postfix": "arc",
+                "body": "Arc::new(${receiver})",
+                "requires": "std::sync::Arc",
+                "description": "Put the expression into an `Arc`",
+                "scope": "expr"
+            },
+            "Rc::new": {
+                "postfix": "rc",
+                "body": "Rc::new(${receiver})",
+                "requires": "std::rc::Rc",
+                "description": "Put the expression into an `Rc`",
+                "scope": "expr"
+            },
+            "Box::pin": {
+                "postfix": "pinbox",
+                "body": "Box::pin(${receiver})",
+                "requires": "std::boxed::Box",
+                "description": "Put the expression into a pinned `Box`",
+                "scope": "expr"
+            },
+            "Ok": {
+                "postfix": "ok",
+                "body": "Ok(${receiver})",
+                "description": "Wrap the expression in a `Result::Ok`",
+                "scope": "expr"
+            },
+            "Err": {
+                "postfix": "err",
+                "body": "Err(${receiver})",
+                "description": "Wrap the expression in a `Result::Err`",
+                "scope": "expr"
+            },
+            "Some": {
+                "postfix": "some",
+                "body": "Some(${receiver})",
+                "description": "Wrap the expression in an `Option::Some`",
+                "scope": "expr"
+            }
+        }
+
+
+
+

Custom completion snippets.

+
+
+
+
+
rust-analyzer.diagnostics.disabled (default: [])
+
+
+
+
+

List of rust-analyzer diagnostics to disable.

+
+
+
+
+
rust-analyzer.diagnostics.enable (default: true)
+
+
+
+
+

Whether to show native rust-analyzer diagnostics.

+
+
+
+
+
rust-analyzer.diagnostics.experimental.enable (default: false)
+
+
+
+
+

Whether to show experimental rust-analyzer diagnostics that might +have more false positives than usual.

+
+
+
+
+
rust-analyzer.diagnostics.remapPrefix (default: {})
+
+
+
+
+

Map of prefixes to be substituted when parsing diagnostic file paths. +This should be the reverse mapping of what is passed to rustc as --remap-path-prefix.

+
+
+
+
+
rust-analyzer.diagnostics.warningsAsHint (default: [])
+
+
+
+
+

List of warnings that should be displayed with hint severity.

+
+
+

The warnings will be indicated by faded text or three dots in code +and will not show up in the Problems Panel.

+
+
+
+
+
rust-analyzer.diagnostics.warningsAsInfo (default: [])
+
+
+
+
+

List of warnings that should be displayed with info severity.

+
+
+

The warnings will be indicated by a blue squiggly underline in code +and a blue icon in the Problems Panel.

+
+
+
+
+
rust-analyzer.files.excludeDirs (default: [])
+
+
+
+
+

These directories will be ignored by rust-analyzer. They are +relative to the workspace root, and globs are not supported. You may +also need to add the folders to Code’s files.watcherExclude.

+
+
+
+
+
rust-analyzer.files.watcher (default: "client")
+
+
+
+
+

Controls file watching implementation.

+
+
+
+
+
rust-analyzer.highlightRelated.breakPoints.enable (default: true)
+
+
+
+
+

Enables highlighting of related references while the cursor is on break, loop, while, or for keywords.

+
+
+
+
+
rust-analyzer.highlightRelated.closureCaptures.enable (default: true)
+
+
+
+
+

Enables highlighting of all captures of a closure while the cursor is on the | or move keyword of a closure.

+
+
+
+
+
rust-analyzer.highlightRelated.exitPoints.enable (default: true)
+
+
+
+
+

Enables highlighting of all exit points while the cursor is on any return, ?, fn, or return type arrow ().

+
+
+
+
+
rust-analyzer.highlightRelated.references.enable (default: true)
+
+
+
+
+

Enables highlighting of related references while the cursor is on any identifier.

+
+
+
+
+
rust-analyzer.highlightRelated.yieldPoints.enable (default: true)
+
+
+
+
+

Enables highlighting of all break points for a loop or block context while the cursor is on any async or await keywords.

+
+
+
+
+
rust-analyzer.hover.actions.debug.enable (default: true)
+
+
+
+
+

Whether to show Debug action. Only applies when +rust-analyzer.hover.actions.enable is set.

+
+
+
+
+
rust-analyzer.hover.actions.enable (default: true)
+
+
+
+
+

Whether to show HoverActions in Rust files.

+
+
+
+
+
rust-analyzer.hover.actions.gotoTypeDef.enable (default: true)
+
+
+
+
+

Whether to show Go to Type Definition action. Only applies when +rust-analyzer.hover.actions.enable is set.

+
+
+
+
+
rust-analyzer.hover.actions.implementations.enable (default: true)
+
+
+
+
+

Whether to show Implementations action. Only applies when +rust-analyzer.hover.actions.enable is set.

+
+
+
+
+
rust-analyzer.hover.actions.references.enable (default: false)
+
+
+
+
+

Whether to show References action. Only applies when +rust-analyzer.hover.actions.enable is set.

+
+
+
+
+
rust-analyzer.hover.actions.run.enable (default: true)
+
+
+
+
+

Whether to show Run action. Only applies when +rust-analyzer.hover.actions.enable is set.

+
+
+
+
+
rust-analyzer.hover.documentation.enable (default: true)
+
+
+
+
+

Whether to show documentation on hover.

+
+
+
+
+
rust-analyzer.hover.documentation.keywords.enable (default: true)
+
+
+
+
+

Whether to show keyword hover popups. Only applies when +rust-analyzer.hover.documentation.enable is set.

+
+
+
+
+
rust-analyzer.hover.links.enable (default: true)
+
+
+
+
+

Use markdown syntax for links on hover.

+
+
+
+
+
rust-analyzer.hover.memoryLayout.alignment (default: "hexadecimal")
+
+
+
+
+

How to render the align information in a memory layout hover.

+
+
+
+
+
rust-analyzer.hover.memoryLayout.enable (default: true)
+
+
+
+
+

Whether to show memory layout data on hover.

+
+
+
+
+
rust-analyzer.hover.memoryLayout.niches (default: false)
+
+
+
+
+

How to render the niche information in a memory layout hover.

+
+
+
+
+
rust-analyzer.hover.memoryLayout.offset (default: "hexadecimal")
+
+
+
+
+

How to render the offset information in a memory layout hover.

+
+
+
+
+
rust-analyzer.hover.memoryLayout.size (default: "both")
+
+
+
+
+

How to render the size information in a memory layout hover.

+
+
+
+
+
rust-analyzer.imports.granularity.enforce (default: false)
+
+
+
+
+

Whether to enforce the import granularity setting for all files. If set to false rust-analyzer will try to keep import styles consistent per file.

+
+
+
+
+
rust-analyzer.imports.granularity.group (default: "crate")
+
+
+
+
+

How imports should be grouped into use statements.

+
+
+
+
+
rust-analyzer.imports.group.enable (default: true)
+
+
+
+
+

Group inserted imports by the following order. Groups are separated by newlines.

+
+
+
+
+
rust-analyzer.imports.merge.glob (default: true)
+
+
+
+
+

Whether to allow import insertion to merge new imports into single path glob imports like use std::fmt::*;.

+
+
+
+
+
rust-analyzer.imports.prefer.no.std (default: false)
+
+
+
+
+

Prefer to unconditionally use imports of the core and alloc crate, over the std crate.

+
+
+
+
+
rust-analyzer.imports.prefix (default: "plain")
+
+
+
+
+

The path structure for newly inserted paths to use.

+
+
+
+
+
rust-analyzer.inlayHints.bindingModeHints.enable (default: false)
+
+
+
+
+

Whether to show inlay type hints for binding modes.

+
+
+
+
+
rust-analyzer.inlayHints.chainingHints.enable (default: true)
+
+
+
+
+

Whether to show inlay type hints for method chains.

+
+
+
+
+
rust-analyzer.inlayHints.closingBraceHints.enable (default: true)
+
+
+
+
+

Whether to show inlay hints after a closing } to indicate what item it belongs to.

+
+
+
+
+
rust-analyzer.inlayHints.closingBraceHints.minLines (default: 25)
+
+
+
+
+

Minimum number of lines required before the } until the hint is shown (set to 0 or 1 +to always show them).

+
+
+
+
+
rust-analyzer.inlayHints.closureCaptureHints.enable (default: false)
+
+
+
+
+

Whether to show inlay hints for closure captures.

+
+
+
+
+
rust-analyzer.inlayHints.closureReturnTypeHints.enable (default: "never")
+
+
+
+
+

Whether to show inlay type hints for return types of closures.

+
+
+
+
+
rust-analyzer.inlayHints.closureStyle (default: "impl_fn")
+
+
+
+
+

Closure notation in type and chaining inlay hints.

+
+
+
+
+
rust-analyzer.inlayHints.discriminantHints.enable (default: "never")
+
+
+
+
+

Whether to show enum variant discriminant hints.

+
+
+
+
+
rust-analyzer.inlayHints.expressionAdjustmentHints.enable (default: "never")
+
+
+
+
+

Whether to show inlay hints for type adjustments.

+
+
+
+
+
rust-analyzer.inlayHints.expressionAdjustmentHints.hideOutsideUnsafe (default: false)
+
+
+
+
+

Whether to hide inlay hints for type adjustments outside of unsafe blocks.

+
+
+
+
+
rust-analyzer.inlayHints.expressionAdjustmentHints.mode (default: "prefix")
+
+
+
+
+

Whether to show inlay hints as postfix ops (. instead of , etc).

+
+
+
+
+
rust-analyzer.inlayHints.lifetimeElisionHints.enable (default: "never")
+
+
+
+
+

Whether to show inlay type hints for elided lifetimes in function signatures.

+
+
+
+
+
rust-analyzer.inlayHints.lifetimeElisionHints.useParameterNames (default: false)
+
+
+
+
+

Whether to prefer using parameter names as the name for elided lifetime hints if possible.

+
+
+
+
+
rust-analyzer.inlayHints.maxLength (default: 25)
+
+
+
+
+

Maximum length for inlay hints. Set to null to have an unlimited length.

+
+
+
+
+
rust-analyzer.inlayHints.parameterHints.enable (default: true)
+
+
+
+
+

Whether to show function parameter name inlay hints at the call +site.

+
+
+
+
+
rust-analyzer.inlayHints.reborrowHints.enable (default: "never")
+
+
+
+
+

Whether to show inlay hints for compiler inserted reborrows. +This setting is deprecated in favor of rust-analyzer.inlayHints.expressionAdjustmentHints.enable.

+
+
+
+
+
rust-analyzer.inlayHints.renderColons (default: true)
+
+
+
+
+

Whether to render leading colons for type hints, and trailing colons for parameter hints.

+
+
+
+
+
rust-analyzer.inlayHints.typeHints.enable (default: true)
+
+
+
+
+

Whether to show inlay type hints for variables.

+
+
+
+
+
rust-analyzer.inlayHints.typeHints.hideClosureInitialization (default: false)
+
+
+
+
+

Whether to hide inlay type hints for let statements that initialize to a closure. +Only applies to closures with blocks, same as rust-analyzer.inlayHints.closureReturnTypeHints.enable.

+
+
+
+
+
rust-analyzer.inlayHints.typeHints.hideNamedConstructor (default: false)
+
+
+
+
+

Whether to hide inlay type hints for constructors.

+
+
+
+
+
rust-analyzer.interpret.tests (default: false)
+
+
+
+
+

Enables the experimental support for interpreting tests.

+
+
+
+
+
rust-analyzer.joinLines.joinAssignments (default: true)
+
+
+
+
+

Join lines merges consecutive declaration and initialization of an assignment.

+
+
+
+
+
rust-analyzer.joinLines.joinElseIf (default: true)
+
+
+
+
+

Join lines inserts else between consecutive ifs.

+
+
+
+
+
rust-analyzer.joinLines.removeTrailingComma (default: true)
+
+
+
+
+

Join lines removes trailing commas.

+
+
+
+
+
rust-analyzer.joinLines.unwrapTrivialBlock (default: true)
+
+
+
+
+

Join lines unwraps trivial blocks.

+
+
+
+
+
rust-analyzer.lens.debug.enable (default: true)
+
+
+
+
+

Whether to show Debug lens. Only applies when +rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.enable (default: true)
+
+
+
+
+

Whether to show CodeLens in Rust files.

+
+
+
+
+
rust-analyzer.lens.forceCustomCommands (default: true)
+
+
+
+
+

Internal config: use custom client-side commands even when the +client doesn’t set the corresponding capability.

+
+
+
+
+
rust-analyzer.lens.implementations.enable (default: true)
+
+
+
+
+

Whether to show Implementations lens. Only applies when +rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.location (default: "above_name")
+
+
+
+
+

Where to render annotations.

+
+
+
+
+
rust-analyzer.lens.references.adt.enable (default: false)
+
+
+
+
+

Whether to show References lens for Struct, Enum, and Union. +Only applies when rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.references.enumVariant.enable (default: false)
+
+
+
+
+

Whether to show References lens for Enum Variants. +Only applies when rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.references.method.enable (default: false)
+
+
+
+
+

Whether to show Method References lens. Only applies when +rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.references.trait.enable (default: false)
+
+
+
+
+

Whether to show References lens for Trait. +Only applies when rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.run.enable (default: true)
+
+
+
+
+

Whether to show Run lens. Only applies when +rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.linkedProjects (default: [])
+
+
+
+
+

Disable project auto-discovery in favor of explicitly specified set +of projects.

+
+
+

Elements must be paths pointing to Cargo.toml, +rust-project.json, or JSON objects in rust-project.json format.

+
+
+
+
+
rust-analyzer.lru.capacity (default: null)
+
+
+
+
+

Number of syntax trees rust-analyzer keeps in memory. Defaults to 128.

+
+
+
+
+
rust-analyzer.lru.query.capacities (default: {})
+
+
+
+
+

Sets the LRU capacity of the specified queries.

+
+
+
+
+
rust-analyzer.notifications.cargoTomlNotFound (default: true)
+
+
+
+
+

Whether to show can’t find Cargo.toml error message.

+
+
+
+
+
rust-analyzer.numThreads (default: null)
+
+
+
+
+

How many worker threads in the main loop. The default null means to pick automatically.

+
+
+
+
+
rust-analyzer.procMacro.attributes.enable (default: true)
+
+
+
+
+

Expand attribute macros. Requires rust-analyzer.procMacro.enable to be set.

+
+
+
+
+
rust-analyzer.procMacro.enable (default: true)
+
+
+
+
+

Enable support for procedural macros, implies rust-analyzer.cargo.buildScripts.enable.

+
+
+
+
+
rust-analyzer.procMacro.ignored (default: {})
+
+
+
+
+

These proc-macros will be ignored when trying to expand them.

+
+
+

This config takes a map of crate names with the exported proc-macro names to ignore as values.

+
+
+
+
+
rust-analyzer.procMacro.server (default: null)
+
+
+
+
+

Internal config, path to proc-macro server executable.

+
+
+
+
+
rust-analyzer.references.excludeImports (default: false)
+
+
+
+
+

Exclude imports from find-all-references.

+
+
+
+
+
rust-analyzer.runnables.command (default: null)
+
+
+
+
+

Command to be executed instead of 'cargo' for runnables.

+
+
+
+
+
rust-analyzer.runnables.extraArgs (default: [])
+
+
+
+
+

Additional arguments to be passed to cargo for runnables such as +tests or binaries. For example, it may be --release.

+
+
+
+
+
rust-analyzer.rust.analyzerTargetDir (default: null)
+
+
+
+
+

Optional path to a rust-analyzer specific target directory. +This prevents rust-analyzer’s cargo check from locking the Cargo.lock +at the expense of duplicating build artifacts.

+
+
+

Set to true to use a subdirectory of the existing target directory or +set to a path relative to the workspace to use that path.

+
+
+
+
+
rust-analyzer.rustc.source (default: null)
+
+
+
+
+

Path to the Cargo.toml of the rust compiler workspace, for usage in rustc_private +projects, or "discover" to try to automatically find it if the rustc-dev component +is installed.

+
+
+

Any project which uses rust-analyzer with the rustcPrivate +crates must set [package.metadata.rust-analyzer] rustc_private=true to use it.

+
+
+

This option does not take effect until rust-analyzer is restarted.

+
+
+
+
+
rust-analyzer.rustfmt.extraArgs (default: [])
+
+
+
+
+

Additional arguments to rustfmt.

+
+
+
+
+
rust-analyzer.rustfmt.overrideCommand (default: null)
+
+
+
+
+

Advanced option, fully override the command rust-analyzer uses for +formatting. This should be the equivalent of rustfmt here, and +not that of cargo fmt. The file contents will be passed on the +standard input and the formatted result will be read from the +standard output.

+
+
+
+
+
rust-analyzer.rustfmt.rangeFormatting.enable (default: false)
+
+
+
+
+

Enables the use of rustfmt’s unstable range formatting command for the +textDocument/rangeFormatting request. The rustfmt option is unstable and only +available on a nightly build.

+
+
+
+
+
rust-analyzer.semanticHighlighting.doc.comment.inject.enable (default: true)
+
+
+
+
+

Inject additional highlighting into doc comments.

+
+
+

When enabled, rust-analyzer will highlight rust source in doc comments as well as intra +doc links.

+
+
+
+
+
rust-analyzer.semanticHighlighting.nonStandardTokens (default: true)
+
+
+
+
+

Whether the server is allowed to emit non-standard tokens and modifiers.

+
+
+
+
+
rust-analyzer.semanticHighlighting.operator.enable (default: true)
+
+
+
+
+

Use semantic tokens for operators.

+
+
+

When disabled, rust-analyzer will emit semantic tokens only for operator tokens when +they are tagged with modifiers.

+
+
+
+
+
rust-analyzer.semanticHighlighting.operator.specialization.enable (default: false)
+
+
+
+
+

Use specialized semantic tokens for operators.

+
+
+

When enabled, rust-analyzer will emit special token types for operator tokens instead +of the generic operator token type.

+
+
+
+
+
rust-analyzer.semanticHighlighting.punctuation.enable (default: false)
+
+
+
+
+

Use semantic tokens for punctuation.

+
+
+

When disabled, rust-analyzer will emit semantic tokens only for punctuation tokens when +they are tagged with modifiers or have a special role.

+
+
+
+
+
rust-analyzer.semanticHighlighting.punctuation.separate.macro.bang (default: false)
+
+
+
+
+

When enabled, rust-analyzer will emit a punctuation semantic token for the ! of macro +calls.

+
+
+
+
+
rust-analyzer.semanticHighlighting.punctuation.specialization.enable (default: false)
+
+
+
+
+

Use specialized semantic tokens for punctuation.

+
+
+

When enabled, rust-analyzer will emit special token types for punctuation tokens instead +of the generic punctuation token type.

+
+
+
+
+
rust-analyzer.semanticHighlighting.strings.enable (default: true)
+
+
+
+
+

Use semantic tokens for strings.

+
+
+

In some editors (e.g. vscode) semantic tokens override other highlighting grammars. +By disabling semantic tokens for strings, other grammars can be used to highlight +their contents.

+
+
+
+
+
rust-analyzer.signatureInfo.detail (default: "full")
+
+
+
+
+

Show full signature of the callable. Only shows parameters if disabled.

+
+
+
+
+
rust-analyzer.signatureInfo.documentation.enable (default: true)
+
+
+
+
+

Show documentation.

+
+
+
+
+
rust-analyzer.typing.autoClosingAngleBrackets.enable (default: false)
+
+
+
+
+

Whether to insert closing angle brackets when typing an opening angle bracket of a generic argument list.

+
+
+
+
+
rust-analyzer.workspace.symbol.search.kind (default: "only_types")
+
+
+
+
+

Workspace symbol search kind.

+
+
+
+
+
rust-analyzer.workspace.symbol.search.limit (default: 128)
+
+
+
+
+

Limits the number of items returned from a workspace symbol search (Defaults to 128). +Some clients like vs-code issue new searches on result filtering and don’t require all results to be returned in the initial search. +Other clients requires all results upfront and might require a higher limit.

+
+
+
+
+
rust-analyzer.workspace.symbol.search.scope (default: "workspace")
+
+
+
+
+

Workspace symbol search scope.

+
+
+
+
+
+
+
+ + + + + diff --git a/generated_diagnostic.html b/generated_diagnostic.html new file mode 100644 index 00000000..408a2ac2 --- /dev/null +++ b/generated_diagnostic.html @@ -0,0 +1,423 @@ + + + + + + + + + + rust-analyzer + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

break-outside-of-loop

+ +
+

This diagnostic is triggered if the break keyword is used outside of a loop.

+
+
+
+

expected-function

+ +
+

This diagnostic is triggered if a call is made on something that is not callable.

+
+
+
+

inactive-code

+
+

Source: inactive_code.rs

+
+
+

This diagnostic is shown for code with inactive #[cfg] attributes.

+
+
+
+

incoherent-impl

+
+

Source: incoherent_impl.rs

+
+
+

This diagnostic is triggered if the targe type of an impl is from a foreign crate.

+
+
+
+

incorrect-ident-case

+
+

Source: incorrect_case.rs

+
+
+

This diagnostic is triggered if an item name doesn’t follow Rust naming convention.

+
+
+
+

invalid-derive-target

+ +
+

This diagnostic is shown when the derive attribute is used on an item other than a struct, +enum or union.

+
+
+
+

macro-error

+
+

Source: macro_error.rs

+
+
+

This diagnostic is shown for macro expansion errors.

+
+
+
+

macro-error

+
+

Source: macro_error.rs

+
+
+

This diagnostic is shown for macro expansion errors.

+
+
+
+

malformed-derive

+ +
+

This diagnostic is shown when the derive attribute has invalid input.

+
+
+
+

mismatched-arg-count

+ +
+

This diagnostic is triggered if a function is invoked with an incorrect amount of arguments.

+
+
+
+

mismatched-tuple-struct-pat-arg-count

+ +
+

This diagnostic is triggered if a function is invoked with an incorrect amount of arguments.

+
+
+
+

missing-fields

+
+

Source: missing_fields.rs

+
+
+

This diagnostic is triggered if record lacks some fields that exist in the corresponding structure.

+
+
+

Example:

+
+
+
+
1
+2
+3
+
struct A { a: u8, b: u8 }
+
+let a = A { a: 10 };
+
+
+
+
+
+

missing-match-arm

+ +
+

This diagnostic is triggered if match block is missing one or more match arms.

+
+
+
+

missing-unsafe

+
+

Source: missing_unsafe.rs

+
+
+

This diagnostic is triggered if an operation marked as unsafe is used outside of an unsafe function or block.

+
+
+
+

moved-out-of-ref

+ +
+

This diagnostic is triggered on moving non copy things out of references.

+
+
+
+

need-mut

+ +
+

This diagnostic is triggered on mutating an immutable variable.

+
+
+
+

no-such-field

+
+

Source: no_such_field.rs

+
+
+

This diagnostic is triggered if created structure does not have field provided in record.

+
+
+
+

private-assoc-item

+ +
+

This diagnostic is triggered if the referenced associated item is not visible from the current +module.

+
+
+
+

private-field

+
+

Source: private_field.rs

+
+
+

This diagnostic is triggered if the accessed field is not visible from the current module.

+
+
+
+

replace-filter-map-next-with-find-map

+ +
+

This diagnostic is triggered when .filter_map(..).next() is used, rather than the more concise .find_map(..).

+
+
+
+

type-mismatch

+
+

Source: type_mismatch.rs

+
+
+

This diagnostic is triggered when the type of an expression or pattern does not match +the expected type.

+
+
+
+

typed-hole

+
+

Source: typed_hole.rs

+
+
+

This diagnostic is triggered when an underscore expression is used in an invalid position.

+
+
+
+

undeclared-label

+ +
+
+

unimplemented-builtin-macro

+ +
+

This diagnostic is shown for builtin macros which are not yet implemented by rust-analyzer

+
+
+
+

unlinked-file

+
+

Source: unlinked_file.rs

+
+
+

This diagnostic is shown for files that are not included in any crate, or files that are part of +crates rust-analyzer failed to discover. The file will not have IDE features available.

+
+
+
+

unnecessary-braces

+
+

Source: useless_braces.rs

+
+
+

Diagnostic for unnecessary braces in use items.

+
+
+
+

unreachable-label

+ +
+
+

unresolved-extern-crate

+ +
+

This diagnostic is triggered if rust-analyzer is unable to discover referred extern crate.

+
+
+
+

unresolved-field

+ +
+

This diagnostic is triggered if a field does not exist on a given type.

+
+
+
+

unresolved-import

+ +
+

This diagnostic is triggered if rust-analyzer is unable to resolve a path in +a use declaration.

+
+
+
+

unresolved-macro-call

+ +
+

This diagnostic is triggered if rust-analyzer is unable to resolve the path +to a macro in a macro invocation.

+
+
+
+

unresolved-method

+ +
+

This diagnostic is triggered if a method does not exist on a given type.

+
+
+
+

unresolved-module

+ +
+

This diagnostic is triggered if rust-analyzer is unable to discover referred module.

+
+
+
+

unresolved-proc-macro

+ +
+

This diagnostic is shown when a procedural macro can not be found. This usually means that +procedural macro support is simply disabled (and hence is only a weak hint instead of an error), +but can also indicate project setup problems.

+
+
+

If you are seeing a lot of "proc macro not expanded" warnings, you can add this option to the +rust-analyzer.diagnostics.disabled list to prevent them from showing. Alternatively you can +enable support for procedural macros (see rust-analyzer.procMacro.attributes.enable).

+
+
+
+

unused-mut

+ +
+

This diagnostic is triggered when a mutable variable isn’t actually mutated.

+
+
+
+

unused-variables

+ +
+

This diagnostic is triggered when a local variable is not used.

+
+
+
+ + + + + diff --git a/index.html b/index.html new file mode 100644 index 00000000..7f60cd05 --- /dev/null +++ b/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + rust-analyzer + + + + + + + + + + + + + + + + + + + + + + +
+
+

+ +

+ +

+ Bringing a great IDE experience
+ to the Rust programming language. +

+ + + GitHub Source + +
+ +
+

About

+

+ rust-analyzer is an implementation of Language + Server Protocol for the Rust programming language. + It provides features like completion and goto definition for many code editors, including VS Code, Emacs and + Vim. +

+
+ +
+

Quick Start

+ +

+ For VS Code, install rust-analyzer extension + from the marketplace. + Prebuilt language server binaries for Windows, Linux and Mac are available on the releases page. +

+ +

+ Instructions for other editors, building from source and the list of features are found in + + + the manual. + +

+ +

+ You can ask questions about using rust-analyzer in the Rust users forum: + + Editors and IDEs. + +

+
+ +
+

Support

+ +

+ rust-analyzer is a free and open source project, developed by + Ferrous Systems + with support from multiple companies and individuals. + Donate to rust-analyzer on Open Collective. +

+ + +

+ The following companies contributed significantly towards rust-analyzer development: +

+ + +
+ +
+

Latest News

+ +
+ + + Changelog #203 +
+ + All news +
+ +
+

Latest Post

+ +
+ + + Durable Incrementality +
+ + All posts +
+ +
+ + + + + diff --git a/manual.html b/manual.html new file mode 100644 index 00000000..8804f150 --- /dev/null +++ b/manual.html @@ -0,0 +1,11992 @@ + + + + + + + + + + User Manual + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

User Manual

+ +
+
+
+

At its core, rust-analyzer is a library for semantic analysis of Rust code as it changes over time. +This manual focuses on a specific usage of the library — running it as part of a server that implements the +Language Server Protocol (LSP). +The LSP allows various code editors, like VS Code, Emacs or Vim, to implement semantic features like completion or goto definition by talking to an external language server process.

+
+
+ + + + + +
+ + +
+

To improve this document, send a pull request:
+https://github.com/rust-analyzer/…​/manual.adoc

+
+
+

The manual is written in AsciiDoc and includes some extra files which are generated from the source code. Run cargo test and cargo test -p xtask to create these and then asciidoctor manual.adoc to create an HTML copy.

+
+
+
+
+

If you have questions about using rust-analyzer, please ask them in the “IDEs and Editors” topic of Rust users forum.

+
+
+
+
Table of Contents
+ +
+
+
+

Installation

+
+
+

In theory, one should be able to just install the rust-analyzer binary and have it automatically work with any editor. +We are not there yet, so some editor specific setup is required.

+
+
+

Additionally, rust-analyzer needs the sources of the standard library. +If the source code is not present, rust-analyzer will attempt to install it automatically.

+
+
+

To add the sources manually, run the following command:

+
+
+
+
1
+
$ rustup component add rust-src
+
+
+
+
+

Toolchain

+
+

Only the latest stable standard library source is officially supported for use with rust-analyzer. +If you are using an older toolchain or have an override set, rust-analyzer may fail to understand the Rust source. +You will either need to update your toolchain or use an older version of rust-analyzer that is compatible with your toolchain.

+
+
+

If you are using an override in your project, you can still force rust-analyzer to use the stable toolchain via the environment variable RUSTUP_TOOLCHAIN. +For example, with VS Code or coc-rust-analyzer:

+
+
+
+
1
+
{ "rust-analyzer.server.extraEnv": { "RUSTUP_TOOLCHAIN": "stable" } }
+
+
+
+
+
+

VS Code

+
+

This is the best supported editor at the moment. +The rust-analyzer plugin for VS Code is maintained +in tree.

+
+
+

You can install the latest release of the plugin from +the marketplace.

+
+
+

Note that the plugin may cause conflicts with the +previous official Rust plugin. +The latter is no longer maintained and should be uninstalled.

+
+
+

The server binary is stored in the extension install directory, which starts with rust-lang.rust-analyzer- and is located under:

+
+
+
    +
  • +

    Linux: ~/.vscode/extensions

    +
  • +
  • +

    Linux (Remote, such as WSL): ~/.vscode-server/extensions

    +
  • +
  • +

    macOS: ~/.vscode/extensions

    +
  • +
  • +

    Windows: %USERPROFILE%\.vscode\extensions

    +
  • +
+
+
+

As an exception, on NixOS, the extension makes a copy of the server and stores it under ~/.config/Code/User/globalStorage/rust-lang.rust-analyzer.

+
+
+

Note that we only support the two most recent versions of VS Code.

+
+
+

Updates

+
+

The extension will be updated automatically as new versions become available. +It will ask your permission to download the matching language server version binary if needed.

+
+
+
Nightly
+
+

We ship nightly releases for VS Code. +To help us out by testing the newest code, you can enable pre-release versions in the Code extension page.

+
+
+
+
+

Manual installation

+
+

Alternatively, download a VSIX corresponding to your platform from the +releases page.

+
+
+

Install the extension with the Extensions: Install from VSIX command within VS Code, or from the command line via:

+
+
+
+
1
+
$ code --install-extension /path/to/rust-analyzer.vsix
+
+
+
+
+

If you are running an unsupported platform, you can install rust-analyzer-no-server.vsix and compile or obtain a server binary. +Copy the server anywhere, then add the path to your settings.json, for example:

+
+
+
+
1
+
{ "rust-analyzer.server.path": "~/.local/bin/rust-analyzer-linux" }
+
+
+
+
+
+

Building From Source

+
+

Both the server and the Code plugin can be installed from source:

+
+
+
+
1
+2
+
$ git clone https://github.com/rust-lang/rust-analyzer.git && cd rust-analyzer
+$ cargo xtask install
+
+
+
+
+

You’ll need Cargo, nodejs (matching a supported version of VS Code) and npm for this.

+
+
+

Note that installing via xtask install does not work for VS Code Remote, instead you’ll need to install the .vsix manually.

+
+
+

If you’re not using Code, you can compile and install only the LSP server:

+
+
+
+
1
+
$ cargo xtask install --server
+
+
+
+
+

Make sure that .cargo/bin is in $PATH and precedes paths where rust-analyzer may also be installed. +Specifically, rustup includes a proxy called rust-analyzer, which can cause problems if you’re planning to use a source build or even a downloaded binary.

+
+
+
+
+

rust-analyzer Language Server Binary

+
+

Other editors generally require the rust-analyzer binary to be in $PATH. +You can download pre-built binaries from the releases page. +You will need to uncompress and rename the binary for your platform, e.g. from rust-analyzer-aarch64-apple-darwin.gz on Mac OS to rust-analyzer, make it executable, then move it into a directory in your $PATH.

+
+
+

On Linux to install the rust-analyzer binary into ~/.local/bin, these commands should work:

+
+
+
+
1
+2
+3
+
$ mkdir -p ~/.local/bin
+$ curl -L https://github.com/rust-lang/rust-analyzer/releases/latest/download/rust-analyzer-x86_64-unknown-linux-gnu.gz | gunzip -c - > ~/.local/bin/rust-analyzer
+$ chmod +x ~/.local/bin/rust-analyzer
+
+
+
+
+

Make sure that ~/.local/bin is listed in the $PATH variable and use the appropriate URL if you’re not on a x86-64 system.

+
+
+

You don’t have to use ~/.local/bin, any other path like ~/.cargo/bin or /usr/local/bin will work just as well.

+
+
+

Alternatively, you can install it from source using the command below. +You’ll need the latest stable version of the Rust toolchain.

+
+
+
+
1
+2
+
$ git clone https://github.com/rust-lang/rust-analyzer.git && cd rust-analyzer
+$ cargo xtask install --server
+
+
+
+
+

If your editor can’t find the binary even though the binary is on your $PATH, the likely explanation is that it doesn’t see the same $PATH as the shell, see this issue. +On Unix, running the editor from a shell or changing the .desktop file to set the environment should help.

+
+
+

rustup

+
+

rust-analyzer is available in rustup:

+
+
+
+
1
+
$ rustup component add rust-analyzer
+
+
+
+
+
+

Arch Linux

+
+

The rust-analyzer binary can be installed from the repos or AUR (Arch User Repository):

+
+
+ +
+
+

Install it with pacman, for example:

+
+
+
+
1
+
$ pacman -S rust-analyzer
+
+
+
+
+
+

Gentoo Linux

+
+

rust-analyzer is available in the GURU repository:

+
+
+ +
+
+

If not already, GURU must be enabled (e.g. using app-eselect/eselect-repository) and sync’d before running emerge:

+
+
+
+
1
+2
+
$ eselect repository enable guru && emaint sync -r guru
+$ emerge rust-analyzer-bin
+
+
+
+
+
+

macOS

+
+

The rust-analyzer binary can be installed via Homebrew.

+
+
+
+
1
+
$ brew install rust-analyzer
+
+
+
+
+
+
+

VS Code or VSCodium in Flatpak

+
+

Setting up rust-analyzer with a Flatpak version of Code is not trivial because of the Flatpak sandbox. +While the sandbox can be disabled for some directories, /usr/bin will always be mounted under /run/host/usr/bin. +This prevents access to the system’s C compiler, a system-wide installation of Rust, or any other libraries you might want to link to. +Some compilers and libraries can be acquired as Flatpak SDKs, such as org.freedesktop.Sdk.Extension.rust-stable or org.freedesktop.Sdk.Extension.llvm15.

+
+
+

If you use a Flatpak SDK for Rust, there should be no extra steps necessary.

+
+
+

If you want to use Flatpak in combination with rustup, the following steps might help:

+
+
+
    +
  • +

    both Rust and rustup have to be installed using https://rustup.rs. Distro packages will not work.

    +
  • +
  • +

    you need to launch Code, open a terminal and run echo $PATH

    +
  • +
  • +

    using Flatseal, you must add an environment variable called PATH. +Set its value to the output from above, appending :~/.cargo/bin, where ~ is the path to your home directory. +You must replace ~, as it won’t be expanded otherwise.

    +
  • +
  • +

    while Flatseal is open, you must enable access to "All user files"

    +
  • +
+
+
+

A C compiler should already be available via org.freedesktop.Sdk. +Any other tools or libraries you will need to acquire from Flatpak.

+
+
+
+

Emacs

+
+

Prerequisites: You have installed the rust-analyzer binary.

+
+
+

To use rust-analyzer, you need to install and enable one of the two popular LSP client implementations for Emacs, Eglot or LSP Mode. Both enable rust-analyzer by default in rust buffers if it is available.

+
+
+

Eglot

+
+

Eglot is the more minimalistic and lightweight LSP client for Emacs, integrates well with existing Emacs functionality and will be built into Emacs starting from release 29.

+
+
+

After installing Eglot, e.g. via M-x package-install (not needed from Emacs 29), you can enable it via the M-x eglot command or load it automatically in rust-mode via

+
+
+
+
1
+
(add-hook 'rust-mode-hook 'eglot-ensure)
+
+
+
+
+

For more detailed instructions and options see the Eglot manual (also available from Emacs via M-x info) and the +Eglot readme.

+
+
+

Eglot does not support the rust-analyzer extensions to the language-server protocol and does not aim to do so in the future. The eglot-x package adds experimental support for those LSP extensions.

+
+
+
+

LSP Mode

+
+

LSP-mode is the original LSP-client for emacs. Compared to Eglot it has a larger codebase and supports more features, like LSP protocol extensions. +With extension packages like LSP UI it offers a lot of visual eyecandy. +Further it integrates well with DAP mode for support of the Debug Adapter Protocol.

+
+
+

You can install LSP-mode via M-x package-install and then run it via the M-x lsp command or load it automatically in rust buffers with

+
+
+
+
1
+
(add-hook 'rust-mode-hook 'lsp-deferred)
+
+
+
+
+

For more information on how to set up LSP mode and its extension package see the instructions in the LSP mode manual. +Also see the rust-analyzer section for rust-analyzer specific options and commands, which you can optionally bind to keys.

+
+
+

Note the excellent guide from @rksm on how to set-up Emacs for Rust development with LSP mode and several other packages.

+
+
+
+
+

Vim/Neovim

+
+

Prerequisites: You have installed the rust-analyzer binary. +Not needed if the extension can install/update it on its own, coc-rust-analyzer is one example.

+
+
+

There are several LSP client implementations for Vim or Neovim:

+
+
+

coc-rust-analyzer

+
+
    +
  1. +

    Install coc.nvim by following the instructions at +coc.nvim +(Node.js required)

    +
  2. +
  3. +

    Run :CocInstall coc-rust-analyzer to install +coc-rust-analyzer, +this extension implements most of the features supported in the VSCode extension:

    +
    +
      +
    • +

      automatically install and upgrade stable/nightly releases

      +
    • +
    • +

      same configurations as VSCode extension, rust-analyzer.server.path, rust-analyzer.cargo.features etc.

      +
    • +
    • +

      same commands too, rust-analyzer.analyzerStatus, rust-analyzer.ssr etc.

      +
    • +
    • +

      inlay hints for variables and method chaining, Neovim Only

      +
    • +
    +
    +
  4. +
+
+
+

Note: for code actions, use coc-codeaction-cursor and coc-codeaction-selected; coc-codeaction and coc-codeaction-line are unlikely to be useful.

+
+
+
+

LanguageClient-neovim

+
+
    +
  1. +

    Install LanguageClient-neovim by following the instructions +here

    +
    +
      +
    • +

      The GitHub project wiki has extra tips on configuration

      +
    • +
    +
    +
  2. +
  3. +

    Configure by adding this to your Vim/Neovim config file (replacing the existing Rust-specific line if it exists):

    +
    +
    +
    1
    +2
    +3
    +
    let g:LanguageClient_serverCommands = {
    +\ 'rust': ['rust-analyzer'],
    +\ }
    +
    +
    +
    +
  4. +
+
+
+
+

YouCompleteMe

+
+

Install YouCompleteMe by following the instructions + here.

+
+
+

rust-analyzer is the default in ycm, it should work out of the box.

+
+
+
+

ALE

+
+

To use the LSP server in ale:

+
+
+
+
1
+
let g:ale_linters = {'rust': ['analyzer']}
+
+
+
+
+
+

nvim-lsp

+
+

Neovim 0.5 has built-in language server support. +For a quick start configuration of rust-analyzer, use neovim/nvim-lspconfig. +Once neovim/nvim-lspconfig is installed, use lua require'lspconfig'.rust_analyzer.setup({}) in your init.vim.

+
+
+

You can also pass LSP settings to the server:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
lua << EOF
+local nvim_lsp = require'lspconfig'
+
+local on_attach = function(client)
+    require'completion'.on_attach(client)
+end
+
+nvim_lsp.rust_analyzer.setup({
+    on_attach=on_attach,
+    settings = {
+        ["rust-analyzer"] = {
+            imports = {
+                granularity = {
+                    group = "module",
+                },
+                prefix = "self",
+            },
+            cargo = {
+                buildScripts = {
+                    enable = true,
+                },
+            },
+            procMacro = {
+                enable = true
+            },
+        }
+    }
+})
+EOF
+
+
+
+
+

See https://sharksforarms.dev/posts/neovim-rust/ for more tips on getting started.

+
+
+

Check out https://github.com/simrat39/rust-tools.nvim for a batteries included rust-analyzer setup for Neovim.

+
+
+
+

vim-lsp

+
+

vim-lsp is installed by following the plugin instructions. +It can be as simple as adding this line to your .vimrc:

+
+
+
+
1
+
Plug 'prabirshrestha/vim-lsp'
+
+
+
+
+

Next you need to register the rust-analyzer binary. +If it is available in $PATH, you may want to add this to your .vimrc:

+
+
+
+
1
+2
+3
+4
+5
+6
+7
+
if executable('rust-analyzer')
+  au User lsp_setup call lsp#register_server({
+        \   'name': 'Rust Language Server',
+        \   'cmd': {server_info->['rust-analyzer']},
+        \   'whitelist': ['rust'],
+        \ })
+endif
+
+
+
+
+

There is no dedicated UI for the server configuration, so you would need to send any options as a value of the initialization_options field, as described in the Configuration section. +Here is an example of how to enable the proc-macro support:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+
if executable('rust-analyzer')
+  au User lsp_setup call lsp#register_server({
+        \   'name': 'Rust Language Server',
+        \   'cmd': {server_info->['rust-analyzer']},
+        \   'whitelist': ['rust'],
+        \   'initialization_options': {
+        \     'cargo': {
+        \       'buildScripts': {
+        \         'enable': v:true,
+        \       },
+        \     },
+        \     'procMacro': {
+        \       'enable': v:true,
+        \     },
+        \   },
+        \ })
+endif
+
+
+
+
+
+
+

Sublime Text

+
+

Sublime Text 4:

+
+ +
+
+ + + + + +
+ + +Install LSP-file-watcher-chokidar to enable file watching (workspace/didChangeWatchedFiles). +
+
+
+
+

Sublime Text 3:

+
+
    +
  • +

    Install the rust-analyzer binary.

    +
  • +
  • +

    Install the LSP package.

    +
  • +
  • +

    From the command palette, run LSP: Enable Language Server Globally and select rust-analyzer.

    +
  • +
+
+
+

If it worked, you should see "rust-analyzer, Line X, Column Y" on the left side of the status bar, and after waiting a bit, functionalities like tooltips on hovering over variables should become available.

+
+
+

If you get an error saying No such file or directory: 'rust-analyzer', see the rust-analyzer binary section on installing the language server binary.

+
+
+
+
+

GNOME Builder

+
+

GNOME Builder 3.37.1 and newer has native rust-analyzer support. +If the LSP binary is not available, GNOME Builder can install it when opening a Rust file.

+
+
+
+

Eclipse IDE

+
+

Support for Rust development in the Eclipse IDE is provided by Eclipse Corrosion. +If available in PATH or in some standard location, rust-analyzer is detected and powers editing of Rust files without further configuration. +If rust-analyzer is not detected, Corrosion will prompt you for configuration of your Rust toolchain and language server with a link to the Window > Preferences > Rust preference page; from here a button allows to download and configure rust-analyzer, but you can also reference another installation. +You’ll need to close and reopen all .rs and Cargo files, or to restart the IDE, for this change to take effect.

+
+
+
+

Kate Text Editor

+
+

Support for the language server protocol is built into Kate through the LSP plugin, which is included by default. +It is preconfigured to use rust-analyzer for Rust sources since Kate 21.12.

+
+
+

To change rust-analyzer config options, start from the following example and put it into Kate’s "User Server Settings" tab (located under the LSP Client settings):

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
{
+    "servers": {
+        "rust": {
+            "initializationOptions": {
+                "cachePriming": {
+                    "enable": false
+                },
+                "check": {
+                    "allTargets": false
+                },
+                "checkOnSave": false
+            }
+        }
+    }
+}
+
+
+
+
+

Then click on apply, and restart the LSP server for your rust project.

+
+
+
+

juCi++

+
+

juCi++ has built-in support for the language server protocol, and since version 1.7.0 offers installation of both Rust and rust-analyzer when opening a Rust file.

+
+
+
+

Kakoune

+
+

Kakoune supports LSP with the help of kak-lsp. +Follow the instructions to install kak-lsp. +To configure kak-lsp, refer to the configuration section which is basically about copying the configuration file in the right place (latest versions should use rust-analyzer by default).

+
+
+

Finally, you need to configure Kakoune to talk to kak-lsp (see Usage section). +A basic configuration will only get you LSP but you can also activate inlay diagnostics and auto-formatting on save. +The following might help you get all of this.

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+
eval %sh{kak-lsp --kakoune -s $kak_session}  # Not needed if you load it with plug.kak.
+hook global WinSetOption filetype=rust %{
+    # Enable LSP
+    lsp-enable-window
+
+    # Auto-formatting on save
+    hook window BufWritePre .* lsp-formatting-sync
+
+    # Configure inlay hints (only on save)
+    hook window -group rust-inlay-hints BufWritePost .* rust-analyzer-inlay-hints
+    hook -once -always window WinSetOption filetype=.* %{
+        remove-hooks window rust-inlay-hints
+    }
+}
+
+
+
+
+
+

Helix

+
+

Helix supports LSP by default. +However, it won’t install rust-analyzer automatically. +You can follow instructions for installing rust-analyzer binary.

+
+
+
+

Visual Studio 2022

+
+

There are multiple rust-analyzer extensions for Visual Studio 2022 on Windows:

+
+
+

rust-analyzer.vs

+
+

(License: Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International)

+
+ +
+

GitHub

+
+
+

Support for Rust development in the Visual Studio IDE is enabled by the rust-analyzer package. Either click on the download link or install from IDE’s extension manager. +For now Visual Studio 2022 is required. All editions are supported viz. Community, Professional & Enterprise. +The package aims to provide 0-friction installation and therefore comes loaded with most things required including rust-analyzer binary. If anything it needs is missing, appropriate errors / warnings will guide the user. E.g. cargo.exe needs to be in path and the package will tell you as much. +This package is under rapid active development. So if you encounter any issues please file it at rust-analyzer.vs.

+
+
+
+

VS_RustAnalyzer

+
+

(License: GPL)

+
+ +
+

GitHub

+
+
+
+

SourceGear Rust

+
+

(License: closed source)

+
+ + +
+
    +
  • +

    Free (no-cost)

    +
  • +
  • +

    Supports all editions of Visual Studio 2022 on Windows: Community, Professional, or Enterprise

    +
  • +
+
+
+
+
+

Lapce

+
+

Lapce has a Rust plugin which you can install directly. +Unfortunately, it downloads an old version of rust-analyzer, but you can set the server path under Settings.

+
+
+
+

Crates

+
+

There is a package named ra_ap_rust_analyzer available on crates.io, for someone who wants to use it programmatically.

+
+
+

For more details, see the publish workflow.

+
+
+
+

Zed

+
+

Zed has native rust-analyzer support. +If the LSP binary is not available, Zed can install it when opening a Rust file.

+
+
+
+
+
+

Troubleshooting

+
+
+

Start with looking at the rust-analyzer version. +Try rust-analyzer: Show RA Version in VS Code (using Command Palette feature typically activated by Ctrl+Shift+P) or rust-analyzer --version in the command line. +If the date is more than a week ago, it’s better to update rust-analyzer version.

+
+
+

The next thing to check would be panic messages in rust-analyzer’s log. +Log messages are printed to stderr, in VS Code you can see them in the Output > Rust Analyzer Language Server tab of the panel. +To see more logs, set the RA_LOG=info environment variable, this can be done either by setting the environment variable manually or by using rust-analyzer.server.extraEnv, note that both of these approaches require the server to be restarted.

+
+
+

To fully capture LSP messages between the editor and the server, set "rust-analyzer.trace.server": "verbose" config and check +Output > Rust Analyzer Language Server Trace.

+
+
+

The root cause for many “nothing works” problems is that rust-analyzer fails to understand the project structure. +To debug that, first note the rust-analyzer section in the status bar. +If it has an error icon and red, that’s the problem (hover will have somewhat helpful error message). +rust-analyzer: Status prints dependency information for the current file. +Finally, RA_LOG=project_model=debug enables verbose logs during project loading.

+
+
+

If rust-analyzer outright crashes, try running rust-analyzer analysis-stats /path/to/project/directory/ on the command line. +This command type checks the whole project in batch mode bypassing LSP machinery.

+
+
+

When filing issues, it is useful (but not necessary) to try to minimize examples. +An ideal bug reproduction looks like this:

+
+
+
+
1
+2
+3
+4
+5
+
$ git clone https://github.com/username/repo.git && cd repo && git switch --detach commit-hash
+$ rust-analyzer --version
+rust-analyzer dd12184e4 2021-05-08 dev
+$ rust-analyzer analysis-stats .
+💀 💀 💀
+
+
+
+
+

It is especially useful when the repo doesn’t use external crates or the standard library.

+
+
+

If you want to go as far as to modify the source code to debug the problem, be sure to take a look at the +dev docs!

+
+
+
+
+

Configuration

+
+
+

Source: config.rs

+
+
+

The Installation section contains details on configuration for some of the editors. +In general rust-analyzer is configured via LSP messages, which means that it’s up to the editor to decide on the exact format and location of configuration files.

+
+
+

Some clients, such as VS Code or COC plugin in Vim provide rust-analyzer specific configuration UIs. Others may require you to know a bit more about the interaction with rust-analyzer.

+
+
+

For the later category, it might help to know that the initial configuration is specified as a value of the initializationOptions field of the InitializeParams message, in the LSP protocol. +The spec says that the field type is any?, but rust-analyzer is looking for a JSON object that is constructed using settings from the list below. +Name of the setting, ignoring the rust-analyzer. prefix, is used as a path, and value of the setting becomes the JSON property value.

+
+
+

For example, a very common configuration is to enable proc-macro support, can be achieved by sending this JSON:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
{
+  "cargo": {
+    "buildScripts": {
+      "enable": true,
+    },
+  },
+  "procMacro": {
+    "enable": true,
+  }
+}
+
+
+
+
+

Please consult your editor’s documentation to learn more about how to configure LSP servers.

+
+
+

To verify which configuration is actually used by rust-analyzer, set RA_LOG environment variable to rust_analyzer=info and look for config-related messages. +Logs should show both the JSON that rust-analyzer sees as well as the updated config.

+
+
+

This is the list of config options rust-analyzer supports:

+
+
+
+
rust-analyzer.assist.emitMustUse (default: false)
+
+
+
+
+

Whether to insert #[must_use] when generating as_ methods +for enum variants.

+
+
+
+
+
rust-analyzer.assist.expressionFillDefault (default: "todo")
+
+
+
+
+

Placeholder expression to use for missing expressions in assists.

+
+
+
+
+
rust-analyzer.cachePriming.enable (default: true)
+
+
+
+
+

Warm up caches on project load.

+
+
+
+
+
rust-analyzer.cachePriming.numThreads (default: 0)
+
+
+
+
+

How many worker threads to handle priming caches. The default 0 means to pick automatically.

+
+
+
+
+
rust-analyzer.cargo.autoreload (default: true)
+
+
+
+
+

Automatically refresh project info via cargo metadata on +Cargo.toml or .cargo/config.toml changes.

+
+
+
+
+
rust-analyzer.cargo.buildScripts.enable (default: true)
+
+
+
+
+

Run build scripts (build.rs) for more precise code analysis.

+
+
+
+
+
rust-analyzer.cargo.buildScripts.invocationLocation (default: "workspace")
+
+
+
+
+

Specifies the working directory for running build scripts. +- "workspace": run build scripts for a workspace in the workspace’s root directory. + This is incompatible with rust-analyzer.cargo.buildScripts.invocationStrategy set to once. +- "root": run build scripts in the project’s root directory. +This config only has an effect when rust-analyzer.cargo.buildScripts.overrideCommand +is set.

+
+
+
+
+
rust-analyzer.cargo.buildScripts.invocationStrategy (default: "per_workspace")
+
+
+
+
+

Specifies the invocation strategy to use when running the build scripts command. +If per_workspace is set, the command will be executed for each workspace. +If once is set, the command will be executed once. +This config only has an effect when rust-analyzer.cargo.buildScripts.overrideCommand +is set.

+
+
+
+
+
rust-analyzer.cargo.buildScripts.overrideCommand (default: null)
+
+
+
+
+

Override the command rust-analyzer uses to run build scripts and +build procedural macros. The command is required to output json +and should therefore include --message-format=json or a similar +option.

+
+
+

If there are multiple linked projects/workspaces, this command is invoked for +each of them, with the working directory being the workspace root +(i.e., the folder containing the Cargo.toml). This can be overwritten +by changing rust-analyzer.cargo.buildScripts.invocationStrategy and +rust-analyzer.cargo.buildScripts.invocationLocation.

+
+
+

By default, a cargo invocation will be constructed for the configured +targets and features, with the following base command line:

+
+
+
+
1
+
cargo check --quiet --workspace --message-format=json --all-targets
+
+
+
+
+

.

+
+
+
+
+
rust-analyzer.cargo.buildScripts.useRustcWrapper (default: true)
+
+
+
+
+

Use RUSTC_WRAPPER=rust-analyzer when running build scripts to +avoid checking unnecessary things.

+
+
+
+
+
rust-analyzer.cargo.cfgs (default: {})
+
+
+
+
+

List of cfg options to enable with the given values.

+
+
+
+
+
rust-analyzer.cargo.extraArgs (default: [])
+
+
+
+
+

Extra arguments that are passed to every cargo invocation.

+
+
+
+
+
rust-analyzer.cargo.extraEnv (default: {})
+
+
+
+
+

Extra environment variables that will be set when running cargo, rustc +or other commands within the workspace. Useful for setting RUSTFLAGS.

+
+
+
+
+
rust-analyzer.cargo.features (default: [])
+
+
+
+
+

List of features to activate.

+
+
+

Set this to "all" to pass --all-features to cargo.

+
+
+
+
+
rust-analyzer.cargo.noDefaultFeatures (default: false)
+
+
+
+
+

Whether to pass --no-default-features to cargo.

+
+
+
+
+
rust-analyzer.cargo.sysroot (default: "discover")
+
+
+
+
+

Relative path to the sysroot, or "discover" to try to automatically find it via +"rustc --print sysroot".

+
+
+

Unsetting this disables sysroot loading.

+
+
+

This option does not take effect until rust-analyzer is restarted.

+
+
+
+
+
rust-analyzer.cargo.sysrootSrc (default: null)
+
+
+
+
+

Relative path to the sysroot library sources. If left unset, this will default to +{cargo.sysroot}/lib/rustlib/src/rust/library.

+
+
+

This option does not take effect until rust-analyzer is restarted.

+
+
+
+
+
rust-analyzer.cargo.target (default: null)
+
+
+
+
+

Compilation target override (target triple).

+
+
+
+
+
rust-analyzer.cargo.unsetTest (default: ["core"])
+
+
+
+
+

Unsets the implicit #[cfg(test)] for the specified crates.

+
+
+
+
+
rust-analyzer.checkOnSave (default: true)
+
+
+
+
+

Run the check command for diagnostics on save.

+
+
+
+
+
rust-analyzer.check.allTargets (default: true)
+
+
+
+
+

Check all targets and tests (--all-targets).

+
+
+
+
+
rust-analyzer.check.command (default: "check")
+
+
+
+
+

Cargo command to use for cargo check.

+
+
+
+
+
rust-analyzer.check.extraArgs (default: [])
+
+
+
+
+

Extra arguments for cargo check.

+
+
+
+
+
rust-analyzer.check.extraEnv (default: {})
+
+
+
+
+

Extra environment variables that will be set when running cargo check. +Extends rust-analyzer.cargo.extraEnv.

+
+
+
+
+
rust-analyzer.check.features (default: null)
+
+
+
+
+

List of features to activate. Defaults to +rust-analyzer.cargo.features.

+
+
+

Set to "all" to pass --all-features to Cargo.

+
+
+
+
+
rust-analyzer.check.ignore (default: [])
+
+
+
+
+

List of cargo check (or other command specified in check.command) diagnostics to ignore.

+
+
+

For example for cargo check: dead_code, unused_imports, unused_variables,…​

+
+
+
+
+
rust-analyzer.check.invocationLocation (default: "workspace")
+
+
+
+
+

Specifies the working directory for running checks. +- "workspace": run checks for workspaces in the corresponding workspaces' root directories. + This falls back to "root" if rust-analyzer.cargo.check.invocationStrategy is set to once. +- "root": run checks in the project’s root directory. +This config only has an effect when rust-analyzer.cargo.check.overrideCommand +is set.

+
+
+
+
+
rust-analyzer.check.invocationStrategy (default: "per_workspace")
+
+
+
+
+

Specifies the invocation strategy to use when running the check command. +If per_workspace is set, the command will be executed for each workspace. +If once is set, the command will be executed once. +This config only has an effect when rust-analyzer.cargo.check.overrideCommand +is set.

+
+
+
+
+
rust-analyzer.check.noDefaultFeatures (default: null)
+
+
+
+
+

Whether to pass --no-default-features to Cargo. Defaults to +rust-analyzer.cargo.noDefaultFeatures.

+
+
+
+
+
rust-analyzer.check.overrideCommand (default: null)
+
+
+
+
+

Override the command rust-analyzer uses instead of cargo check for +diagnostics on save. The command is required to output json and +should therefore include --message-format=json or a similar option +(if your client supports the colorDiagnosticOutput experimental +capability, you can use --message-format=json-diagnostic-rendered-ansi).

+
+
+

If you’re changing this because you’re using some tool wrapping +Cargo, you might also want to change +rust-analyzer.cargo.buildScripts.overrideCommand.

+
+
+

If there are multiple linked projects/workspaces, this command is invoked for +each of them, with the working directory being the workspace root +(i.e., the folder containing the Cargo.toml). This can be overwritten +by changing rust-analyzer.cargo.check.invocationStrategy and +rust-analyzer.cargo.check.invocationLocation.

+
+
+

An example command would be:

+
+
+
+
1
+
cargo check --workspace --message-format=json --all-targets
+
+
+
+
+

.

+
+
+
+
+
rust-analyzer.check.targets (default: null)
+
+
+
+
+

Check for specific targets. Defaults to rust-analyzer.cargo.target if empty.

+
+
+

Can be a single target, e.g. "x86_64-unknown-linux-gnu" or a list of targets, e.g. +["aarch64-apple-darwin", "x86_64-apple-darwin"].

+
+
+

Aliased as "checkOnSave.targets".

+
+
+
+
+
rust-analyzer.completion.autoimport.enable (default: true)
+
+
+
+
+

Toggles the additional completions that automatically add imports when completed. +Note that your client must specify the additionalTextEdits LSP client capability to truly have this feature enabled.

+
+
+
+
+
rust-analyzer.completion.autoself.enable (default: true)
+
+
+
+
+

Toggles the additional completions that automatically show method calls and field accesses +with self prefixed to them when inside a method.

+
+
+
+
+
rust-analyzer.completion.callable.snippets (default: "fill_arguments")
+
+
+
+
+

Whether to add parenthesis and argument snippets when completing function.

+
+
+
+
+
rust-analyzer.completion.fullFunctionSignatures.enable (default: false)
+
+
+
+
+

Whether to show full function/method signatures in completion docs.

+
+
+
+
+
rust-analyzer.completion.limit (default: null)
+
+
+
+
+

Maximum number of completions to return. If None, the limit is infinite.

+
+
+
+
+
rust-analyzer.completion.postfix.enable (default: true)
+
+
+
+
+

Whether to show postfix snippets like dbg, if, not, etc.

+
+
+
+
+
rust-analyzer.completion.privateEditable.enable (default: false)
+
+
+
+
+

Enables completions of private items and fields that are defined in the current workspace even if they are not visible at the current position.

+
+
+
+
+
rust-analyzer.completion.snippets.custom
+
+
+
+
+

Default:

+
+
+
+
{
+            "Arc::new": {
+                "postfix": "arc",
+                "body": "Arc::new(${receiver})",
+                "requires": "std::sync::Arc",
+                "description": "Put the expression into an `Arc`",
+                "scope": "expr"
+            },
+            "Rc::new": {
+                "postfix": "rc",
+                "body": "Rc::new(${receiver})",
+                "requires": "std::rc::Rc",
+                "description": "Put the expression into an `Rc`",
+                "scope": "expr"
+            },
+            "Box::pin": {
+                "postfix": "pinbox",
+                "body": "Box::pin(${receiver})",
+                "requires": "std::boxed::Box",
+                "description": "Put the expression into a pinned `Box`",
+                "scope": "expr"
+            },
+            "Ok": {
+                "postfix": "ok",
+                "body": "Ok(${receiver})",
+                "description": "Wrap the expression in a `Result::Ok`",
+                "scope": "expr"
+            },
+            "Err": {
+                "postfix": "err",
+                "body": "Err(${receiver})",
+                "description": "Wrap the expression in a `Result::Err`",
+                "scope": "expr"
+            },
+            "Some": {
+                "postfix": "some",
+                "body": "Some(${receiver})",
+                "description": "Wrap the expression in an `Option::Some`",
+                "scope": "expr"
+            }
+        }
+
+
+
+

Custom completion snippets.

+
+
+
+
+
rust-analyzer.diagnostics.disabled (default: [])
+
+
+
+
+

List of rust-analyzer diagnostics to disable.

+
+
+
+
+
rust-analyzer.diagnostics.enable (default: true)
+
+
+
+
+

Whether to show native rust-analyzer diagnostics.

+
+
+
+
+
rust-analyzer.diagnostics.experimental.enable (default: false)
+
+
+
+
+

Whether to show experimental rust-analyzer diagnostics that might +have more false positives than usual.

+
+
+
+
+
rust-analyzer.diagnostics.remapPrefix (default: {})
+
+
+
+
+

Map of prefixes to be substituted when parsing diagnostic file paths. +This should be the reverse mapping of what is passed to rustc as --remap-path-prefix.

+
+
+
+
+
rust-analyzer.diagnostics.warningsAsHint (default: [])
+
+
+
+
+

List of warnings that should be displayed with hint severity.

+
+
+

The warnings will be indicated by faded text or three dots in code +and will not show up in the Problems Panel.

+
+
+
+
+
rust-analyzer.diagnostics.warningsAsInfo (default: [])
+
+
+
+
+

List of warnings that should be displayed with info severity.

+
+
+

The warnings will be indicated by a blue squiggly underline in code +and a blue icon in the Problems Panel.

+
+
+
+
+
rust-analyzer.files.excludeDirs (default: [])
+
+
+
+
+

These directories will be ignored by rust-analyzer. They are +relative to the workspace root, and globs are not supported. You may +also need to add the folders to Code’s files.watcherExclude.

+
+
+
+
+
rust-analyzer.files.watcher (default: "client")
+
+
+
+
+

Controls file watching implementation.

+
+
+
+
+
rust-analyzer.highlightRelated.breakPoints.enable (default: true)
+
+
+
+
+

Enables highlighting of related references while the cursor is on break, loop, while, or for keywords.

+
+
+
+
+
rust-analyzer.highlightRelated.closureCaptures.enable (default: true)
+
+
+
+
+

Enables highlighting of all captures of a closure while the cursor is on the | or move keyword of a closure.

+
+
+
+
+
rust-analyzer.highlightRelated.exitPoints.enable (default: true)
+
+
+
+
+

Enables highlighting of all exit points while the cursor is on any return, ?, fn, or return type arrow ().

+
+
+
+
+
rust-analyzer.highlightRelated.references.enable (default: true)
+
+
+
+
+

Enables highlighting of related references while the cursor is on any identifier.

+
+
+
+
+
rust-analyzer.highlightRelated.yieldPoints.enable (default: true)
+
+
+
+
+

Enables highlighting of all break points for a loop or block context while the cursor is on any async or await keywords.

+
+
+
+
+
rust-analyzer.hover.actions.debug.enable (default: true)
+
+
+
+
+

Whether to show Debug action. Only applies when +rust-analyzer.hover.actions.enable is set.

+
+
+
+
+
rust-analyzer.hover.actions.enable (default: true)
+
+
+
+
+

Whether to show HoverActions in Rust files.

+
+
+
+
+
rust-analyzer.hover.actions.gotoTypeDef.enable (default: true)
+
+
+
+
+

Whether to show Go to Type Definition action. Only applies when +rust-analyzer.hover.actions.enable is set.

+
+
+
+
+
rust-analyzer.hover.actions.implementations.enable (default: true)
+
+
+
+
+

Whether to show Implementations action. Only applies when +rust-analyzer.hover.actions.enable is set.

+
+
+
+
+
rust-analyzer.hover.actions.references.enable (default: false)
+
+
+
+
+

Whether to show References action. Only applies when +rust-analyzer.hover.actions.enable is set.

+
+
+
+
+
rust-analyzer.hover.actions.run.enable (default: true)
+
+
+
+
+

Whether to show Run action. Only applies when +rust-analyzer.hover.actions.enable is set.

+
+
+
+
+
rust-analyzer.hover.documentation.enable (default: true)
+
+
+
+
+

Whether to show documentation on hover.

+
+
+
+
+
rust-analyzer.hover.documentation.keywords.enable (default: true)
+
+
+
+
+

Whether to show keyword hover popups. Only applies when +rust-analyzer.hover.documentation.enable is set.

+
+
+
+
+
rust-analyzer.hover.links.enable (default: true)
+
+
+
+
+

Use markdown syntax for links on hover.

+
+
+
+
+
rust-analyzer.hover.memoryLayout.alignment (default: "hexadecimal")
+
+
+
+
+

How to render the align information in a memory layout hover.

+
+
+
+
+
rust-analyzer.hover.memoryLayout.enable (default: true)
+
+
+
+
+

Whether to show memory layout data on hover.

+
+
+
+
+
rust-analyzer.hover.memoryLayout.niches (default: false)
+
+
+
+
+

How to render the niche information in a memory layout hover.

+
+
+
+
+
rust-analyzer.hover.memoryLayout.offset (default: "hexadecimal")
+
+
+
+
+

How to render the offset information in a memory layout hover.

+
+
+
+
+
rust-analyzer.hover.memoryLayout.size (default: "both")
+
+
+
+
+

How to render the size information in a memory layout hover.

+
+
+
+
+
rust-analyzer.imports.granularity.enforce (default: false)
+
+
+
+
+

Whether to enforce the import granularity setting for all files. If set to false rust-analyzer will try to keep import styles consistent per file.

+
+
+
+
+
rust-analyzer.imports.granularity.group (default: "crate")
+
+
+
+
+

How imports should be grouped into use statements.

+
+
+
+
+
rust-analyzer.imports.group.enable (default: true)
+
+
+
+
+

Group inserted imports by the following order. Groups are separated by newlines.

+
+
+
+
+
rust-analyzer.imports.merge.glob (default: true)
+
+
+
+
+

Whether to allow import insertion to merge new imports into single path glob imports like use std::fmt::*;.

+
+
+
+
+
rust-analyzer.imports.prefer.no.std (default: false)
+
+
+
+
+

Prefer to unconditionally use imports of the core and alloc crate, over the std crate.

+
+
+
+
+
rust-analyzer.imports.prefix (default: "plain")
+
+
+
+
+

The path structure for newly inserted paths to use.

+
+
+
+
+
rust-analyzer.inlayHints.bindingModeHints.enable (default: false)
+
+
+
+
+

Whether to show inlay type hints for binding modes.

+
+
+
+
+
rust-analyzer.inlayHints.chainingHints.enable (default: true)
+
+
+
+
+

Whether to show inlay type hints for method chains.

+
+
+
+
+
rust-analyzer.inlayHints.closingBraceHints.enable (default: true)
+
+
+
+
+

Whether to show inlay hints after a closing } to indicate what item it belongs to.

+
+
+
+
+
rust-analyzer.inlayHints.closingBraceHints.minLines (default: 25)
+
+
+
+
+

Minimum number of lines required before the } until the hint is shown (set to 0 or 1 +to always show them).

+
+
+
+
+
rust-analyzer.inlayHints.closureCaptureHints.enable (default: false)
+
+
+
+
+

Whether to show inlay hints for closure captures.

+
+
+
+
+
rust-analyzer.inlayHints.closureReturnTypeHints.enable (default: "never")
+
+
+
+
+

Whether to show inlay type hints for return types of closures.

+
+
+
+
+
rust-analyzer.inlayHints.closureStyle (default: "impl_fn")
+
+
+
+
+

Closure notation in type and chaining inlay hints.

+
+
+
+
+
rust-analyzer.inlayHints.discriminantHints.enable (default: "never")
+
+
+
+
+

Whether to show enum variant discriminant hints.

+
+
+
+
+
rust-analyzer.inlayHints.expressionAdjustmentHints.enable (default: "never")
+
+
+
+
+

Whether to show inlay hints for type adjustments.

+
+
+
+
+
rust-analyzer.inlayHints.expressionAdjustmentHints.hideOutsideUnsafe (default: false)
+
+
+
+
+

Whether to hide inlay hints for type adjustments outside of unsafe blocks.

+
+
+
+
+
rust-analyzer.inlayHints.expressionAdjustmentHints.mode (default: "prefix")
+
+
+
+
+

Whether to show inlay hints as postfix ops (. instead of , etc).

+
+
+
+
+
rust-analyzer.inlayHints.lifetimeElisionHints.enable (default: "never")
+
+
+
+
+

Whether to show inlay type hints for elided lifetimes in function signatures.

+
+
+
+
+
rust-analyzer.inlayHints.lifetimeElisionHints.useParameterNames (default: false)
+
+
+
+
+

Whether to prefer using parameter names as the name for elided lifetime hints if possible.

+
+
+
+
+
rust-analyzer.inlayHints.maxLength (default: 25)
+
+
+
+
+

Maximum length for inlay hints. Set to null to have an unlimited length.

+
+
+
+
+
rust-analyzer.inlayHints.parameterHints.enable (default: true)
+
+
+
+
+

Whether to show function parameter name inlay hints at the call +site.

+
+
+
+
+
rust-analyzer.inlayHints.reborrowHints.enable (default: "never")
+
+
+
+
+

Whether to show inlay hints for compiler inserted reborrows. +This setting is deprecated in favor of rust-analyzer.inlayHints.expressionAdjustmentHints.enable.

+
+
+
+
+
rust-analyzer.inlayHints.renderColons (default: true)
+
+
+
+
+

Whether to render leading colons for type hints, and trailing colons for parameter hints.

+
+
+
+
+
rust-analyzer.inlayHints.typeHints.enable (default: true)
+
+
+
+
+

Whether to show inlay type hints for variables.

+
+
+
+
+
rust-analyzer.inlayHints.typeHints.hideClosureInitialization (default: false)
+
+
+
+
+

Whether to hide inlay type hints for let statements that initialize to a closure. +Only applies to closures with blocks, same as rust-analyzer.inlayHints.closureReturnTypeHints.enable.

+
+
+
+
+
rust-analyzer.inlayHints.typeHints.hideNamedConstructor (default: false)
+
+
+
+
+

Whether to hide inlay type hints for constructors.

+
+
+
+
+
rust-analyzer.interpret.tests (default: false)
+
+
+
+
+

Enables the experimental support for interpreting tests.

+
+
+
+
+
rust-analyzer.joinLines.joinAssignments (default: true)
+
+
+
+
+

Join lines merges consecutive declaration and initialization of an assignment.

+
+
+
+
+
rust-analyzer.joinLines.joinElseIf (default: true)
+
+
+
+
+

Join lines inserts else between consecutive ifs.

+
+
+
+
+
rust-analyzer.joinLines.removeTrailingComma (default: true)
+
+
+
+
+

Join lines removes trailing commas.

+
+
+
+
+
rust-analyzer.joinLines.unwrapTrivialBlock (default: true)
+
+
+
+
+

Join lines unwraps trivial blocks.

+
+
+
+
+
rust-analyzer.lens.debug.enable (default: true)
+
+
+
+
+

Whether to show Debug lens. Only applies when +rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.enable (default: true)
+
+
+
+
+

Whether to show CodeLens in Rust files.

+
+
+
+
+
rust-analyzer.lens.forceCustomCommands (default: true)
+
+
+
+
+

Internal config: use custom client-side commands even when the +client doesn’t set the corresponding capability.

+
+
+
+
+
rust-analyzer.lens.implementations.enable (default: true)
+
+
+
+
+

Whether to show Implementations lens. Only applies when +rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.location (default: "above_name")
+
+
+
+
+

Where to render annotations.

+
+
+
+
+
rust-analyzer.lens.references.adt.enable (default: false)
+
+
+
+
+

Whether to show References lens for Struct, Enum, and Union. +Only applies when rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.references.enumVariant.enable (default: false)
+
+
+
+
+

Whether to show References lens for Enum Variants. +Only applies when rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.references.method.enable (default: false)
+
+
+
+
+

Whether to show Method References lens. Only applies when +rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.references.trait.enable (default: false)
+
+
+
+
+

Whether to show References lens for Trait. +Only applies when rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.lens.run.enable (default: true)
+
+
+
+
+

Whether to show Run lens. Only applies when +rust-analyzer.lens.enable is set.

+
+
+
+
+
rust-analyzer.linkedProjects (default: [])
+
+
+
+
+

Disable project auto-discovery in favor of explicitly specified set +of projects.

+
+
+

Elements must be paths pointing to Cargo.toml, +rust-project.json, or JSON objects in rust-project.json format.

+
+
+
+
+
rust-analyzer.lru.capacity (default: null)
+
+
+
+
+

Number of syntax trees rust-analyzer keeps in memory. Defaults to 128.

+
+
+
+
+
rust-analyzer.lru.query.capacities (default: {})
+
+
+
+
+

Sets the LRU capacity of the specified queries.

+
+
+
+
+
rust-analyzer.notifications.cargoTomlNotFound (default: true)
+
+
+
+
+

Whether to show can’t find Cargo.toml error message.

+
+
+
+
+
rust-analyzer.numThreads (default: null)
+
+
+
+
+

How many worker threads in the main loop. The default null means to pick automatically.

+
+
+
+
+
rust-analyzer.procMacro.attributes.enable (default: true)
+
+
+
+
+

Expand attribute macros. Requires rust-analyzer.procMacro.enable to be set.

+
+
+
+
+
rust-analyzer.procMacro.enable (default: true)
+
+
+
+
+

Enable support for procedural macros, implies rust-analyzer.cargo.buildScripts.enable.

+
+
+
+
+
rust-analyzer.procMacro.ignored (default: {})
+
+
+
+
+

These proc-macros will be ignored when trying to expand them.

+
+
+

This config takes a map of crate names with the exported proc-macro names to ignore as values.

+
+
+
+
+
rust-analyzer.procMacro.server (default: null)
+
+
+
+
+

Internal config, path to proc-macro server executable.

+
+
+
+
+
rust-analyzer.references.excludeImports (default: false)
+
+
+
+
+

Exclude imports from find-all-references.

+
+
+
+
+
rust-analyzer.runnables.command (default: null)
+
+
+
+
+

Command to be executed instead of 'cargo' for runnables.

+
+
+
+
+
rust-analyzer.runnables.extraArgs (default: [])
+
+
+
+
+

Additional arguments to be passed to cargo for runnables such as +tests or binaries. For example, it may be --release.

+
+
+
+
+
rust-analyzer.rust.analyzerTargetDir (default: null)
+
+
+
+
+

Optional path to a rust-analyzer specific target directory. +This prevents rust-analyzer’s cargo check from locking the Cargo.lock +at the expense of duplicating build artifacts.

+
+
+

Set to true to use a subdirectory of the existing target directory or +set to a path relative to the workspace to use that path.

+
+
+
+
+
rust-analyzer.rustc.source (default: null)
+
+
+
+
+

Path to the Cargo.toml of the rust compiler workspace, for usage in rustc_private +projects, or "discover" to try to automatically find it if the rustc-dev component +is installed.

+
+
+

Any project which uses rust-analyzer with the rustcPrivate +crates must set [package.metadata.rust-analyzer] rustc_private=true to use it.

+
+
+

This option does not take effect until rust-analyzer is restarted.

+
+
+
+
+
rust-analyzer.rustfmt.extraArgs (default: [])
+
+
+
+
+

Additional arguments to rustfmt.

+
+
+
+
+
rust-analyzer.rustfmt.overrideCommand (default: null)
+
+
+
+
+

Advanced option, fully override the command rust-analyzer uses for +formatting. This should be the equivalent of rustfmt here, and +not that of cargo fmt. The file contents will be passed on the +standard input and the formatted result will be read from the +standard output.

+
+
+
+
+
rust-analyzer.rustfmt.rangeFormatting.enable (default: false)
+
+
+
+
+

Enables the use of rustfmt’s unstable range formatting command for the +textDocument/rangeFormatting request. The rustfmt option is unstable and only +available on a nightly build.

+
+
+
+
+
rust-analyzer.semanticHighlighting.doc.comment.inject.enable (default: true)
+
+
+
+
+

Inject additional highlighting into doc comments.

+
+
+

When enabled, rust-analyzer will highlight rust source in doc comments as well as intra +doc links.

+
+
+
+
+
rust-analyzer.semanticHighlighting.nonStandardTokens (default: true)
+
+
+
+
+

Whether the server is allowed to emit non-standard tokens and modifiers.

+
+
+
+
+
rust-analyzer.semanticHighlighting.operator.enable (default: true)
+
+
+
+
+

Use semantic tokens for operators.

+
+
+

When disabled, rust-analyzer will emit semantic tokens only for operator tokens when +they are tagged with modifiers.

+
+
+
+
+
rust-analyzer.semanticHighlighting.operator.specialization.enable (default: false)
+
+
+
+
+

Use specialized semantic tokens for operators.

+
+
+

When enabled, rust-analyzer will emit special token types for operator tokens instead +of the generic operator token type.

+
+
+
+
+
rust-analyzer.semanticHighlighting.punctuation.enable (default: false)
+
+
+
+
+

Use semantic tokens for punctuation.

+
+
+

When disabled, rust-analyzer will emit semantic tokens only for punctuation tokens when +they are tagged with modifiers or have a special role.

+
+
+
+
+
rust-analyzer.semanticHighlighting.punctuation.separate.macro.bang (default: false)
+
+
+
+
+

When enabled, rust-analyzer will emit a punctuation semantic token for the ! of macro +calls.

+
+
+
+
+
rust-analyzer.semanticHighlighting.punctuation.specialization.enable (default: false)
+
+
+
+
+

Use specialized semantic tokens for punctuation.

+
+
+

When enabled, rust-analyzer will emit special token types for punctuation tokens instead +of the generic punctuation token type.

+
+
+
+
+
rust-analyzer.semanticHighlighting.strings.enable (default: true)
+
+
+
+
+

Use semantic tokens for strings.

+
+
+

In some editors (e.g. vscode) semantic tokens override other highlighting grammars. +By disabling semantic tokens for strings, other grammars can be used to highlight +their contents.

+
+
+
+
+
rust-analyzer.signatureInfo.detail (default: "full")
+
+
+
+
+

Show full signature of the callable. Only shows parameters if disabled.

+
+
+
+
+
rust-analyzer.signatureInfo.documentation.enable (default: true)
+
+
+
+
+

Show documentation.

+
+
+
+
+
rust-analyzer.typing.autoClosingAngleBrackets.enable (default: false)
+
+
+
+
+

Whether to insert closing angle brackets when typing an opening angle bracket of a generic argument list.

+
+
+
+
+
rust-analyzer.workspace.symbol.search.kind (default: "only_types")
+
+
+
+
+

Workspace symbol search kind.

+
+
+
+
+
rust-analyzer.workspace.symbol.search.limit (default: 128)
+
+
+
+
+

Limits the number of items returned from a workspace symbol search (Defaults to 128). +Some clients like vs-code issue new searches on result filtering and don’t require all results to be returned in the initial search. +Other clients requires all results upfront and might require a higher limit.

+
+
+
+
+
rust-analyzer.workspace.symbol.search.scope (default: "workspace")
+
+
+
+
+

Workspace symbol search scope.

+
+
+
+
+
+
+
+
+
+

Non-Cargo Based Projects

+
+
+

rust-analyzer does not require Cargo. +However, if you use some other build system, you’ll have to describe the structure of your project for rust-analyzer in the rust-project.json format:

+
+
+
+
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+
interface JsonProject {
+    /// Path to the sysroot directory.
+    ///
+    /// The sysroot is where rustc looks for the
+    /// crates that are built-in to rust, such as
+    /// std.
+    ///
+    /// https://doc.rust-lang.org/rustc/command-line-arguments.html#--sysroot-override-the-system-root
+    ///
+    /// To see the current value of sysroot, you
+    /// can query rustc:
+    ///
+    /// ```
+    /// $ rustc --print sysroot
+    /// /Users/yourname/.rustup/toolchains/stable-x86_64-apple-darwin
+    /// ```
+    sysroot?: string;
+    /// Path to the directory with *source code* of
+    /// sysroot crates.
+    ///
+    /// By default, this is `lib/rustlib/src/rust/library`
+    /// relative to the sysroot.
+    ///
+    /// It should point to the directory where std,
+    /// core, and friends can be found:
+    ///
+    /// https://github.com/rust-lang/rust/tree/master/library.
+    ///
+    /// If provided, rust-analyzer automatically adds
+    /// dependencies on sysroot crates. Conversely,
+    /// if you omit this path, you can specify sysroot
+    /// dependencies yourself and, for example, have
+    /// several different "sysroots" in one graph of
+    /// crates.
+    sysroot_src?: string;
+    /// The set of crates comprising the current
+    /// project. Must include all transitive
+    /// dependencies as well as sysroot crate (libstd,
+    /// libcore and such).
+    crates: Crate[];
+}
+
+interface Crate {
+    /// Optional crate name used for display purposes,
+    /// without affecting semantics. See the `deps`
+    /// key for semantically-significant crate names.
+    display_name?: string;
+    /// Path to the root module of the crate.
+    root_module: string;
+    /// Edition of the crate.
+    edition: "2015" | "2018" | "2021";
+    /// Dependencies
+    deps: Dep[];
+    /// Should this crate be treated as a member of
+    /// current "workspace".
+    ///
+    /// By default, inferred from the `root_module`
+    /// (members are the crates which reside inside
+    /// the directory opened in the editor).
+    ///
+    /// Set this to `false` for things like standard
+    /// library and 3rd party crates to enable
+    /// performance optimizations (rust-analyzer
+    /// assumes that non-member crates don't change).
+    is_workspace_member?: boolean;
+    /// Optionally specify the (super)set of `.rs`
+    /// files comprising this crate.
+    ///
+    /// By default, rust-analyzer assumes that only
+    /// files under `root_module.parent` can belong
+    /// to a crate. `include_dirs` are included
+    /// recursively, unless a subdirectory is in
+    /// `exclude_dirs`.
+    ///
+    /// Different crates can share the same `source`.
+    ///
+    /// If two crates share an `.rs` file in common,
+    /// they *must* have the same `source`.
+    /// rust-analyzer assumes that files from one
+    /// source can't refer to files in another source.
+    source?: {
+        include_dirs: string[],
+        exclude_dirs: string[],
+    },
+    /// The set of cfgs activated for a given crate, like
+    /// `["unix", "feature=\"foo\"", "feature=\"bar\""]`.
+    cfg: string[];
+    /// Target triple for this Crate.
+    ///
+    /// Used when running `rustc --print cfg`
+    /// to get target-specific cfgs.
+    target?: string;
+    /// Environment variables, used for
+    /// the `env!` macro
+    env: { [key: string]: string; },
+
+    /// Whether the crate is a proc-macro crate.
+    is_proc_macro: boolean;
+    /// For proc-macro crates, path to compiled
+    /// proc-macro (.so file).
+    proc_macro_dylib_path?: string;
+}
+
+interface Dep {
+    /// Index of a crate in the `crates` array.
+    crate: number,
+    /// Name as should appear in the (implicit)
+    /// `extern crate name` declaration.
+    name: string,
+}
+
+
+
+
+

This format is provisional and subject to change. +Specifically, the roots setup will be different eventually.

+
+
+

There are three ways to feed rust-project.json to rust-analyzer:

+
+
+
    +
  • +

    Place rust-project.json file at the root of the project, and rust-analyzer will discover it.

    +
  • +
  • +

    Specify "rust-analyzer.linkedProjects": [ "path/to/rust-project.json" ] in the settings (and make sure that your LSP client sends settings as a part of initialize request).

    +
  • +
  • +

    Specify "rust-analyzer.linkedProjects": [ { "roots": […​], "crates": […​] }] inline.

    +
  • +
+
+
+

Relative paths are interpreted relative to rust-project.json file location or (for inline JSON) relative to rootUri.

+
+ +
+

You can set the RA_LOG environment variable to rust_analyzer=info to inspect how rust-analyzer handles config and project loading.

+
+
+

Note that calls to cargo check are disabled when using rust-project.json by default, so compilation errors and warnings will no longer be sent to your LSP client. +To enable these compilation errors you will need to specify explicitly what command rust-analyzer should run to perform the checks using the rust-analyzer.check.overrideCommand configuration. +As an example, the following configuration explicitly sets cargo check as the check command.

+
+
+
+
1
+
{ "rust-analyzer.check.overrideCommand": ["cargo", "check", "--message-format=json"] }
+
+
+
+
+

check.overrideCommand requires the command specified to output json error messages for rust-analyzer to consume. +The --message-format=json flag does this for cargo check so whichever command you use must also output errors in this format. +See the Configuration section for more information.

+
+
+
+
+

Security

+
+
+

At the moment, rust-analyzer assumes that all code is trusted. +Here is a non-exhaustive list of ways to make rust-analyzer execute arbitrary code:

+
+
+
    +
  • +

    proc macros and build scripts are executed by default

    +
  • +
  • +

    .cargo/config can override rustc with an arbitrary executable

    +
  • +
  • +

    rust-toolchain.toml can override rustc with an arbitrary executable

    +
  • +
  • +

    VS Code plugin reads configuration from project directory, and that can be used to override paths to various executables, like rustfmt or rust-analyzer itself.

    +
  • +
  • +

    rust-analyzer’s syntax trees library uses a lot of unsafe and hasn’t been properly audited for memory safety.

    +
  • +
+
+
+
+
+

Privacy

+
+
+

The LSP server performs no network access in itself, but runs cargo metadata which will update or download the crate registry and the source code of the project dependencies. +If enabled (the default), build scripts and procedural macros can do anything.

+
+
+

The Code extension does not access the network.

+
+
+

Any other editor plugins are not under the control of the rust-analyzer developers. For any privacy concerns, you should check with their respective developers.

+
+
+

For rust-analyzer developers, cargo xtask release uses the GitHub API to put together the release notes.

+
+
+
+
+

Features

+
+
+

Annotations

+
+

Source: annotations.rs

+
+
+

Provides user with annotations above items for looking up references or impl blocks +and running/debugging binaries.

+
+
+
+113020672 b7c34f00 917a 11eb 8f6e 858735660a0e +
+
+
+
+

Auto Import

+
+

Source: auto_import.rs

+
+
+

Using the auto-import assist it is possible to insert missing imports for unresolved items. +When inserting an import it will do so in a structured manner by keeping imports grouped, +separated by a newline in the following order:

+
+
+
    +
  • +

    std and core

    +
  • +
  • +

    External Crates

    +
  • +
  • +

    Current Crate, paths prefixed by crate

    +
  • +
  • +

    Current Module, paths prefixed by self

    +
  • +
  • +

    Super Module, paths prefixed by super

    +
  • +
+
+
+

Example:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
use std::fs::File;
+
+use itertools::Itertools;
+use syntax::ast;
+
+use crate::utils::insert_use;
+
+use self::auto_import;
+
+use super::AssistContext;
+
+
+
+
+
Import Granularity
+

It is possible to configure how use-trees are merged with the imports.granularity.group setting. +It has the following configurations:

+
+
+
    +
  • +

    crate: Merge imports from the same crate into a single use statement. This kind of +nesting is only supported in Rust versions later than 1.24.

    +
  • +
  • +

    module: Merge imports from the same module into a single use statement.

    +
  • +
  • +

    item: Don’t merge imports at all, creating one import per item.

    +
  • +
  • +

    preserve: Do not change the granularity of any imports. For auto-import this has the same +effect as item.

    +
  • +
+
+
+

In VS Code the configuration for this is rust-analyzer.imports.granularity.group.

+
+
+
Import Prefix
+

The style of imports in the same crate is configurable through the imports.prefix setting. +It has the following configurations:

+
+
+
    +
  • +

    crate: This setting will force paths to be always absolute, starting with the crate +prefix, unless the item is defined outside of the current crate.

    +
  • +
  • +

    self: This setting will force paths that are relative to the current module to always +start with self. This will result in paths that always start with either crate, self, +super or an extern crate identifier.

    +
  • +
  • +

    plain: This setting does not impose any restrictions in imports.

    +
  • +
+
+
+

In VS Code the configuration for this is rust-analyzer.imports.prefix.

+
+
+
+113020673 b85be580 917a 11eb 9022 59585f35d4f8 +
+
+
+
+

Completion With Autoimport

+
+

Source: flyimport.rs

+
+
+

When completing names in the current scope, proposes additional imports from other modules or crates, +if they can be qualified in the scope, and their name contains all symbols from the completion input.

+
+
+

To be considered applicable, the name must contain all input symbols in the given order, not necessarily adjacent. +If any input symbol is not lowercased, the name must contain all symbols in exact case; otherwise the containing is checked case-insensitively.

+
+
+
+
1
+2
+3
+4
+
fn main() {
+    pda$0
+}
+# pub mod std { pub mod marker { pub struct PhantomData { } } }
+
+
+
+
+

+
+
+
+
1
+2
+3
+4
+5
+6
+
use std::marker::PhantomData;
+
+fn main() {
+    PhantomData
+}
+# pub mod std { pub mod marker { pub struct PhantomData { } } }
+
+
+
+
+

Also completes associated items, that require trait imports. +If any unresolved and/or partially-qualified path precedes the input, it will be taken into account. +Currently, only the imports with their import path ending with the whole qualifier will be proposed +(no fuzzy matching for qualifier).

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+
mod foo {
+    pub mod bar {
+        pub struct Item;
+
+        impl Item {
+            pub const TEST_ASSOC: usize = 3;
+        }
+    }
+}
+
+fn main() {
+    bar::Item::TEST_A$0
+}
+
+
+
+
+

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
use foo::bar;
+
+mod foo {
+    pub mod bar {
+        pub struct Item;
+
+        impl Item {
+            pub const TEST_ASSOC: usize = 3;
+        }
+    }
+}
+
+fn main() {
+    bar::Item::TEST_ASSOC
+}
+
+
+
+
+ + + + + +
+ + +currently, if an assoc item comes from a trait that’s not currently imported, and it also has an unresolved and/or partially-qualified path, +no imports will be proposed. +
+
+
+
Fuzzy search details
+

To avoid an excessive amount of the results returned, completion input is checked for inclusion in the names only +(i.e. in HashMap in the std::collections::HashMap path). +For the same reasons, avoids searching for any path imports for inputs with their length less than 2 symbols +(but shows all associated items for any input length).

+
+
+
Import configuration
+

It is possible to configure how use-trees are merged with the imports.granularity.group setting. +Mimics the corresponding behavior of the Auto Import feature.

+
+
+
LSP and performance implications
+

The feature is enabled only if the LSP client supports LSP protocol version 3.16+ and reports the additionalTextEdits +(case-sensitive) resolve client capability in its client capabilities. +This way the server is able to defer the costly computations, doing them for a selected completion item only. +For clients with no such support, all edits have to be calculated on the completion request, including the fuzzy search completion ones, +which might be slow ergo the feature is automatically disabled.

+
+
+
Feature toggle
+

The feature can be forcefully turned off in the settings with the rust-analyzer.completion.autoimport.enable flag. +Note that having this flag set to true does not guarantee that the feature is enabled: your client needs to have the corresponding +capability enabled.

+
+
+
+

Debug ItemTree

+
+

Source: view_item_tree.rs

+
+
+

Displays the ItemTree of the currently open file, for debugging.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Debug ItemTree

+
+
+

Expand Macro Recursively

+
+

Source: expand_macro.rs

+
+
+

Shows the full macro expansion of the macro at current cursor.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Expand macro recursively

+
+
+113020648 b3973180 917a 11eb 84a9 ecb921293dc5 +
+
+
+
+

Expand and Shrink Selection

+ +
+

Extends or shrinks the current selection to the encompassing syntactic construct +(expression, statement, item, module, etc). It works with multiple cursors.

+
+ ++++ + + + + + + + + + + + + +
EditorShortcut

VS Code

Alt+Shift+, Alt+Shift+

+
+
+113020651 b42fc800 917a 11eb 8a4f cf1a07859fac +
+
+
+
+

File Structure

+
+

Source: file_structure.rs

+
+
+

Provides a tree of the symbols defined in the file. Can be used to

+
+
+
    +
  • +

    fuzzy search symbol in a file (super useful)

    +
  • +
  • +

    draw breadcrumbs to describe the context around the cursor

    +
  • +
  • +

    draw outline of the file

    +
  • +
+
+ ++++ + + + + + + + + + + + + +
EditorShortcut

VS Code

Ctrl+Shift+O

+
+
+113020654 b42fc800 917a 11eb 8388 e7dc4d92b02e +
+
+
+
+

Find All References

+
+

Source: references.rs

+
+
+

Shows all references of the item at the cursor location

+
+ ++++ + + + + + + + + + + + + +
EditorShortcut

VS Code

Shift+Alt+F12

+
+
+113020670 b7c34f00 917a 11eb 8003 370ac5f2b3cb +
+
+
+
+

Folding

+
+

Source: folding_ranges.rs

+
+
+

Defines folding regions for curly braced blocks, runs of consecutive use, mod, const or static +items, and region / endregion comment markers.

+
+
+
+

Format String Completion

+
+

Source: format_like.rs

+
+
+

"Result {result} is {2 + 2}" is expanded to the "Result {} is {}", result, 2 + 2.

+
+
+

The following postfix snippets are available:

+
+
+
    +
  • +

    formatformat!(…​)

    +
  • +
  • +

    panicpanic!(…​)

    +
  • +
  • +

    printlnprintln!(…​)

    +
  • +
  • +

    log:

    +
    +
      +
    • +

      logdlog::debug!(…​)

      +
    • +
    • +

      logtlog::trace!(…​)

      +
    • +
    • +

      logilog::info!(…​)

      +
    • +
    • +

      logwlog::warn!(…​)

      +
    • +
    • +

      logelog::error!(…​)

      +
    • +
    +
    +
  • +
+
+
+
+113020656 b560f500 917a 11eb 87de 02991f61beb8 +
+
+
+
+

Go to Declaration

+ +
+

Navigates to the declaration of an identifier.

+
+
+

This is the same as Go to Definition with the following exceptions: +- outline modules will navigate to the mod name; item declaration +- trait assoc items will navigate to the assoc item of the trait declaration opposed to the trait impl +- fields in patterns will navigate to the field declaration of the struct, union or variant

+
+
+
+

Go to Definition

+
+

Source: goto_definition.rs

+
+
+

Navigates to the definition of an identifier.

+
+
+

For outline modules, this will navigate to the source file of the module.

+
+ ++++ + + + + + + + + + + + + +
EditorShortcut

VS Code

F12

+
+
+113065563 025fbe00 91b1 11eb 83e4 a5a703610b23 +
+
+
+
+

Go to Implementation

+ +
+

Navigates to the impl blocks of types.

+
+ ++++ + + + + + + + + + + + + +
EditorShortcut

VS Code

Ctrl+F12

+
+
+113065566 02f85480 91b1 11eb 9288 aaad8abd8841 +
+
+
+
+

Go to Type Definition

+ +
+

Navigates to the type of an identifier.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

Go to Type Definition

+
+
+113020657 b560f500 917a 11eb 9007 0f809733a338 +
+
+
+
+ + +
+

Highlights constructs related to the thing under the cursor:

+
+
+
    +
  1. +

    if on an identifier, highlights all references to that identifier in the current file

    +
    +
      +
    1. +

      additionally, if the identifier is a trait in a where clause, type parameter trait bound or use item, highlights all references to that trait’s assoc items in the corresponding scope

      +
    2. +
    +
    +
  2. +
  3. +

    if on an async or `await token, highlights all yield points for that async context

    +
  4. +
  5. +

    if on a return or fn keyword, ? character or return type arrow, highlights all exit points for that context

    +
  6. +
  7. +

    if on a break, loop, while or for token, highlights all break points for that loop or block context

    +
  8. +
  9. +

    if on a move or | token that belongs to a closure, highlights all captures of the closure.

    +
  10. +
+
+
+

Note: ?, | and do not currently trigger this behavior in the VSCode editor.

+
+
+
+

Hover

+
+

Source: hover.rs

+
+
+

Shows additional information, like the type of an expression or the documentation for a definition when "focusing" code. +Focusing is usually hovering with a mouse, but can also be triggered with a shortcut.

+
+
+
+113020658 b5f98b80 917a 11eb 9f88 3dbc27320c95 +
+
+
+
+

Inlay Hints

+
+

Source: inlay_hints.rs

+
+
+

rust-analyzer shows additional information inline with the source code. +Editors usually render this using read-only virtual text snippets interspersed with code.

+
+
+

rust-analyzer by default shows hints for

+
+
+
    +
  • +

    types of local variables

    +
  • +
  • +

    names of function arguments

    +
  • +
  • +

    types of chained expressions

    +
  • +
+
+
+

Optionally, one can enable additional hints for

+
+
+
    +
  • +

    return types of closure expressions

    +
  • +
  • +

    elided lifetimes

    +
  • +
  • +

    compiler inserted reborrows

    +
  • +
+
+
+
+113020660 b5f98b80 917a 11eb 8d70 3be3fd558cdd +
+
+
+
+

Interpret Function

+ + ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Interpret Function

+
+
+

Join Lines

+
+

Source: join_lines.rs

+
+
+

Join selected lines into one, smartly fixing up whitespace, trailing commas, and braces.

+
+
+

See +this gif +for the cases handled specially by joined lines.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Join lines

+
+
+113020661 b6922200 917a 11eb 87c4 b75acc028f11 +
+
+
+
+

Magic Completions

+
+

Source: lib.rs

+
+
+

In addition to usual reference completion, rust-analyzer provides some ✨magic✨ +completions as well:

+
+
+

Keywords like if, else while, loop are completed with braces, and cursor +is placed at the appropriate position. Even though if is easy to type, you +still want to complete it, to get ` { }` for free! return is inserted with a +space or ; depending on the return type of the function.

+
+
+

When completing a function call, () are automatically inserted. If a function +takes arguments, the cursor is positioned inside the parenthesis.

+
+
+

There are postfix completions, which can be triggered by typing something like +foo().if. The word after . determines postfix completion. Possible variants are:

+
+
+
    +
  • +

    expr.ifif expr {} or if let …​ {} for Option or Result

    +
  • +
  • +

    expr.matchmatch expr {}

    +
  • +
  • +

    expr.whilewhile expr {} or while let …​ {} for Option or Result

    +
  • +
  • +

    expr.ref&expr

    +
  • +
  • +

    expr.refm&mut expr

    +
  • +
  • +

    expr.letlet $0 = expr;

    +
  • +
  • +

    expr.letmlet mut $0 = expr;

    +
  • +
  • +

    expr.not!expr

    +
  • +
  • +

    expr.dbgdbg!(expr)

    +
  • +
  • +

    expr.dbgrdbg!(&expr)

    +
  • +
  • +

    expr.call(expr)

    +
  • +
+
+
+

There also snippet completions:

+
+
+
Expressions
+
    +
  • +

    pdeprintln!(" = {:?}", );

    +
  • +
  • +

    ppdeprintln!(" = {:#?}", );

    +
  • +
+
+
+
Items
+
    +
  • +

    tfn#[test] fn feature(){}

    +
  • +
  • +

    tmod

    +
  • +
+
+
+
+
1
+2
+3
+4
+5
+6
+7
+
#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_name() {}
+}
+
+
+
+
+

And the auto import completions, enabled with the rust-analyzer.completion.autoimport.enable setting and the corresponding LSP client capabilities. +Those are the additional completion options with automatic use import and options from all project importable items, +fuzzy matched against the completion input.

+
+
+
+113020667 b72ab880 917a 11eb 8778 716cf26a0eb3 +
+
+
+
+

Matching Brace

+
+

Source: matching_brace.rs

+
+
+

If the cursor is on any brace (<>(){}[]||) which is a part of a brace-pair, +moves cursor to the matching brace. It uses the actual parser to determine +braces, so it won’t confuse generics with comparisons.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Find matching brace

+
+
+113065573 04298180 91b1 11eb 8dec d4e2a202f304 +
+
+
+
+

Memory Usage

+
+

Source: apply_change.rs

+
+
+

Clears rust-analyzer’s internal database and prints memory usage statistics.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Memory Usage (Clears Database)

+
+
+113065592 08559f00 91b1 11eb 8c96 64b88068ec02 +
+
+
+
+

Move Item

+
+

Source: move_item.rs

+
+
+

Move item under cursor or selection up and down.

+
+ ++++ + + + + + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Move item up

VS Code

rust-analyzer: Move item down

+
+
+113065576 04298180 91b1 11eb 91ce 4505e99ed598 +
+
+
+
+

On Enter

+
+

Source: on_enter.rs

+
+
+

rust-analyzer can override Enter key to make it smarter:

+
+
+
    +
  • +

    Enter inside triple-slash comments automatically inserts ///

    +
  • +
  • +

    Enter in the middle or after a trailing space in // inserts //

    +
  • +
  • +

    Enter inside //! doc comments automatically inserts //!

    +
  • +
  • +

    Enter after { indents contents and closing } of single-line block

    +
  • +
+
+
+

This action needs to be assigned to shortcut explicitly.

+
+
+

Note that, depending on the other installed extensions, this feature can visibly slow down typing. +Similarly, if rust-analyzer crashes or stops responding, Enter might not work. +In that case, you can still press Shift-Enter to insert a newline.

+
+
+
+
VS Code
+
+

Add the following to keybindings.json:

+
+
+
+
+
+
1
+2
+3
+4
+5
+
{
+  "key": "Enter",
+  "command": "rust-analyzer.onEnter",
+  "when": "editorTextFocus && !suggestWidgetVisible && editorLangId == rust"
+}
+
+
+
+
+

When using the Vim plugin:

+
+
+
+
1
+2
+3
+4
+5
+
{
+  "key": "Enter",
+  "command": "rust-analyzer.onEnter",
+  "when": "editorTextFocus && !suggestWidgetVisible && editorLangId == rust && vim.mode == 'Insert'"
+}
+
+
+
+
+
+113065578 04c21800 91b1 11eb 82b8 22b8c481e645 +
+
+
+
+

On Typing Assists

+
+

Source: typing.rs

+
+
+

Some features trigger on typing certain characters:

+
+
+
    +
  • +

    typing let = tries to smartly add ; if = is followed by an existing expression

    +
  • +
  • +

    typing = between two expressions adds ; when in statement position

    +
  • +
  • +

    typing = to turn an assignment into an equality comparison removes ; when in expression position

    +
  • +
  • +

    typing . in a chain method call auto-indents

    +
  • +
  • +

    typing { or ( in front of an expression inserts a closing } or ) after the expression

    +
  • +
  • +

    typing { in a use item adds a closing } in the right place

    +
    +
    +
    VS Code
    +
    +

    Add the following to settings.json:

    +
    +
    +
    +
  • +
+
+
+
+
"editor.formatOnType": true,
+
+
+
+
+113166163 69758500 923a 11eb 81ee eb33ec380399 +
+
+
+
+113171066 105c2000 923f 11eb 87ab f4a263346567 +
+
+
+
+

Open Docs

+
+

Source: doc_links.rs

+
+
+

Retrieve a links to documentation for the given symbol.

+
+
+

The simplest way to use this feature is via the context menu. Right-click on +the selected item. The context menu opens. Select Open Docs.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Open Docs

+
+
+

Parent Module

+
+

Source: parent_module.rs

+
+
+

Navigates to the parent module of the current module.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Locate parent module

+
+
+113065580 04c21800 91b1 11eb 9a32 00086161c0bd +
+
+
+
+ +
+

Source: runnables.rs

+
+
+

Provides a sneak peek of all tests where the current item is used.

+
+
+

The simplest way to use this feature is via the context menu. Right-click on +the selected item. The context menu opens. Select Peek Related Tests.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Peek Related Tests

+
+
+

Rename

+
+

Source: rename.rs

+
+
+

Renames the item below the cursor and all of its references

+
+ ++++ + + + + + + + + + + + + +
EditorShortcut

VS Code

F2

+
+
+113065582 055aae80 91b1 11eb 8ade 2b58e6d81883 +
+
+
+
+

Run

+
+

Source: runnables.rs

+
+
+

Shows a popup suggesting to run a test/benchmark/binary at the current cursor +location. Super useful for repeatedly running just a single test. Do bind this +to a shortcut!

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Run

+
+
+113065583 055aae80 91b1 11eb 958f d67efcaf6a2f +
+
+
+
+

Semantic Syntax Highlighting

+ +
+

rust-analyzer highlights the code semantically. +For example, Bar in foo::Bar might be colored differently depending on whether Bar is an enum or a trait. +rust-analyzer does not specify colors directly, instead it assigns a tag (like struct) and a set of modifiers (like declaration) to each token. +It’s up to the client to map those to specific colors.

+
+
+

The general rule is that a reference to an entity gets colored the same way as the entity itself. +We also give special modifier for mut and &mut local variables.

+
+
+
Token Tags
+

Rust-analyzer currently emits the following token tags:

+
+
+
    +
  • +

    For items:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +attribute + +

    Emitted for attribute macros.

    +
    +enum + +

    Emitted for enums.

    +
    +function + +

    Emitted for free-standing functions.

    +
    +derive + +

    Emitted for derive macros.

    +
    +macro + +

    Emitted for function-like macros.

    +
    +method + +

    Emitted for associated functions, also knowns as methods.

    +
    +namespace + +

    Emitted for modules.

    +
    +struct + +

    Emitted for structs.

    +
    +trait + +

    Emitted for traits.

    +
    +typeAlias + +

    Emitted for type aliases and Self in `impl`s.

    +
    +union + +

    Emitted for unions.

    +
    +
    +
  • +
  • +

    For literals:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +boolean + +

    Emitted for the boolean literals true and false.

    +
    +character + +

    Emitted for character literals.

    +
    +number + +

    Emitted for numeric literals.

    +
    +string + +

    Emitted for string literals.

    +
    +escapeSequence + +

    Emitted for escaped sequences inside strings like \n.

    +
    +formatSpecifier + +

    Emitted for format specifiers {:?} in format!-like macros.

    +
    +
    +
  • +
  • +

    For operators:

    +
    + + + + + + + + + + + + + + + + + + + + + +
    +operator + +

    Emitted for general operators.

    +
    +arithmetic + +

    Emitted for the arithmetic operators +, -, , /, +=, -=, =, /=.

    +
    +bitwise + +

    Emitted for the bitwise operators |, &, !, ^, |=, &=, ^=.

    +
    +comparison + +

    Emitted for the comparison operators >, <, ==, >=, , !=.

    +
    +logical + +

    Emitted for the logical operators ||, &&, !.

    +
    +
    +
  • +
  • +

    For punctuation:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +punctuation + +

    Emitted for general punctuation.

    +
    +attributeBracket + +

    Emitted for attribute invocation brackets, that is the #[ and ] tokens.

    +
    +angle + +

    Emitted for <> angle brackets.

    +
    +brace + +

    Emitted for {} braces.

    +
    +bracket + +

    Emitted for [] brackets.

    +
    +parenthesis + +

    Emitted for () parentheses.

    +
    +colon + +

    Emitted for the : token.

    +
    +comma + +

    Emitted for the , token.

    +
    +dot + +

    Emitted for the . token.

    +
    +semi + +

    Emitted for the ; token.

    +
    +macroBang + +

    Emitted for the ! token in macro calls.

    +
    +
    +
  • +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+builtinAttribute + +

Emitted for names to builtin attributes in attribute path, the repr in #[repr(u8)] for example.

+
+builtinType + +

Emitted for builtin types like u32, str and f32.

+
+comment + +

Emitted for comments.

+
+constParameter + +

Emitted for const parameters.

+
+deriveHelper + +

Emitted for derive helper attributes.

+
+enumMember + +

Emitted for enum variants.

+
+generic + +

Emitted for generic tokens that have no mapping.

+
+keyword + +

Emitted for keywords.

+
+label + +

Emitted for labels.

+
+lifetime + +

Emitted for lifetimes.

+
+parameter + +

Emitted for non-self function parameters.

+
+property + +

Emitted for struct and union fields.

+
+selfKeyword + +

Emitted for the self function parameter and self path-specifier.

+
+selfTypeKeyword + +

Emitted for the Self type parameter.

+
+toolModule + +

Emitted for tool modules.

+
+typeParameter + +

Emitted for type parameters.

+
+unresolvedReference + +

Emitted for unresolved references, names that rust-analyzer can’t find the definition of.

+
+variable + +

Emitted for locals, constants and statics.

+
+
+
+
Token Modifiers
+

Token modifiers allow to style some elements in the source code more precisely.

+
+
+

Rust-analyzer currently emits the following token modifiers:

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+async + +

Emitted for async functions and the async and await keywords.

+
+attribute + +

Emitted for tokens inside attributes.

+
+callable + +

Emitted for locals whose types implements one of the Fn* traits.

+
+constant + +

Emitted for consts.

+
+consuming + +

Emitted for locals that are being consumed when use in a function call.

+
+controlFlow + +

Emitted for control-flow related tokens, this includes the ? operator.

+
+crateRoot + +

Emitted for crate names, like serde and crate.

+
+declaration + +

Emitted for names of definitions, like foo in fn foo() {}.

+
+defaultLibrary + +

Emitted for items from built-in crates (std, core, alloc, test and proc_macro).

+
+documentation + +

Emitted for documentation comments.

+
+injected + +

Emitted for doc-string injected highlighting like rust source blocks in documentation.

+
+intraDocLink + +

Emitted for intra doc links in doc-strings.

+
+library + +

Emitted for items that are defined outside of the current crate.

+
+macro + +

Emitted for tokens inside macro calls.

+
+mutable + +

Emitted for mutable locals and statics as well as functions taking &mut self.

+
+public + +

Emitted for items that are from the current crate and are pub.

+
+reference + +

Emitted for locals behind a reference and functions taking self by reference.

+
+static + +

Emitted for "static" functions, also known as functions that do not take a self param, as well as statics and consts.

+
+trait + +

Emitted for associated trait items.

+
+unsafe + +

Emitted for unsafe operations, like unsafe function calls, as well as the unsafe token.

+
+
+
+
+113164457 06cfb980 9239 11eb 819b 0f93e646acf8 +
+
+
+
+113187625 f7f50100 9250 11eb 825e 91c58f236071 +
+
+
+
+

Show Dependency Tree

+
+

Source: fetch_crates.rs

+
+
+

Shows a view tree with all the dependencies of this project

+
+ ++++ + + + + + + + + + + + + +
EditorPanel Name

VS Code

Rust Dependencies

+
+
+229394139 2625beab f4c9 484b 84ed ad5dee0b1e1a +
+
+
+
+

Show Syntax Tree

+
+

Source: syntax_tree.rs

+
+
+

Shows the parse tree of the current file. It exists mostly for debugging +rust-analyzer itself.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Show Syntax Tree

+
+
+113065586 068bdb80 91b1 11eb 9507 fee67f9f45a0 +
+
+
+
+

Shuffle Crate Graph

+ +
+

Randomizes all crate IDs in the crate graph, for debugging.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Shuffle Crate Graph

+
+
+

Status

+
+

Source: status.rs

+
+
+

Shows internal statistic about memory usage of rust-analyzer.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Status

+
+
+113065584 05f34500 91b1 11eb 98cc 5c196f76be7f +
+
+
+
+

Structural Search and Replace

+
+

Source: lib.rs

+
+
+

Search and replace with named wildcards that will match any expression, type, path, pattern or item. +The syntax for a structural search replace command is <search_pattern> =⇒> <replace_pattern>. +A $<name> placeholder in the search pattern will match any AST node and $<name> will reference it in the replacement. +Within a macro call, a placeholder will match up until whatever token follows the placeholder.

+
+
+

All paths in both the search pattern and the replacement template must resolve in the context +in which this command is invoked. Paths in the search pattern will then match the code if they +resolve to the same item, even if they’re written differently. For example if we invoke the +command in the module foo with a pattern of Bar, then code in the parent module that refers +to foo::Bar will match.

+
+
+

Paths in the replacement template will be rendered appropriately for the context in which the +replacement occurs. For example if our replacement template is foo::Bar and we match some +code in the foo module, we’ll insert just Bar.

+
+
+

Inherent method calls should generally be written in UFCS form. e.g. foo::Bar::baz($s, $a) will +match $s.baz($a), provided the method call baz resolves to the method foo::Bar::baz. When a +placeholder is the receiver of a method call in the search pattern (e.g. $s.foo()), but not in +the replacement template (e.g. bar($s)), then *, & and &mut will be added as needed to mirror +whatever autoderef and autoref was happening implicitly in the matched code.

+
+
+

The scope of the search / replace will be restricted to the current selection if any, otherwise +it will apply to the whole workspace.

+
+
+

Placeholders may be given constraints by writing them as ${<name>:<constraint1>:<constraint2>…​}.

+
+
+

Supported constraints:

+
+ ++++ + + + + + + + + + + + + + + + + +
ConstraintRestricts placeholder

kind(literal)

Is a literal (e.g. 42 or "forty two")

not(a)

Negates the constraint a

+
+

Available via the command rust-analyzer.ssr.

+
+
+
+
1
+2
+3
+4
+5
+6
+7
+
// Using structural search replace command [foo($a, $b) ==>> ($a).foo($b)]
+
+// BEFORE
+String::from(foo(y + 5, z))
+
+// AFTER
+String::from((y + 5).foo(z))
+
+
+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: Structural Search Replace

+
+

Also available as an assist, by writing a comment containing the structural +search and replace rule. You will only see the assist if the comment can +be parsed as a valid structural search and replace rule.

+
+
+
+
1
+2
+
// Place the cursor on the line below to see the assist 💡.
+// foo($a, $b) ==>> ($a).foo($b)
+
+
+
+
+
+

User Snippet Completions

+
+

Source: snippet.rs

+
+
+

rust-analyzer allows the user to define custom (postfix)-snippets that may depend on items to be accessible for the current scope to be applicable.

+
+
+

A custom snippet can be defined by adding it to the rust-analyzer.completion.snippets.custom object respectively.

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
{
+  "rust-analyzer.completion.snippets.custom": {
+    "thread spawn": {
+      "prefix": ["spawn", "tspawn"],
+      "body": [
+        "thread::spawn(move || {",
+        "\t$0",
+        "});",
+      ],
+      "description": "Insert a thread::spawn call",
+      "requires": "std::thread",
+      "scope": "expr",
+    }
+  }
+}
+
+
+
+
+

In the example above:

+
+
+
    +
  • +

    "thread spawn" is the name of the snippet.

    +
  • +
  • +

    prefix defines one or more trigger words that will trigger the snippets completion. +Using postfix will instead create a postfix snippet.

    +
  • +
  • +

    body is one or more lines of content joined via newlines for the final output.

    +
  • +
  • +

    description is an optional description of the snippet, if unset the snippet name will be used.

    +
  • +
  • +

    requires is an optional list of item paths that have to be resolvable in the current crate where the completion is rendered. +On failure of resolution the snippet won’t be applicable, otherwise the snippet will insert an import for the items on insertion if +the items aren’t yet in scope.

    +
  • +
  • +

    scope is an optional filter for when the snippet should be applicable. Possible values are:

    +
    +
      +
    • +

      for Snippet-Scopes: expr, item (default: item)

      +
    • +
    • +

      for Postfix-Snippet-Scopes: expr, type (default: expr)

      +
    • +
    +
    +
  • +
+
+
+

The body field also has access to placeholders as visible in the example as $0. +These placeholders take the form of $number or ${number:placeholder_text} which can be traversed as tabstop in ascending order starting from 1, +with $0 being a special case that always comes last.

+
+
+

There is also a special placeholder, ${receiver}, which will be replaced by the receiver expression for postfix snippets, or a $0 tabstop in case of normal snippets. +This replacement for normal snippets allows you to reuse a snippet for both post- and prefix in a single definition.

+
+
+

For the VSCode editor, rust-analyzer also ships with a small set of defaults which can be removed +by overwriting the settings object mentioned above, the defaults are:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+
{
+    "Arc::new": {
+        "postfix": "arc",
+        "body": "Arc::new(${receiver})",
+        "requires": "std::sync::Arc",
+        "description": "Put the expression into an `Arc`",
+        "scope": "expr"
+    },
+    "Rc::new": {
+        "postfix": "rc",
+        "body": "Rc::new(${receiver})",
+        "requires": "std::rc::Rc",
+        "description": "Put the expression into an `Rc`",
+        "scope": "expr"
+    },
+    "Box::pin": {
+        "postfix": "pinbox",
+        "body": "Box::pin(${receiver})",
+        "requires": "std::boxed::Box",
+        "description": "Put the expression into a pinned `Box`",
+        "scope": "expr"
+    },
+    "Ok": {
+        "postfix": "ok",
+        "body": "Ok(${receiver})",
+        "description": "Wrap the expression in a `Result::Ok`",
+        "scope": "expr"
+    },
+    "Err": {
+        "postfix": "err",
+        "body": "Err(${receiver})",
+        "description": "Wrap the expression in a `Result::Err`",
+        "scope": "expr"
+    },
+    "Some": {
+        "postfix": "some",
+        "body": "Some(${receiver})",
+        "description": "Wrap the expression in an `Option::Some`",
+        "scope": "expr"
+    }
+}
+
+
+
+
+
+

View Crate Graph

+ +
+

Renders the currently loaded crate graph as an SVG graphic. Requires the dot tool, which +is part of graphviz, to be installed.

+
+
+

Only workspace crates are included, no crates.io dependencies or sysroot crates.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: View Crate Graph

+
+
+

View Hir

+
+

Source: view_hir.rs

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: View Hir

+
+
+113065588 068bdb80 91b1 11eb 9a78 0b4ef1e972fb +
+
+
+
+

View Memory Layout

+ +
+

Displays the recursive memory layout of a datatype.

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: View Memory Layout

+
+
+

View Mir

+
+

Source: view_mir.rs

+
+ ++++ + + + + + + + + + + + + +
EditorAction Name

VS Code

rust-analyzer: View Mir

+
+
+

Workspace Symbol

+
+

Source: symbol_index.rs

+
+
+

Uses fuzzy-search to find types, modules and functions by name across your +project and dependencies. This is the most useful feature, which improves code +navigation tremendously. It mostly works on top of the built-in LSP +functionality, however # and * symbols can be used to narrow down the +search. Specifically,

+
+
+
    +
  • +

    Foo searches for Foo type in the current workspace

    +
  • +
  • +

    foo# searches for foo function in the current workspace

    +
  • +
  • +

    Foo* searches for Foo type among dependencies, including stdlib

    +
  • +
  • +

    foo#* searches for foo function among dependencies

    +
  • +
+
+
+

That is, # switches from "types" to all symbols, * switches from the current +workspace to dependencies.

+
+
+

Note that filtering does not currently work in VSCode due to the editor never +sending the special symbols to the language server. Instead, you can configure +the filtering via the rust-analyzer.workspace.symbol.search.scope and +rust-analyzer.workspace.symbol.search.kind settings.

+
+ ++++ + + + + + + + + + + + + +
EditorShortcut

VS Code

Ctrl+T

+
+
+
+
+

Assists (Code Actions)

+
+
+

Assists, or code actions, are small local refactorings, available in a particular context. +They are usually triggered by a shortcut or by clicking a light bulb icon in the editor. +Cursor position or selection is signified by character.

+
+

add_braces

+
+

Source: add_braces.rs

+
+
+

Adds braces to lambda and match arm expressions.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn foo(n: i32) -> i32 {
+    match n {
+        1 => n + 1,
+        _ => 0
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
fn foo(n: i32) -> i32 {
+    match n {
+        1 => {
+            n + 1
+        },
+        _ => 0
+    }
+}
+
+
+
+

add_explicit_type

+ +
+

Specify type for a let binding.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let x = 92;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    let x: i32 = 92;
+}
+
+
+
+

add_hash

+
+

Source: raw_string.rs

+
+
+

Adds a hash to a raw string literal.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    r#"Hello,┃ World!"#;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    r##"Hello, World!"##;
+}
+
+
+
+

add_impl_default_members

+ +
+

Adds scaffold for overriding default impl members.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
trait Trait {
+    type X;
+    fn foo(&self);
+    fn bar(&self) {}
+}
+
+impl Trait for () {
+    type X = ();
+    fn foo(&self) {}
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
trait Trait {
+    type X;
+    fn foo(&self);
+    fn bar(&self) {}
+}
+
+impl Trait for () {
+    type X = ();
+    fn foo(&self) {}
+
+    fn bar(&self) {}
+}
+
+
+
+

add_impl_missing_members

+ +
+

Adds scaffold for required impl members.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
trait Trait<T> {
+    type X;
+    fn foo(&self) -> T;
+    fn bar(&self) {}
+}
+
+impl Trait<u32> for () {
+
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+
trait Trait<T> {
+    type X;
+    fn foo(&self) -> T;
+    fn bar(&self) {}
+}
+
+impl Trait<u32> for () {
+    type X;
+
+    fn foo(&self) -> u32 {
+        todo!()
+    }
+}
+
+
+
+

add_label_to_loop

+ +
+

Adds a label to a loop.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    loop {
+        break;
+        continue;
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    'l: loop {
+        break 'l;
+        continue 'l;
+    }
+}
+
+
+
+

add_lifetime_to_type

+ +
+

Adds a new lifetime to a struct, enum or union.

+
+
+
Before
+
+
1
+2
+3
+4
+
struct Point {
+    x: &u32,
+    y: u32,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
struct Point<'a> {
+    x: &'a u32,
+    y: u32,
+}
+
+
+
+

add_missing_match_arms

+ +
+

Adds missing clauses to a match expression.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } => todo!(),
+        Action::Stop => todo!(),
+    }
+}
+
+
+
+

add_return_type

+
+

Source: add_return_type.rs

+
+
+

Adds the return type to a function or closure inferred from its tail expression if it doesn’t have a return +type specified. This assists is useable in a functions or closures tail expression or return type position.

+
+
+
Before
+
+
1
+
fn foo() { 42i32 }
+
+
+
+
+
After
+
+
1
+
fn foo() -> i32 { 42i32 }
+
+
+
+

add_turbo_fish

+
+

Source: add_turbo_fish.rs

+
+
+

Adds ::<_> to a call of a generic method or function.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn make<T>() -> T { todo!() }
+fn main() {
+    let x = make();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn make<T>() -> T { todo!() }
+fn main() {
+    let x = make::<${0:_}>();
+}
+
+
+
+

apply_demorgan

+
+

Source: apply_demorgan.rs

+
+
+

Apply De Morgan’s law. +This transforms expressions of the form !l || !r into !(l && r). +This also works with &&. This assist can only be applied with the cursor +on either || or &&.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    if x != 4 || y < 3.14 {}
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    if !(x == 4 && y >= 3.14) {}
+}
+
+
+
+

apply_demorgan_iterator

+
+

Source: apply_demorgan.rs

+
+
+

Apply De Morgan’s law to +Iterator::all and Iterator::any.

+
+
+

This transforms expressions of the form !iter.any(|x| predicate(x)) into +iter.all(|x| !predicate(x)) and vice versa. This also works the other way for +Iterator::all into Iterator::any.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let arr = [1, 2, 3];
+    if !arr.into_iter().┃any(|num| num == 4) {
+        println!("foo");
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let arr = [1, 2, 3];
+    if arr.into_iter().all(|num| num != 4) {
+        println!("foo");
+    }
+}
+
+
+
+

auto_import

+
+

Source: auto_import.rs

+
+
+

If the name is unresolved, provides all possible imports for it.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let map = HashMap::new();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
use std::collections::HashMap;
+
+fn main() {
+    let map = HashMap::new();
+}
+
+
+
+

bind_unused_param

+ +
+

Binds unused function parameter to an underscore.

+
+
+
Before
+
+
1
+
fn some_function(x: i32) {}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn some_function(x: i32) {
+    let _ = x;
+}
+
+
+
+

bool_to_enum

+
+

Source: bool_to_enum.rs

+
+
+

This converts boolean local variables, fields, constants, and statics into a new +enum with two variants Bool::True and Bool::False, as well as replacing +all assignments with the variants and replacing all usages with == Bool::True or +== Bool::False.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    let bool = true;
+
+    if bool {
+        println!("foo");
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
#[derive(PartialEq, Eq)]
+enum Bool { True, False }
+
+fn main() {
+    let bool = Bool::True;
+
+    if bool == Bool::True {
+        println!("foo");
+    }
+}
+
+
+
+

change_visibility

+ +
+

Adds or changes existing visibility specifier.

+
+
+
Before
+
+
1
+
fn frobnicate() {}
+
+
+
+
+
After
+
+
1
+
pub(crate) fn frobnicate() {}
+
+
+
+

convert_bool_then_to_if

+ +
+

Converts a bool::then method call to an equivalent if expression.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    (0 == 0).then(|| val)
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    if 0 == 0 {
+        Some(val)
+    } else {
+        None
+    }
+}
+
+
+
+

convert_for_loop_with_for_each

+ +
+

Converts a for loop into a for_each loop on the Iterator.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let x = vec![1, 2, 3];
+    for v in x {
+        let y = v * 2;
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let x = vec![1, 2, 3];
+    x.into_iter().for_each(|v| {
+        let y = v * 2;
+    });
+}
+
+
+
+

convert_if_to_bool_then

+ +
+

Converts an if expression into a corresponding bool::then call.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    if cond {
+        Some(val)
+    } else {
+        None
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    cond.then(|| val)
+}
+
+
+
+

convert_integer_literal

+ +
+

Converts the base of integer literals to other bases.

+
+
+
Before
+
+
1
+
const _: i32 = 10;
+
+
+
+
+
After
+
+
1
+
const _: i32 = 0b1010;
+
+
+
+

convert_into_to_from

+ +
+

Converts an Into impl to an equivalent From impl.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
impl Into<Thing> for usize {
+    fn into(self) -> Thing {
+        Thing {
+            b: self.to_string(),
+            a: self
+        }
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
impl From<usize> for Thing {
+    fn from(val: usize) -> Self {
+        Thing {
+            b: val.to_string(),
+            a: val
+        }
+    }
+}
+
+
+
+

convert_iter_for_each_to_for

+ +
+

Converts an Iterator::for_each function into a for loop.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let iter = iter::repeat((9, 2));
+    iter.for_each(|(x, y)| {
+        println!("x: {}, y: {}", x, y);
+    });
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let iter = iter::repeat((9, 2));
+    for (x, y) in iter {
+        println!("x: {}, y: {}", x, y);
+    }
+}
+
+
+
+

convert_let_else_to_match

+ +
+

Converts let-else statement to let statement and match expression.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let Ok(mut x) = f() else { return };
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    let mut x = match f() {
+        Ok(x) => x,
+        _ => return,
+    };
+}
+
+
+
+

convert_match_to_let_else

+ +
+

Converts let statement with match initializer to let-else statement.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn foo(opt: Option<()>) {
+    let val = match opt {
+        Some(it) => it,
+        None => return,
+    };
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn foo(opt: Option<()>) {
+    let Some(val) = opt else { return };
+}
+
+
+
+

convert_named_struct_to_tuple_struct

+ +
+

Converts struct with named fields to tuple struct, and analogously for enum variants with named +fields.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
struct Point { x: f32, y: f32 }
+
+impl Point {
+    pub fn new(x: f32, y: f32) -> Self {
+        Point { x, y }
+    }
+
+    pub fn x(&self) -> f32 {
+        self.x
+    }
+
+    pub fn y(&self) -> f32 {
+        self.y
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
struct Point(f32, f32);
+
+impl Point {
+    pub fn new(x: f32, y: f32) -> Self {
+        Point(x, y)
+    }
+
+    pub fn x(&self) -> f32 {
+        self.0
+    }
+
+    pub fn y(&self) -> f32 {
+        self.1
+    }
+}
+
+
+
+

convert_nested_function_to_closure

+ +
+

Converts a function that is defined within the body of another function into a closure.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    fn foo(label: &str, number: u64) {
+        println!("{}: {}", label, number);
+    }
+
+    foo("Bar", 100);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    let foo = |label: &str, number: u64| {
+        println!("{}: {}", label, number);
+    };
+
+    foo("Bar", 100);
+}
+
+
+
+

convert_to_guarded_return

+ +
+

Replace a large conditional with a guarded return.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    if cond {
+        foo();
+        bar();
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    if !cond {
+        return;
+    }
+    foo();
+    bar();
+}
+
+
+
+

convert_tuple_return_type_to_struct

+ +
+

This converts the return type of a function from a tuple type +into a tuple struct and updates the body accordingly.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn bar() {
+    let (a, b, c) = foo();
+}
+
+fn foo() -> (u32, u32, u32) {
+    (1, 2, 3)
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
fn bar() {
+    let FooResult(a, b, c) = foo();
+}
+
+struct FooResult(u32, u32, u32);
+
+fn foo() -> FooResult {
+    FooResult(1, 2, 3)
+}
+
+
+
+

convert_tuple_struct_to_named_struct

+ +
+

Converts tuple struct to struct with named fields, and analogously for tuple enum variants.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
struct Point(f32, f32);
+
+impl Point {
+    pub fn new(x: f32, y: f32) -> Self {
+        Point(x, y)
+    }
+
+    pub fn x(&self) -> f32 {
+        self.0
+    }
+
+    pub fn y(&self) -> f32 {
+        self.1
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
struct Point { field1: f32, field2: f32 }
+
+impl Point {
+    pub fn new(x: f32, y: f32) -> Self {
+        Point { field1: x, field2: y }
+    }
+
+    pub fn x(&self) -> f32 {
+        self.field1
+    }
+
+    pub fn y(&self) -> f32 {
+        self.field2
+    }
+}
+
+
+
+

convert_two_arm_bool_match_to_matches_macro

+ +
+

Convert 2-arm match that evaluates to a boolean into the equivalent matches! invocation.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
fn main() {
+    match scrutinee {
+        Some(val) if val.cond() => true,
+        _ => false,
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    matches!(scrutinee, Some(val) if val.cond())
+}
+
+
+
+

convert_while_to_loop

+ +
+

Replace a while with a loop.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
fn main() {
+    while cond {
+        foo();
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
fn main() {
+    loop {
+        if !cond {
+            break;
+        }
+        foo();
+    }
+}
+
+
+
+

destructure_tuple_binding

+ +
+

Destructures a tuple binding in place.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn main() {
+    let t = (1,2);
+    let v = t.0;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn main() {
+    let (_0, _1) = (1,2);
+    let v = _0;
+}
+
+
+
+

desugar_doc_comment

+ +
+

Desugars doc-comments to the attribute form.

+
+
+
Before
+
+
1
+2
+
/// Multi-line┃
+/// comment
+
+
+
+
+
After
+
+
1
+2
+
#[doc = r"Multi-line
+comment"]
+
+
+
+

expand_glob_import

+ +
+

Expands glob imports.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
mod foo {
+    pub struct Bar;
+    pub struct Baz;
+}
+
+use foo::*;
+
+fn qux(bar: Bar, baz: Baz) {}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
mod foo {
+    pub struct Bar;
+    pub struct Baz;
+}
+
+use foo::{Bar, Baz};
+
+fn qux(bar: Bar, baz: Baz) {}
+
+
+
+

extract_expressions_from_format_string

+ +
+

Move an expression out of a format string.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    print!("{var} {x + 1}┃");
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    print!("{var} {}", x + 1);
+}
+
+
+
+

extract_function

+ +
+

Extracts selected statements and comments into new function.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn main() {
+    let n = 1;
+    let m = n + 2;
+    // calculate
+    let k = m + n;
+    let g = 3;
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
fn main() {
+    let n = 1;
+    fun_name(n);
+    let g = 3;
+}
+
+fn fun_name(n: i32) {
+    let m = n + 2;
+    // calculate
+    let k = m + n;
+}
+
+
+
+

extract_module

+
+

Source: extract_module.rs

+
+
+

Extracts a selected region as separate module. All the references, visibility and imports are +resolved.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
fn foo(name: i32) -> i32 {
+    name + 1
+}
+
+fn bar(name: i32) -> i32 {
+    name + 2
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
mod modname {
+    pub(crate) fn foo(name: i32) -> i32 {
+        name + 1
+    }
+}
+
+fn bar(name: i32) -> i32 {
+    name + 2
+}
+
+
+
+

extract_struct_from_enum_variant

+ +
+

Extracts a struct from enum variant.

+
+
+
Before
+
+
1
+
enum A { One(u32, u32) }
+
+
+
+
+
After
+
+
1
+2
+3
+
struct One(u32, u32);
+
+enum A { One(One) }
+
+
+
+

extract_type_alias

+ +
+

Extracts the selected type as a type alias.

+
+
+
Before
+
+
1
+2
+3
+
struct S {
+    field: (u8, u8, u8),
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
type Type = (u8, u8, u8);
+
+struct S {
+    field: Type,
+}
+
+
+
+

extract_variable

+ +
+

Extracts subexpression into a variable.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    (1 + 2) * 4;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn main() {
+    let var_name = (1 + 2);
+    var_name * 4;
+}
+
+
+
+

fix_visibility

+
+

Source: fix_visibility.rs

+
+
+

Makes inaccessible item public.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
mod m {
+    fn frobnicate() {}
+}
+fn main() {
+    m::frobnicate();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
mod m {
+    pub(crate) fn frobnicate() {}
+}
+fn main() {
+    m::frobnicate();
+}
+
+
+
+

flip_binexpr

+
+

Source: flip_binexpr.rs

+
+
+

Flips operands of a binary expression.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let _ = 90 + 2;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    let _ = 2 + 90;
+}
+
+
+
+

flip_comma

+
+

Source: flip_comma.rs

+
+
+

Flips two comma-separated items.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    ((1, 2), (3, 4));
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    ((3, 4), (1, 2));
+}
+
+
+
+

flip_trait_bound

+ +
+

Flips two trait bounds.

+
+
+
Before
+
+
1
+
fn foo<T: Clone + Copy>() { }
+
+
+
+
+
After
+
+
1
+
fn foo<T: Copy + Clone>() { }
+
+
+
+

generate_constant

+ +
+

Generate a named constant.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
struct S { i: usize }
+impl S { pub fn new(n: usize) {} }
+fn main() {
+    let v = S::new(CAPACITY);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
struct S { i: usize }
+impl S { pub fn new(n: usize) {} }
+fn main() {
+    const CAPACITY: usize = ;
+    let v = S::new(CAPACITY);
+}
+
+
+
+

generate_default_from_enum_variant

+ +
+

Adds a Default impl for an enum using a variant.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
enum Version {
+ Undefined,
+ Minor,
+ Major,
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
enum Version {
+ Undefined,
+ Minor,
+ Major,
+}
+
+impl Default for Version {
+    fn default() -> Self {
+        Self::Minor
+    }
+}
+
+
+
+

generate_default_from_new

+ +
+

Generates default implementation from new method.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
struct Example { _inner: () }
+
+impl Example {
+    pub fn new() -> Self {
+        Self { _inner: () }
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+
struct Example { _inner: () }
+
+impl Example {
+    pub fn new() -> Self {
+        Self { _inner: () }
+    }
+}
+
+impl Default for Example {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+
+
+

generate_delegate_methods

+ +
+

Generate delegate methods.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
struct Age(u8);
+impl Age {
+    fn age(&self) -> u8 {
+        self.0
+    }
+}
+
+struct Person {
+    age: Age,
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+
struct Age(u8);
+impl Age {
+    fn age(&self) -> u8 {
+        self.0
+    }
+}
+
+struct Person {
+    age: Age,
+}
+
+impl Person {
+    fn age(&self) -> u8 {
+        self.age.age()
+    }
+}
+
+
+
+

generate_delegate_trait

+ +
+

Generate delegate trait implementation for `StructField`s.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+
trait SomeTrait {
+    type T;
+    fn fn_(arg: u32) -> u32;
+    fn method_(&mut self) -> bool;
+}
+struct A;
+impl SomeTrait for A {
+    type T = u32;
+
+    fn fn_(arg: u32) -> u32 {
+        42
+    }
+
+    fn method_(&mut self) -> bool {
+        false
+    }
+}
+struct B {
+    a: A,
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+
trait SomeTrait {
+    type T;
+    fn fn_(arg: u32) -> u32;
+    fn method_(&mut self) -> bool;
+}
+struct A;
+impl SomeTrait for A {
+    type T = u32;
+
+    fn fn_(arg: u32) -> u32 {
+        42
+    }
+
+    fn method_(&mut self) -> bool {
+        false
+    }
+}
+struct B {
+    a: A,
+}
+
+impl SomeTrait for B {
+    type T = <A as SomeTrait>::T;
+
+    fn fn_(arg: u32) -> u32 {
+        <A as SomeTrait>::fn_(arg)
+    }
+
+    fn method_(&mut self) -> bool {
+        <A as SomeTrait>::method_( &mut self.a )
+    }
+}
+
+
+
+

generate_deref

+
+

Source: generate_deref.rs

+
+
+

Generate Deref impl using the given struct field.

+
+
+
Before
+
+
1
+2
+3
+4
+
struct A;
+struct B {
+   a: A
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
struct A;
+struct B {
+   a: A
+}
+
+impl core::ops::Deref for B {
+    type Target = A;
+
+    fn deref(&self) -> &Self::Target {
+        &self.a
+    }
+}
+
+
+
+

generate_derive

+
+

Source: generate_derive.rs

+
+
+

Adds a new #[derive()] clause to a struct or enum.

+
+
+
Before
+
+
1
+2
+3
+4
+
struct Point {
+    x: u32,
+    y: u32,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
#[derive()]
+struct Point {
+    x: u32,
+    y: u32,
+}
+
+
+
+

generate_doc_example

+ +
+

Generates a rustdoc example when editing an item’s documentation.

+
+
+
Before
+
+
1
+2
+
/// Adds two numbers.┃
+pub fn add(a: i32, b: i32) -> i32 { a + b }
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
/// Adds two numbers.
+///
+/// # Examples
+///
+/// ```
+/// use test::add;
+///
+/// assert_eq!(add(a, b), );
+/// ```
+pub fn add(a: i32, b: i32) -> i32 { a + b }
+
+
+
+

generate_documentation_template

+ +
+

Adds a documentation template above a function definition / declaration.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
pub struct S;
+impl S {
+    pub unsafe fn set_len(&mut self, len: usize) -> Result<(), std::io::Error> {
+        /* ... */
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
pub struct S;
+impl S {
+    /// Sets the length of this [`S`].
+    ///
+    /// # Errors
+    ///
+    /// This function will return an error if .
+    ///
+    /// # Safety
+    ///
+    /// .
+    pub unsafe fn set_len(&mut self, len: usize) -> Result<(), std::io::Error> {
+        /* ... */
+    }
+}
+
+
+
+

generate_enum_as_method

+ +
+

Generate an as_ method for this enum variant.

+
+
+
Before
+
+
1
+2
+3
+4
+
enum Value {
+ Number(i32),
+ Text(String),
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+
enum Value {
+ Number(i32),
+ Text(String),
+}
+
+impl Value {
+    fn as_text(&self) -> Option<&String> {
+        if let Self::Text(v) = self {
+            Some(v)
+        } else {
+            None
+        }
+    }
+}
+
+
+
+

generate_enum_is_method

+ +
+

Generate an is_ method for this enum variant.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
enum Version {
+ Undefined,
+ Minor,
+ Major,
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
enum Version {
+ Undefined,
+ Minor,
+ Major,
+}
+
+impl Version {
+    /// Returns `true` if the version is [`Minor`].
+    ///
+    /// [`Minor`]: Version::Minor
+    #[must_use]
+    fn is_minor(&self) -> bool {
+        matches!(self, Self::Minor)
+    }
+}
+
+
+
+

generate_enum_try_into_method

+ +
+

Generate a try_into_ method for this enum variant.

+
+
+
Before
+
+
1
+2
+3
+4
+
enum Value {
+ Number(i32),
+ Text(String),
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+
enum Value {
+ Number(i32),
+ Text(String),
+}
+
+impl Value {
+    fn try_into_text(self) -> Result<String, Self> {
+        if let Self::Text(v) = self {
+            Ok(v)
+        } else {
+            Err(self)
+        }
+    }
+}
+
+
+
+

generate_enum_variant

+ +
+

Adds a variant to an enum.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
enum Countries {
+    Ghana,
+}
+
+fn main() {
+    let country = Countries::Lesotho;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Countries {
+    Ghana,
+    Lesotho,
+}
+
+fn main() {
+    let country = Countries::Lesotho;
+}
+
+
+
+

generate_from_impl_for_enum

+ +
+

Adds a From impl for this enum variant with one tuple field.

+
+
+
Before
+
+
1
+
enum A { One(u32) }
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
enum A { One(u32) }
+
+impl From<u32> for A {
+    fn from(v: u32) -> Self {
+        Self::One(v)
+    }
+}
+
+
+
+

generate_function

+ +
+

Adds a stub function with a signature matching the function under the cursor.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
struct Baz;
+fn baz() -> Baz { Baz }
+fn foo() {
+    bar("", baz());
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct Baz;
+fn baz() -> Baz { Baz }
+fn foo() {
+    bar("", baz());
+}
+
+fn bar(arg: &str, baz: Baz) ${0:-> _} {
+    todo!()
+}
+
+
+
+

generate_getter

+ +
+

Generate a getter method.

+
+
+
Before
+
+
1
+2
+3
+
struct Person {
+    name: String,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct Person {
+    name: String,
+}
+
+impl Person {
+    fn name(&self) -> &str {
+        self.name.as_ref()
+    }
+}
+
+
+
+

generate_getter_mut

+ +
+

Generate a mut getter method.

+
+
+
Before
+
+
1
+2
+3
+
struct Person {
+    name: String,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct Person {
+    name: String,
+}
+
+impl Person {
+    fn name_mut(&mut self) -> &mut String {
+        &mut self.name
+    }
+}
+
+
+
+

generate_impl

+
+

Source: generate_impl.rs

+
+
+

Adds a new inherent impl for a type.

+
+
+
Before
+
+
1
+2
+3
+
struct Ctx<T: Clone> {
+    data: T,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
struct Ctx<T: Clone> {
+    data: T,
+}
+
+impl<T: Clone> Ctx<T> {
+    
+}
+
+
+
+

generate_is_empty_from_len

+ +
+

Generates is_empty implementation from the len method.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
struct MyStruct { data: Vec<String> }
+
+impl MyStruct {
+    #[must_use]
+    pub fn len(&self) -> usize {
+        self.data.len()
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+
struct MyStruct { data: Vec<String> }
+
+impl MyStruct {
+    #[must_use]
+    pub fn len(&self) -> usize {
+        self.data.len()
+    }
+
+    #[must_use]
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+}
+
+
+
+

generate_new

+
+

Source: generate_new.rs

+
+
+

Adds a fn new for a type.

+
+
+
Before
+
+
1
+2
+3
+
struct Ctx<T: Clone> {
+     data: T,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
struct Ctx<T: Clone> {
+     data: T,
+}
+
+impl<T: Clone> Ctx<T> {
+    fn new(data: T) -> Self { Self { data } }
+}
+
+
+
+

generate_setter

+ +
+

Generate a setter method.

+
+
+
Before
+
+
1
+2
+3
+
struct Person {
+    name: String,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct Person {
+    name: String,
+}
+
+impl Person {
+    fn set_name(&mut self, name: String) {
+        self.name = name;
+    }
+}
+
+
+
+

generate_trait_from_impl

+ +
+

Generate trait for an already defined inherent impl and convert impl to a trait impl.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+
struct Foo<const N: usize>([i32; N]);
+
+macro_rules! const_maker {
+    ($t:ty, $v:tt) => {
+        const CONST: $t = $v;
+    };
+}
+
+impl<const N: usize> Foo<N> {
+    // Used as an associated constant.
+    const CONST_ASSOC: usize = N * 4;
+
+    fn create() -> Option<()> {
+        Some(())
+    }
+
+    const_maker! {i32, 7}
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+
struct Foo<const N: usize>([i32; N]);
+
+macro_rules! const_maker {
+    ($t:ty, $v:tt) => {
+        const CONST: $t = $v;
+    };
+}
+
+trait ${0:TraitName}<const N: usize> {
+    // Used as an associated constant.
+    const CONST_ASSOC: usize = N * 4;
+
+    fn create() -> Option<()>;
+
+    const_maker! {i32, 7}
+}
+
+impl<const N: usize> ${0:TraitName}<N> for Foo<N> {
+    // Used as an associated constant.
+    const CONST_ASSOC: usize = N * 4;
+
+    fn create() -> Option<()> {
+        Some(())
+    }
+
+    const_maker! {i32, 7}
+}
+
+
+
+

generate_trait_impl

+
+

Source: generate_impl.rs

+
+
+

Adds a new trait impl for a type.

+
+
+
Before
+
+
1
+2
+3
+
struct Ctx<T: Clone> {
+    data: T,
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
struct Ctx<T: Clone> {
+    data: T,
+}
+
+impl<T: Clone>  for Ctx<T> {
+
+}
+
+
+
+

inline_call

+
+

Source: inline_call.rs

+
+
+

Inlines a function or method body creating a let statement per parameter unless the parameter +can be inlined. The parameter will be inlined either if it the supplied argument is a simple local +or if the parameter is only accessed inside the function body once.

+
+
+
Before
+
+
1
+2
+3
+
fn foo(name: Option<&str>) {
+    let name = name.unwrap();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn foo(name: Option<&str>) {
+    let name = match name {
+            Some(val) => val,
+            None => panic!("called `Option::unwrap()` on a `None` value"),
+        };
+}
+
+
+
+

inline_const_as_literal

+ +
+

Evaluate and inline const variable as literal.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
const STRING: &str = "Hello, World!";
+
+fn something() -> &'static str {
+    STRING
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
const STRING: &str = "Hello, World!";
+
+fn something() -> &'static str {
+    "Hello, World!"
+}
+
+
+
+

inline_into_callers

+
+

Source: inline_call.rs

+
+
+

Inline a function or method body into all of its callers where possible, creating a let statement per parameter +unless the parameter can be inlined. The parameter will be inlined either if it the supplied argument is a simple local +or if the parameter is only accessed inside the function body once. +If all calls can be inlined the function will be removed.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
fn print(_: &str) {}
+fn foo(word: &str) {
+    if !word.is_empty() {
+        print(word);
+    }
+}
+fn bar() {
+    foo("안녕하세요");
+    foo("여러분");
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+
fn print(_: &str) {}
+
+fn bar() {
+    {
+        let word = "안녕하세요";
+        if !word.is_empty() {
+            print(word);
+        }
+    };
+    {
+        let word = "여러분";
+        if !word.is_empty() {
+            print(word);
+        }
+    };
+}
+
+
+
+

inline_local_variable

+ +
+

Inlines a local variable.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn main() {
+    let x = 1 + 2;
+    x * 4;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    (1 + 2) * 4;
+}
+
+
+
+

inline_macro

+
+

Source: inline_macro.rs

+
+
+

Takes a macro and inlines it one step.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
macro_rules! num {
+    (+$($t:tt)+) => (1 + num!($($t )+));
+    (-$($t:tt)+) => (-1 + num!($($t )+));
+    (+) => (1);
+    (-) => (-1);
+}
+
+fn main() {
+    let number = num!(+ + + - + +);
+    println!("{number}");
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
macro_rules! num {
+    (+$($t:tt)+) => (1 + num!($($t )+));
+    (-$($t:tt)+) => (-1 + num!($($t )+));
+    (+) => (1);
+    (-) => (-1);
+}
+
+fn main() {
+    let number = 1+num!(+ + - + +);
+    println!("{number}");
+}
+
+
+
+

inline_type_alias

+ +
+

Replace a type alias with its concrete type.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
type A<T = u32> = Vec<T>;
+
+fn main() {
+    let a: A;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
type A<T = u32> = Vec<T>;
+
+fn main() {
+    let a: Vec<u32>;
+}
+
+
+
+

inline_type_alias_uses

+ +
+

Inline a type alias into all of its uses where possible.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
type A = i32;
+fn id(x: A) -> A {
+    x
+};
+fn foo() {
+    let _: A = 3;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
+fn id(x: i32) -> i32 {
+    x
+};
+fn foo() {
+    let _: i32 = 3;
+}
+
+
+
+

into_to_qualified_from

+ +
+

Convert an into method call to a fully qualified from call.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
//- minicore: from
+struct B;
+impl From<i32> for B {
+    fn from(a: i32) -> Self {
+       B
+    }
+}
+
+fn main() -> () {
+    let a = 3;
+    let b: B = a.into();
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
struct B;
+impl From<i32> for B {
+    fn from(a: i32) -> Self {
+       B
+    }
+}
+
+fn main() -> () {
+    let a = 3;
+    let b: B = B::from(a);
+}
+
+
+
+

introduce_named_generic

+ +
+

Replaces impl Trait function argument with the named generic.

+
+
+
Before
+
+
1
+
fn foo(bar: impl Bar) {}
+
+
+
+
+
After
+
+
1
+
fn foo<B: Bar>(bar: B) {}
+
+
+
+

introduce_named_lifetime

+ +
+

Change an anonymous lifetime to a named lifetime.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
impl Cursor<'_> {
+    fn node(self) -> &SyntaxNode {
+        match self {
+            Cursor::Replace(node) | Cursor::Before(node) => node,
+        }
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
impl<'a> Cursor<'a> {
+    fn node(self) -> &SyntaxNode {
+        match self {
+            Cursor::Replace(node) | Cursor::Before(node) => node,
+        }
+    }
+}
+
+
+
+

invert_if

+
+

Source: invert_if.rs

+
+
+

This transforms if expressions of the form if !x {A} else {B} into if x {B} else {A} +This also works with !=. This assist can only be applied with the cursor on if.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    if !y { A } else { B }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    if y { B } else { A }
+}
+
+
+
+

line_to_block

+ +
+

Converts comments between block and single-line form.

+
+
+
Before
+
+
1
+2
+
   // Multi-line┃
+   // comment
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
  /*
+  Multi-line
+  comment
+  */
+
+
+
+

make_raw_string

+
+

Source: raw_string.rs

+
+
+

Adds r# to a plain string literal.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    "Hello,┃ World!";
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    r#"Hello, World!"#;
+}
+
+
+
+

make_usual_string

+
+

Source: raw_string.rs

+
+
+

Turns a raw string into a plain string.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    r#"Hello,┃ "World!""#;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    "Hello, \"World!\"";
+}
+
+
+
+

merge_imports

+
+

Source: merge_imports.rs

+
+
+

Merges two imports with a common prefix.

+
+
+
Before
+
+
1
+2
+
use std::fmt::Formatter;
+use std::io;
+
+
+
+
+
After
+
+
1
+
use std::{fmt::Formatter, io};
+
+
+
+

merge_match_arms

+ +
+

Merges the current match arm with the following if their bodies are identical.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move(..) => foo(),
+        Action::Stop => foo(),
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move(..) | Action::Stop => foo(),
+    }
+}
+
+
+
+

move_arm_cond_to_match_guard

+
+

Source: move_guard.rs

+
+
+

Moves if expression from match arm body into a guard.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } => if distance > 10 { foo() },
+        _ => (),
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } if distance > 10 => foo(),
+        _ => (),
+    }
+}
+
+
+
+

move_bounds_to_where_clause

+
+

Source: move_bounds.rs

+
+
+

Moves inline type bounds to a where clause.

+
+
+
Before
+
+
1
+2
+3
+
fn apply<T, U, F: FnOnce(T) -> U>(f: F, x: T) -> U {
+    f(x)
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn apply<T, U, F>(f: F, x: T) -> U where F: FnOnce(T) -> U {
+    f(x)
+}
+
+
+
+

move_const_to_impl

+ +
+

Move a local constant item in a method to impl’s associated constant. All the references will be +qualified with Self::.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct S;
+impl S {
+    fn foo() -> usize {
+        /// The answer.
+        const C: usize = 42;
+
+        C * C
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
struct S;
+impl S {
+    /// The answer.
+    const C: usize = 42;
+
+    fn foo() -> usize {
+        Self::C * Self::C
+    }
+}
+
+
+
+

move_from_mod_rs

+ +
+

Moves xxx/mod.rs to xxx.rs.

+
+
+
Before
+
+
1
+2
+3
+4
+
//- /main.rs
+mod a;
+//- /a/mod.rs
+fn t() {}
+
+
+
+
+
After
+
+
1
+
fn t() {}
+
+
+
+

move_guard_to_arm_body

+
+

Source: move_guard.rs

+
+
+

Moves match guard into match arm body.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } if distance > 10 => foo(),
+        _ => (),
+    }
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } => if distance > 10 {
+            foo()
+        },
+        _ => (),
+    }
+}
+
+
+
+

move_module_to_file

+ +
+

Moves inline module’s contents to a separate file.

+
+
+
Before
+
+
1
+2
+3
+
mod foo {
+    fn t() {}
+}
+
+
+
+
+
After
+
+
1
+
mod foo;
+
+
+
+

move_to_mod_rs

+
+

Source: move_to_mod_rs.rs

+
+
+

Moves xxx.rs to xxx/mod.rs.

+
+
+
Before
+
+
1
+2
+3
+4
+
//- /main.rs
+mod a;
+//- /a.rs
+fn t() {}
+
+
+
+
+
After
+
+
1
+
fn t() {}
+
+
+
+

promote_local_to_const

+ +
+

Promotes a local variable to a const item changing its name to a SCREAMING_SNAKE_CASE variant +if the local uses no non-const expressions.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
fn main() {
+    let foo = true;
+
+    if foo {
+        println!("It's true");
+    } else {
+        println!("It's false");
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
fn main() {
+    const FOO: bool = true;
+
+    if FOO {
+        println!("It's true");
+    } else {
+        println!("It's false");
+    }
+}
+
+
+
+

pull_assignment_up

+ +
+

Extracts variable assignment to outside an if or match statement.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
fn main() {
+    let mut foo = 6;
+
+    if true {
+        foo = 5;
+    } else {
+        foo = 4;
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
fn main() {
+    let mut foo = 6;
+
+    foo = if true {
+        5
+    } else {
+        4
+    };
+}
+
+
+
+

qualify_method_call

+ +
+

Replaces the method call with a qualified function call.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
struct Foo;
+impl Foo {
+    fn foo(&self) {}
+}
+fn main() {
+    let foo = Foo;
+    foo.foo();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
struct Foo;
+impl Foo {
+    fn foo(&self) {}
+}
+fn main() {
+    let foo = Foo;
+    Foo::foo(&foo);
+}
+
+
+
+

qualify_path

+
+

Source: qualify_path.rs

+
+
+

If the name is unresolved, provides all possible qualified paths for it.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let map = HashMap::new();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    let map = std::collections::HashMap::new();
+}
+
+
+
+

reformat_number_literal

+ +
+

Adds or removes separators from integer literal.

+
+
+
Before
+
+
1
+
const _: i32 = 1012345;
+
+
+
+
+
After
+
+
1
+
const _: i32 = 1_012_345;
+
+
+
+

remove_dbg

+
+

Source: remove_dbg.rs

+
+
+

Removes dbg!() macro call.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let x = dbg!(42 * dbg!(4 + 2));
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    let x = 42 * (4 + 2);
+}
+
+
+
+

remove_hash

+
+

Source: raw_string.rs

+
+
+

Removes a hash from a raw string literal.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    r#"Hello,┃ World!"#;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    r"Hello, World!";
+}
+
+
+
+

remove_mut

+
+

Source: remove_mut.rs

+
+
+

Removes the mut keyword.

+
+
+
Before
+
+
1
+2
+3
+
impl Walrus {
+    fn feed(&mut self, amount: u32) {}
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
impl Walrus {
+    fn feed(&self, amount: u32) {}
+}
+
+
+
+

remove_parentheses

+ +
+

Removes redundant parentheses.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    _ = (2) + 2;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    _ = 2 + 2;
+}
+
+
+
+

remove_unused_imports

+ +
+

Removes any use statements in the current selection that are unused.

+
+
+
Before
+
+
1
+2
+3
+4
+
struct X();
+mod foo {
+    use super::X;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
struct X();
+mod foo {
+}
+
+
+
+

remove_unused_param

+ +
+

Removes unused function parameter.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
fn frobnicate(x: i32) {}
+
+fn main() {
+    frobnicate(92);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
fn frobnicate() {}
+
+fn main() {
+    frobnicate();
+}
+
+
+
+

reorder_fields

+
+

Source: reorder_fields.rs

+
+
+

Reorder the fields of record literals and record patterns in the same order as in +the definition.

+
+
+
Before
+
+
1
+2
+
struct Foo {foo: i32, bar: i32};
+const test: Foo = Foo {bar: 0, foo: 1}
+
+
+
+
+
After
+
+
1
+2
+
struct Foo {foo: i32, bar: i32};
+const test: Foo = Foo {foo: 1, bar: 0}
+
+
+
+

reorder_impl_items

+ +
+

Reorder the items of an impl Trait. The items will be ordered +in the same order as in the trait definition.

+
+
+
Before
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
trait Foo {
+    type A;
+    const B: u8;
+    fn c();
+}
+
+struct Bar;
+impl Foo for Bar {
+    const B: u8 = 17;
+    fn c() {}
+    type A = String;
+}
+
+
+
+
+
After
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
trait Foo {
+    type A;
+    const B: u8;
+    fn c();
+}
+
+struct Bar;
+impl Foo for Bar {
+    type A = String;
+    const B: u8 = 17;
+    fn c() {}
+}
+
+
+
+

replace_arith_with_checked

+ +
+

Replaces arithmetic on integers with the checked_* equivalent.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+  let x = 1 + 2;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+  let x = 1.checked_add(2);
+}
+
+
+
+

replace_arith_with_saturating

+ +
+

Replaces arithmetic on integers with the saturating_* equivalent.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+  let x = 1 + 2;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+  let x = 1.saturating_add(2);
+}
+
+
+
+

replace_arith_with_wrapping

+ +
+

Replaces arithmetic on integers with the wrapping_* equivalent.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+  let x = 1 + 2;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+  let x = 1.wrapping_add(2);
+}
+
+
+
+

replace_char_with_string

+ +
+

Replace a char literal with a string literal.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    find('{┃');
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    find("{");
+}
+
+
+
+

replace_derive_with_manual_impl

+ +
+

Converts a derive impl into a manual one.

+
+
+
Before
+
+
1
+2
+
#[derive(Debug, Display)]
+struct S;
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
#[derive(Display)]
+struct S;
+
+impl Debug for S {
+    fn fmt(&self, f: &mut Formatter) -> Result<()> {
+        f.debug_struct("S").finish()
+    }
+}
+
+
+
+

replace_if_let_with_match

+ +
+

Replaces a if let expression with a match expression.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    if let Action::Move { distance } = action {
+        foo(distance)
+    } else {
+        bar()
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } => foo(distance),
+        _ => bar(),
+    }
+}
+
+
+
+

replace_is_some_with_if_let_some

+ +
+

Replace if x.is_some() with if let Some(_tmp) = x or if x.is_ok() with if let Ok(_tmp) = x.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn main() {
+    let x = Some(1);
+    if x.is_some() {}
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn main() {
+    let x = Some(1);
+    if let Some(${0:_tmp}) = x {}
+}
+
+
+
+

replace_let_with_if_let

+ +
+

Replaces let with an if let.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+
+fn main(action: Action) {
+    let x = compute();
+}
+
+fn compute() -> Option<i32> { None }
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+
+fn main(action: Action) {
+    if let Some(x) = compute() {
+    }
+}
+
+fn compute() -> Option<i32> { None }
+
+
+
+

replace_match_with_if_let

+ +
+

Replaces a binary match with a wildcard pattern and no guards with an if let expression.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move { distance } => foo(distance),
+        _ => bar(),
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    if let Action::Move { distance } = action {
+        foo(distance)
+    } else {
+        bar()
+    }
+}
+
+
+
+

replace_named_generic_with_impl

+ +
+

Replaces named generic with an impl Trait in function argument.

+
+
+
Before
+
+
1
+
fn new<P: AsRef<Path>>(location: P) -> Self {}
+
+
+
+
+
After
+
+
1
+
fn new(location: impl AsRef<Path>) -> Self {}
+
+
+
+

replace_qualified_name_with_use

+ +
+

Adds a use statement for a given fully-qualified name.

+
+
+
Before
+
+
1
+
fn process(map: std::collections::HashMap<String, String>) {}
+
+
+
+
+
After
+
+
1
+2
+3
+
use std::collections::HashMap;
+
+fn process(map: HashMap<String, String>) {}
+
+
+
+

replace_string_with_char

+ +
+

Replace string literal with char literal.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    find("{┃");
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    find('{');
+}
+
+
+
+

replace_try_expr_with_match

+ +
+

Replaces a try expression with a match expression.

+
+
+
Before
+
+
1
+2
+3
+
fn handle() {
+    let pat = Some(true)?;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+
fn handle() {
+    let pat = match Some(true) {
+        Some(it) => it,
+        None => return None,
+    };
+}
+
+
+
+

replace_turbofish_with_explicit_type

+ +
+

Converts ::<_> to an explicit type assignment.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn make<T>() -> T { ) }
+fn main() {
+    let a = make::<i32>();
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn make<T>() -> T { ) }
+fn main() {
+    let a: i32 = make();
+}
+
+
+
+

replace_with_eager_method

+ +
+

Replace unwrap_or_else with unwrap_or and ok_or_else with ok_or.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn foo() {
+    let a = Some(1);
+    a.unwrap_or_else(|| 2);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn foo() {
+    let a = Some(1);
+    a.unwrap_or(2);
+}
+
+
+
+

replace_with_lazy_method

+ +
+

Replace unwrap_or with unwrap_or_else and ok_or with ok_or_else.

+
+
+
Before
+
+
1
+2
+3
+4
+
fn foo() {
+    let a = Some(1);
+    a.unwrap_or(2);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn foo() {
+    let a = Some(1);
+    a.unwrap_or_else(|| 2);
+}
+
+
+
+

sort_items

+
+

Source: sort_items.rs

+
+
+

Sorts item members alphabetically: fields, enum variants and methods.

+
+
+
Before
+
+
1
+
struct Foo { second: u32, first: String }
+
+
+
+
+
After
+
+
1
+
struct Foo { first: String, second: u32 }
+
+
+
+
+
+
Before
+
+
1
+2
+3
+4
+
trait Bar {
+    fn second(&self) -> u32;
+    fn first(&self) -> String;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
trait Bar {
+    fn first(&self) -> String;
+    fn second(&self) -> u32;
+}
+
+
+
+
+
+
Before
+
+
1
+2
+3
+4
+5
+
struct Baz;
+impl Baz {
+    fn second(&self) -> u32;
+    fn first(&self) -> String;
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
struct Baz;
+impl Baz {
+    fn first(&self) -> String;
+    fn second(&self) -> u32;
+}
+
+
+
+
+
+

There is a difference between sorting enum variants:

+
+
+
Before
+
+
1
+2
+3
+4
+
enum Animal {
+  Dog(String, f64),
+  Cat { weight: f64, name: String },
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
enum Animal {
+  Cat { weight: f64, name: String },
+  Dog(String, f64),
+}
+
+
+
+
+

and sorting a single enum struct variant:

+
+
+
Before
+
+
1
+2
+3
+4
+
enum Animal {
+  Dog(String, f64),
+  Cat { weight: f64, name: String },
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
enum Animal {
+  Dog(String, f64),
+  Cat { name: String, weight: f64 },
+}
+
+
+
+

split_import

+
+

Source: split_import.rs

+
+
+

Wraps the tail of import into braces.

+
+
+
Before
+
+
1
+
use std::collections::HashMap;
+
+
+
+
+
After
+
+
1
+
use std::{collections::HashMap};
+
+
+
+

toggle_ignore

+
+

Source: toggle_ignore.rs

+
+
+

Adds #[ignore] attribute to the test.

+
+
+
Before
+
+
1
+2
+3
+4
+
#[test]
+fn arithmetics {
+    assert_eq!(2 + 2, 5);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+
#[test]
+#[ignore]
+fn arithmetics {
+    assert_eq!(2 + 2, 5);
+}
+
+
+
+

unmerge_match_arm

+ +
+

Splits the current match with a | pattern into two arms with identical bodies.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+6
+7
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move(..) | Action::Stop => foo(),
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+    match action {
+        Action::Move(..) => foo(),
+        Action::Stop => foo(),
+    }
+}
+
+
+
+

unmerge_use

+
+

Source: unmerge_use.rs

+
+
+

Extracts single use item from use list.

+
+
+
Before
+
+
1
+
use std::fmt::{Debug, Display};
+
+
+
+
+
After
+
+
1
+2
+
use std::fmt::{Debug};
+use std::fmt::Display;
+
+
+
+

unnecessary_async

+ +
+

Removes the async mark from functions which have no .await in their body. +Looks for calls to the functions and removes the .await on the call site.

+
+
+
Before
+
+
1
+2
+
pub async fn foo() {}
+pub async fn bar() { foo().await }
+
+
+
+
+
After
+
+
1
+2
+
pub fn foo() {}
+pub async fn bar() { foo() }
+
+
+
+

unqualify_method_call

+ +
+

Transforms universal function call syntax into a method call.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    std::ops::Add::add(1, 2);
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn main() {
+    1.add(2);
+}
+
+
+
+

unwrap_block

+
+

Source: unwrap_block.rs

+
+
+

This assist removes if…​else, for, while and loop control statements to just keep the body.

+
+
+
Before
+
+
1
+2
+3
+4
+5
+
fn foo() {
+    if true {
+        println!("foo");
+    }
+}
+
+
+
+
+
After
+
+
1
+2
+3
+
fn foo() {
+    println!("foo");
+}
+
+
+
+

unwrap_result_return_type

+ +
+

Unwrap the function’s return type.

+
+
+
Before
+
+
1
+
fn foo() -> Result<i32> { Ok(42i32) }
+
+
+
+
+
After
+
+
1
+
fn foo() -> i32 { 42i32 }
+
+
+
+

unwrap_tuple

+
+

Source: unwrap_tuple.rs

+
+
+

Unwrap the tuple to different variables.

+
+
+
Before
+
+
1
+2
+3
+
fn main() {
+    let (foo, bar) = ("Foo", "Bar");
+}
+
+
+
+
+
After
+
+
1
+2
+3
+4
+
fn main() {
+    let foo = "Foo";
+    let bar = "Bar";
+}
+
+
+
+

wrap_return_type_in_result

+ +
+

Wrap the function’s return type into Result.

+
+
+
Before
+
+
1
+
fn foo() -> i32 { 42i32 }
+
+
+
+
+
After
+
+
1
+
fn foo() -> Result<i32, ${0:_}> { Ok(42i32) }
+
+
+
+
+
+
+

Diagnostics

+
+
+

While most errors and warnings provided by rust-analyzer come from the cargo check integration, there’s a growing number of diagnostics implemented using rust-analyzer’s own analysis. +Some of these diagnostics don’t respect #[allow] or \#[deny] attributes yet, but can be turned off using the rust-analyzer.diagnostics.enable, rust-analyzer.diagnostics.experimental.enable or rust-analyzer.diagnostics.disabled settings.

+
+
+

Clippy

+
+

To run cargo clippy instead of cargo check, you can set "rust-analyzer.check.command": "clippy".

+
+
+
+

break-outside-of-loop

+ +
+

This diagnostic is triggered if the break keyword is used outside of a loop.

+
+
+
+

expected-function

+ +
+

This diagnostic is triggered if a call is made on something that is not callable.

+
+
+
+

inactive-code

+
+

Source: inactive_code.rs

+
+
+

This diagnostic is shown for code with inactive #[cfg] attributes.

+
+
+
+

incoherent-impl

+
+

Source: incoherent_impl.rs

+
+
+

This diagnostic is triggered if the targe type of an impl is from a foreign crate.

+
+
+
+

incorrect-ident-case

+
+

Source: incorrect_case.rs

+
+
+

This diagnostic is triggered if an item name doesn’t follow Rust naming convention.

+
+
+
+

invalid-derive-target

+ +
+

This diagnostic is shown when the derive attribute is used on an item other than a struct, +enum or union.

+
+
+
+

macro-error

+
+

Source: macro_error.rs

+
+
+

This diagnostic is shown for macro expansion errors.

+
+
+
+

macro-error

+
+

Source: macro_error.rs

+
+
+

This diagnostic is shown for macro expansion errors.

+
+
+
+

malformed-derive

+ +
+

This diagnostic is shown when the derive attribute has invalid input.

+
+
+
+

mismatched-arg-count

+ +
+

This diagnostic is triggered if a function is invoked with an incorrect amount of arguments.

+
+
+
+

mismatched-tuple-struct-pat-arg-count

+ +
+

This diagnostic is triggered if a function is invoked with an incorrect amount of arguments.

+
+
+
+

missing-fields

+
+

Source: missing_fields.rs

+
+
+

This diagnostic is triggered if record lacks some fields that exist in the corresponding structure.

+
+
+

Example:

+
+
+
+
1
+2
+3
+
struct A { a: u8, b: u8 }
+
+let a = A { a: 10 };
+
+
+
+
+
+

missing-match-arm

+ +
+

This diagnostic is triggered if match block is missing one or more match arms.

+
+
+
+

missing-unsafe

+
+

Source: missing_unsafe.rs

+
+
+

This diagnostic is triggered if an operation marked as unsafe is used outside of an unsafe function or block.

+
+
+
+

moved-out-of-ref

+ +
+

This diagnostic is triggered on moving non copy things out of references.

+
+
+
+

need-mut

+ +
+

This diagnostic is triggered on mutating an immutable variable.

+
+
+
+

no-such-field

+
+

Source: no_such_field.rs

+
+
+

This diagnostic is triggered if created structure does not have field provided in record.

+
+
+
+

private-assoc-item

+ +
+

This diagnostic is triggered if the referenced associated item is not visible from the current +module.

+
+
+
+

private-field

+
+

Source: private_field.rs

+
+
+

This diagnostic is triggered if the accessed field is not visible from the current module.

+
+
+
+

replace-filter-map-next-with-find-map

+ +
+

This diagnostic is triggered when .filter_map(..).next() is used, rather than the more concise .find_map(..).

+
+
+
+

type-mismatch

+
+

Source: type_mismatch.rs

+
+
+

This diagnostic is triggered when the type of an expression or pattern does not match +the expected type.

+
+
+
+

typed-hole

+
+

Source: typed_hole.rs

+
+
+

This diagnostic is triggered when an underscore expression is used in an invalid position.

+
+
+
+

undeclared-label

+ +
+
+

unimplemented-builtin-macro

+ +
+

This diagnostic is shown for builtin macros which are not yet implemented by rust-analyzer

+
+
+
+

unlinked-file

+
+

Source: unlinked_file.rs

+
+
+

This diagnostic is shown for files that are not included in any crate, or files that are part of +crates rust-analyzer failed to discover. The file will not have IDE features available.

+
+
+
+

unnecessary-braces

+
+

Source: useless_braces.rs

+
+
+

Diagnostic for unnecessary braces in use items.

+
+
+
+

unreachable-label

+ +
+
+

unresolved-extern-crate

+ +
+

This diagnostic is triggered if rust-analyzer is unable to discover referred extern crate.

+
+
+
+

unresolved-field

+ +
+

This diagnostic is triggered if a field does not exist on a given type.

+
+
+
+

unresolved-import

+ +
+

This diagnostic is triggered if rust-analyzer is unable to resolve a path in +a use declaration.

+
+
+
+

unresolved-macro-call

+ +
+

This diagnostic is triggered if rust-analyzer is unable to resolve the path +to a macro in a macro invocation.

+
+
+
+

unresolved-method

+ +
+

This diagnostic is triggered if a method does not exist on a given type.

+
+
+
+

unresolved-module

+ +
+

This diagnostic is triggered if rust-analyzer is unable to discover referred module.

+
+
+
+

unresolved-proc-macro

+ +
+

This diagnostic is shown when a procedural macro can not be found. This usually means that +procedural macro support is simply disabled (and hence is only a weak hint instead of an error), +but can also indicate project setup problems.

+
+
+

If you are seeing a lot of "proc macro not expanded" warnings, you can add this option to the +rust-analyzer.diagnostics.disabled list to prevent them from showing. Alternatively you can +enable support for procedural macros (see rust-analyzer.procMacro.attributes.enable).

+
+
+
+

unused-mut

+ +
+

This diagnostic is triggered when a mutable variable isn’t actually mutated.

+
+
+
+

unused-variables

+ +
+

This diagnostic is triggered when a local variable is not used.

+
+
+
+
+
+

Editor Features

+
+
+

VS Code

+
+

Color configurations

+
+

It is possible to change the foreground/background color and font family/size of inlay hints. +Just add this to your settings.json:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+
{
+  "editor.inlayHints.fontFamily": "Courier New",
+  "editor.inlayHints.fontSize": 11,
+
+  "workbench.colorCustomizations": {
+    // Name of the theme you are currently using
+    "[Default Dark+]": {
+      "editorInlayHint.foreground": "#868686f0",
+      "editorInlayHint.background": "#3d3d3d48",
+
+      // Overrides for specific kinds of inlay hints
+      "editorInlayHint.typeForeground": "#fdb6fdf0",
+      "editorInlayHint.parameterForeground": "#fdb6fdf0",
+    }
+  }
+}
+
+
+
+
+
+

Semantic style customizations

+
+

You can customize the look of different semantic elements in the source code. +For example, mutable bindings are underlined by default and you can override this behavior by adding the following section to your settings.json:

+
+
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
{
+  "editor.semanticTokenColorCustomizations": {
+    "rules": {
+      "*.mutable": {
+        "fontStyle": "", // underline is the default
+      },
+    }
+  },
+}
+
+
+
+
+

Most themes doesn’t support styling unsafe operations differently yet. You can fix this by adding overrides for the rules operator.unsafe, function.unsafe, and method.unsafe:

+
+
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+
{
+   "editor.semanticTokenColorCustomizations": {
+         "rules": {
+             "operator.unsafe": "#ff6600",
+             "function.unsafe": "#ff6600",
+             "method.unsafe": "#ff6600"
+         }
+    },
+}
+
+
+
+
+

In addition to the top-level rules you can specify overrides for specific themes. For example, if you wanted to use a darker text color on a specific light theme, you might write:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
{
+   "editor.semanticTokenColorCustomizations": {
+         "rules": {
+             "operator.unsafe": "#ff6600"
+         },
+         "[Ayu Light]": {
+            "rules": {
+               "operator.unsafe": "#572300"
+            }
+         }
+    },
+}
+
+
+
+
+

Make sure you include the brackets around the theme name. For example, use "[Ayu Light]" to customize the theme Ayu Light.

+
+
+
+

Special when clause context for keybindings.

+
+

You may use inRustProject context to configure keybindings for rust projects only. +For example:

+
+
+
+
1
+2
+3
+4
+5
+
{
+  "key": "ctrl+alt+d",
+  "command": "rust-analyzer.openDocs",
+  "when": "inRustProject"
+}
+
+
+
+
+

More about when clause contexts here.

+
+
+
+

Setting runnable environment variables

+
+

You can use "rust-analyzer.runnables.extraEnv" setting to define runnable environment-specific substitution variables. +The simplest way for all runnables in a bunch:

+
+
+
+
1
+2
+3
+
"rust-analyzer.runnables.extraEnv": {
+    "RUN_SLOW_TESTS": "1"
+}
+
+
+
+
+

Or it is possible to specify vars more granularly:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
"rust-analyzer.runnables.extraEnv": [
+    {
+        // "mask": null, // null mask means that this rule will be applied for all runnables
+        env: {
+             "APP_ID": "1",
+             "APP_DATA": "asdf"
+        }
+    },
+    {
+        "mask": "test_name",
+        "env": {
+             "APP_ID": "2", // overwrites only APP_ID
+        }
+    }
+]
+
+
+
+
+

You can use any valid regular expression as a mask. +Also note that a full runnable name is something like run bin_or_example_name, test some::mod::test_name or test-mod some::mod, so it is possible to distinguish binaries, single tests, and test modules with this masks: "^run", "^test " (the trailing space matters!), and "^test-mod" respectively.

+
+
+

If needed, you can set different values for different platforms:

+
+
+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+
"rust-analyzer.runnables.extraEnv": [
+    {
+        "platform": "win32", // windows only
+        env: {
+             "APP_DATA": "windows specific data"
+        }
+    },
+    {
+        "platform": ["linux"],
+        "env": {
+             "APP_DATA": "linux data",
+        }
+    },
+    { // for all platforms
+        "env": {
+             "APP_COMMON_DATA": "xxx",
+        }
+    }
+]
+
+
+
+
+
+

Compiler feedback from external commands

+
+

Instead of relying on the built-in cargo check, you can configure Code to run a command in the background and use the $rustc-watch problem matcher to generate inline error markers from its output.

+
+
+

To do this you need to create a new VS Code Task and set "rust-analyzer.checkOnSave": false in preferences.

+
+
+

For example, if you want to run cargo watch instead, you might add the following to .vscode/tasks.json:

+
+
+
+
1
+2
+3
+4
+5
+6
+7
+8
+
{
+    "label": "Watch",
+    "group": "build",
+    "type": "shell",
+    "command": "cargo watch",
+    "problemMatcher": "$rustc-watch",
+    "isBackground": true
+}
+
+
+
+
+
+

Live Share

+
+

VS Code Live Share has partial support for rust-analyzer.

+
+
+

Live Share requires the official Microsoft build of VS Code, OSS builds will not work correctly.

+
+
+

The host’s rust-analyzer instance will be shared with all guests joining the session. +The guests do not have to have the rust-analyzer extension installed for this to work.

+
+
+

If you are joining a Live Share session and do have rust-analyzer installed locally, commands from the command palette will not work correctly since they will attempt to communicate with the local server.

+
+
+
+
+
+
+ +
+ + + + + diff --git a/redirects.json b/redirects.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/redirects.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/thisweek.html b/thisweek.html new file mode 100644 index 00000000..3605ca95 --- /dev/null +++ b/thisweek.html @@ -0,0 +1,1109 @@ + + + + + + + + + + rust-analyzer + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+

This Week In rust-analyzer

+ + + +
+ + + + + diff --git a/thisweek/2019/07/24/changelog-0.html b/thisweek/2019/07/24/changelog-0.html new file mode 100644 index 00000000..06ffdd77 --- /dev/null +++ b/thisweek/2019/07/24/changelog-0.html @@ -0,0 +1,189 @@ + + + + + + + + + + Changelog #0 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #0

+ +
+
+
+

Hello!

+
+
+

This is the first instance of a monthly changelog for rust-analyzer. Notable +changes since last month include:

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #1558 initial support for .await syntax.

    +
    +
      +
    • +

      #1512 type inference for ?.

      +
    • +
    • +

      #1472 completion for type aliases.

      +
    • +
    • +

      #1544, #1550 mutable variables are underlined.

      +
    • +
    • +

      #1476 add_impl_members adds types.

      +
    • +
    • +

      #1478, #1499 sumbodules with raw names and #[path] are resolved.

      +
    • +
    • +

      #1496 correctly add obligations in function methods.

      +
    • +
    • +

      #1501 initial type inference for for loops.

      +
    • +
    • +

      #1515 use bounds on generic parameters during type inference.

      +
    • +
    • +

      #1525, #1572 completions works for fields of enum variants and in patterns.

      +
    • +
    • +

      #1582 show types of local variables in completion.

      +
    • +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #1511 make goto definition work with various Vim clients.

    +
  • +
  • +

    #1494 diagnostics are collected for a single file.

    +
  • +
  • +

    #1536 show code lens for fn main.

    +
  • +
  • +

    #1514 fix discovery of lang items.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #1575 s the lexer with rustc.

    +
  • +
  • +

    #1545 migrate to the new version of rowan library, improving memory usage of syntax trees for 60%.

    +
  • +
  • +

    #1532 pick up floundering work from chalk.

    +
  • +
  • +

    Many improvements and cleanups by @kjeremy.

    +
  • +
+
+
+

The highlight of the month is probably #1575. +The end-game for rust-analyzer is to become a different front-end for the code that rustc itself uses. +This pull request is the first step on this path: now, rust-analyzer and rustc use the same code for lexing Rust.

+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2019/12/04/changelog-1.html b/thisweek/2019/12/04/changelog-1.html new file mode 100644 index 00000000..97cd9cef --- /dev/null +++ b/thisweek/2019/12/04/changelog-1.html @@ -0,0 +1,156 @@ + + + + + + + + + + Changelog #1 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #1

+ +
+
+
+

Commit: c6e4cad

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #2388 added a more informative message for missing fields diagnostics.

    +
  • +
  • +

    #2445 added type inference for range expressions.

    +
  • +
  • +

    #2018 adds an initial version of add custom impl assist, which switches from a #[derive] to a manual impl.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    Update chalk to fix infinite memory usage in some cases.

    +
  • +
  • +

    #2406 slightly better hygiene handling in macros.

    +
  • +
  • +

    #2453 employed salsa’s cycle-handling functionality to gracefully handle some error conditions instead of panicking.

    +
  • +
  • +

    #2455 add required special-casing for name-resolution of primitive types.

    +
  • +
  • +

    #2463 fixed method resolution order.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    Extract hir_ty crate.

    +
  • +
  • +

    Separate compiler-internal hir_ty::Ty from IDE-visible hir::Type. +This should allow more flexible evolution of type representation.

    +
  • +
  • +

    Rename "the IDE" crate from ra_ide_api to ra_ide: at 14k lines, it has much more stuff than just an API.

    +
  • +
  • +

    A lot of assorted refactorings in the type inference area.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2019/12/09/changelog-2.html b/thisweek/2019/12/09/changelog-2.html new file mode 100644 index 00000000..27721743 --- /dev/null +++ b/thisweek/2019/12/09/changelog-2.html @@ -0,0 +1,151 @@ + + + + + + + + + + Changelog #2 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #2

+ +
+
+
+

Commit: e3a9e80

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #2500 goto definition works inside format!-like macros.

    +
  • +
  • +

    #2477 pass the right --edition to rustfmt

    +
  • +
  • +

    #2479 support some build-in derives

    +
  • +
  • +

    #2492, #2494 goto definition and syntax highlighting work properly for type parameters

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #2487 fix type inference for references

    +
  • +
  • +

    #2466 fix imports being considered resolved to early

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #2474 more cleanly separate inline and out-of-line module

    +
  • +
  • +

    #2480 discover the relevant hir for AST more reliably

    +
  • +
  • +

    #2484 implement DynMap — a dynamically typed heterogeneous map to +make it easy to plumb stuff through compiler layers

    +
  • +
  • +

    #2499 refactor code_model module, which is the API for accessing +compiler’s data from the IDE.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2019/12/16/changelog-3.html b/thisweek/2019/12/16/changelog-3.html new file mode 100644 index 00000000..2ba60908 --- /dev/null +++ b/thisweek/2019/12/16/changelog-3.html @@ -0,0 +1,164 @@ + + + + + + + + + + Changelog #3 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #3

+ +
+
+
+

Commit: 0ef8ace

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #2511 implement ra_lsp_server --version.

    +
  • +
  • +

    #2523 implement extend selection for tuple patterns.

    +
  • +
  • +

    #2550 type inference for unary !.

    +
  • +
  • +

    #2548 allow to select cargo features (by default, --all-features is used).

    +
  • +
  • +

    #2559 use more fine-grained tags for syntax highlighting (literal.byte, literal.char, …​)

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #2565 fix bug with syntax highlighting not updating on windows.

    +
  • +
  • +

    #2519 fix name resolution for types in traits.

    +
  • +
  • +

    #2535 don’t trigger signature help on typing ).

    +
  • +
  • +

    #2552 fix goto definition target when the cursor is between tokens.

    +
  • +
  • +

    #2567 fix type inference for impl Trait syntax.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #2510 restore source maps for the typescript extension.

    +
  • +
  • +

    #2525 use ES2018 for VS Code extension.

    +
  • +
  • +

    #2526 upgrade to LSP 3.15.

    +
  • +
  • +

    #2537 lookup hir nodes by their parents, and not only by the source location.

    +
  • +
  • +

    #2561 split Path into non-generic ModPath and generic Path.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2019/12/23/changelog-4.html b/thisweek/2019/12/23/changelog-4.html new file mode 100644 index 00000000..68311198 --- /dev/null +++ b/thisweek/2019/12/23/changelog-4.html @@ -0,0 +1,179 @@ + + + + + + + + + + Changelog #4 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #4

+ +
+
+
+

Commit: ce07a2d

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #2577 by default for VS Code, rely on client-side file watching.

    +
  • +
  • +

    #2568 add option to disable --all-targets flag for cargo watch.

    +
  • +
  • +

    #2594 type hints don’t show default type arguments.

    +
  • +
  • +

    #2592 initial type-inference for index expressions.

    +
  • +
  • +

    #2616, #2619 improve type-inference for closures.

    +
  • +
  • +

    #2617 don’t use approximate name resolution when computing hover.

    +
  • +
  • +

    #2623 expand macros in impls.

    +
  • +
  • +

    #2628 parse macros 2.0.

    +
  • +
  • +

    #2641 parse const generics.

    +
  • +
  • +

    #2648 rudimentary name resolution for local items.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #2577 better parser recovery for lambdas.

    +
  • +
  • +

    #2562 correctly compute goto target range for a target inside a macro.

    +
  • +
  • +

    #2575 correctly highlight cargo watch errors inside macros.

    +
  • +
  • +

    #2595 fix parsing of expressions expanded by macros.

    +
  • +
  • +

    #2637 optimize inlay hints.

    +
  • +
  • +

    #2643 optimize change tracking.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #2581 refactor hir::Path to separate paths with and without generic arguments on the type level.

    +
  • +
  • +

    #2583 better prettier config for TypeScript extension

    +
  • +
  • +

    #2545 add ids to all tokens (this is groundwork for hygiene and better support for IDE features inside macro calls).

    +
  • +
  • +

    #2629 remove imports from hir.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2019/12/30/changelog-5.html b/thisweek/2019/12/30/changelog-5.html new file mode 100644 index 00000000..350f9ab1 --- /dev/null +++ b/thisweek/2019/12/30/changelog-5.html @@ -0,0 +1,152 @@ + + + + + + + + + + Changelog #5 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #5

+ +
+
+
+

Commit: 9cad88d

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #2668 move cargo watch integration to the server side. Now it is available for every editor, and not only for VS Code.

    +
  • +
  • +

    #2661 type inference for async functions.

    +
  • +
  • +

    #2663 "add missing impl members" assists now substitutes type parameters.

    +
  • +
  • +

    #2657 type hints for closures are less verbose.

    +
  • +
  • +

    #2667 account for visibility modifiers during name resolution.

    +
  • +
  • +

    #2061 use existing TextMate scopes infrastructure for color theme customization.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #2658 don’t pass empty set of features to Cargo.

    +
  • +
  • +

    #2673 correctly don’t add parent item to the scope of a nested item.

    +
  • +
  • +

    #2650 correctly display types of macro call expressions.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #2679 use lang-items infrastructure for resolving known traits.

    +
  • +
  • +

    #2684 simplify build process for the TypeScript extension.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/01/06/changelog-6.html b/thisweek/2020/01/06/changelog-6.html new file mode 100644 index 00000000..79447c43 --- /dev/null +++ b/thisweek/2020/01/06/changelog-6.html @@ -0,0 +1,137 @@ + + + + + + + + + + Changelog #6 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #6

+ +
+
+
+

Commit: 07340a6

+
+
+
+
+

New Features

+
+ +
+
+
+

Fixes

+
+
+
    +
  • +

    #2672 fix macro expansion of repetitions.

    +
  • +
  • +

    #2722 fix cargo watch tests on windows.

    +
  • +
  • +

    #2734 fix panic in type inference.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    Restructure Vs Code extension

    +
  • +
  • +

    #2703 remove support for old-style syntax highlighting.

    +
  • +
  • +

    #2731 improve internal profiling infrastructure.

    +
  • +
  • +

    #2743 use a declarative macro instead of an external .ron file to describe input to AST code generation.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/01/13/changelog-7.html b/thisweek/2020/01/13/changelog-7.html new file mode 100644 index 00000000..6ada0e3a --- /dev/null +++ b/thisweek/2020/01/13/changelog-7.html @@ -0,0 +1,190 @@ + + + + + + + + + + Changelog #7 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #7

+ +
+
+
+

Commit: a30129b
+Release: 2020-01-13

+
+
+

We now publish binary releases to GitHub 🎁! +Note that this is the first release, so things are expected to go wrong. +Release process is orchestrated by this workflow.

+
+
+

Additionally, the VS Code extension is renamed to rust-analyzer (the old name was ra-lsp). +cargo xtask install should automatically remove the old extension, but, if you use the binary release, you’d have to uninstall manually.

+
+
+

We also got a new sponsor: freiheit.com! +If you use rust-analyzer at work, consider asking your company to support its development!

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #2724 basic support for const-generic parsing.

    +
  • +
  • +

    #2738 invoking reference search on { searches for struct literals. +72264442 10acd300 361b 11ea 8d2d 0d48eff2f1c1

    +
  • +
  • +

    #2698 initial support for call hierarchy. +71634596 6d57c900 2beb 11ea 9957 d1bb1aa92d3b

    +
  • +
  • +

    #2732 add configuration option to silence the error message about missing Cargo.toml.

    +
  • +
  • +

    #2779 support for parsing trait aliases.

    +
  • +
  • +

    #2749 initial support for read/write classification of accesses in reference search.

    +
  • +
  • +

    #2727 add impl members assist now correctly qualifies paths.

    +
  • +
  • +

    #2712 extend selection works in macro calls. +72265573 025fb680 361d 11ea 82d1 ccf5fe524767

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #2753 epic one-line change by @michalt which enables salsa fast-path for incremental validation of libraries.

    +
  • +
  • +

    #2785 fix macro expansion in expression positions.

    +
  • +
  • +

    #2786 fix hover for local variables.

    +
  • +
  • +

    #2807 fix goto implementation for derived implementations.

    +
  • +
  • +

    #2788 outline correctly displays `#[macro_export]`ed macro rules.

    +
  • +
  • +

    #2816 add macro_rules snippet.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #2771 make issues like #2753 less likely.

    +
  • +
  • +

    #2768 rename VS Code extension to rust-analyzer.

    +
  • +
  • +

    #2820 publish binary releases.

    +
  • +
  • +

    compiler-team/#237 initial research for parser library-ification.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/01/20/changelog-8.html b/thisweek/2020/01/20/changelog-8.html new file mode 100644 index 00000000..f8014c2b --- /dev/null +++ b/thisweek/2020/01/20/changelog-8.html @@ -0,0 +1,163 @@ + + + + + + + + + + Changelog #8 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #8

+ +
+
+
+

Commit: de24097
+Release: 2020-01-20

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #2824 defer starting cargo check until workspace is loaded.

    +
  • +
  • +

    #2843 display inlay hints for function parameter names.

    +
  • +
  • +

    rust-analyzer.github.io#24 rust-analyzer has a new logo and a refreshed website. +Thanks @Aloso!

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #2837 syntax highlighting was accidentally quadratic.

    +
  • +
  • +

    #2852 don’t parse child modules when computing diagnostics for a module.

    +
  • +
  • +

    #2853 reduce the amount of blocking cargo check does.

    +
  • +
  • +

    #2827, #2813, #2867 fix outer attributes on expressions in some cases.

    +
  • +
  • +

    #2877 more precise active range for "add explicit type" assist.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #2818 recover from panics inside of chalk.

    +
  • +
  • +

    #2834 remove code duplication from syntax validation routines.

    +
  • +
  • +

    #2841 use consistent style for assist labels.

    +
  • +
  • +

    #2856 more orthogonal design for ast::Path editing API.

    +
  • +
  • +

    #2716 groundwork for assists with multiple actions.

    +
  • +
  • +

    #2862 new infrastructure for mapping source code to internal hir representation, which should prevent problems like quadratic syntax highlighting.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/01/27/changelog-9.html b/thisweek/2020/01/27/changelog-9.html new file mode 100644 index 00000000..70357294 --- /dev/null +++ b/thisweek/2020/01/27/changelog-9.html @@ -0,0 +1,149 @@ + + + + + + + + + + Changelog #9 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #9

+ +
+
+
+

Commit: 87e1baf
+Release: 2020-01-27

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #2887 auto import assist. +73185119 cf89e800 411d 11ea 9213 d6eac89256c4

    +
  • +
  • +

    #2883 enable semantic highlighting inside macros. +73185287 137ced00 411e 11ea 93ed e415daa9c5dd

    +
  • +
  • +

    #2899 detect popular macro-based test frameworks for the purposes of the "Run …​" lenses/keybinding.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #2901 cancel pending requests when shutdown is initiated.

    +
  • +
  • +

    #2907 inline variable does not remove unused variables.

    +
  • +
  • +

    #2906 fix a bug on windows where main loop was starved by background tasks.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #2893 add a guided tour of lossless syntax trees to the dev docs.

    +
  • +
  • +

    #2891 remove code duplication in validation.

    +
  • +
  • +

    #2898 cleanup cargo watch state management.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/02/03/changelog-10.html b/thisweek/2020/02/03/changelog-10.html new file mode 100644 index 00000000..cfb26d63 --- /dev/null +++ b/thisweek/2020/02/03/changelog-10.html @@ -0,0 +1,184 @@ + + + + + + + + + + Changelog #10 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #10

+ +
+
+
+

Commit: c57ed0c
+Release: 2020-02-03

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #2963 add auto-import support to Emacs.

    +
  • +
  • +

    #2978 support auto-import for functions.

    +
  • +
  • +

    #2982 merge imports when auto-importing.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #2933 don’t compute diagnostics on the main thread. +That fixes a long-standing issue with peformance degradation due to cargo check.

    +
  • +
  • +

    #2810 make magical search of struct literals work in more contexts.

    +
  • +
  • +

    #2916 fix slow cargo check performance due to unbuffered reads.

    +
  • +
  • +

    #2924 avoid spawning more than one Cargo for cargo check.

    +
  • +
  • +

    #2917 prefer imports starting with std for auto import.

    +
  • +
  • +

    #2937 fix an issue where cargo check got stuck in an infinite loop if some procedural macro printed to stdout.

    +
  • +
  • +

    #2970 fix some clint-side bugs with syntax highlighting.

    +
  • +
  • +

    #2972, a fun one, prevent a child process for flipping rust-analyzer’s stdin into non-blocking mode.

    +
  • +
  • +

    #2959 fix a bug where diagnostics from cargo check were obsolete.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #2872 update Chalk. This should fix some cases of extremely slow trait checking.

    +
  • +
  • +

    #2934 log error if the main loop turns takes too long.

    +
  • +
  • +

    #2931 document test_utils module.

    +
  • +
  • +

    #2940, #2941 update developer documentation.

    +
  • +
  • +

    #2943 improve memory usage tracking infrastructure.

    +
  • +
  • +

    #2895 make internal profiling infrastructure more maintainable.

    +
  • +
  • +

    #2967 speed up the build of rust-analyzer by using profile overrides.

    +
  • +
  • +

    #2987, #2986, #2989 cleanup VS Code extension.

    +
  • +
  • +

    #2991, #2998 unsuccessfully try to improve TypeScript build process.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/02/10/changelog-11.html b/thisweek/2020/02/10/changelog-11.html new file mode 100644 index 00000000..f831d129 --- /dev/null +++ b/thisweek/2020/02/10/changelog-11.html @@ -0,0 +1,199 @@ + + + + + + + + + + Changelog #11 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #11

+ +
+
+
+

Commit: 5b703bd
+Release: 2020-02-10

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #3053 VS Code extension now tries to automatically download the latest release. +Additionally, the extension is now published to the Marketplace (link). +Note that if you want to continue using rust-analyzer build from sources, you need to add

    +
    +
    +
    1
    +2
    +3
    +
    {
    +      "rust-analyzer.raLspServerPath": "ra_lsp_server"
    +}
    +
    +
    +
    +
    +

    to settings.json

    +
    +
  • +
  • +

    #2981 changed the way onEnter handler works in VS Code. +We no longer register a custom ontype command. +Instead, we provide a shortcut, bound to Enter. +If you have enableEnhancedTyping: false in you settings, you’ll want to disable this shortcut.

    +
  • +
  • +

    #3050 implement argument-position impl Trait again (support for impl Trait was removed with the Chalk upgrade last week). Return-position impl Trait support will still have to wait for Chalk.

    +
  • +
  • +

    #2911 display errors from the lexer.

    +
  • +
  • +

    #2962 groundwork for use Trait as _ syntax.

    +
  • +
  • +

    #2948 Add Explicit Type assist now can replace _ types.

    +
  • +
  • +

    #3040 rework value parameter parsing to use 2018 edition syntax.

    +
  • +
  • +

    #3054 move Emacs support upstream.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #3017 correctly handle crates with - in names.

    +
  • +
  • +

    #3044 don’t crash when receiving unknown file for cargo diagnostics.

    +
  • +
  • +

    #3047 fix parsing of async unsafe functions.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #3024 fix leaking observers and promises in VS Code extension.

    +
  • +
  • +

    #3001, #3003 reduce the number of TypeScript dependencies.

    +
  • +
  • +

    #3018, #3045 refactor some assists to use type-safe AST editing API.

    +
  • +
  • +

    #3031, #3034, #3063 refactor auto-import infrastructure.

    +
  • +
  • +

    #3069 refactor interface for creating assists groups.

    +
  • +
  • +

    #3081 automate release process.

    +
  • +
  • +

    #3029 extract ra_ide_db crate to improve compile times and code organization.

    +
  • +
  • +

    rust-analyzer.github.io#31 switch changelogs from markdown to AsciiDoctor.

    +
  • +
  • +

    Bump NodeJS requirement to 12 (you only need node if you build VS Code extension from source).

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/02/17/changelog-12.html b/thisweek/2020/02/17/changelog-12.html new file mode 100644 index 00000000..7507c406 --- /dev/null +++ b/thisweek/2020/02/17/changelog-12.html @@ -0,0 +1,221 @@ + + + + + + + + + + Changelog #12 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #12

+ +
+
+
+

Commit: 94fb9ad
+Release: 2020-02-17

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #3140 we now have a basic manual: https://rust-analyzer.github.io/manual.html. +PRs with improvements are welcome!

    +
  • +
  • +

    #3108 complete default function, types and constants in impl blocks:

    +
    +
    +74660243 0d66b300 5196 11ea 8327 205b1262e7a2 +
    +
    +
  • +
  • +

    #3169 display fields when completing an enum variant:

    +
    +
    +74607251 8ce17d00 50d7 11ea 9d4d 38d198a4aec0 +
    +
    +
  • +
  • +

    #3099 initial implementation of Structural Search & Replace.

    +
  • +
  • +

    #3074 initial support for OR-patterns.

    +
  • +
  • +

    #3064 rename works inside macros.

    +
  • +
  • +

    #3120 support auto-import of traits for unresolved method calls in some cases.

    +
  • +
  • +

    #3162 VS Code extension automatically downloads the correct server binary release.

    +
  • +
  • +

    #3153 when running a Cargo test, pass --exact flag.

    +
  • +
  • +

    #3181 add ability to pass additional arguments to rustfmt.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #3084 better error reporting around workspace loading.

    +
  • +
  • +

    #3102 better error reporting when deserializing wrong config.

    +
  • +
  • +

    #3092 fix error when starting the server immediately after download.

    +
  • +
  • +

    #3100 improved error handling when downloading the server binary.

    +
  • +
  • +

    #3114 fix type inference for match arms of unknown type.

    +
  • +
  • +

    #3121 during auto-import, don’t insert use statements before inner attributes.

    +
  • +
  • +

    #3127 support unnamed arguments in function pointers.

    +
  • +
  • +

    #3143 fix name resolution for std::sync::atomic::AtomicX types.

    +
  • +
  • +

    #3145 Self inside trait’s default methods implements the trait.

    +
  • +
  • +

    #3150 increase the limit on the number of iterations the name resolution algorithm can do.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #3139 bump VS Code requirenment to 1.42.

    +
  • +
  • +

    #3086 automate publishing of the VS Code extension.

    +
  • +
  • +

    #3062 preliminary work on type inference for slice patterns.

    +
  • +
  • +

    #3136 rewrite `xtask`s in a more declarative style.

    +
  • +
  • +

    #3131 simplify configuration handling in VS Code extension.

    +
  • +
  • +

    #3157 add randomization to analysis-stats, which should help with debugging non-determinism issues.

    +
  • +
  • +

    #3171 enable profiling for analysis-bench.

    +
  • +
  • +

    #3174, #3174 improve debugging settings for VS Code extension.

    +
  • +
  • +

    #3179 refactor macro expansion.

    +
  • +
  • +

    #3190, #3191 simplify VS Code extension life cycle.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/02/24/changelog-13.html b/thisweek/2020/02/24/changelog-13.html new file mode 100644 index 00000000..97cda4dc --- /dev/null +++ b/thisweek/2020/02/24/changelog-13.html @@ -0,0 +1,223 @@ + + + + + + + + + + Changelog #13 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #13

+ +
+
+
+

Commit: cba3c99
+Release: 2020-02-24

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #3216 language server binary is renamed from ra_lsp_server to rust-analyzer. +Additionally, rust-analyzer.lspServerPath config is renamed to rust-analyzer.serverPath

    +
  • +
  • +

    #3199, #3200 merge ra_cli batch processing utils with the main rust-analyzer binary. +Now you can, eg, run rust-analyzer analysis-stats path/to/my/project to type check all functions in batch. +This is intended to help with debugging rust-analyzer itself.

    +
  • +
  • +

    #3206 automatically install rust-src component.

    +
  • +
  • +

    #3231 add Remove mut assist.

    +
  • +
  • +

    #3252 for syntax highlighting, take token color customization into account.

    +
  • +
  • +

    #3269 document inlay hints.

    +
  • +
  • +

    #3278, #3279 show inlay hints in more cases.

    +
  • +
  • +

    #3275 document structural search and replace.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #3229 fix a crash with non-ascii whitespace in doc-comments.

    +
  • +
  • +

    #3228 fix hover for for code inside macro calls.

    +
  • +
  • +

    #3233 extend selection correctly handles commas in tuple patterns

    +
  • +
  • +

    #3239 remove dependency on libbacktrace.

    +
  • +
  • +

    #3241 Fill missing fields fix works with enum variants as well.

    +
  • +
  • +

    #3215 exclude methods from non-parameter types introduced by generic constraints

    +
  • +
  • +

    #3248 fix custom onEnter not triggering at the start of a doc comment

    +
  • +
  • +

    #3251, #3282 better error messages when workspace loading fails.

    +
  • +
  • +

    #3259 fix handing of associated type.

    +
  • +
  • +

    #3244 renaming a module now renames both the file and the references to the module.

    +
  • +
  • +

    #3262 correctly distinguish between const patterns and bindings.

    +
  • +
  • +

    #3260 fix name resolution rules for build-in types.

    +
  • +
  • +

    #3230 fix macro expansion for invalid tokens.

    +
  • +
  • +

    #3277 gracefully handle cancellation errors in VS Code plugin.

    +
  • +
  • +

    #3289, #3290 don’t break the Enter key if rust-analyzer returns an error.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #3195 remove dependency on proptest property based testing library to +improve compile times.

    +
  • +
  • +

    #3209, #3205, #3258 switch TypeScript extension linter to eslint.

    +
  • +
  • +

    #3214 document all modules in the language server crate.

    +
  • +
  • +

    #3026 simplify internal representation of syntax errors.

    +
  • +
  • +

    #3234, #3235, #3236 refactor handing of symbols/defs in IDE.

    +
  • +
  • +

    #3242 make sure that, by default, rust-analyzer does not depend on C code.

    +
  • +
  • +

    #3247 make rust-analyzer --version more useful and reliable.

    +
  • +
  • +

    #3263 use chalk for unsizing coercions.

    +
  • +
  • +

    #3274 refactor navigation-related code to use hir instead of AST.

    +
  • +
  • +

    #3261 setup client-side logging infrastructure.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/03/02/changelog-14.html b/thisweek/2020/03/02/changelog-14.html new file mode 100644 index 00000000..2cf09be2 --- /dev/null +++ b/thisweek/2020/03/02/changelog-14.html @@ -0,0 +1,250 @@ + + + + + + + + + + Changelog #14 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #14

+ +
+
+
+

Commit: 2c8f136
+Release: 2020-03-02

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #3159, #3321, #3322 switch syntax highlighting implementation to use the new proposed semantic token LSP/VS Code API.To try this out:

    +
    +
      +
    • +

      install vscode plugin from source (using cargo xtask install --client-code)

      +
    • +
    • +

      set "rust-analyzer.highlighting.semanticTokens": true, in settings,

      +
    • +
    • +

      install the recent VS Code Insiders

      +
    • +
    • +

      run code as code-insiders --enable-proposed-api matklad.rust-analyzer (handy bash wrapper)

      +
    • +
    +
    +
  • +
  • +

    #3362 remove ctrl+r default keybinding for running tests & binaries, to avoid conflict with a build-in keybinding. +You might want to assign shortcut for this action, it is a productivity booster!

    +
    +
    +75686456 93a5ed80 5c9c 11ea 83b3 05adecfd07c2 +
    +
    +
  • +
  • +

    #3349 rust-analyzer now highlights code in rust-analyzer’s own tests as rust:

    +
    +
    +75685194 77a14c80 5c9a 11ea 86b0 5ac223451b10 +
    +
    +
  • +
  • +

    #3294 when joining lines, unwrap single-statement blocks if possible.

    +
  • +
  • +

    #3285 structural search replace now correctly ignores whitespace differences.

    +
  • +
  • +

    #3357 change visibility assist now works with consts:

    +
    +
    +75685982 c56a8480 5c9b 11ea 84ca a9cf07bfe0ce +
    +
    +
  • +
  • +

    #3355 add completion & docs for featureFlag configuration in VS Code extension.

    +
  • +
  • +

    #3309 look for Cargo.toml not only in the root and parent directory, but also among one-level child directories.

    +
  • +
  • +

    #3387 type inference for slice patterns.

    +
  • +
  • +

    #3397 add minimal metatdata to VS Code extension.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #3314, #3325, #3350, #3366 fix a lot of range-mapping bugs for recursive macro invocations.

    +
  • +
  • +

    #3308 fix conflict for Enter key with VS Code vim extension. +If rust-analyzer’s custom on enter behavior causes you trouble, you can disable it by removing the corresponding shortcut from the settings.

    +
  • +
  • +

    #3364 correctly handle unions in IDEs.

    +
  • +
  • +

    #3367 finally fix highlighting and name goto definition for constants in patterns, like None.

    +
  • +
  • +

    #3376 fix a common false-positive type mismatch.

    +
  • +
  • +

    #3380 use unsizing in method resolution & autoderef for indexing.

    +
  • +
  • +

    #3384 fix name resolution for paths with repeated super segments.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #3222 redo the interface between "compiler" and "IDE". +IDE no longer needs to explicitly track the file a particular bit of syntax tree originated from.

    +
  • +
  • +

    #3296 bump TypeScript version.

    +
  • +
  • +

    #3299 more type safe way to deal with custom LSP extensions.

    +
  • +
  • +

    #3298 update chalk.

    +
  • +
  • +

    #3316 remove code duplication in assists tests.

    +
  • +
  • +

    #3324, #3335, #3344, #3346 refactor syntax highlighting infrastructure to be more future proof and robust.

    +
  • +
  • +

    #3329, #3330 run cargo audit and npm audit on CI.

    +
  • +
  • +

    #3337 remove unused dependencies.

    +
  • +
  • +

    #3340 gate CI on eslint.

    +
  • +
  • +

    #3351 better API for working with string literals.

    +
  • +
  • +

    #3360 fix parsing of attributes in let statements.

    +
  • +
  • +

    #3370 extract code for adding a new use item to a separate module.

    +
  • +
  • +

    #3374 cleanup API for constructing syntax trees for paths.

    +
  • +
  • +

    #3375 cleanup API for editing syntax trees.

    +
  • +
  • +

    #3377 simplify API for getting semantic definitions from syntax trees.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/03/09/changelog-15.html b/thisweek/2020/03/09/changelog-15.html new file mode 100644 index 00000000..3cae11ed --- /dev/null +++ b/thisweek/2020/03/09/changelog-15.html @@ -0,0 +1,229 @@ + + + + + + + + + + Changelog #15 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #15

+ +
+
+
+

Commit: 5770fa7
+Release: 2020-03-09

+
+
+

Heads up: this update requires VS Code 1.43.0. +In general, rust-analyzer requires the latest version of VS Code at the moment.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #3513 code completion in macro calls.

    +
    +
    +76160803 92a60d80 612d 11ea 8b51 9566cbb4c773 +
    +
    +
  • +
  • +

    #3432 insert argument snippets when completing function calls.

    +
    +
    +76219227 cd837080 6215 11ea 8d0d a9447b1d26b1 +
    +
    +
    +

    Insertion of snippets is controled by completion.insertion.add-argument-snippets feature flag.

    +
    +
  • +
  • +

    #3498 when completing function call, trigger parameter hints automatically.

    +
  • +
  • +

    #3500 more concise mode for parameter hints:

    +
    +
    +76219505 39fe6f80 6216 11ea 9bc2 f2591388c5e6 +
    +
    +
    +

    It is controlled by call-info.full feature flag.

    +
    +
  • +
  • +

    #3392 support for eager concat! macro.

    +
  • +
  • +

    #3456 publish nightly binary releases: releases/tag/nightly.

    +
  • +
  • +

    #3474 on start up, initiate analysis of files even if there were no explicit requests for it.

    +
  • +
  • +

    #3490 support aliases and Self in struct literals.

    +
  • +
  • +

    #3494 implement include! macro.

    +
  • +
  • +

    #3499 resolve Self::AssocTy in impls.

    +
  • +
  • +

    #3516 account for visibility during code completion.

    +
  • +
  • +

    #3514 flag to update the server binary automatically, without asking.

    +
  • +
  • +

    #3519 hover on item now includes full module path.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #3378 fix inlay hints to work correctly in VS Code for several opened editors.

    +
  • +
  • +

    #3388 don’t show wrong inlay hints in a diff view.

    +
  • +
  • +

    #3430 use correct name when completing re-exported functions.

    +
  • +
  • +

    #3509 disallow include! macro to include itself.

    +
  • +
  • +

    #3520 don’t show trivial type hints for unit structs.

    +
  • +
  • +

    #3526 silence "Rust file outside current workspace" warning.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #3502 don’t cache Chalk solver. Counter-intuitively, this allows improves performance by allowing caching elsewhere.

    +
  • +
  • +

    #3405, #3427, #3428 refactor reference and definitions to better accommodate edge cases like field init shorthand.

    +
  • +
  • +

    #3440, #3426, #3443 refactor reference search infrastructure.

    +
  • +
  • +

    #3413 update chalk.

    +
  • +
  • +

    #3425 fix macro expansion for a single dollar.

    +
  • +
  • +

    #3458 add cargo xtask dist for building the distribution package.

    +
  • +
  • +

    #3489 make sure that during expression lowering every non-missing expression gets a source.

    +
  • +
  • +

    #3487 add some editing API for manipulating use statements.

    +
  • +
  • +

    #3497 specify additional label on profiling calls, to see, for example, which functions are slow to typecheck.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/03/16/changelog-16.html b/thisweek/2020/03/16/changelog-16.html new file mode 100644 index 00000000..8d7cf5cf --- /dev/null +++ b/thisweek/2020/03/16/changelog-16.html @@ -0,0 +1,215 @@ + + + + + + + + + + Changelog #16 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #16

+ +
+
+
+

Commit: ebab250
+Release: 2020-03-16

+
+
+

Note that the minimal required version of VS Code is 1.43.0 now. +In general, we only support the latest release of VS Code.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #3534 Implement nightly channel for VS Code. +You can enabled nightly channel by setting

    +
    +
    +
    1
    +
    "rust-analyzer.updates.channel": "nightly"
    +
    +
    +
    +
    +

    option.

    +
    +
  • +
  • +

    #3561 add Debug code lens. It requires vscode-lldb extension to work.

    +
    +
    +76760335 bf8d9c80 678d 11ea 80c3 8e8b12a36690 +
    +
    +
  • +
  • +

    #3506 Trigger associated item completion when typing a name of the item.

    +
    +
    +76758522 1ee9ad80 678a 11ea 84cd 111739ecd379 +
    +
    +
  • +
  • +

    #3549 initial support for the env! macro. This unlocks preliminary support for include!(concat!(env!("OUT_DIR"), "/foo.rs")) pattern. +At the moment, value for OUT_DIR should be specified in the settings, using rust-analyzer.additionalOutDirs key.

    +
  • +
  • +

    #3543 separate options for controlling type and parameter inlay hints: +rust-analyzer.inlayHints.typeHints and rust-analyzer.inlayHints.parameterHints.

    +
  • +
  • +

    #3591 initial support for local macro_rules.

    +
  • +
  • +

    #3587 replace "workspace loaded" notification with a progress bar.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #3552 fix completion for partially unknown types.

    +
  • +
  • +

    #3542 rename works correctly for field init shortcut.

    +
    +
    +76759028 28bfe080 678b 11ea 9fb5 5ab6e6476814 +
    +
    +
  • +
  • +

    #3557 on Enter, continue multiline non-doc comments.

    +
  • +
  • +

    #3558 fix parsing of binary expressions where rhs is a block.

    +
  • +
  • +

    #3564 correctly handle multi-spand diagnostics/fixits from rustc/clippy.

    +
  • +
  • +

    #3553 show completion for all namespaces.

    +
  • +
  • +

    #3574 fix completion for HashMap::new.

    +
  • +
  • +

    #3576 correctly parse variadic extern "C" functions.

    +
  • +
  • +

    #3595 fix completion of trait items.

    +
  • +
  • +

    #3573 by default, run cargo check for all crates in workspace.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #3551 slightly refactor feature flags.

    +
  • +
  • +

    #3562 implement fmt::Display for all AST nodes.

    +
  • +
  • +

    #3577 protect against diverging macro expansion.

    +
  • +
  • +

    #3540 split Structural Search Replace into query validation and execution.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/03/23/changelog-17.html b/thisweek/2020/03/23/changelog-17.html new file mode 100644 index 00000000..fcd2814e --- /dev/null +++ b/thisweek/2020/03/23/changelog-17.html @@ -0,0 +1,206 @@ + + + + + + + + + + Changelog #17 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #17

+ +
+
+
+

Commit: aaa6961
+Release: 2020-03-23

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #3582 fetch appropriate value of OUT_DIR from cargo check. +This enables rust-analyzer to work correctly with crates which use compile-time code generation. This might significantly slow-down startup time (as we need to run cargo check build), so this functionality is disabled by default. +To enable, set:

    +
    +
    +
    1
    +
    "rust-analyzer.cargoFeatures.loadOutDirsFromCheck": true
    +
    +
    +
    +
  • +
  • +

    #3580 macro expander is now more tolerant for syntax errors, which makes code completion inside macros more robust.

    +
  • +
  • +

    #3623 Fill Match Arms assist now works even if some arms are already present.

    +
  • +
  • +

    #3607 and instructions for installing rust-analyzer from AUR.

    +
  • +
  • +

    #3640, #3651 assist to merge imports with a common prefix.

    +
    +
    +77323042 ea8b6980 6d14 11ea 8cb6 23dccafaa024 +
    +
    +
  • +
  • +

    #3662 correctly part arbitrary enum discriminants.

    +
  • +
  • +

    #3663 installation from source uses rust-analyzer from $PATH by default.

    +
  • +
  • +

    #3677 include macro_rules! macros in workspace symbols.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #3541 correctly complete constants and paths in patterns.

    +
  • +
  • +

    #3668 don’t suggest Invert If assist for if let syntax.

    +
  • +
  • +

    #3671 fix infinite loop in macro expansion during completion.

    +
  • +
  • +

    #3674 use correct name for the library if it is renamed in Cargo.toml.

    +
  • +
  • +

    #3673 guard against runaway macro expansion in expressions.

    +
  • +
  • +

    #3681 only suggest machine-applicable suggestions from cargo check.

    +
  • +
  • +

    #3678 fix rename behavior in macros.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #3584 use dyn Trait when working with salsa database, which improves compile times in release mode.

    +
  • +
  • +

    #3606, #3608, #3610 improve audit on CI.

    +
  • +
  • +

    #3614 in the TypeScript extension, be more explicit about persistent state.

    +
  • +
  • +

    #3626 check trailing whitespace on CI.

    +
  • +
  • +

    #3629 simplify and streamline plugin auto-update.

    +
  • +
  • +

    #3635 simplify extension versioning scheme.

    +
  • +
  • +

    #3656 simplify arena API.

    +
  • +
  • +

    #3672 assists documentation generator skips hidden files.

    +
  • +
  • +

    #3632 log errors from cargo check.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/03/30/changelog-18.html b/thisweek/2020/03/30/changelog-18.html new file mode 100644 index 00000000..cca06856 --- /dev/null +++ b/thisweek/2020/03/30/changelog-18.html @@ -0,0 +1,200 @@ + + + + + + + + + + Changelog #18 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #18

+ +
+
+
+

Commit: 9e12b9e
+Release: 2020-03-30

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #3710 display inlay hints for method chains (controlled by rust-analyzer.inlayHints.chainingHints config).

    +
    +
    +77911990 0ef5c180 7292 11ea 9779 7ce60d8e7b2e +
    +
    +
  • +
  • +

    #3689 Fill Match Arms assist now handles tuples of enums.

    +
  • +
  • +

    #3685 auto import now works for macros.

    +
  • +
  • +

    #3704 add troubleshooting section to the manual.

    +
  • +
  • +

    #3694 completion for fields does not suggest already specified fields.

    +
  • +
  • +

    #3732 assist to replace .unwrap with a match.

    +
  • +
  • +

    #3742 assist to replace let with if let.

    +
  • +
  • +

    #3693 Rust Analyzer: version command now shows tag in addition to commit hash.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #3698 dbg! postfix completion wraps the reference.

    +
  • +
  • +

    #3703 don’t enabled proposed APIs on stable release.

    +
  • +
  • +

    #3707 use real visibility in reference search.

    +
  • +
  • +

    #3714 correctly detect x86 CPU architecture.

    +
  • +
  • +

    #3717 always expand macros during code analysis.

    +
  • +
  • +

    #3722 fix parsing lambdas with return type.

    +
  • +
  • +

    #3724 blame the right queries for memory usage.

    +
  • +
  • +

    #3725 fix TypeScript memory leak on server restart.

    +
  • +
  • +

    #3745 Merge Imports assist correctly handles *.

    +
  • +
  • +

    #3764 fix index out of bounds error during workspace loading.

    +
  • +
  • +

    #3761 Fill Match Arms assist correctly preserves comments.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #3753 introduce stdx crate for storing missing batteries.

    +
  • +
  • +

    #3695 simplify configuration handling.

    +
  • +
  • +

    #3708 generalize syntax rewriting infrastructure to allow removal of nodes.

    +
  • +
  • +

    #3664, #3692, #3727 groundwork for procedural macros support.

    +
  • +
  • +

    #3726 refactor Rust Analyzer: Status command.

    +
  • +
  • +

    #3754 use auto-joining threads for managing cargo watch.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/04/06/changelog-19.html b/thisweek/2020/04/06/changelog-19.html new file mode 100644 index 00000000..d96eee48 --- /dev/null +++ b/thisweek/2020/04/06/changelog-19.html @@ -0,0 +1,288 @@ + + + + + + + + + + Changelog #19 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #19

+ +
+
+
+

Commit: ec3fb1c
+Release: 2020-04-06

+
+
+
+
+

New Features

+
+
+
    +
  • +

    BREAKING #3824 changed the name of many options. The current set is specified here. If you are using a non-VS Code client, note that rust-analyzer now asks for +rust-analyzer secion of configuration, and expects this config to be present in initializationOptions.

    +
  • +
  • +

    #3804, #3825 it is now possible to use arbitrary command for on the fly error checking:

    +
    +
    +
    1
    +2
    +3
    +4
    +5
    +
    {
    +    "rust-analyzer.checkOnSave.overrideCommand": [
    +        "./x.py", "check", "--json-output"
    +    ]
    +}
    +
    +
    +
    +
  • +
  • +

    #3807, #3825 similarly, it is now possible to completely override rustfmt command.

    +
  • +
  • +

    #3820 remove support for old syntax highlighting. To use the new semantic tokens highlighting:

    +
    +
      +
    1. +

      install the recent vscode insiders build

      +
    2. +
    3. +

      add

      +
      +
      +
      1
      +2
      +3
      +4
      +
      {
      +    "rust-analyzer.highlighting.semanticTokens": true,
      +    "editor.semanticHighlighting.enabled": false,
      +}
      +
      +
      +
      +
      +

      to config

      +
      +
    4. +
    5. +

      run vscode as code-insiders --enabled-proposed-api matklad.rust-analyzer

      +
    6. +
    7. +

      make sure to use a color theme with support for syntax highlighitng.

      +
    8. +
    9. +

      Rust specific tokens and modifiers are listed here. For example, to underline all mut and &mut variables, add this to settings.json:

      +
      +
      +
      1
      +2
      +3
      +4
      +5
      +
      "editor.tokenColorCustomizationsExperimental": {
      +    "*.mutable": {
      +        "fontStyle": "underline"
      +    }
      +}
      +
      +
      +
      +
    10. +
    +
    +
  • +
  • +

    #3814 add Implement From for enum variant assist

    +
    +
    +78559964 8f2da100 7815 11ea 99a4 00b431df7022 +
    +
    +
  • +
  • +

    #3746 add Create function assist.

    +
    +
    +78560241 111dca00 7816 11ea 89a4 5489ddf6d9dc +
    +
    +
  • +
  • +

    #3840 automatically add call parenthesis for tuple-like enum variants

    +
    +
    +78560584 9a350100 7816 11ea 93ad 66bf625fcb93 +
    +
    +
  • +
  • +

    #3666 handle some configuration changes without server restart.

    +
  • +
  • +

    #3777 populate default task list in VS Code with cargo commands.

    +
  • +
  • +

    #3765 SSR no longer takes field order into account.

    +
  • +
  • +

    #3829 SSR treats method call and UFCS equivalently.

    +
  • +
  • +

    #3779 code completion for recrod literals now suggest only fields which are not already present.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #3785 attach doc comments to declaration even if there’s a blank line after comment.

    +
  • +
  • +

    #3781, #3819 make Run action correctly handle the case with several major versions of the package in the crate graph.

    +
  • +
  • +

    #3786 Fill Match Arms assits does not leave the floating comma behind.

    +
  • +
  • +

    #3797 don’t show chaining hints for record literals and unit structs.

    +
  • +
  • +

    #3844 make sure that default configuration values are honored.

    +
  • +
  • +

    #3857 fix inference of function pointer return types.

    +
  • +
  • +

    #3858 don’t show return type for ()-returning function.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #3817, #3815, #3816 Show Syntax Tree internal command now has syntax highlighting and auto scroll from source.

    +
  • +
  • +

    #3805, #3806, #3811 lower literal patterns.

    +
  • +
  • +

    #3790 use uniiform naming (config) for all configuration-related functionality.

    +
  • +
  • +

    #3792, #3802 inspired by Emacs, rename "cargo watch" functionality to flycheck.

    +
  • +
  • +

    #3738, #3800 more groundwork for proc-macro support.

    +
  • +
  • +

    #3793 add integrated test for code-generating build.rs.

    +
  • +
  • +

    #3795 decouple flycheck and project model.

    +
  • +
  • +

    #3809 reduce the number of structs holding configuration from three to one.

    +
  • +
  • +

    #3836 wrap macros in pattern position into ast::MacroPat node to not confuse them with expressions.

    +
  • +
  • +

    #3744 upgrade chalk.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/04/13/changelog-20.html b/thisweek/2020/04/13/changelog-20.html new file mode 100644 index 00000000..93a00b2d --- /dev/null +++ b/thisweek/2020/04/13/changelog-20.html @@ -0,0 +1,227 @@ + + + + + + + + + + Changelog #20 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #20

+ +
+
+
+

Commit: c388130
+Release: 2020-04-13

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #3875 new release strategy: we now just promote Sunday’s nightly to stable.

    +
  • +
  • +

    #3899 enables semantic highlighting by default.

    +
  • +
  • +

    #3706, #3884, #3938 show native rust-analyzer’s diagnostics for not exhaustive patterns. +As a reminder, all rust-analyzer diagnostics can be disabled with "rust-analyzer.diagnostics.enable" setting.

    +
  • +
  • +

    #3925 Reorder record fields assist to sort the fields in the declaration order.

    +
    +
    +79140307 10f27100 7db8 11ea 9f3b b246a7283bdf +
    +
    +
  • +
  • +

    #3902 improve documentation for Sublime Text.

    +
  • +
  • +

    #3880, #3918 process cfg attributes on fields and methods.

    +
  • +
  • +

    #3901, #3910 add more heuristics for hiding obvious param hints.

    +
  • +
  • +

    #3905 handle patterns with ellipsis.

    +
  • +
  • +

    #3935 generated trait methods now use todo! rather than unimplemented!.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #3933 fix accidentally quadratic behavior when expanding the include! macro.

    +
  • +
  • +

    #3868 fix panic in Chalk.

    +
  • +
  • +

    #3872 fix "rust-analyzer.checkOnSave.command" option.

    +
  • +
  • +

    #3878 when completing a macro call, don’t add () if they are already there.

    +
  • +
  • +

    #3892 fix "parser is stuck" error during macro expansion.

    +
  • +
  • +

    #3912 fix parsing of where clauses with Fn traits.

    +
  • +
  • +

    #3939 canonicalize paths coming from cargo metadata.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #3944 speed up type inference by up to 30% percent.

    +
  • +
  • +

    #3867 add CI checks for stray `eprintln`s.

    +
  • +
  • +

    #3842, #3906, #3920 copy libprocmacro from rustc. +We will be using this library to load proc macro dynamic libraries.

    +
  • +
  • +

    #3863 use .rast extension for serialized syntax trees in tests. +This adds syntax highlighting!

    +
  • +
  • +

    #3876 rename complete_scope to hopefully less confusing complete_unqualified_path.

    +
  • +
  • +

    #3882 centralize the logic for computing missing struct fields.

    +
  • +
  • +

    #3826 when doing syntax highlighting, produce a flat list of ranges.

    +
  • +
  • +

    #3909 generate token accessors.

    +
  • +
  • +

    #3913 remove allocation from the "least common ancestor" algorithm.

    +
  • +
  • +

    #3915 format generated code in a more readable way.

    +
  • +
  • +

    #3917 improve tt::Subtree debug print.

    +
  • +
  • +

    #3748 implement Chalk’s debug methods using TLS.

    +
  • +
  • +

    #3926 align tokens names with syn somewhat.

    +
  • +
  • +

    #3940 use actions-rs for cargo audit.

    +
  • +
  • +

    #3942 more precise typing of TypeScript config.

    +
  • +
  • +

    #3949 cleanup cfg handling.

    +
  • +
  • +

    #3951, #3955 simplify and unify grammar for record literals and patterns.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/04/20/changelog-21.html b/thisweek/2020/04/20/changelog-21.html new file mode 100644 index 00000000..7463afcd --- /dev/null +++ b/thisweek/2020/04/20/changelog-21.html @@ -0,0 +1,256 @@ + + + + + + + + + + Changelog #21 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #21

+ +
+
+
+

Commit: 90f8378
+Release: 2020-04-20

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #3958 Initial support for proc-macros

    +
    +
    +79734928 c57c1d80 82f7 11ea 93a5 9081087402e0 +
    +
    +
    +

    To enable it, set the following settings:

    +
    +
    +
    +
    1
    +2
    +3
    +4
    +
    {
    +    "rust-analyzer.cargo.loadOutDirsFromCheck": true,
    +    "rust-analyzer.procMacro.enabled": true
    +}
    +
    +
    +
    +
  • +
  • +

    #3990 switch to Chalk recursive solver. +This significantly improves type inference when associated types are involved, +for example, with iterators:

    +
    +
    +79728444 3a4a5a00 82ee 11ea 83ab 1f3e539dde69 +
    +
    Before
    +
    +
    +
    +79728643 8ac1b780 82ee 11ea 867a b231d46b89a0 +
    +
    After
    +
    +
  • +
  • +

    #4034 add unresolvedReference semantic tag for names which rust-analyzer fails to resolve. +Adding to VS Code config

    +
    +
    +
    1
    +2
    +3
    +
    "editor.tokenColorCustomizationsExperimental": {
    +    "unresolvedReference": "#FF0000"
    +}
    +
    +
    +
    +
    +

    will give fast feedback about unresolved references, highlighting them in red. +No default highlighting is set, as rust-analyzer still has a fair number of false positives.

    +
    +
    +
    +79669212 42a17880 81ba 11ea 9274 bceac6448914 +
    +
    +
  • +
  • +

    #3962 don’t assign shortcut for Parent Module command. +The original shortcut was ctrl+u, but it conflicts with VS Code build-in. +It is recommended to assign custom shortcut for rust-analyzer.parentModule action.

    +
  • +
  • +

    #3965 implement inline associated type bounds.

    +
  • +
  • +

    #3966 add support for bounds on associated types in trait definitions.

    +
  • +
  • +

    #4026 omit more parameter hints in the presence of underscores.

    +
  • +
  • +

    #3894 implement exhaustiveness checking for record enum variants.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #3961 fix extraneous comma when merging import.

    +
  • +
  • +

    #3969 Add Function assist now uses todo! macro.

    +
  • +
  • +

    #3967 handle Self::Type in trait definitions when referring to own associated type.

    +
  • +
  • +

    #3948 fix inlay hints config synchronization between client and server.

    +
  • +
  • +

    #3979 fix missing match arm false positive for enum with no variants.

    +
  • +
  • +

    #4010 fix diagnostics ranges in macros.

    +
  • +
  • +

    #4011 fix self-fulfilling completion.

    +
  • +
  • +

    #4012 fix panic on ellipsis in pattern.

    +
  • +
  • +

    #4021 fix type equality for dyn Trait.

    +
  • +
  • +

    #4022 fix panic in syntax highlighting.

    +
  • +
  • +

    #4023 fix another crash from wrong binders.

    +
  • +
  • +

    #4027 don’t qualify builtins in generated code.

    +
  • +
  • +

    #4036 fix name resolution in guard closes and record patterns.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #3971 add rust-analyzer diagnostics command for batch processing.

    +
  • +
  • +

    #3964 nicer Chalk debug logs.

    +
  • +
  • +

    #3994, #4016 don’t expose implementation details of SyntaxNodePtr.

    +
  • +
  • +

    #3995 separate project discovery from project loading.

    +
  • +
  • +

    #4008 add more info about what failed in tidy tests.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/04/27/changelog-22.html b/thisweek/2020/04/27/changelog-22.html new file mode 100644 index 00000000..0f4ef690 --- /dev/null +++ b/thisweek/2020/04/27/changelog-22.html @@ -0,0 +1,266 @@ + + + + + + + + + + Changelog #22 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #22

+ +
+
+
+

Commit: 7a9ba16
+Release: 2020-04-27

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #4065, #4128 complete unqualifed enum variants

    +
    +
    +80367186 ecec6080 888a 11ea 8968 37f93424106a +
    +
    +
  • +
  • +

    #4105 code completion for attributes.

    +
  • +
  • +

    #3954 we now pre-select completion variant if it matches the expected type.

    +
  • +
  • +

    #4006 syntax highlighting for format strings

    +
    +
    +80368064 6e90be00 888c 11ea 9395 85d6c3371000 +
    +
    +
  • +
  • +

    #4069, #4070, #4158 improve documentation.

    +
  • +
  • +

    #4098 add setup instructions for YouCompleteMe.

    +
  • +
  • +

    #4082 implement rust-analyzer --help.

    +
  • +
  • +

    #4090 fix naming of two config options:

    +
    +
      +
    • +

      featureFlags.lsp.diagnosticsdiagnostics.enable (enables native rust-analyzer diagnostics)

      +
    • +
    • +

      procMacro.enabledprocMacro.enable (enables support for procedural macros)

      +
    • +
    +
    +
  • +
  • +

    #4092 allow running #[ignore] tests.

    +
  • +
  • +

    #4107 custom onEnter command is disabled by default. To re-enable it, use the following config:

    +
    +
    +
    1
    +2
    +3
    +4
    +5
    +
    {
    +    "key": "Enter",
    +    "command": "rust-analyzer.onEnter",
    +    "when": "editorTextFocus && !suggestWidgetVisible && editorLangId == rust"
    +},
    +
    +
    +
    +
  • +
  • +

    #4111 support for extern "C" {} blocks.

    +
  • +
  • +

    #3998 Add Function assist can now add functions in other files.

    +
  • +
  • +

    #4133 eagerly prime caches to reduce startup latency in certain vim setups.

    +
  • +
  • +

    #4137 prefer core/alloc paths on #![no_std].

    +
  • +
  • +

    #4136 support #[cfg] on expressions.

    +
  • +
  • +

    #4154 add cargo test to the list of Run commands.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #4096 fix default tasks.json generation.

    +
  • +
  • +

    #4057 fix panic in split_imports assist.

    +
  • +
  • +

    #4076 fix handing of derive attributes for macros.

    +
  • +
  • +

    #4078 do not add default and closure types in 'add explicit type' assist.

    +
  • +
  • +

    #4106 fix panic in type inference.

    +
  • +
  • +

    #4116, #4117 honor client’s snippet capability.

    +
  • +
  • +

    #4113 honor hierarchical document symbols client capability.

    +
  • +
  • +

    #4126 don’t omit methods with self from path completion.

    +
  • +
  • +

    #4127 more helpful diagnostic message if PATH doesn’t contain cargo (this PR also broke everything)

    +
  • +
  • +

    #4129 unbreak everything.

    +
  • +
  • +

    #4134 fix panic on empty doc comment.

    +
  • +
  • +

    #4139 fix infinite macro loop on an empty repetition.

    +
  • +
  • +

    #4146 completion doesn’t add () when completiing high-order function argument.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #4060 update chalk, the new version uses more caching and should be faster.

    +
  • +
  • +

    #4061, #4066, #4101 cleanups of proc macro infrastructure.

    +
  • +
  • +

    #4094 show stderr from proc macro server.

    +
  • +
  • +

    #4038 when generating code for AST, move boring impl out of the way.

    +
  • +
  • +

    #4080, #4081 improve Show Syntax Tree internal action.

    +
  • +
  • +

    #4099, #4108 hide implementation details of "pointer" to a syntax tree node.

    +
  • +
  • +

    #4131 switch to text-size crate for representing text offsets and ranges.

    +
  • +
  • +

    #4135 rename StructFieldField everywhere.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/05/04/changelog-23.html b/thisweek/2020/05/04/changelog-23.html new file mode 100644 index 00000000..462c3edc --- /dev/null +++ b/thisweek/2020/05/04/changelog-23.html @@ -0,0 +1,236 @@ + + + + + + + + + + Changelog #23 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #23

+ +
+
+
+

Commit: 6a48a94
+Release: 2020-05-04

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #4222 C/C++ for Visual Studio Code extension as an alternative debug engine for Debug Code lens.

    +
  • +
  • +

    #4153, #4276, #4278 add support for incremental text synchronization.

    +
  • +
  • +

    #4157 we now use x86_64-unknown-linux-gnu instead of x86_64-unknown-linux-musl for binary releases for Linux. The main reason is that our proc-macro impl does not work under musl, as it lacks dlopen.

    +
  • +
  • +

    #4207 add Unwrap Block assist:

    +
    +
    +80965443 cf7f3f80 8e12 11ea 89e3 972503f30ca7 +
    +
    +
  • +
  • +

    #4270 add completion for derive macros:

    +
    +
    +80965765 6cda7380 8e13 11ea 9720 7f0704b8c1cc +
    +
    +
  • +
  • +

    #4198 complete union fields after dot.

    +
  • +
  • +

    #4199 document how to use ale with vim.

    +
  • +
  • +

    #4205 improve YouCompleteMe setup instructions for vim.

    +
  • +
  • +

    #4236 document Gnome Builder support.

    +
  • +
  • +

    #4162 complete associated items on type parameters.

    +
  • +
  • +

    #4178, #4227, #4246 show errors for misplaced crate, self and super in paths.

    +
  • +
  • +

    #4210, #4244 include function and traits qualifiers in hover.

    +
  • +
  • +

    #4167 implement CodeActionKind for assists.

    +
  • +
  • +

    #4258 Run action now includes option for testing the current package as a whole.

    +
  • +
  • +

    #4234 support local_inner_macros.

    +
  • +
  • +

    #4268 auto-import works inside macros.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #4173 use core instead of std for builtin derive macros.

    +
  • +
  • +

    #4183 format specifiers uses a dedicated token type, formatSpecifier.

    +
  • +
  • +

    #4184 treat comments beginning with four slashes as regular line comments.

    +
  • +
  • +

    #4203 better filtering of qualified enum variants in completion.

    +
  • +
  • +

    #4204 if-let to match assists now uses more specific pattern instead of _.

    +
  • +
  • +

    #4221, #4225 better support try! macro on 2015 edition.

    +
  • +
  • +

    #4231 fix a bunch of false-positives in join-lines.

    +
  • +
  • +

    #4253 remove workspaceLoaded setting, it no longer makes sense after +we’ve switched to progress

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #4148 simplify profiler implementation.

    +
  • +
  • +

    #4196 rebuild rust-analyzer when launching in VS Code.

    +
  • +
  • +

    #4208 use semanic info for finding From trait in Add From impl assist.

    +
  • +
  • +

    #4119 cache proc-macro dlls.

    +
  • +
  • +

    #4219 avoid rustup invocation for non-rustup rust installation.

    +
  • +
  • +

    #4223 allow piping and setting env var in the not_bash infra.

    +
  • +
  • +

    #4233 accidentally remove "dead" code, which turned out to be very much alive.

    +
  • +
  • +

    #4254 restore the "dead" code back.

    +
  • +
  • +

    #4220 introduce LowerCtx for correctly dealing with hygiene.

    +
  • +
  • +

    #4256 improve formatting of analyzer status text.

    +
  • +
  • +

    #4257 refactor grammar for block-like expressions, introduce ast::EffectExpr.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/05/11/changelog-24.html b/thisweek/2020/05/11/changelog-24.html new file mode 100644 index 00000000..16862238 --- /dev/null +++ b/thisweek/2020/05/11/changelog-24.html @@ -0,0 +1,237 @@ + + + + + + + + + + Changelog #24 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #24

+ +
+
+
+

Commit: eb892d7
+Release: 2020-05-11

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #4043 Change Return Type to Result assist

    +
    +
    +81538330 ea9c0300 936e 11ea 90d3 23525b545cd2 +
    +
    +
  • +
  • +

    #4320 Run action and code lens now supports doc tests on functions

    +
    +
    +81537179 18804800 936d 11ea 9e86 c7e6feaf38fd +
    +
    +
  • +
  • +

    #4411 Unwrap Block now works for single else:

    +
    +
    +81539698 ea046c00 9370 11ea 899f 9e38238ee25b +
    +
    +
  • +
  • +

    #4166 rust-analyzer.cargo.target setting for specifying target tripple rust-analyzer uses for analysis.

    +
  • +
  • +

    #4328 rust-analyzer.checkOnSave.allFeatures setting (all by default) to run cargo check with all features enabled.

    +
  • +
  • +

    #4372 'rust-analyzer.inlayHints.enable' settings for conveniently disabling all inlay hints.

    +
  • +
  • +

    #4265 Change Visibility assist now works for tuple struct fields.

    +
    +
    +81536600 22ee1200 936c 11ea 91be 37698d642fa7 +
    +
    +
  • +
  • +

    #4316 always display full types on hover.

    +
  • +
  • +

    #4333 add installation instructions for Arch Linux (rust-analyzer is now packaged!).

    +
  • +
  • +

    #4296 fetch cfg`s from `build.rs.

    +
  • +
  • +

    #4329 in addition to PATH, look for cargo and rustc in ~/.cargo/bin.

    +
  • +
  • +

    #4414 highlight static mut as mutable, highlight name of the macro defined with macro_rules.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #4419 fix panic in AstIdMap due to files with \r\n.

    +
  • +
  • +

    #4295 specify all rust-analyzer specific tokens and modifiers in package.json. +You can use these custom types to tweak syntax highlighting for Rust.

    +
  • +
  • +

    #4305 correctly handle namespaces for structs in name resolution.

    +
  • +
  • +

    #4325 fix conversion to UTF-16 indexing for supplementary plane characters.

    +
  • +
  • +

    #4347 fix pattern exhaustiveness checks for ! type.

    +
  • +
  • +

    #4353, #4365 work around VS Code TextMate scope bugs, kudos to @georgewfraser for tracking those down!

    +
  • +
  • +

    #4359, #4409 fix panic in function signature.

    +
  • +
  • +

    #4346 fix visibility checks in rename for enum variants.

    +
  • +
  • +

    #4362 do not show runnables for main function outside of a binary target.

    +
  • +
  • +

    #4376, #4412, #4377, #4379 various type inference fixes.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #4300, #4303 cleanup attribute completion, making sure that each "completion contributor" is independent from the others.

    +
  • +
  • +

    #4321 rename ast::ImplItem → ast::AssocItem.

    +
  • +
  • +

    #4350 implement new API for assists infrastructure.

    +
  • +
  • +

    #4339 assert correct capitalization of labels in edits.

    +
  • +
  • +

    #4340, #4344 use the single SourceChange to describe all edits.

    +
  • +
  • +

    #4341 make it possible to sort assist by relevance without computing the action.

    +
  • +
  • +

    #4331 helpfully detect errors when parsing rust-analyzer fixtures.

    +
  • +
  • +

    #4366 unify lldb and native windows debugger handling.

    +
  • +
  • +

    #4175, #4389 introduce `HirDisplay`ko method for rendering source code & use it in Add Function and Specify Type Explicitly assists

    +
  • +
  • +

    #4418 refactor conversion between LSP and rust-analyzer native types.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/05/18/changelog-25.html b/thisweek/2020/05/18/changelog-25.html new file mode 100644 index 00000000..3eef9317 --- /dev/null +++ b/thisweek/2020/05/18/changelog-25.html @@ -0,0 +1,207 @@ + + + + + + + + + + Changelog #25 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #25

+ +
+
+
+

Commit: 31611da
+Release: 2020-05-18

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #4397 implement a basic TextMate grammar which plays better with our semantic highlighting.

    +
  • +
  • +

    #4358 ifl postfix template for Result and Option

    +
    +
    +82217445 b7331880 991a 11ea 8e9a 698e3dc07106 +
    +
    +
  • +
  • +

    #4423 tmod item-level snippet.

    +
    +
    +82217447 b8644580 991a 11ea 87e1 a8c61d21583f +
    +
    +
  • +
  • +

    #4273 Add Visibility assist now works on paths, adding a visibility to an item in other module:

    +
    +
    +82217439 b39f9180 991a 11ea 92e9 f162c41debc6 +
    +
    +
  • +
  • +

    #4448 Generate Launch Configuration command to save debug configurations for specific tests:

    +
    +
    +82217442 b601eb80 991a 11ea 99dd b0c2bba786c8 +
    +
    +
  • +
  • +

    #4436 use .rust sufix on TextMate scopes introduced by rust-analyzer for easier theming.

    +
  • +
  • +

    #4427 use Ubuntu 16.04 to build releases, to get older glibc.

    +
  • +
  • +

    #4400, #4473 improve syntax higlighting, underline mutable bindings in all themes.

    +
  • +
  • +

    #4455 in completion, prioritise locals with correct types.

    +
  • +
  • +

    #4288 initial implementation of renaming of self parameter, for switching between associated function and a method.

    +
  • +
  • +

    #4479, #4484 support for dyn Trait.

    +
  • +
  • +

    #4489 reduce allocations, improving performance for batch analysis for up to 4%.

    +
  • +
  • +

    #4496 we now support two latest versions of VS Code.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #4421 fix visibility handling in find references.

    +
  • +
  • +

    #4403 check client capabilities before sending progres notifications.

    +
  • +
  • +

    #4447 make sure that play arrow in Run lens is not emoji-ifyied.

    +
  • +
  • +

    #4431 don’t garbage-collect results of procedural macro expansion, to combat non-deterministic proc macros. +Please avoid randomized hash maps when writing procedural macros :-)

    +
  • +
  • +

    #4470 handle Self in values and patterns.

    +
  • +
  • +

    #4472 fix path resolution for module and function with same name.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #4424 use RA_LOG variable to enable rust-analyzer’s logging, so as not to conflict with usual RUST_LOG.

    +
  • +
  • +

    #4083 document rust-analyzer’s AST.

    +
  • +
  • +

    #4405 make some internal types public so that rust-analyzer is easier to use as a library.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/05/25/changelog-26.html b/thisweek/2020/05/25/changelog-26.html new file mode 100644 index 00000000..1dfbdfcf --- /dev/null +++ b/thisweek/2020/05/25/changelog-26.html @@ -0,0 +1,222 @@ + + + + + + + + + + Changelog #26 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #26

+ +
+
+
+

Commit: fbb8b88
+Release: 2020-05-25

+
+
+

In the effort to improve support for all editors, and to speedup acceptance of rust-analyzer extensions to the Language Server Protocol, all extensions are now documented:

+
+ +
+

If you maintain rust-analyzer plugin for some editor, consider implementing these extensions and giving feedback for the corresponding upstream issue at Microsoft/language-server-protocol. +Additionally, consider subscribing to #4604, which will announce all future extensions and changes. +Note that we don’t have any compatibility guarantees yet — all our extensions are subject to change on a short notice.

+
+
+
+
+

Sponsors

+
+
+

Starting this week, we’ll be mentioning our significant Open Collective backers of "Sponsor" level or higher in the changelogs.

+
+
+

This week, we welcome a new sponsor: Prisma, a modern database toolkit for Node.js and TypeScript built with Rust under the hood.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #4518 Add TurboFish assist

    +
    +
    +82789805 3cfb1a80 9e6b 11ea 9100 a14d722d2620 +
    +
    +
  • +
  • +

    #4464 Run action passes --feature flags to cargo based on the required cfg.

    +
  • +
  • +

    #4555 on NixOS, automatically patchelf downloaded rust-analyzer binary.

    +
  • +
  • +

    #4474 highlight attributes.

    +
  • +
  • +

    #4556 dedicated highlighting for true and false.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #4491 run doctest feature works on item inside impls.

    +
  • +
  • +

    #4505 infer return type of loops with value breaks.

    +
  • +
  • +

    #4528 fix debug lens fix for binary targets.

    +
  • +
  • +

    #4526 take tree at fixing ▶ symbol.

    +
  • +
  • +

    #4559 add blank line after module path in hover text.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #4538 add tests for VS Code extension.

    +
  • +
  • +

    #4494, #4519 change implementation of code actions to use snippets.

    +
  • +
  • +

    #4543 remove old infrastructure for cursor placement.

    +
  • +
  • +

    #4552 use snippets for onEnter handling.

    +
  • +
  • +

    #4569 change implementation of code action groups to make it upstreamable.

    +
  • +
  • +

    #4501, #4506 improve performance of auto-import.

    +
  • +
  • +

    #4520 better test marks infrastructure.

    +
  • +
  • +

    #4532 split change_visibility and fix_visibility assists.

    +
  • +
  • +

    #4516 use two-stage LSP initialization, to better account for capabilities.

    +
  • +
  • +

    #4571 remove label from SourceChange.

    +
  • +
  • +

    #4570 leverage Chalk’s impls for built-ins.

    +
  • +
  • +

    #4573 cleanup Chalk integration code.

    +
  • +
  • +

    #4575 leverage Chalk’s impls for functions items and pointers.

    +
  • +
  • +

    #4590 upgrade rustc_lexer.

    +
  • +
  • +

    #4495 improve parsing of test fixtures.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/06/01/changelog-27.html b/thisweek/2020/06/01/changelog-27.html new file mode 100644 index 00000000..0e5dfe68 --- /dev/null +++ b/thisweek/2020/06/01/changelog-27.html @@ -0,0 +1,185 @@ + + + + + + + + + + Changelog #27 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #27

+ +
+
+
+

Commit: 7ae247f
+Release: 2020-06-01

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #4646 users.rust-lang.org now includes a dedicated category for IDE-related questions: IDEs and editors.

    +
  • +
  • +

    #4664 add most of the features of rust-analyzer to the manual. +Each feature includes a link to the source code which implements the feature. +If something does not work exactly as you want it to, you know what to do ;)

    +
  • +
  • +

    #4602, #4603 add semantic token types for boolean literals and self keyword.

    +
  • +
  • +

    #4621, #4654 highlighting for ? operator.

    +
  • +
  • +

    #4534 .call postfix completion.

    +
  • +
  • +

    #4640 add inRustProject when-clause for commands in vscode.

    +
  • +
  • +

    #4648 support the nightly raw reference operator.

    +
  • +
  • +

    #4562 Introduce Named Lifetime assist.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #4612 correctly tag releases.

    +
  • +
  • +

    #4617 fix rendering of hover.

    +
  • +
  • +

    #4629 don’t display inlay hints in diff view in VS Code.

    +
  • +
  • +

    #4596 when completing parameter names, don’t include leading underscore.

    +
  • +
  • +

    #4592 correctly compute text edit during completion if the partially-typed identifier is a keyword.

    +
  • +
  • +

    #4651 to improve completion, prefer first type in if else if there’s a type mismatch.

    +
  • +
  • +

    #4653 fix match ergonomics in closure parameters.

    +
  • +
  • +

    #4667 infer labelled breaks correctly.

    +
  • +
  • +

    #4669 in VS Code plugin always derive from process.env when spawning a child process/shell execution.

    +
  • +
  • +

    #4674 recursively search submodules to find modules in which a definition is visible.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+ +
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/06/08/changelog-28.html b/thisweek/2020/06/08/changelog-28.html new file mode 100644 index 00000000..8c8406d8 --- /dev/null +++ b/thisweek/2020/06/08/changelog-28.html @@ -0,0 +1,242 @@ + + + + + + + + + + Changelog #28 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #28

+ +
+
+
+

Commit: d696776
+Release: 2020-06-08

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #4711 don’t pass --all-features by default, use Cargo’s default features instead.

    +
  • +
  • +

    #4720 highlight unsafe operations inside unsafe blocks. In VS Code, you can use editor.semanticTokenColorCustomizations to customize the actual coloring

    +
    +
    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +
    "editor.semanticTokenColorCustomizations": {
    +    "[Theme Name]": {
    +        "rules": {
    +            "operator.unsafe": "#f00",
    +            "function.unsafe": "#f00"
    +        },
    +    }
    +}
    +
    +
    +
    +
    +
    +84034187 48d1fb00 a99a 11ea 960b e6b3f73e7db1 +
    +
    +
  • +
  • +

    #4382 allow specifying key-value cfg options in JsonProject.

    +
  • +
  • +

    #4726 allow to override build-in project discovery with explicit list of `Cargo.toml`s to import:

    +
    +
    +
    1
    +
    { "rust-analyzer.linkedProjects": ["/home/projects/rust-analyzer/Cargo.toml"] }
    +
    +
    +
    +
  • +
  • +

    #4730 document rust-project.json file format, which can be used with non-Cargo based build systems. +Docs: #non-cargo-based-projects.

    +
  • +
  • +

    #4660 enable hover and autocomplete docs on macro generated items.

    +
  • +
  • +

    #4748 implement hover actions, as an alternative UI for code lenses.

    +
    +
    +84036613 b6cbf180 a99d 11ea 81e3 f3ecd9142937 +
    +
    +
  • +
  • +

    #4689 implement return position impl trait.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #4750 fix Introduce Named Lifetime assist to work in more cases.

    +
    +
    +84036167 22fa2580 a99d 11ea 8fec 493520297c3d +
    +
    +
  • +
  • +

    #4580 invoke correct cargo for run action in VS Code.

    +
  • +
  • +

    #4658 fix lexing of format strings.

    +
  • +
  • +

    #4721 use correct modifier for unused code.

    +
  • +
  • +

    #4502 mark fixes from diagnostics as quick fixes.

    +
  • +
  • +

    #4737 parse default unsafe & default const.

    +
  • +
  • +

    #4765 fix type parameter defaults.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #4761 use Chalk from crates.io.

    +
  • +
  • +

    #4748 build specialized index to improve auto-import performance.

    +
  • +
  • +

    #4717 compute assists text edits lazily.

    +
  • +
  • +

    #4703 document review process and contribution guidelines.

    +
  • +
  • +

    #4772 document certain high-level internal architecture invariants.

    +
  • +
  • +

    #4688 document initilizationOptions used by rust-analyzer.

    +
  • +
  • +

    #4710 make LSP extension for running tests & binaries less rust-specific.

    +
  • +
  • +

    #4723 derive local roots from workspace configuration.

    +
  • +
  • +

    #4724 rename WorldState → GlobalState.

    +
  • +
  • +

    #4758 actually test include!(concant!(env!())) pattern.

    +
  • +
  • +

    #4760 preliminary refactorings in preparation for new VFS.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/06/15/changelog-29.html b/thisweek/2020/06/15/changelog-29.html new file mode 100644 index 00000000..4c5af24b --- /dev/null +++ b/thisweek/2020/06/15/changelog-29.html @@ -0,0 +1,205 @@ + + + + + + + + + + Changelog #29 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #29

+ +
+
+
+

Commit: 017331a
+Release: 2020-06-15

+
+
+
+
+

Sponsors

+
+
+

This week, we’d like to give a shoutout to one of our oldest sponsors: +Embark Studios, a Stockholm-based game studio building a platform for the future of gamemaking and striving to support a thriving open-source ecosystem for game development in Rust.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #4683 initial version of semantic syntax highlighting for code inside doc comments.

    +
    +
    +83415249 1f0b5800 a41f 11ea 8fa6 c282434d6ff7 +
    +
    +
  • +
  • +

    #4576 Extract Enum Variant to Struct refactoring.

    +
    +
    +84659254 6f9ead00 af17 11ea 84ab bea16f160ecf +
    +
    +
  • +
  • +

    #4822 checkOnSave cargo flags by default are inherited from cargo flags.

    +
  • +
  • +

    #4700 add top level keywords completion.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #4775 goto definition work correctly for fields of enum variants.

    +
  • +
  • +

    #4784 correctly handle cfgs from rust-project.json.

    +
  • +
  • +

    #4803 parse default unsafe fn.

    +
  • +
  • +

    #4811 Unwrap Block works with match arms.

    +
  • +
  • +

    #4815 correctly parse <_> paths in patterns.

    +
  • +
  • +

    #4834 in field patterns, don’t highlight local binding as a field.

    +
  • +
  • +

    #4850 indent chain . even if there’s more stuff afterwards.

    +
  • +
  • +

    #4849 make known paths use core instead of std.

    +
  • +
  • +

    #4833 separating parsing of for in predicates and types.

    +
  • +
  • +

    #4858 prefer shorter paths for external items in auto import.

    +
  • +
  • +

    #4857 fix invalid shorthand initialization diagnostic for tuple structs.

    +
  • +
  • +

    #4862 re-enable "Warning" diagnostic severity for unused variables.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #4805 finish JsonProject transition to cfgs from the separate atoms and features.

    +
  • +
  • +

    #4810 simplify unwrapping of blocks.

    +
  • +
  • +

    #4832 reduce OUT_DIR special casing.

    +
  • +
  • +

    #4819 auto import go brrr (add an FST index to ImportMap and use it to speed up auto import).

    +
  • +
  • +

    #4843 don’t guess macro expansion crate.

    +
  • +
  • +

    #4875 introduce paths crate to track absolutness of path in the type system.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/06/22/changelog-30.html b/thisweek/2020/06/22/changelog-30.html new file mode 100644 index 00000000..cb0baf74 --- /dev/null +++ b/thisweek/2020/06/22/changelog-30.html @@ -0,0 +1,230 @@ + + + + + + + + + + Changelog #30 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #30

+ +
+
+
+

Commit: 3370c81
+Release: 2020-06-22

+
+
+
+
+

Sponsors

+
+
+

This week, we’d like to thank another long-time sponsor:

+
+
+

Discord, a place to talk with your communities and friends, built using Rust and other best-in-class tools.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #4839 implement goto type definition for inlay hints

    +
    +
    +83335671 0122e380 a2b7 11ea 9922 fbdcfb11a7f3 +
    +
    +
  • +
  • +

    #4851 add quickfix to add a struct field

    +
    +
    +85289481 d253f380 b497 11ea 8089 2f21e3fdb75e +
    +
    +
  • +
  • +

    #4860 accept relative paths in rust-project.json. +If a relative path is found as part of Crate.root_module or Root.path, interpret it as relative to the location of the rust-project.json file.

    +
  • +
  • +

    #4878 make Replace Qualified Name With Use replace all mentions of the path.

    +
  • +
  • +

    #4919 Structural Search Replace no longer requires to specify the type of the capture.

    +
  • +
  • +

    #4916 add configuration options to treat certain cargo check warnings with hint or information severity.

    +
    +
    +
    1
    +2
    +3
    +4
    +5
    +
    {
    +    "rust-analyzer.diagnostics.warningsAsHint": [
    +        "unused_variables"
    +    ]
    +}
    +
    +
    +
    +
  • +
  • +

    #4925 highlighting escape sequences in strings.

    +
  • +
  • +

    #4903 add documentation to the list of semantic tokens modifiers for code inside doc comments.

    +
  • +
  • +

    #4963 download artifacts into tmp dir. +This should prevent partially downloaded files in cases when the user closes vsode before the download is complete.

    +
  • +
  • +

    #4969 handle bindings after @ in patterns.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #4877 fix syntax highlighting of recursive macros.

    +
  • +
  • +

    #4876 don’t highlight unresolved references in doc comments.

    +
  • +
  • +

    #4915 only highlight rust code in doc comments.

    +
  • +
  • +

    #4959 syntax highlighting for documentation comments on macro definitions.

    +
  • +
  • +

    #4914, #4930 fix panic in match checking.

    +
  • +
  • +

    #4821 display doctest code lens before comment.

    +
  • +
  • +

    #4950, #4952, #4957 fix panics in type inference.

    +
  • +
  • +

    #4958 fix type inference for Fn traits.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #4891, #4948 add API for the new Virtual File System.

    +
  • +
  • +

    #4947 improve type checking to use up to 20% less memory.

    +
  • +
  • +

    #4934 directly leverage salsa queries for computing symbol index.

    +
  • +
  • +

    #4937 allow overriding rust-analyzer display version.

    +
  • +
  • +

    #4961, #4964 centralize in-flight LSP requests handling.

    +
  • +
  • +

    #4962 expand parsing API to allow more node types for SSR.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/06/29/changelog-31.html b/thisweek/2020/06/29/changelog-31.html new file mode 100644 index 00000000..aec52bf2 --- /dev/null +++ b/thisweek/2020/06/29/changelog-31.html @@ -0,0 +1,232 @@ + + + + + + + + + + Changelog #31 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #31

+ +
+
+
+

Commit: ca31b1d
+Release: 2020-06-29

+
+
+
+
+

Sponsors

+
+
+

This week, we’d like to thank another long-time sponsor:

+
+
+

Parity is building tooling and infrastructure for the decentralised, trustless Web in Rust.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #4990 introduce an ItemTree layer to avoid reparsing files. +This reduces the latency of "go to definition" in a simple benchmark on rust-analyzer by around 30%.

    +
  • +
  • +

    #5017 add custom cargo runners support. This adds an option to delegate actual cargo commands building to another extension. +For example, to use a different manager like cross. +cross-rust-analyzer is an example of such extension.

    +
  • +
  • +

    #5069 Extract Variable understands field init shorthand

    +
    +
    +86007529 d2b03980 ba17 11ea 998f 0e44f659041f +
    +
    +
  • +
  • +

    #4999 allow matching of whole macro calls in structural search replace.

    +
  • +
  • +

    #5007 allow matching within macro calls in structural search replace.

    +
  • +
  • +

    #4997 document GNOME Builder (Nightly) support for rust-analyzer.

    +
  • +
  • +

    #4940 set injected modifier for code in doctests. +Theme authors can use it to dim injected code.

    +
  • +
  • +

    #5047 matching brace works for | in lambdas

    +
    +
    +86006971 122a5600 ba17 11ea 8be7 f60b0a97eead +
    +
    +
  • +
  • +

    #5066 infer type for slice wildcard patterns.

    +
  • +
  • +

    #4587 missing unsafe diagnostics.

    +
  • +
  • +

    #5100, #5102: Add support for include_str and include_bytes.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #4900 fix name resolution for Self in enums.

    +
  • +
  • +

    #4988 don’t offer to add missing fields of unknown types.

    +
  • +
  • +

    #4992 never disable error logging on the frontend.

    +
  • +
  • +

    #5002 fix underflow panic when doctests are at top of file.

    +
  • +
  • +

    #5004 fix panic in split/merge import assists.

    +
  • +
  • +

    #5023 fix string literal inference in match.

    +
  • +
  • +

    #5015 account for updated module ids when determining whether a resolution is changed.

    +
  • +
  • +

    #5033 order of glob imports does not affect import shadowing.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #4976 new VFS.

    +
  • +
  • +

    #5068 prepare for dynamic project reloading.

    +
  • +
  • +

    Rewrite main loop in rust-analyzer.

    +
  • +
  • +

    #4982 upgrade chalk. This, and other type system improvements, bring the proportion of of unknown types in rust-analzyer to less than 1%.

    +
  • +
  • +

    #4983, #5010 add paths::RelPath[Buf].

    +
  • +
  • +

    #5013 uniformly trim test data.

    +
  • +
  • +

    #5014 centralize test data parsing.

    +
  • +
  • +

    #5029 use paths::AbsPath in more places.

    +
  • +
  • +

    #5034 cleanup project.json deserialization.

    +
  • +
  • +

    #5048, #5056 Canonicalize actor API.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/07/06/changelog-32.html b/thisweek/2020/07/06/changelog-32.html new file mode 100644 index 00000000..55046a5d --- /dev/null +++ b/thisweek/2020/07/06/changelog-32.html @@ -0,0 +1,294 @@ + + + + + + + + + + Changelog #32 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #32

+ +
+
+
+

Commit: 8b0983e
+Release: 2020-07-06

+
+
+
+
+

Sponsors

+
+
+

This week we’d like to thank one of our individual sponsors, @anp.

+
+
+

@anp maintains moxie project: a lightweight platform-agnostic declarative UI runtime, because incremental feedback latency and quality are core to building interactive software.

+
+
+

Become a sponsor: opencollective.com/rust-analyzer

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5169, #5188 initial support for dynamic workspace reloading.

    +
    +
    +86605844 8335b480 bfa7 11ea 964f 72e06f535607 +
    +
    +
  • +
  • +

    #5119 show notification while SSR is in progress.

    +
  • +
  • +

    #5120, #5154 add a simple SSR subcommand to the rust-analyzer command line binary:

    +
  • +
+
+
+
+
rust-analyzer ssr '$a.foo($b) ==> bar($a, $b)'
+
+
+
+
    +
  • +

    #5161 add initial support for placeholder constraints in structural search replace.

    +
  • +
  • +

    #5142 allow parallel type inference in batch mode (rust-analyzer analysis-stats).

    +
  • +
  • +

    #5178 emit folding ranges for multiline calls.

    +
  • +
  • +

    #5149 implement Chalk variable kinds, which improves type inference for primitives.

    +
  • +
  • +

    #5116 set categories for code actions.

    +
  • +
  • +

    #5192 take rust-analyzer.cargo.features into account when generating run configurations.

    +
  • +
  • +

    #5202 allow to set default environment for run configurations (docs):

    +
    +
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +
    "rust-analyzer.runnableEnv": [
    +  {
    +    // null mask means that this rule will be applied for all runnables
    +    // "mask": null,
    +    env: {
    +      "APP_ID": "1",
    +      "APP_DATA": "asdf"
    +    }
    +  },
    +  {
    +    "mask": "test_name",
    +    "env": {
    +      "APP_ID": "2", // overwrites only APP_ID
    +    }
    +  }
    +]
    +
    +
    +
    +
  • +
  • +

    #4864 Add optional target to crates in json project

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #5122 fix "Run | Debug" lens for examples.

    +
  • +
  • +

    #5124 partially fix handling of type params depending on type params.

    +
  • +
  • +

    #5211 partially fix inference of indexing argument.

    +
  • +
  • +

    #5096 fix handling of whitespace when applying SSR within macro expansions.

    +
  • +
  • +

    #5110 fix call hierarchy.

    +
  • +
  • +

    #5179 lower fields despite invalid type.

    +
  • +
  • +

    #5089 disable auto-complete on comments.

    +
  • +
  • +

    #5189 record and suggest assoc. items of traits via ImportMap.

    +
  • +
  • +

    #5212 fix renaming of nested out of line modules mod outer { mod inner; }.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5136 split namespace maps in ItemScope, reducing memory usage of the CrateDefMap query by ~130 MB (50%) on r-a.

    +
  • +
  • +

    #5175 more memory-efficient impl collection. +This saves roughly 90 MB in ImplsFromDepsQuery, which used to copy the list of all impls from libcore into every crate in the graph.

    +
  • +
  • +

    #5127 improve test infra for type inference test.

    +
  • +
  • +

    #5126 use FxHash{Map,Set} consistently.

    +
  • +
  • +

    #5101 add expect — a lighter-weight alternative to the insta snapshot testing library.

    +
  • +
  • +

    #5137 make gotodef tests more data-driven.

    +
  • +
  • +

    #5138 refactor runnable tests.

    +
  • +
  • +

    #5146, #5151 simplify inlay hints tests.

    +
  • +
  • +

    #5153, #5156, #5157, #5162 remove some generics from ra_hir interface.

    +
  • +
  • +

    #5158 correctly distinguish between semantical and display crate names.

    +
  • +
  • +

    #5160, #5167 reuse caches in more cases.

    +
  • +
  • +

    #5176 update expand macro tests.

    +
  • +
  • +

    #5193 move cargo metadata off the main loop.

    +
  • +
  • +

    #5199, #5200, #5201, #5205, #5214, #5215, #5219, #5221, #5226 refactor completion tests.

    +
  • +
  • +

    #5197 SSR internal refactors.

    +
  • +
  • +

    #5222 add "rehighlight after adding a new top-level function" to the set of bechmarks.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/07/13/changelog-33.html b/thisweek/2020/07/13/changelog-33.html new file mode 100644 index 00000000..8974e1fd --- /dev/null +++ b/thisweek/2020/07/13/changelog-33.html @@ -0,0 +1,257 @@ + + + + + + + + + + Changelog #33 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #33

+ +
+
+
+

Commit: 5ca7cd9
+Release: 2020-07-13

+
+
+
+
+

Sponsors

+
+
+

Ferrous Systems is a Berlin based consultancy focused on the Rust Programming language. +Ferrous Systems offers advice, training, open source development, and proprietary development services for a wide variety of applications in Rust, including embedded systems, compiler/tooling components, and web/backend technologies. +This week, Ferrous Systems is running Oxidize Global, an online conference for embedded systems in Rust! +Thanks to Ferrous Systems for supporting open source projects like rust-analyzer!

+
+
+

Become a sponsor: opencollective.com/rust-analyzer

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5293, #5299 automatically reload workspace on Cargo.toml and similar changes.

    +
    +
    +87297466 c4c6e200 c508 11ea 9fb0 519757220b5d +
    +
    +
  • +
  • +

    rust-analyzer is available via rustup:

    +
    +
    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +
    $ rustup update nightly
    +info: syncing channel updates ...
    +$ rustup component add \
    +    --toolchain nightly rust-analyzer-preview
    +info: installing component ...
    +$ rustup run nightly rust-analyzer --version
    +rust-analyzer 8b0983e
    +
    +
    +
    +
    +

    At the moment, the recommended way to install rust-analyzer is still via GitHub release.

    +
    +
  • +
  • +

    #4972 gzip rust-analyzer releases.

    +
  • +
  • +

    #5244 add a command to compute memory usage statistics using Archimedes' method.

    +
  • +
  • +

    #5270 highlight error for calls with too few/too many arguments.

    +
  • +
  • +

    #5284 add folding for record literals.

    +
  • +
  • +

    #5292 Goto Type Definition works for self.

    +
  • +
  • +

    #5294 complete function parameters in more cases

    +
    +
    +87296648 60efe980 c507 11ea 95d5 9b66623e2636 +
    +
    +
  • +
  • +

    #5314 use parameter semantic tag for function parameters.

    +
  • +
  • +

    #5326 add type inference support for unions.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #5319 upgrade Chalk, fixing a number of type inference bugs.

    +
  • +
  • +

    #5285 correctly determine cursor position when rewriting to a raw strings:

    +
    +
    +87071611 bdf35300 c21a 11ea 93d6 c04f1b1a8ac1 +
    +
    +
  • +
  • +

    #5243 consider EPERM error as other vscode processes using rust-analyzer.

    +
  • +
  • +

    #5252, #5255 fix a bug where workspace symbols in workspace would skip symbols +from top-level crate.

    +
  • +
  • +

    #5280 re-enable completion for incomplete impl blocks.

    +
  • +
  • +

    #5288 avoid accidentally overwriting config values.

    +
  • +
  • +

    #5286 cap the maximal number of syntax errors.

    +
  • +
  • +

    #4996 correctly generate new struct field in file containing struct def.

    +
  • +
  • +

    #5311 fix goto definition for type alias type parameters.

    +
  • +
  • +

    #5324 show implementation code lens for unions.

    +
  • +
  • +

    #5328 Change Visibility assist works on statics.

    +
  • +
  • +

    #5330 fix ignore attribute autocompletion.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5303 speed up code completion.

    +
  • +
  • +

    #5307 document how to profile code completion.

    +
  • +
  • +

    #5242 upgrade salsa to 0.15.0 which significantly improves rust-analyzer’s. +compile times, by avoiding repeated monomorphisations.

    +
  • +
  • +

    #5245 prepare AssistBuilder for assists which create new files.

    +
  • +
  • +

    #5247 modernize completion tests.

    +
  • +
  • +

    #5312 make a slow test parallel.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/07/20/changelog-34.html b/thisweek/2020/07/20/changelog-34.html new file mode 100644 index 00000000..909dcfeb --- /dev/null +++ b/thisweek/2020/07/20/changelog-34.html @@ -0,0 +1,226 @@ + + + + + + + + + + Changelog #34 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #34

+ +
+
+
+

Commit: c9c518e
+Release: 2020-07-20

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: opencollective.com/rust-analyzer

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5378 support vararg functions.

    +
  • +
  • +

    #5354 add Cargo feature for enabling mimalloc allocator. +Call for participation: pure Rust version of mimalloc would be really handy as cross-compilable fast allocator.

    +
  • +
  • +

    #5345 emit mutable modifier for self in semantic highlighting.

    +
  • +
  • +

    #5348 highlight punctuation using "operator" tag in semantic highlighting.

    +
  • +
  • +

    #5350 return only requested assists to the editor.

    +
  • +
  • +

    #5401 leverage chalk for type checking closures.

    +
  • +
  • +

    #5418 continue non-doc comments if there’s a trailing whitespace:

    +
    +
    +87931694 7d050500 ca8a 11ea 8b3f c958663795e6 +
    +
    +
  • +
  • +

    #5327 mark fixes from check on save as preferred.

    +
  • +
  • +

    #5430 Add turbofish assist works after ()

    +
    +
    +87852942 8f563600 c906 11ea 808b 63e8bf3fc228 +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #4676 upgrade procmacro ABI for the latest stable.

    +
  • +
  • +

    #5352, #5361 fix build on powerpc.

    +
  • +
  • +

    #5367 remove associated type bounds in Add Missing Members assist.

    +
  • +
  • +

    #5370 don’t insert duplicate () when completing tuple struct pattern.

    +
  • +
  • +

    #5377 fix goto definition for multi-segment macro paths.

    +
  • +
  • +

    #5379, #5396 guard against infinite macro expansion.

    +
  • +
  • +

    #5381 fix macro handling in type position.

    +
  • +
  • +

    #5385 fix off by one error when determining the active param.

    +
  • +
  • +

    #5390 fix progress registration error for check on save.

    +
  • +
  • +

    #5394 fix freeze when processing a certain crate with a lot of glob imports.

    +
  • +
  • +

    #5427 various fixes for Add/Remove # assists.

    +
  • +
  • +

    #5423 Correctly resolve associated types in path bindings.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5357 use relaxed atomic ordering for single location test marks.

    +
  • +
  • +

    #5358, #5373 cleanup hir diagnostics API.

    +
  • +
  • +

    #5355, #5376 implement license check.

    +
  • +
  • +

    #5387 add --memory-usage to analysis-bench.

    +
  • +
  • +

    #5405, #5415, #5417 refactor support for callables, so that IDE features that work for functions, work for lambdas as well.

    +
  • +
  • +

    #5413 rewrite call info to use semantic information.

    +
  • +
  • +

    #5422 use expect! for snapshot testing in ra_hir_def.

    +
  • +
  • +

    #5433 simplify file exclusion logic in VFS.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/07/27/changelog-35.html b/thisweek/2020/07/27/changelog-35.html new file mode 100644 index 00000000..677f6202 --- /dev/null +++ b/thisweek/2020/07/27/changelog-35.html @@ -0,0 +1,219 @@ + + + + + + + + + + Changelog #35 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #35

+ +
+
+
+

Commit: 8ff40af
+Release: 2020-07-27

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: opencollective.com/rust-analyzer

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5524 allow opting out of experimental diagnostics like MismatchedArgCount.

    +
  • +
  • +

    #5518 use resolved paths in SSR rules. The main user-visible changes are:

    +
    +
      +
    • +

      SSR now matches paths based on whether they resolve to the same thing instead of whether they’re written the same.

      +
      +
        +
      • +

        So foo() won’t match foo() if it’s a different function foo(), but will match bar::foo() if it’s the same foo.

        +
      • +
      +
      +
    • +
    • +

      Paths in the replacement will now be rendered with appropriate qualification for their context.

      +
      +
        +
      • +

        For example foo::Bar will render as just Bar inside the module foo, but might render as baz::foo::Bar from elsewhere.

        +
      • +
      +
      +
    • +
    • +

      This means that all paths in the search pattern and replacement template must be able to be resolved.

      +
    • +
    • +

      It now also matters where you invoke SSR from, since paths are resolved relative to wherever that is.

      +
    • +
    • +

      Search now uses find-uses on paths to locate places to try matching. This means that when a path is present in the pattern, search will generally be pretty fast.

      +
    • +
    • +

      Function calls can now match method calls again, but this time only if they resolve to the same function.

      +
    • +
    +
    +
  • +
  • +

    #5527 track internal metrics: https://rust-analyzer.github.io/metrics/.

    +
  • +
  • +

    #5470 use cargo.target for checkOnSave.

    +
  • +
  • +

    #5451 highlight more cases punctuation characters.

    +
  • +
  • +

    #5475 support Trait as _ imports.

    +
  • +
  • +

    #5492 use symbol tags.

    +
  • +
  • +

    #5500 problem matcher auto detects relative/absolute paths and matches VSCode LSP’s owner and source.

    +
  • +
  • +

    #5473 new format of rust-project.json — configuration file for non Cargo-based projects.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #5467 allow null or empty values for configuration.

    +
  • +
  • +

    #5466 do not show default types in function and closure return values.

    +
  • +
  • +

    #5478 replace existing visibility modifier in Fix Visibility assist.

    +
  • +
  • +

    #5480 fix snippetTextEdits applying to other files.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5458, #5472 fully switch from insta to expect.

    +
  • +
  • +

    #5479 allow gathering memory stats on non-jemalloc Linux.

    +
  • +
  • +

    #5481 track document versions in the server.

    +
  • +
  • +

    #5497 store macro invocation parameters green trees instead of token +trees, which improves memory usage.

    +
  • +
  • +

    #5519 cache macro expansion in semantics.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/08/03/changelog-36.html b/thisweek/2020/08/03/changelog-36.html new file mode 100644 index 00000000..a5c47578 --- /dev/null +++ b/thisweek/2020/08/03/changelog-36.html @@ -0,0 +1,222 @@ + + + + + + + + + + Changelog #36 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #36

+ +
+
+
+

Commit: e96bfd8
+Release: 2020-08-03

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: opencollective.com/rust-analyzer

+
+
+
+
+

New Features

+
+
+
    +
  • +

    We started the effort to share the parser between rust-analyzer and rustc. +This will take a while to complete, and won’t give any new user-visible features until completion. +As the first step, rust-analyzer now uses +this grammar +to generate syntax tree structure.

    +
  • +
  • +

    #5547 fold multiline parameter lists.

    +
  • +
  • +

    #5561: allow running more tests at once via the module runners:

    +
    +
    +88724896 e85a7100 d133 11ea 99ee 689126679cbc +
    +
    +
  • +
  • +

    #5563 Check all targets for package-level tasks. +When invoking "Select Runnable" with the caret on a runnable with a specific target (test, bench, binary), append the corresponding argument for the cargo check -p module runnable.

    +
  • +
  • +

    #5586 Support new sysroot layout on nightly.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #5596 add checkOnSave.noDefaultFeatures and correct how we handle some cargo flags.

    +
  • +
  • +

    #5565 don’t mix non-path-based rules with path-based in Structural Search Replace.

    +
  • +
  • +

    #5554 fix Remove dbg assist to not remove meaningful parenthesis and semicolons.

    +
  • +
  • +

    #5567 wrap placeholder expansions in SSR in parenthesis when necessary.

    +
  • +
  • +

    #5513 when generating launch.json configurations, correctly handle multi-folder workspaces.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5572 Switch to ungrammar for generating syntax trees.

    +
  • +
  • +

    #5574 Replace rand with oorandom.

    +
  • +
  • +

    #5581 Use perf-events to measure number of instructions in addition to wall clock time for metrics to get more stable measurements on CI. That plan was foiled by perf not working on the CI.

    +
  • +
  • +

    #5573, #5578, …​ : rename various AST types

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Old NameNew Name

    ast::NominalDef

    ast::AdtDef

    ast::ModuleItem

    ast::Item

    ast::Alias

    ast::Rename

    ast::TypeParamList

    ast::GenericParamList

    ast::TypeRef

    ast::Type

    ast::PlaceholderType

    ast::InferType

    ast::DotDotPat

    ast::RestPat

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/08/10/changelog-37.html b/thisweek/2020/08/10/changelog-37.html new file mode 100644 index 00000000..fc66316f --- /dev/null +++ b/thisweek/2020/08/10/changelog-37.html @@ -0,0 +1,176 @@ + + + + + + + + + + Changelog #37 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #37

+ +
+
+
+

Commit: 7a03f05
+Release: 2020-08-10

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: opencollective.com/rust-analyzer

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5648: Add expand glob import assist.

    +
  • +
  • +

    #5639: Structural Search Replace: Allow self in patterns.

    +
  • +
  • +

    #5526: Handle semantic token deltas, improving efficiency of syntax highlighting.

    +
  • +
  • +

    #5678: Highlight static mut accesses as unsafe.

    +
  • +
  • +

    #5684: Semantic highlighting for unsafe union field access.

    +
  • +
  • +

    #5692: Add syntax highlighting, hover, and goto def support for extern crate.

    +
  • +
  • +

    #5698: Display the value of a const on hover.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #5658: Do not add to pub use in assists that insert a use statement.

    +
  • +
  • +

    #5668: Fix relative path handling for custom rustfmt.

    +
  • +
  • +

    #5664: Fix renamed self module in imports.

    +
  • +
  • +

    #5679: Account for static mut in missing unsafe diagnostic.

    +
  • +
  • +

    #5694: Fix # lines not getting removed in hover docs.

    +
  • +
  • +

    #5414: Fix positioning of test code lens.

    +
  • +
  • +

    #5693: Fix no inlay hints / unresolved tokens until manual edit to refresh.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5494: Use salsa’s purge to account for all memory.

    +
  • +
  • +

    #5669: Document release process.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/08/17/changelog-38.html b/thisweek/2020/08/17/changelog-38.html new file mode 100644 index 00000000..8ab224ab --- /dev/null +++ b/thisweek/2020/08/17/changelog-38.html @@ -0,0 +1,202 @@ + + + + + + + + + + Changelog #38 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #38

+ +
+
+
+

Commit: 0b2b9a5
+Release: 2020-08-17

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: opencollective.com/rust-analyzer

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5705 log the command flycheck runs to debug misconfigurations.

    +
  • +
  • +

    #5711 display snippet in the completion label.

    +
  • +
  • +

    #4743 add tracking of packed repr, use it to highlight unsafe refs.

    +
  • +
  • +

    #5637 Structural Search Replace: match trait associated constants, types and functions.

    +
  • +
  • +

    #5746 SSR now handles UFCS calls to trait methods.

    +
  • +
  • +

    #5766 initial support for function-like procedural macros.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #5696 respond InvalidRequest if Shutdown has been requested.

    +
  • +
  • +

    #5730 Merge Imports assist handles self:

    +
    +
    +90399497 5216cc80 e09b 11ea 8fea e03ebc2f250e +
    +
    +
  • +
  • +

    #5732 don’t show inlay hints for complex patterns in arguments.

    +
  • +
  • +

    #5752 correctly display impl Trait<T> + Trait<T>.

    +
  • +
  • +

    #5756 vfs on windows is case-insensitive to the drive letter.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5707 address some FIXMEs for ra_assists.

    +
  • +
  • +

    #5716 test musl build on CI.

    +
  • +
  • +

    #5553 add fix ranges for diagnostics.

    +
  • +
  • +

    #5723 remove cargo audit from CI.

    +
  • +
  • +

    #5724, #5725, …​: remove ra_ prefix from crate names.

    +
  • +
  • +

    #5740, #5753, #5755 make hygiene private to hir.

    +
  • +
  • +

    #5768, #5768 make hir::Path private to hir.

    +
  • +
  • +

    #5757 document that CI should not depend on externalities.

    +
  • +
  • +

    #5759 rename hypotheticalspeculative (naming inspired by Roslyn).

    +
  • +
  • +

    #5760 document that xtasks should have few dependencies.

    +
  • +
  • +

    #5347 add rust-analyzer dump-chalk command.

    +
  • +
  • +

    #5778 upgrade chalk.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/08/24/changelog-39.html b/thisweek/2020/08/24/changelog-39.html new file mode 100644 index 00000000..f1118942 --- /dev/null +++ b/thisweek/2020/08/24/changelog-39.html @@ -0,0 +1,189 @@ + + + + + + + + + + Changelog #39 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #39

+ +
+
+
+

Commit: e65d48d
+Release: 2020-08-24

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: opencollective.com/rust-analyzer

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5821 Remove Unused Parameter refactoring.

    +
    +
    +91040554 bfcc7680 e60e 11ea 905f 548c4308246a +
    +
    +
  • +
  • +

    #5695 completion for unstable features.

    +
    +
    +91040123 feadfc80 e60d 11ea 8f7c 3d0e76e59f5b +
    +
    +
  • +
  • +

    #5643 Add new consuming modifier to semantic syntax highlighting, apply consuming and mutable to methods.

    +
  • +
  • +

    #5758 structural search replace now inserts *, & and &mut in the +replacement to match any auto[de]ref in the matched code.

    +
  • +
  • +

    #5682 allow disabling specific rust-analyzer diagnostics.

    +
    +
    +
    1
    +2
    +3
    +
    {
    +  "rust-analyzer.diagnostics.disabled": ["missing-structure-fields"],
    +}
    +
    +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #5782 make status notification confirm with JSON RPC specification.

    +
  • +
  • +

    #5787 fix missing match arm false positive.

    +
  • +
  • +

    #5687 correctly sort DocumentSymbols for Sublime Text.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5835 publish snapshot-testing library, expect-test to crates.io: https://lib.rs/crates/expect-test.

    +
  • +
  • +

    #5776 fix eslint errors on .eslintrc.js and rollup.config.js.

    +
  • +
  • +

    #5790 improve CI time by cleaning traget dir properly.

    +
  • +
  • +

    #5813 use lld to link rust-analyzer on Windows.

    +
  • +
  • +

    #5824 optimize unused parameters search.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/08/31/changelog-40.html b/thisweek/2020/08/31/changelog-40.html new file mode 100644 index 00000000..c8799cae --- /dev/null +++ b/thisweek/2020/08/31/changelog-40.html @@ -0,0 +1,194 @@ + + + + + + + + + + Changelog #40 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #40

+ +
+
+
+

Commit: ac4b134
+Release: 2020-08-31

+
+
+
+
+

Sponsors

+
+
+

This week we want to thank The Techno Creatives, a Gothenburg-based creative tech house merging strategy, design, and technology to catalyze innovation.

+
+
+

Become a sponsor: opencollective.com/rust-analyzer

+
+
+
+
+

New Features

+
+
+
    +
  • +

    wg-parselib is formed to tackle the hard task of sharing the parser between rust-analyzer and rustc. +Join discussion on Zulip or look for +WG-parslib tagged issues in rust-lang/rust.

    +
  • +
  • +

    #5859 automatically publish rust-analyzer crates with ra_ap prefix: https://crates.io/search?q=ra_ap. +You can use these crates to build your own tooling on top of rust-analyzer, which can be compile with stable rustc. +Note that we provide no backwards compatibility guarantees. +Building external tooling on top of rust-analyzer libraries is a non-goal at the moment.

    +
  • +
  • +

    #4873 resolve links in hover documentation.

    +
    +
    +91714233 91f5ad80 eb8b 11ea 8149 d9eeaf8150f9 +
    +
    +
  • +
  • +

    #5884 for non-cargo based projects (rust-project.json) add a short-cut to specify sysroot location.

    +
  • +
  • +

    #5861 support extern types.

    +
  • +
  • +

    #5877 complete pub keyword in field definitions.

    +
  • +
  • +

    #5889 add --log-file argument to redirect logs to a file (by default, rust-analyze writes logs to stderr).

    +
  • +
  • +

    #5885 add more options to configure the color of inlay hints.

    +
  • +
  • +

    pr:5893: Allow running harness = false tests.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #5733 fix several bugs in Expand Glob Imports assist.

    +
  • +
  • +

    #5841 fix downloading rust-analyzer being stuck on 100%.

    +
  • +
  • +

    #5888 Inline Variable works with field shorthand

    +
    +
    +91714758 aa19fc80 eb8c 11ea 82af 8b86941ca23c +
    +
    +
  • +
  • +

    #5887 improve fenced code block support for doctests.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5866 improve logging.

    +
  • +
  • +

    #5867 unify the API for working with docs & other attributes.

    +
  • +
  • +

    #5880 detect overlapping text edit bugs earlier.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/09/07/changelog-41.html b/thisweek/2020/09/07/changelog-41.html new file mode 100644 index 00000000..7e9b6a78 --- /dev/null +++ b/thisweek/2020/09/07/changelog-41.html @@ -0,0 +1,153 @@ + + + + + + + + + + Changelog #41 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #41

+ +
+
+
+

Commit: 0275b08
+Release: 2020-09-07

+
+
+
+
+

Sponsors

+
+
+

This week we want to thank the Microsoft FOSS Fund for their support and commitment! Also check out their whole program!

+
+
+

Become a sponsor on OpenCollective: opencollective.com/rust-analyzer +Become a sponsor on GitHub Sponsors: github.com/sponsors/rust-analyzer

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5930 Migrate to the latest Semantic Tokens Proposal for LSP 3.16.

    +
  • +
  • +

    #5940 Implement "Replace impl Trait function argument with the named generic" assist.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #5926 Bump token expansion limit.

    +
  • +
  • +

    #5939 Default checkOnSave.enable to true in server.

    +
  • +
  • +

    #5937 Update chalk to 0.25.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5935 Rewrite import insertion.

    +
  • +
  • +

    #5862 Forbid unnecessary merge commits.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/09/14/changelog-42.html b/thisweek/2020/09/14/changelog-42.html new file mode 100644 index 00000000..272fbd5c --- /dev/null +++ b/thisweek/2020/09/14/changelog-42.html @@ -0,0 +1,176 @@ + + + + + + + + + + Changelog #42 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #42

+ +
+
+
+

Commit: 0d03fe6
+Release: 2020-09-14

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5956 Highlight errors in macros.

    +
    +
    +92319594 b71e6c00 f022 11ea 94c1 f412905269dd +
    +
    +
  • +
  • +

    #5957 Add consuming modifier to lvalues that are passed by value and not Copy.

    +
  • +
  • +

    #5969 Complete modules based on existing files.

    +
    +
    +93090591 466bf500 f69d 11ea 9a8c f054a693287f +
    +
    +
  • +
  • +

    #5990 Implement box patterns.

    +
    +
    +93090576 3fdd7d80 f69d 11ea 95e9 8e1866f23c23 +
    +
    +
  • +
  • +

    #5971 Implement async blocks.

    +
    +
    +93090569 3b18c980 f69d 11ea 872c c3bbf99b2438 +
    +
    +
  • +
  • +

    #5976 Complete trait impl immediately after type/const/fn.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #5970 Use better heuristics for replacement text when removing dbg!.

    +
  • +
  • +

    #5981 Properly preserve macro braces during dbg! removal.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5968 Improve generation of Chalk programs.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/09/21/changelog-43.html b/thisweek/2020/09/21/changelog-43.html new file mode 100644 index 00000000..a0547ae9 --- /dev/null +++ b/thisweek/2020/09/21/changelog-43.html @@ -0,0 +1,166 @@ + + + + + + + + + + Changelog #43 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #43

+ +
+
+
+

Commit: e70cf70
+Release: 2020-09-21

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6011 document "consuming" semantic tokens modifier.

    +
  • +
  • +

    #6013 add support for custom flycheck commands with JSON project +workspaces.

    +
  • +
  • +

    #6016 emit rust-analyzer native diagnostics for unresolved imports and extern crates.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6008 when rendering completion item for a function, condense whitespace for readability.

    +
  • +
  • +

    #6010 make triggers for completing associated items more precise.

    +
  • +
  • +

    #6017 don’t report changes for no-op formatting.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #5993 update chalk to 0.27 and add support for extern opaque types.

    +
  • +
  • +

    #5989 refactor infrastructure for editing use statements.

    +
  • +
  • +

    #6024 simplify item tree IR for extern crate.

    +
  • +
  • +

    #6025, #6035 better error logging.

    +
  • +
  • +

    #6032 update signature help protocol.

    +
  • +
  • +

    #6036 don’t re-read open files from disk when reloading a workspace.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/09/28/changelog-44.html b/thisweek/2020/09/28/changelog-44.html new file mode 100644 index 00000000..9f0410db --- /dev/null +++ b/thisweek/2020/09/28/changelog-44.html @@ -0,0 +1,149 @@ + + + + + + + + + + Changelog #44 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #44

+ +
+
+
+

Commit: 277488b
+Release: 2020-09-28

+
+
+

Small release today: nightlies are blocked on fixing type inference bug.

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5846 when completing function calls, automatically insert &:

    +
    +
    +94450567 b7d39980 01ad 11eb 9a81 08717c9f76f6 +
    +
    +
  • +
  • +

    #6061 allow to use a Github Auth token for fetching releases. +This change allows to use a authorization token provided by Github in +order to fetch metadata for a RA release. Using an authorization token +prevents to get rate-limited in environments where lots of RA users use +a shared client IP (e.g. behind a company NAT).

    +
  • +
  • +

    #6056 add dbgr postfix completion, which expands to dbg!(&e)

    +
    +
    +94450989 33cde180 01ae 11eb 877a 6651124a707c +
    +
    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6048 document internal scope abstraction.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/10/05/changelog-45.html b/thisweek/2020/10/05/changelog-45.html new file mode 100644 index 00000000..cf14f455 --- /dev/null +++ b/thisweek/2020/10/05/changelog-45.html @@ -0,0 +1,192 @@ + + + + + + + + + + Changelog #45 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #45

+ +
+
+
+

Commit: 97d107e
+Release: 2020-10-05

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5928 add method references CodeLens:

    +
    +
    +91858244 95fbfb00 ec71 11ea 90c7 5b3ee067e305 +
    +
    +
  • +
  • +

    #5954 allow overriding command for Rust Analyzer: Run action:

    +
    +
    +92306622 2f404f80 ef99 11ea 9bb7 6c6192a2c54a +
    +
    +
  • +
  • +

    #5988 postfix completions for fmt-like string literals:

    +
    +
    +92998650 a048af80 f523 11ea 8fd8 410146de8caa +
    +
    +
  • +
  • +

    #6080 add linksInHover config option to remove links from markdown for clients which don’t support them.

    +
  • +
  • +

    #6096 Rust Analyzer: Status command now displays dependencies of the current file. +This is helps with trouble shooting project structure issues.

    +
  • +
  • +

    #5997 better inlay hints in for loops:

    +
    +
    +93024580 41a53380 f600 11ea 9bb1 1f8ac141be95 +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6088 Update chalk, fixing panics in type inference.

    +
  • +
  • +

    #6102 fix "rust-analyzer.assist.importMergeBehaviour": "last".

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6093 print current LSP request on panic.

    +
  • +
  • +

    #6019 remove make::path_from_text to keep editing API more structured.

    +
  • +
  • +

    #6116 update lexer.

    +
  • +
  • +

    #6090, #6114 additions to the style guide.

    +
  • +
  • +

    #6118 document internal policy about clippy.

    +
  • +
  • +

    #6123 unfork testing infarastructure.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/10/12/changelog-46.html b/thisweek/2020/10/12/changelog-46.html new file mode 100644 index 00000000..4229975b --- /dev/null +++ b/thisweek/2020/10/12/changelog-46.html @@ -0,0 +1,208 @@ + + + + + + + + + + Changelog #46 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #46

+ +
+
+
+

Commit: b7596d2
+Release: 2020-10-12

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6154 shorten type hints for std::iter iterators.

    +
    +
    +95746625 63ddb000 0c97 11eb 83d1 5f3e2fb997f6 +
    +
    +
  • +
  • +

    #6111 add assist for converting the base of integer literals.

    +
    +
    +MBhdPFH +
    +
    +
  • +
  • +

    #6139 add rust-analyzer.assist.importPrefix configuration open to configure style of auto-import.

    +
  • +
  • +

    #6140 honor hover.contentFormat client capability and strip markdown markup for clients which don’t support it.

    +
  • +
  • +

    #6160 add validation check for ambiguous trait objects.

    +
  • +
  • +

    #5651 fix proc macros support for Rust 1.47.

    +
  • +
  • +

    #6176 support eprintln! postfix completion.

    +
  • +
  • +

    #5858 show reasons for failed renames.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6127 correctly complete items with leading underscore.

    +
  • +
  • +

    #6143 fix name resolution for proc-macros.

    +
  • +
  • +

    #6147 tweak Remove dbg assist to remove useless parenthesis in more cases.

    +
  • +
  • +

    #6124 normalize - in crate names for display purposes.

    +
  • +
  • +

    #6148 fix trait object hir formatting behind pointer and references.

    +
  • +
  • +

    #6128 trim all trailing whitespace in onEnter.

    +
  • +
  • +

    #6158 fix negative literals in procedural macros.

    +
  • +
  • +

    #6181, #6188, #6189 fix resolve for enum variant fields.

    +
  • +
  • +

    #6185 better diagnostics for invalid RUST_SRC_PATH.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6133 add some notes related to privacy and network access.

    +
  • +
  • +

    #6149 smoke test documentation generation.

    +
  • +
  • +

    #6150, #6151 cleanup path handling in the IDE layer.

    +
  • +
  • +

    #6159 document "*.mutable" semantic token modifier in the manual.

    +
  • +
  • +

    #6161 upgrade chalk.

    +
  • +
  • +

    #6187 leverage new cargo defaults for profile for build dependencies.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/10/19/changelog-47.html b/thisweek/2020/10/19/changelog-47.html new file mode 100644 index 00000000..570bab3b --- /dev/null +++ b/thisweek/2020/10/19/changelog-47.html @@ -0,0 +1,226 @@ + + + + + + + + + + Changelog #47 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #47

+ +
+
+
+

Commit: 3ca97b0
+Release: 2020-10-19

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #5917 add rust-analyzer.openDocs command to open documentation of symbol under cursor:

    +
    +
    +DeVAfV4 +
    +
    +
  • +
  • +

    #6153 aggressively pre-warm caches on startup. +This should reduce latency in some cases, and give better indication about when rust-analyzer is fully ready.

    +
  • +
  • +

    #6137, #6248, #6275 add a new TextMate grammar.

    +
  • +
  • +

    #6130 quick fix to change casing of names.

    +
  • +
  • +

    #6230 improve logging during sysroot discovery. Use RA_LOG=project_model=debug to see those logs.

    +
  • +
  • +

    #6240 document auto-import: manual.html#import-insertion.

    +
  • +
  • +

    #6242 suggest field shorthand in patterns.

    +
  • +
  • +

    #6220 implement binary operator overloading type inference.

    +
  • +
  • +

    #6246 follow symlinks when crawling the project tree. +This doesn’t implement full support for symlinks, but fixes some of the cases.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6277 Change Visibility assist works for type aliases.

    +
    +
    +96458761 9a7c7300 1221 11eb 8243 1c722cc8b614 +
    +
    +
  • +
  • +

    #6199 fix semantic highlighting for mut self.

    +
  • +
  • +

    #6198 improve semantic highlighting of macro rules.

    +
  • +
  • +

    #6195 when shortening iterator hints, recursively shorten associated types.

    +
  • +
  • +

    #6213 fix "Invalid request: experimental/resolveCodeAction" panic.

    +
  • +
  • +

    #6209 fix auto-import merge behavior for full/last options.

    +
  • +
  • +

    #6222 fix stackoverflow in insert_use::recursive_merge.

    +
  • +
  • +

    #6236 prevent editors from forming ligatures with inlay hints.

    +
  • +
  • +

    #6234 fix hover over field pattern shorthand.

    +
  • +
  • +

    #6262 remove some incorrect completions.

    +
  • +
  • +

    #6271 complete method calls when receiver is a macro.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6260 switch build automation to use xshell

    +
  • +
  • +

    #6208 debug a befuddling failure on CI. +Turns out, macOS tar is broken, and can corrupt cargo’s caches, which would result in “crate not found” compilation errors.

    +
  • +
  • +

    #6207 make auto-import infrastructure more reusable.

    +
  • +
  • +

    #6226 test that all rust-analyzer’s protocol extensions are documented.

    +
  • +
  • +

    #6228 add S-actionable and S-unactionable issue labels.

    +
  • +
  • +

    #6231 split syntax highlighting into more modules.

    +
  • +
  • +

    #6233, #6239, #6250 additions to style guide.

    +
  • +
  • +

    #6276 move completion into a separate crate.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/10/26/changelog-48.html b/thisweek/2020/10/26/changelog-48.html new file mode 100644 index 00000000..dd5ed9b7 --- /dev/null +++ b/thisweek/2020/10/26/changelog-48.html @@ -0,0 +1,228 @@ + + + + + + + + + + Changelog #48 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #48

+ +
+
+
+

Commit: eae54b5
+Release: 2020-10-26

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6266 document all rust-analyzer native diagnostics in the manual.

    +
  • +
  • +

    #6297 project.json now allows setting a display name for crate. +This is used in UI, as well as for hacky work-around for cfg-if in the standard library.

    +
  • +
  • +

    #6299, #6324, #6339 highlight items which are disabled by the current set of cfg flags.

    +
  • +
  • +

    #6172 Qualify Path assist:

    +
    +
    +97172657 9c998100 178f 11eb 89de 172af96d0301 +
    +
    +
  • +
  • +

    #6256 Replace String Literal With Character Literal

    +
    +
    +97172891 fe59eb00 178f 11eb 80ce 57502898920b +
    +
    +
  • +
  • +

    #6109 complete clippy lint in attributes

    +
    +
    +97173004 29dcd580 1790 11eb 8bbc 932dd27a1e05 +
    +
    +
  • +
  • +

    #6259 when installing from source code, allow cargo xtask install --client=code-oss to support alternative code binaries.

    +
  • +
  • +

    #6098 suggest adding & to local variable during completion:

    +
    +
    +97173470 eafb4f80 1790 11eb 87a4 cb3f2407a2d8 +
    +
    +
  • +
  • +

    #6251 add callable modifier for things that implement Fn traits to semantic highlighting.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6288 fix long-standing bug where features merged in master close to release were missing from the changelog.

    +
  • +
  • +

    #6294 add a hack to resolve cfg-if inside standard library crates.

    +
  • +
  • +

    #6274 fix VS Code to correctly handle cargoExtraArgs.

    +
  • +
  • +

    #6302, #6320, #6330 fixes to the new TextMate grammar.

    +
  • +
  • +

    #6307 don’t highlight safe intrinsics as unsafe.

    +
  • +
  • +

    #6314 generate assist respect cfg attributes.

    +
  • +
  • +

    #6321 fix opening module documentation opening parent documentation instead.

    +
  • +
  • +

    #6319 fix false positive in camel case inspection.

    +
  • +
  • +

    #6326 hide paramater inlay hints for cloned vars if applicable.

    +
  • +
  • +

    #6337 fix indentation of inserted use statements.

    +
  • +
  • +

    #6331 correct hover text for items with doc attribute with raw strings.

    +
  • +
  • +

    #6357 don’t keep parens around with remove-dbg.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6284 document appropriate logging statements for debugging project model issues.

    +
  • +
  • +

    #6295, #6301 try harder to separate crate names as written in Cargo.toml from crate names in extern crate statements.

    +
  • +
  • +

    #6336, #6354 improve Chalk debugging.

    +
  • +
  • +

    #6310 support insertions and deletions in tree diffing.

    +
  • +
  • +

    #6342 improve physical architecture (shorten critical crate dependency chain).

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/11/02/changelog-49.html b/thisweek/2020/11/02/changelog-49.html new file mode 100644 index 00000000..37a335c8 --- /dev/null +++ b/thisweek/2020/11/02/changelog-49.html @@ -0,0 +1,177 @@ + + + + + + + + + + Changelog #49 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #49

+ +
+
+
+

Commit: 86d3b78
+Release: 2020-11-02

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6394 use smaller font-size for inlay hints in VS Code.

    +
  • +
  • +

    #6416 respond with JSON-RPC error message for invalid requests, instead of hard-crashing.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6361 fixes to TextMate grammar.

    +
  • +
  • +

    #6360 fix unary minus highlighting.

    +
  • +
  • +

    #6350 fix false positive for case checking diagnostics.

    +
  • +
  • +

    #6333 fix parsing of pub(in path) visibility.

    +
  • +
  • +

    #6367 correctly handle #![cfg] at the crate root.

    +
  • +
  • +

    #6257 don’t suggest extracting enum variant into a struct if it’s already extracted.

    +
  • +
  • +

    #6376 add a quick hack to fix type inference around Fn traits.

    +
  • +
  • +

    #6382, #6392 improve inlay hints presentation.

    +
  • +
  • +

    #6384 allow running struct’s doctests.

    +
  • +
  • +

    #6387, #6396 fix inlay hints for associated types.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6347 support insertion in SyntaxRewriter.

    +
  • +
  • +

    #6313 update LSP version.

    +
  • +
  • +

    #6351 rearrange code completion code.

    +
  • +
  • +

    #6415 upgrade chalk.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/11/09/changelog-50.html b/thisweek/2020/11/09/changelog-50.html new file mode 100644 index 00000000..f2855f2a --- /dev/null +++ b/thisweek/2020/11/09/changelog-50.html @@ -0,0 +1,218 @@ + + + + + + + + + + Changelog #50 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #50

+ +
+
+
+

Commit: 945900b
+Release: 2020-11-09

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6477 Infer Function Return Type assist.

    +
    +
    +98535642 bf935d00 2286 11eb 98c4 8bdf2c5aa93a +
    +
    +
  • +
  • +

    #6458, #6476 Add Custom Impl automatically fills-in required methods

    +
    +
    +98534279 84902a00 2284 11eb 8f65 b63c6e27c268 +
    +
    +
  • +
  • +

    #6456 Extract Enum Variant supports records

    +
    +
    +98535147 e7ce8c00 2285 11eb 8b12 802ceb249389 +
    +
    +
  • +
  • +

    #6480 Change Return Type to Result works for closures.

    +
    +
    +98535478 793dfe00 2286 11eb 9e3e 91724a1b93e1 +
    +
    +
  • +
  • +

    #6393 hide more trivial inlay hints.

    +
  • +
  • +

    #6421 take some of the allow(…​) attributes into account when producing rust-analyzer diagnostics.

    +
  • +
  • +

    #6479 ignore RUST_SRC_PATH if it is set to invalid location.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6436, #6447, #6450, #6488, #6489, #6491, #6497 fixes to TextMate grammar.

    +
  • +
  • +

    #6441 don’t overload the client with too many progress notifications.

    +
  • +
  • +

    #6399 keep existing type arguments in the Qualify Path assist.

    +
  • +
  • +

    #6401 fix inlay hints for self parameter.

    +
  • +
  • +

    #6287 auto-import preserves cursor position.

    +
  • +
  • +

    #6454 fix panic in Convert Integer Literal assist.

    +
  • +
  • +

    #6467 fix stack overflow when module includes itself.

    +
  • +
  • +

    #6470 fix syntax highlighting flicker.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6438 use -Dunreachable_pub on CI.

    +
  • +
  • +

    #6490 minimize Convert Integer Literal tests.

    +
  • +
  • +

    #6437, #6483 amend code style.

    +
  • +
  • +

    #6442 upgrade chalk.

    +
  • +
  • +

    #6365 improve tree diffing algorithm.

    +
  • +
  • +

    #6430 refactor completion rendering.

    +
  • +
  • +

    #6468 add issue template.

    +
  • +
  • +

    #6485 use the same type to represent both "hello" and r#"hello"# string literals.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/11/16/changelog-51.html b/thisweek/2020/11/16/changelog-51.html new file mode 100644 index 00000000..41491e84 --- /dev/null +++ b/thisweek/2020/11/16/changelog-51.html @@ -0,0 +1,191 @@ + + + + + + + + + + Changelog #51 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #51

+ +
+
+
+

Commit: e8c8039
+Release: 2020-11-16

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6524 add support for #![feature(rustc_private)]. +Set rust-analyzer.rustcSource to point to a directory with compiler’s sources if you develop tooling which uses compiler directly (clippy, rustfmt, etc).

    +
  • +
  • +

    #6500 add .some postfix template.

    +
    +
    +99246914 612a2980 2806 11eb 9f54 1111cdfe08c6 +
    +
    +
  • +
  • +

    #6544 add .. Default::default() completion.

    +
    +
    +99248146 4e185900 2808 11eb 9cca c85180ddb217 +
    +
    +
  • +
  • +

    #6472 add static semantic tokens modifier to associated functions.

    +
  • +
  • +

    #6519 Open Cargo.toml action opens a Cargo.toml file, relevant for the current .rs file.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6510 fix panic in Extract Struct From Enum Variant.

    +
  • +
  • +

    #6514 Extract Struct From Enum Variant updates references when extracting a record.

    +
  • +
  • +

    #6511 highlight . as an operator.

    +
  • +
  • +

    #6516 fixes to TextMate grammar.

    +
  • +
  • +

    #6534 fix attachment of inner doc comments.

    +
  • +
  • +

    #6529 do not insert imports before inner comments

    +
  • +
  • +

    #6513 support qualified function calls in Remove Unused Parameter assist.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6501 make assists API more orthogonal.

    +
  • +
  • +

    #6465 support multiple file edits in assists.

    +
  • +
  • +

    #6509 support multiple file tests in assists.

    +
  • +
  • +

    #6521 switch to upstream protocol for resolving code actions.

    +
  • +
  • +

    #6545 simplify project loading.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/11/23/changelog-52.html b/thisweek/2020/11/23/changelog-52.html new file mode 100644 index 00000000..60db0c27 --- /dev/null +++ b/thisweek/2020/11/23/changelog-52.html @@ -0,0 +1,190 @@ + + + + + + + + + + Changelog #52 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #52

+ +
+
+
+

Commit: cadf0e9
+Release: 2020-11-23

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6553 auto imports in completion:

    +
    +
    +99155339 ae4fb380 26bf 11eb 805a 655b1706ce70 +
    +
    +
  • +
  • +

    #6585 link error explanations via clickable codes in diagnostics:

    +
    +
    +99459468 6d110b00 292e 11eb 9cde d43ec9cebc09 +
    +
    +
  • +
  • +

    #6573 Ignore Test assist:

    +
    +
    +99943965 6a6d4600 2d72 11eb 9833 5d89c42fade1 +
    +
    +
  • +
  • +

    #6582 fill the diagnostic code field in publish_diagnostics.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6552 properly handle shorthands in destructure patterns when renaming:

    +
    +
    +99943469 a5bb4500 2d71 11eb 89dd ff76a00ee6f0 +
    +
    +
  • +
  • +

    #6574 Unwrap Block supports stand-alone blocks:

    +
    +
    +99945932 ceddd480 2d75 11eb 8e39 f5bae09ff8e4 +
    +
    +
  • +
  • +

    #6558 format string highlighting: handle hex + debug type.

    +
  • +
  • +

    #6563 don’t complete keywords in struct initializers.

    +
  • +
  • +

    #6598 ensure word boundary after true in TextMate grammar.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6566 update LSP to 3.16.

    +
  • +
  • +

    #6581 update vscode-languageclient.

    +
  • +
  • +

    #6578 simplify project_model.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/11/30/changelog-53.html b/thisweek/2020/11/30/changelog-53.html new file mode 100644 index 00000000..d9246de8 --- /dev/null +++ b/thisweek/2020/11/30/changelog-53.html @@ -0,0 +1,210 @@ + + + + + + + + + + Changelog #53 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #53

+ +
+
+
+

Commit: ac30710
+Release: 2020-11-30

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6645 add diagnostics for unexpandable macros.

    +
    +
    +100385784 f954b980 3023 11eb 9617 ac2eb0a0a9dc +
    +
    +
  • +
  • +

    #6666 support "go to definition" for self parameter.

    +
    +
    +100603959 2b0c9f80 3306 11eb 94fa a7285ed17cf6 +
    +
    +
  • +
  • +

    #6664 show type of self on hover.

    +
  • +
  • +

    #6606 support unsafe extern block syntax.

    +
  • +
  • +

    #6618, #6621 type inference for tuple patterns with ellipsis.

    +
  • +
  • +

    #6624 check structs for match exhaustiveness.

    +
  • +
  • +

    #6631 gate autoimports behind experimental completions.

    +
  • +
  • +

    #6599 add attribute highlight modifier to all tokens inside attributes.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6670 allow renaming between self and first param with owned parameters.

    +
    +
    +100604888 6f4c6f80 3307 11eb 85ac 773bda464ad5 +
    +
    +
  • +
  • +

    #6610 Ignore Test assist now.

    +
  • +
  • +

    #6614 improve performance of auto-import.

    +
  • +
  • +

    #6641 #[cfg] diagnostics are more robust to code changes.

    +
  • +
  • +

    #6635 complete struct in irrefutable let.

    +
  • +
  • +

    #6586 better label for Infer Function Return Type assist.

    +
  • +
  • +

    #6669 use the same default importing behavior in all editors.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6613 don’t crash on invalid DidChangeTextDocument notifications.

    +
  • +
  • +

    #6637 publish diagnostics on file open.

    +
  • +
  • +

    #6638, #6639, #6640 cleanup macro expansion.

    +
  • +
  • +

    #6651 add more profiling calls to completions.

    +
  • +
  • +

    #6652 add more profiling calls to macro expansion.

    +
  • +
  • +

    #6656 coalesce flycheck events.

    +
  • +
  • +

    #6650 make completion and assists crates independent.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/12/07/changelog-54.html b/thisweek/2020/12/07/changelog-54.html new file mode 100644 index 00000000..f1ea625a --- /dev/null +++ b/thisweek/2020/12/07/changelog-54.html @@ -0,0 +1,174 @@ + + + + + + + + + + Changelog #54 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #54

+ +
+
+
+

Commit: a0fa522
+Release: 2020-12-07

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6683 emit macro diagnostics in bodies.

    +
  • +
  • +

    #6673 show type of Self on hover.

    +
  • +
  • +

    #6721 use METHOD semantic token type.

    +
  • +
  • +

    #6734 emit additional diagnostics for hints/help/etc.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6680 fix use merging not using the first path segment.

    +
  • +
  • +

    #6688 place the cursor correctly when using qualified syntax for calling method.

    +
  • +
  • +

    #6689 trigger .let postfix snippet in the middle of the block.

    +
  • +
  • +

    #6649 accept more than just the standard rust literal suffixes.

    +
  • +
  • +

    #6701 fixes occasional "progress handler already registered" errors.

    +
  • +
  • +

    #6712 fix proc macro token mapping.

    +
  • +
  • +

    #6723 fix a crash in type inference.

    +
  • +
  • +

    #6724 fix rust-analyzer diagnostics CLI command to process modules recursively.

    +
  • +
  • +

    #6725 handle proc-macro crashes robustly.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6681, #6700 refactor builtin macros support.

    +
  • +
  • +

    #6698 attach macro expansion errors to the right file.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/12/14/changelog-55.html b/thisweek/2020/12/14/changelog-55.html new file mode 100644 index 00000000..f37fa742 --- /dev/null +++ b/thisweek/2020/12/14/changelog-55.html @@ -0,0 +1,260 @@ + + + + + + + + + + Changelog #55 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #55

+ +
+
+
+

Commit: dbd0cfb
+Release: 2020-12-14

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6761, #6776 editor-independent description of configuration format. +All server configs are now documented in the manual: +https://rust-analyzer.github.io/manual.html#configuration

    +
  • +
  • +

    #6769, #6841 Remove this semicolon fix:

    +
    +
    +101530533 b76c3180 399a 11eb 9d18 5c8457721655 +
    +
    +
  • +
  • +

    #6731 Replace match With if let assist:

    +
    +
    +102076127 88751600 3e07 11eb 8333 ef5a83459cf2 +
    +
    +
  • +
  • +

    #6706 lazily compute text edits for completion. This significantly speeds up completion in certain cases.

    +
  • +
  • +

    #6754, #6752, #6807 handle cross-compilation and cfg attributes from build scripts.

    +
  • +
  • +

    #6760 Open Cargo.toml now opens Cargo.toml for current package of the workspace.

    +
    +
    +102076855 aee78100 3e08 11eb 8e98 777e712e67c4 +
    +
    +
  • +
  • +

    #6771 handle inner attributes.

    +
  • +
  • +

    #6790 ask the editor to refresh code lenses when the project structure changes.

    +
  • +
  • +

    #6795 support key=value pairs in format!-like macros.

    +
  • +
  • +

    #6819 support built-in attributes in name resolution.

    +
  • +
  • +

    #6839 type inference for labeled blocks.

    +
  • +
  • +

    #6840 add VS Code level language configuration (indent, matching parenthesis, etc).

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6805 fix accidentally quadratic tree modification code. +This speeds up new auto-import completions a lot. +See this stream for an interesting discussion about tree editing API.

    +
  • +
  • +

    #6813 fix negative literals handling in declarative macros.

    +
  • +
  • +

    #6743 fix desugaring of doc attributes.

    +
  • +
  • +

    #6751 fix name resolution for builtin macros.

    +
  • +
  • +

    #6719 fix attachment of doc comments for modules and use items.

    +
  • +
  • +

    #6759 fix rollup build.

    +
  • +
  • +

    #6765 fix misplaced diagnostics in macros.

    +
  • +
  • +

    #6768 fix concat! with integer literals.

    +
  • +
  • +

    #6774 don’t bail to early when expanding erroneous macros.

    +
  • +
  • +

    #6796 fix FileId calculation in incorrect case diagnostics.

    +
  • +
  • +

    #6798 ignore extern items in incorrect-case check.

    +
  • +
  • +

    #6804 raise the size limit for macro-generated files.

    +
  • +
  • +

    #6816 complete PartialEq, Eq rather than Eq, PartialEq.

    +
  • +
  • +

    #6824 don’t highlight parent nodes of comments on hover.

    +
  • +
  • +

    #6845 fix source code generation with only partially substituted generics.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6806 improve docs for building from source.

    +
  • +
  • +

    #6597 upgrade chalk and make CHALK_OVERFLOW_DEPTH and +CHALK_SOLVER_MAX_SIZE configurable via corresponding env variables.

    +
  • +
  • +

    #6745 proc macro cleanups.

    +
  • +
  • +

    #6750, #6834, #6836 completely move doc comments handling to attributes.

    +
  • +
  • +

    #6767 better handling of panicking proc macros.

    +
  • +
  • +

    #6766 install from source now supports code-exploration.

    +
  • +
  • +

    #6784 add AnchoredPath abstraction to describe file-system paths in Rust files.

    +
  • +
  • +

    #6797 document preference for american spelling for code.

    +
  • +
  • +

    #6825, #6827, #6828, #6829, #6830 try hard to fix perf collection.

    +
  • +
  • +

    #6818 plumbing to support lifetimes in hir.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/12/21/changelog-56.html b/thisweek/2020/12/21/changelog-56.html new file mode 100644 index 00000000..3ba354b8 --- /dev/null +++ b/thisweek/2020/12/21/changelog-56.html @@ -0,0 +1,218 @@ + + + + + + + + + + Changelog #56 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #56

+ +
+
+
+

Commit: 5e2935e
+Release: 2020-12-21

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6779 upgrade to LSP 3.16. Note, this is sadly not as backwards compatible as we would like, if you see errors during project loading, please stick to the previous version of rust-analyzer until the next release.

    +
  • +
  • +

    #6907 support goto definition, reference search and rename for lifetimes.

    +
    +
    + +
    +
    +
  • +
  • +

    #6934 support cfg_attr.

    +
  • +
  • +

    #6874 support module_path!() built-in macro.

    +
  • +
  • +

    #6861 generate Default for enum.

    +
    +
    + +
    +
    +
  • +
  • +

    #6897 basic support for macros 2.0.

    +
  • +
  • +

    #6922, #6946 better ordering of auto-importing completions.

    +
  • +
  • +

    #6932 detect when both rust-lang.rust and matklad.rust-analyzer extensions are active and suggest to disable one.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6885 actually ship language configuration with VS Code extension.

    +
  • +
  • +

    #6889 fix false positive macro diagnostic on asm! and llvm_asm! macros.

    +
  • +
  • +

    #6886 expand statements for macros in lowering.

    +
  • +
  • +

    #6894 parenthesize composite if condition before inverting in invert-if assist.

    +
  • +
  • +

    #6909 avoid querying attributes in item tree lowering.

    +
  • +
  • +

    #6912 default to host platform for cargo metadata.

    +
  • +
  • +

    #6901 fix a couple of proc-macro related panics.

    +
  • +
  • +

    #6929 handle $_ in declarative macros.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6817 replace goblin crate with object.

    +
  • +
  • +

    #6862 add lifetimes to the the internal code representations.

    +
  • +
  • +

    #6893 treat macro_rules! as a special syntax and not as a macro call.

    +
  • +
  • +

    #6879 make HasChildSource generic over the type of child.

    +
  • +
  • +

    #6906 document GitHub organization permissions and privileges.

    +
  • +
  • +

    #6896 node-ify lifetimes.

    +
  • +
  • +

    #6911 don’t pass db around so often.

    +
  • +
  • +

    #6916, #6930 privatize hir-level API.

    +
  • +
  • +

    #6919 rewrite "run this doctest" functionality.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2020/12/28/changelog-57.html b/thisweek/2020/12/28/changelog-57.html new file mode 100644 index 00000000..4717a922 --- /dev/null +++ b/thisweek/2020/12/28/changelog-57.html @@ -0,0 +1,219 @@ + + + + + + + + + + Changelog #57 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #57

+ +
+
+
+

Commit: 1d53075
+Release: 2020-12-28

+
+
+

Last release for 2020!

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #6990, #6991, #6989, #7001 produce aarch64-apple-darwin builds.

    +
  • +
  • +

    #6964 add full pattern completions

    +
    +
    +102785796 d1e0da80 439e 11eb 934b 218ada31b51c +
    +
    +
  • +
  • +

    #6984 remove TextMate grammar — it is now included with VS Code.

    +
  • +
  • +

    #6746 Extract Module to File assist.

    +
    +
    +102748269 33a44300 43a5 11eb 9e37 f5fcb8e62f73 +
    +
    +
  • +
  • +

    #7009 rename module when renaming file.

    +
    +
    +102942807 59ece000 4484 11eb 970b 61b3372534f1 +
    +
    +
  • +
  • +

    #6993 clean up descriptions for settings.

    +
  • +
  • +

    #6960 show enum variant on Self qualified.

    +
  • +
  • +

    #7019 more helpful serde errors.

    +
  • +
  • +

    #7020, #7010 support for const blocks.

    +
  • +
  • +

    #7026 coc-rust-analyzer supports inlay hints for variables and chaining.

    +
  • +
  • +

    #7021, #7030 support goto def, search and rename for lables.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #6967 correctly parse legacy trait objects with leading ForType.

    +
  • +
  • +

    #6965 properly attach attributes to function parameters.

    +
  • +
  • +

    #6978 filter out empty rustc spans.

    +
  • +
  • +

    #6981 rename works from macro.

    +
  • +
  • +

    #6982 remove parentheses when inverting !(cond).

    +
  • +
  • +

    #6987 delete related whitespace when removing unused param.

    +
  • +
  • +

    #7013 don’t think that /submod.rs is /mod.rs.

    +
  • +
  • +

    #7022 prevent multiple incorrect case diagnostics in functions.

    +
  • +
  • +

    #7027 fix macro_rules not accepting brackets or parentheses.

    +
  • +
  • +

    #7047 fix proc-macro related panics.

    +
  • +
  • +

    #7050 fix composite tokens in declarative macros.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #7017 document make module design.

    +
  • +
  • +

    #7043 simplify assists resolution API.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/01/04/changelog-58.html b/thisweek/2021/01/04/changelog-58.html new file mode 100644 index 00000000..729d1b8f --- /dev/null +++ b/thisweek/2021/01/04/changelog-58.html @@ -0,0 +1,209 @@ + + + + + + + + + + Changelog #58 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #58

+ +
+
+
+

Commit: 5b86ff3
+Release: 2021-01-04

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7130 add extract-assignment assist.

    +
    +
    +103537043 b13b7900 4ea4 11eb 84b3 e570d7b92d98 +
    +
    +
  • +
  • +

    #7091 rust-analyzer.server.extraEnv config to specify environment variables for rust-analyzer process.

    +
  • +
  • +

    #7107 add working dir to cargo metadata fail messages.

    +
  • +
  • +

    #7106 produce fine-grained diffs when formatting files.

    +
  • +
  • +

    #7071 pass --all-targets to cargo check when discovering project structure.

    +
  • +
  • +

    #7080 initial support for const type parameters.

    +
  • +
  • +

    #7121 show lifetimes and labels on hover.

    +
  • +
  • +

    #7123 basic support for 2021 edition.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #7070 fix $0 inserted during edits.

    +
  • +
  • +

    #7088 fix false positive "unnecessary braces" diagnostic.

    +
  • +
  • +

    #7064 improve auto-importing completion speed and accuracy.

    +
  • +
  • +

    #7059 fix handling of $_ in macros.

    +
  • +
  • +

    #7075 use .format to trigger postfix format completion.

    +
  • +
  • +

    #7101 fix spacing bug in proc-macro.

    +
  • +
  • +

    #7055 don’t swallow the "rustfmt not installed error".

    +
  • +
  • +

    #7102 fix completion of Default struct update syntax.

    +
  • +
  • +

    #7116 fix proc-macros for deep trees.

    +
  • +
  • +

    #7125 don’t emit arg count diagnostics for method calls with unknown receiver.

    +
  • +
  • +

    #7134 fix type-inference for macro generated arrays.

    +
  • +
  • +

    #7136 fixed nested eager macros.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #7068 add VSCode command to view the rust-analyzer’s hir of a function body.

    +
  • +
  • +

    #7077, #7104 avoid allocations.

    +
  • +
  • +

    #7113 manual updates.

    +
  • +
  • +

    #7115 migrate HasSource::source to return an Option.

    +
  • +
  • +

    #7083 refactor mbe parsing code.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/01/11/changelog-59.html b/thisweek/2021/01/11/changelog-59.html new file mode 100644 index 00000000..a978e83d --- /dev/null +++ b/thisweek/2021/01/11/changelog-59.html @@ -0,0 +1,246 @@ + + + + + + + + + + Changelog #59 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #59

+ +
+
+
+

Commit: 60c501f
+Release: 2021-01-11

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7131 Inline Function assist for inlining a function’s body into its caller:

    +
    +
    +104171256 69bc6c00 5413 11eb 980f e34d259d529e +
    +
    +
  • +
  • +

    #7193 show progress for fetching workspace:

    +
    +
    +103902132 0db4c780 5135 11eb 94d3 32429445be87 +
    +
    +
  • +
  • +

    #7149, #7152, #7154 implement hovering for TypeParams.

    +
    +
    +103547890 42aaeb00 4ea5 11eb 8ac7 f166869af5f8 +
    +
    +
  • +
  • +

    #6980 goto definition for intra-doc links:

    +
    +
    +104176594 90c96c80 5418 11eb 8fe2 0962d228f443 +
    +
    +
  • +
  • +

    #6587, #7147 Structural Search Replace (SSR) supports statement matching and replacing.

    +
  • +
  • +

    #7148, #7151 build aarch64-pc-windows-msvc releases.

    +
  • +
  • +

    #7171 emit diagnostics for unresolved item-level macros.

    +
  • +
  • +

    #7097 add fix to wrap return expression in Some.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #7156 rename config options:

    +
    +
    +
    1
    +2
    +
    rust-analyzer.serverPath    -> rust-analyzer.server.path
    +assist_importMergeBehaviour -> assist.importMergeBehavior
    +
    +
    +
    +
  • +
  • +

    #7162 introduce queries to avoid O(N^2) lookup when performing completion +for enums with many variants.

    +
  • +
  • +

    #7174 normalize line endings when formatting.

    +
  • +
  • +

    #7176 don’t complete optional arguments when completing attributes.

    +
  • +
  • +

    #7205 fix bug for $crate in LHS of mbe.

    +
  • +
  • +

    #7234 allow true and false keywords in const generics.

    +
  • +
  • +

    #7241 Honor client’s dynamic registration capabilities.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #7145 add hygiene info to macro expansions.

    +
  • +
  • +

    #7198 add motivations to all styleguide rules.

    +
  • +
  • +

    #7184 changes cursor marker from <|> to $0.

    +
  • +
  • +

    #7196 improve fixture syntax highlighting.

    +
  • +
  • +

    #7159 refactor mbe to reduce clone and copying.

    +
  • +
  • +

    #7160 API to get hir::Function return type.

    +
  • +
  • +

    #7140 store trait associated items in fuzzy search index.

    +
  • +
  • +

    #7168 rename BlockExpr::expr → tail_expr.

    +
  • +
  • +

    #7170, #7172 refactor config handling.

    +
  • +
  • +

    #7181, #7191 improve internal docs.

    +
  • +
  • +

    #7182 switch from difference to dissimilar.

    +
  • +
  • +

    #7189 extend git evacuation procedure.

    +
  • +
  • +

    #7212, #7216, #7223, #7226 refactor syntax highlighting

    +
  • +
  • +

    #7206 use hir::GenericParam in ide_db::Definition instead of relisting all 3.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/01/18/changelog-60.html b/thisweek/2021/01/18/changelog-60.html new file mode 100644 index 00000000..2e848a0e --- /dev/null +++ b/thisweek/2021/01/18/changelog-60.html @@ -0,0 +1,211 @@ + + + + + + + + + + Changelog #60 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #60

+ +
+
+
+

Commit: fde4a86
+Release: 2021-01-18

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7220 same level folder rename renames module.

    +
  • +
  • +

    #6809 add quick fix to sort impl methods by trait definition:

    +
    +
    +104917483 83762a00 59a4 11eb 9797 34aaee609497 +
    +
    +
  • +
  • +

    #7289 add Unmerge Use assist:

    +
    +
    +104919876 02b92d00 59a8 11eb 9403 cf5ec30c4592 +
    +
    +
  • +
  • +

    #7260 render Fn* trait objects and impl types as rust does.

    +
  • +
  • +

    #7209: support yield keyword syntax.

    +
  • +
  • +

    #7271, #7274 publish the arena library used in rust-analyzer to crates.io: https://crates.io/crates/la-arena.

    +
  • +
  • +

    #7296, #7300, #7314 improve performance of the syntax tree library.

    +
  • +
  • +

    #7311 build aarch64-unknown-linux-gnu releases.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #7110 deduplicate macros when offering completion.

    +
  • +
  • +

    #7235 ifl postfix completion works with &Option<T>.

    +
  • +
  • +

    #7251, #7272 improve LSP conformance, don’t split single file edits.

    +
  • +
  • +

    #7262 don’t treat rename errors as server crashes.

    +
  • +
  • +

    #7264 fix build.rs support in workspaces.

    +
  • +
  • +

    #7285 don’t duplicate rustc diagnostics fixes.

    +
  • +
  • +

    #7287 make SyntaxPtr lookup logarithmic, resolving some accidentally quadratic issues.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    Establish a steering meeting to discuss overall direction of the project. +The meeting is held every sixth Monday at 15:00 UTC in the project’s Zulip. +The first meeting is today.

    +
  • +
  • +

    #7270 introduce new assertion mechanism: assert_always and assert_never macros. +Inspired by https://www.sqlite.org/assert.html.

    +
  • +
  • +

    #7051 check for stray dbg! macros.

    +
  • +
  • +

    #7219 refactor rename name checking.

    +
  • +
  • +

    #7249 add cargo xtask bb to conveniently build rust-analyzer for benchmarking.

    +
  • +
  • +

    #7257 vfs documentation.

    +
  • +
  • +

    #7288 treat self, super and crate as names.

    +
  • +
  • +

    #7295 share import_assets and related entities.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/01/25/changelog-61.html b/thisweek/2021/01/25/changelog-61.html new file mode 100644 index 00000000..c2415945 --- /dev/null +++ b/thisweek/2021/01/25/changelog-61.html @@ -0,0 +1,234 @@ + + + + + + + + + + Changelog #61 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #61

+ +
+
+
+

Commit: 3ab8d7a
+Release: 2021-01-25

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7325 steering issue which guides the development for the next six weeks.

    +
  • +
  • +

    #7297 propose trait associated items and autoimport traits on completion:

    +
    +
    +104819998 6faeb480 583a 11eb 8b45 b7351b51b90e +
    +
    +
  • +
  • +

    #7342 show deprecated completions for deprecated traits:

    +
    +
    +104970200 569d3380 59f3 11eb 9ee3 627b3c8a5c9d +
    +
    +
  • +
  • +

    #7321 support runnables in macros:

    +
    +
    +105707371 e24b1e80 5f23 11eb 94ed 16f88758e607 +
    +
    +
  • +
  • +

    #7351 show const params in completions:

    +
    +
    +105080872 bba76680 5a91 11eb 91cd 0910da4c8312 +
    +
    +
  • +
  • +

    #7310 Add Lifetime to Type assist:

    +
    +
    +105710185 ce092080 5f27 11eb 9dba f39db0ab3e49 +
    +
    +
  • +
  • +

    #7062 add diagnostic for filter_map followed by next:

    +
    +
    +105710800 a8c8e200 5f28 11eb 8c9d 707929087cd1 +
    +
    +
  • +
  • +

    #7413 handle unions in symbol search.

    +
  • +
  • +

    #7414 add validation for mutable const items.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #7319 avoid blocking the main loop when editing Cargo.toml.

    +
  • +
  • +

    #7371 respect rustfmt.toml in subdirectories.

    +
  • +
  • +

    #7389 remove support for heuristic-based goto def.

    +
  • +
  • +

    #7386 handle box with allocator.

    +
  • +
  • +

    #7398 stave off zombies.

    +
  • +
  • +

    #7391 fix error when using "extern crate self as".

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #7291 wrap remaining self/super/crate in ast::Name.

    +
  • +
  • +

    #7324 adds syntax-level support for macros in type position.

    +
  • +
  • +

    #7334 add back jemalloc support.

    +
  • +
  • +

    #7332 rename reference search uses ide_db::search directly.

    +
  • +
  • +

    #7336, #7359, #7366, #7375 groundwork for the item-local import resolution.

    +
  • +
  • +

    #7347, #7331 reduce hygiene info size.

    +
  • +
  • +

    #7365, #7367 update chalk.

    +
  • +
  • +

    #7370 fix mega bug.

    +
  • +
  • +

    #7378 include countme crate to count important data structures.

    +
  • +
  • +

    #7374 add step to run analysis-stats on std.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/02/01/changelog-62.html b/thisweek/2021/02/01/changelog-62.html new file mode 100644 index 00000000..2438d31a --- /dev/null +++ b/thisweek/2021/02/01/changelog-62.html @@ -0,0 +1,220 @@ + + + + + + + + + + Changelog #62 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #62

+ +
+
+
+

Commit: 1a59f75
+Release: 2021-02-01

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7409 add References code lens, gated by rust-analyzer.lens.references:

    +
    +
    +106449060 3f972080 648c 11eb 8105 72725fa33d17 +
    +
    +
  • +
  • +

    #7412 make `OUT_DIR`s and proc macro loading asynchronous:

    +
    +
    +105610083 8f208100 5de8 11eb 8e96 c2d4e349b352 +
    +
    +
  • +
  • +

    #7468 make Fill Match Arms assist work in macros.

    +
  • +
  • +

    #7451 add rust-analyzer.files.excludeDirs config.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #7415 Code: emit fewer download progress notifications.

    +
  • +
  • +

    #7419, #7422 unquote strings when expanding concat!.

    +
  • +
  • +

    #7438 shorten hir::TypeParam ranges for traits in NavigationTarget.

    +
  • +
  • +

    #7406 don’t assume happy path in if_let_match.

    +
  • +
  • +

    #7464 export CARGO for proc. macros.

    +
  • +
  • +

    #7465 only hide parameter hints for path, field and methodcall expressions.

    +
  • +
  • +

    #7487 forbid flyimport completions in use statements.

    +
  • +
  • +

    #7493 add missing --print-config-schema to help.

    +
  • +
  • +

    #7483 classify function calls as functions when shadowed by types.

    +
  • +
  • +

    #7500 fix ast::String::value not properly escaping in some cases.

    +
  • +
  • +

    #7502 honor #![macro_use] in module source files.

    +
  • +
  • +

    #7503 return inner attributes of outline module declarations in attrs_query.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #7426, #7431, #7466, #7480, #7481, #7482, #7485 more work on local item resolution.

    +
  • +
  • +

    #7393 document paths items.

    +
  • +
  • +

    #7433 initial Macros 2.0 in MBE.

    +
  • +
  • +

    #7450 remove the need to manually sync config in package.json.

    +
  • +
  • +

    #7455 make always-assert crate reusable.

    +
  • +
  • +

    #7457 add no-buffering file logging and wait for debugger options.

    +
  • +
  • +

    #7460 count instances of more data structures.

    +
  • +
  • +

    #7471 force Xcode version on CI.

    +
  • +
  • +

    #7472 easier to debug timeouts in tests.

    +
  • +
  • +

    #7491 handle MBE parse errors during parsing, not matching.

    +
  • +
  • +

    #7494 simpilfy mbe parsing.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/02/08/changelog-63.html b/thisweek/2021/02/08/changelog-63.html new file mode 100644 index 00000000..43f42e97 --- /dev/null +++ b/thisweek/2021/02/08/changelog-63.html @@ -0,0 +1,232 @@ + + + + + + + + + + Changelog #63 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #63

+ +
+
+
+

Commit: 336909b
+Release: 2021-02-08

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7535 extract function assist:

    +
    +
    +106980190 c9870800 6770 11eb 83d9 3d36b2550ff6 +
    +
    +
    +
    +106980197 cbe96200 6770 11eb 96b0 14c27894fac0 +
    +
    +
    +
    +106980201 cdb32580 6770 11eb 9e6e 6ac8155d65ac +
    +
    +
    +
    +106980205 cf7ce900 6770 11eb 8516 653c8fcca807 +
    +
    +
  • +
  • +

    #7562 generate enum match method assist:

    +
    +
    +107213058 8945b500 6a10 11eb 95ea 2aa862334609 +
    +
    +
  • +
  • +

    #7520 show underlying type of type aliases.

    +
  • +
  • +

    #7578 add a semantic token type for char literals.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #7508 show code suggestions regardless of applicability.

    +
  • +
  • +

    #7509 improve nvim-lsp setup instructions.

    +
  • +
  • +

    #7512 reap proc macro server instances.

    +
  • +
  • +

    #7514 only allow one proc-macro process.

    +
  • +
  • +

    #7567 remove unnecessary allocs in case_conv.

    +
  • +
  • +

    #7574 remove various redundant clones.

    +
  • +
  • +

    #7576 fix resolveCodeAction trying to edit files before creating them.

    +
  • +
  • +

    #7505 widen highlight root range to covering element.

    +
  • +
  • +

    #7573 do not overwrite npm lock file on install.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+ +
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/02/15/changelog-64.html b/thisweek/2021/02/15/changelog-64.html new file mode 100644 index 00000000..16280497 --- /dev/null +++ b/thisweek/2021/02/15/changelog-64.html @@ -0,0 +1,270 @@ + + + + + + + + + + Changelog #64 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #64

+ +
+
+
+

Commit: 7435b9e
+Release: 2021-02-15

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7614, #7627 unleash inner item resolution to users:

    +
    +
    +107394800 8627f300 6afc 11eb 8662 ed07226bc58f +
    +
    +
  • +
  • +

    #7617 add generate getter/setter assists:

    +
    +
    +107858728 0b314600 6e36 11eb 9603 8a59f23808e4 +
    +
    +
  • +
  • +

    #7616 show Self pattern and Self-prefixed enum variant completions:

    +
    +
    +107413514 1ff99b00 6b11 11eb 88b3 126cd106b514 +
    +
    +
    +
    +107413519 212ac800 6b11 11eb 8282 51115468dccc +
    +
    +
  • +
  • +

    #7618 show qualified enum variant pattern completions:

    +
    +
    +107425157 e9c31800 6b1e 11eb 8963 96653115f8e0 +
    +
    +
  • +
  • +

    #7656 implement constructor usage search for almost all items:

    +
    +
    +107944340 9f1a2380 6f96 11eb 8dd9 811d2c7a2d95 +
    +
    +
  • +
  • +

    #7625 add Copy Run Command Line command for Code.

    +
  • +
  • +

    #7644 implement completion for primitive types.

    +
  • +
  • +

    #7658 release x86_64-unknown-linux-musl binaries.

    +
  • +
  • +

    #7643 automatically detect rustc-src crates.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #7593 include for keyword in completion.

    +
  • +
  • +

    #7602 check for dyn impls in method resolution.

    +
  • +
  • +

    #7591 fix floating promises in the Code extension.

    +
  • +
  • +

    #7622 resolve TupleStructPat in SourceAnalyzer::resolve_path.

    +
  • +
  • +

    #7652 fix "slow" tests sometimes failing.

    +
  • +
  • +

    #7659 improve "Generate From impl" assist.

    +
  • +
  • +

    #7665 fix attribute macro classification.

    +
  • +
  • +

    #7667 strip type parameter defaults when generating impl generics.

    +
  • +
  • +

    #7663 tolerate spaces when patching the server binary on NixOS.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #7549 explain how initial configuration is sent over LSP and document vim-lsp.

    +
  • +
  • +

    #7592 add note about Eclipse IDE support.

    +
  • +
  • +

    #7595 add config: &CargoConfig parameter to fn load_cargo(…).

    +
  • +
  • +

    #7599 add emacs guide.

    +
  • +
  • +

    #7597 set remote branch on xtask promote.

    +
  • +
  • +

    #7613, #7615 add initial benchmarking infrastructure.

    +
  • +
  • +

    #7619, #7621 use #[track_caller] in assist tests.

    +
  • +
  • +

    #7648 fix legacy_derive_helpers warning on nightly.

    +
  • +
  • +

    #7653 document "config" pattern.

    +
  • +
  • +

    #7639 bump Rust to 1.50.

    +
  • +
  • +

    #7650 add find_impl_block_end assist helper.

    +
  • +
  • +

    #7358 refactor reference searching to work with on the ast.

    +
  • +
  • +

    #7596 move code_lens to the ide crate.

    +
  • +
  • +

    #7655 include a commit log summary in the changelog.

    +
  • +
  • +

    #7664 refactor impl generation in assists.

    +
  • +
  • +

    #7668 finalize rename infra rewrite.

    +
  • +
  • +

    #7678 simplify find_crlf.

    +
  • +
  • +

    #7661 start LSP 3.17 support.

    +
  • +
  • +

    #7676 make it clear which client-side commands we use.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/02/22/changelog-65.html b/thisweek/2021/02/22/changelog-65.html new file mode 100644 index 00000000..28efd6b7 --- /dev/null +++ b/thisweek/2021/02/22/changelog-65.html @@ -0,0 +1,206 @@ + + + + + + + + + + Changelog #65 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #65

+ +
+
+
+

Commit: 14de9e5
+Release: 2021-02-22

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7620 support control flow in extract_function assist:

    +
    +
    +107544222 0fadf280 6bdb 11eb 9625 ed6194ba92c0 +
    +
    +
  • +
  • +

    #7657 implement UTF-8 offsets protocol extension from clangd.

    +
  • +
  • +

    #7729 detect musl distros in the Code extension.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #7684 fix runnable link order.

    +
  • +
  • +

    #7687 parse default in traits impls.

    +
  • +
  • +

    #7703 allow comments between newlines in chaining hints.

    +
  • +
  • +

    #7704 avoid transmitting unchanged diagnostics.

    +
  • +
  • +

    #7705 show hover info of the definition of ConstReference patterns instead of its type.

    +
  • +
  • +

    #7722 fix incorrect missing field diagnostic with box patterns.

    +
  • +
  • +

    #7724 consider import prefix settings in flyimport.

    +
  • +
  • +

    #7725 include where predicates when generating an impl.

    +
  • +
  • +

    #7726 add #[doc(hidden)] completion.

    +
  • +
  • +

    #7730 retain visibility when extracting inline module to file.

    +
  • +
  • +

    #7732 fix completions in impl blocks on dyn traits with lifetimes.

    +
  • +
  • +

    #7739 bump chalk fixing impl Trait resolution in returned types.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #7690 extract fn load_workspace(…) from fn load_cargo(…).

    +
  • +
  • +

    #7700 use npm 7.x package-lock.json.

    +
  • +
  • +

    #7702 remove use of deprecated std::collections::Bound.

    +
  • +
  • +

    #7701 remove semantic tokens workaround.

    +
  • +
  • +

    #7699 implement ast::AstNode for NameLike and move it to node_ext.

    +
  • +
  • +

    #7707 rename completion to ide_completion

    +
  • +
  • +

    #7723 fix some typos in the docs

    +
  • +
  • +

    #7727 fix obsolete "Extend Selection" docs

    +
  • +
  • +

    #7735 stop mixing Result and Option with ? in inline_local_variable

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/03/01/changelog-66.html b/thisweek/2021/03/01/changelog-66.html new file mode 100644 index 00000000..68b0acf6 --- /dev/null +++ b/thisweek/2021/03/01/changelog-66.html @@ -0,0 +1,233 @@ + + + + + + + + + + Changelog #66 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #66

+ +
+
+
+

Commit: 5df3ee8
+Release: 2021-03-01

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7677 generate more enum matching methods:

    +
    +
    +109462415 1c03cd80 7a6c 11eb 8ed8 9fed51c0acb5 +
    +
    +
  • +
  • +

    #7741 add "convert for loop into iterator" assist:

    +
    +
    +109151603 adbcc380 776a 11eb 92ab 5774a949c009 +
    +
    +
  • +
  • +

    #7719 (first contribution) correctly parenthesize binary expression in the "apply De Morgan’s law" assist:

    +
    +
    +109150372 1440e200 7769 11eb 8e13 afa4ac5b89ac +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #7749 make common assists easier to use.

    +
  • +
  • +

    #7753 (first contribution) add isize to the list of suffixed integers in typed_integer.

    +
  • +
  • +

    #7768 fix visibility computation inside block expressions.

    +
  • +
  • +

    #7772 pick up ConstReference patterns in FindUsages.

    +
  • +
  • +

    #7775 (first contribution) fix typo in manual.

    +
  • +
  • +

    #7792 (first contribution) change remaining occurrences of importMergeBehaviour to importMergeBehavior.

    +
  • +
  • +

    #7794 (first contribution) disable "Flip comma" assist inside macro calls.

    +
  • +
  • +

    #7801 restrict visibilities to the containing DefMap.

    +
  • +
  • +

    #7802, #7808 fix builtin macros splitting expression on commas.

    +
  • +
  • +

    #7803 fix non-Latin characters in MBE doc comment expansion:

    +
    +
    +109409237 f58e5580 79cb 11eb 92ed a6700bbe39b5 +
    +
    +
  • +
  • +

    #7805 highlight only the last segment of unresolved macros.

    +
  • +
  • +

    #7809 (first contribution) delete old issues from GitHub’s bug report template.

    +
  • +
  • +

    #7815 fix default allocator type in the inference of box expressions.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #7759 (first contribution) rename assists and ssr.

    +
  • +
  • +

    #7766 update Code npm dependencies.

    +
  • +
  • +

    #7770 make memory usage reporting during benchmarking more reliable.

    +
  • +
  • +

    #7566 add benchmark tests for MBE.

    +
  • +
  • +

    #7797 format generated lints and features manually to avoid long lines.

    +
  • +
  • +

    #7806 update remaining references to AnalysisChange.

    +
  • +
  • +

    #7807 directly link the changelog from the README.

    +
  • +
  • +

    #7804 introduce TypeCtor::Scalar.

    +
  • +
  • +

    #7812 use consistent naming for assist.

    +
  • +
  • +

    #7813 inline TypeCtor into Ty.

    +
  • +
  • +

    #7814 turn Ty::Tuple variant into a tuple-variant.

    +
  • +
  • +

    #7816 lift Ty::Fn into a struct.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/03/08/changelog-67.html b/thisweek/2021/03/08/changelog-67.html new file mode 100644 index 00000000..f4e03555 --- /dev/null +++ b/thisweek/2021/03/08/changelog-67.html @@ -0,0 +1,283 @@ + + + + + + + + + + Changelog #67 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #67

+ +
+
+
+

Commit: d54e115
+Release: 2021-03-08

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7777 add line to block and back comment conversion assist:

    +
    +
    +110304890 c8155d80 8004 11eb 8a4a 89a90e059d92 +
    +
    +
  • +
  • +

    #7335 (first contribution) add region folding support:

    +
    +
    +110306982 19bee780 8007 11eb 8b8c be5e46330586 +
    +
    +
  • +
  • +

    #7691 suggest name in "extract variable" assist:

    +
    +
    +108013304 72105400 701c 11eb 9f13 eec52e74d0cc +
    +
    +
    +
    +108013305 72a8ea80 701c 11eb 957e 2214f7f005de +
    +
    +
  • +
  • +

    #7795 show docs on hover for keywords and primitives:

    +
    +
    +109369534 eeb4f500 789c 11eb 8f2b 2f9c4e129de3 +
    +
    +
  • +
  • +

    #7824 (first contribution) "add type ascription" assist:

    +
    +
    +110307658 d7e27100 8007 11eb 965b 2e9a294e7d22 +
    +
    +
  • +
  • +

    #7894 generate_function assist: convert arg names to lower snake case:

    +
    +
    +110308337 a9b16100 8008 11eb 8aa7 bf58be48d089 +
    +
    +
  • +
  • +

    #7800 add "generate `default()`" assist:

    +
    +
    +110308811 3f4cf080 8009 11eb 9e0f a87c36aaec09 +
    +
    +
  • +
  • +

    #7866 add while let completion.

    +
  • +
  • +

    #7889 make imports grouping configurable via rust-analyzer.assist.importGroup.

    +
  • +
  • +

    #7868 rename rust-analyzer.cargo.loadOutDirsFromCheck to rust-analyzer.cargo.runBuildScripts.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #7778 fix lowering trailing self paths in `UseTree`s

    +
  • +
  • +

    #7834 fix find_path when inner items are present.

    +
  • +
  • +

    #7827 (first contribution) fix proc macro TokenStream::from_str token ids.

    +
  • +
  • +

    #7844 fix ProcMacroClient being dropped too early in CLI.

    +
  • +
  • +

    #7513 implement an NFA parser for macro-by-example.

    +
  • +
  • +

    #7884 simplify TokenStream::from_str.

    +
  • +
  • +

    #7850 don’t add space when joining line to opening quote.

    +
  • +
  • +

    #7861 special-case parenthesized and negated expressions in De Morgan’s Law assist.

    +
  • +
  • +

    #7863 prevent renaming SelfType and BuiltinType.

    +
  • +
  • +

    #7880 honor snippet capability in the "extract function" assist.

    +
  • +
  • +

    #7869 add support for deref assignments to "pull assignment up" assist.

    +
  • +
  • +

    #7887 fix path parsing when using meta in MBE.

    +
  • +
  • +

    #7888 add a note about code action commands to the coc.nvim section of the docs.

    +
  • +
  • +

    #7865 preserve escape sequences when replacing string with char.

    +
  • +
  • +

    #7896 fix raw string handling in "replace string with char" assist.

    +
  • +
  • +

    #7892 fix TokenStream::from_str for input consisting of a single group with delimiter.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #7819 speed up heavy tests.

    +
  • +
  • +

    #7820, #7837 Improve VS Code extension README.

    +
  • +
  • +

    #7823 bring Ty::InferenceVar closer to chalk equivalent.

    +
  • +
  • +

    #7826 introduce Ty::Alias.

    +
  • +
  • +

    #7833 use chalk_ir::Mutability.

    +
  • +
  • +

    #7870 use chalk_ir::AdtId.

    +
  • +
  • +

    #7828, #7836 lint against versioned dev dependencies to fix automatic publishing.

    +
  • +
  • +

    #7832 drop pre-commit git hook.

    +
  • +
  • +

    #7835, #7847, #7876, #7881, #7849 migrate to a CLI parser with auto-generated help.

    +
  • +
  • +

    #7899 rename a few crate_def_map`s to `def_map.

    +
  • +
  • +

    #7851 compress tests.

    +
  • +
  • +

    #7858 clarify comparison rule in the style docs.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/03/15/changelog-68.html b/thisweek/2021/03/15/changelog-68.html new file mode 100644 index 00000000..2a1c627a --- /dev/null +++ b/thisweek/2021/03/15/changelog-68.html @@ -0,0 +1,329 @@ + + + + + + + + + + Changelog #68 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #68

+ +
+
+
+

Commit: 5ba7852
+Release: 2021-03-15

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7799 add "peek related tests" command (LSP extension):

    +
    +
    +109397453 a9013680 7947 11eb 8b11 ac03079f7645 +
    +
    +
  • +
  • +

    #7956 (first contribution) add "convert for_each into for loop" assist:

    +
    +
    +111136030 f6a3b300 8585 11eb 9e7a c4716072b55c +
    +
    +
  • +
  • +

    #7898 infer return type in "generate function" assist:

    +
    +
    +111136944 ec35e900 8586 11eb 9957 1bbb478668a7 +
    +
    +
  • +
  • +

    #7873 consider unresolved qualifiers during flyimport:

    +
    +
    +110040808 0af8dc00 7d4c 11eb 83db 65af94e843bb +
    +
    +
  • +
  • +

    #7874, #7961 add "apply Structural Search and Replace" assist:

    +
    +
    +111138847 1688a600 8589 11eb 8098 0bce2360eee9 +
    +
    +
  • +
  • +

    #7904, #8014 improve completion sorting:

    +
    +
    +110249883 4e5e7080 7f2d 11eb 9269 a3bc133fdee7 +
    +
    +
  • +
  • +

    #7981 (first contribution) support multiple terms in De Morgan’s Law assist:

    +
    +
    +111139619 03c2a100 858a 11eb 9cfd 43f7ad83b470 +
    +
    +
  • +
  • +

    #7914 enable build scripts execution by default (disable using rust-analyzer.cargo.runBuildScripts).

    +
  • +
  • +

    #7928 (first contribution) add x.err postfix completion.

    +
  • +
  • +

    #7964 implement builtin cfg! macro.

    +
  • +
  • +

    #7942 show whether a binding is mutable or not on hover.

    +
  • +
  • +

    #7993 use auto-deref in completion scoring.

    +
  • +
  • +

    #7891, #7927 improve handling of rustc_private.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #7901 (first contribution) respect HTTP proxy settings in the Code extension.

    +
  • +
  • +

    #7912 de-duplicate import map results.

    +
  • +
  • +

    #7941 fix highlighting of unused definitions.

    +
  • +
  • +

    #7944 selecting &mut foo completion now actually inserts &mut.

    +
  • +
  • +

    #7957 fix labels for single import assists.

    +
  • +
  • +

    #7958 avoid double text edits when renaming mod declaration.

    +
  • +
  • +

    #7959 prefer names from outer DefMap over extern prelude.

    +
  • +
  • +

    #7969 return original text range in PrepareRename responses when inside macro.

    +
  • +
  • +

    #7972 add semicolon after type ascription.

    +
  • +
  • +

    #7994 speed up MBE matching for recursive macros.

    +
  • +
  • +

    #7984 improve version string display.

    +
  • +
  • +

    #7997 fix folding range kind.

    +
  • +
  • +

    #7999 handle cfg_attr gating multiple attributes.

    +
  • +
  • +

    #8005 handle ill-formed macros propely.

    +
  • +
  • +

    #8010 attach trivia to ast::Union nodes.

    +
  • +
  • +

    #8017 keep type params in doc-test paths.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #6822 (first contribution) read version of rustc that compiled proc macros.

    +
  • +
  • +

    #7921 avoid some serde-json dependencies.

    +
  • +
  • +

    #7918, #7980 generalize file ensuring infrastructure, drop xtask codegen.

    +
  • +
  • +

    #7923 remove useless code_model indirection.

    +
  • +
  • +

    #7924 use upstream cov-mark implementation.

    +
  • +
  • +

    #7930 clarify that all protocol extensions are experimental.

    +
  • +
  • +

    #7931 use Type::new_with_resolver_inner more.

    +
  • +
  • +

    #7932 improve settings descriptions.

    +
  • +
  • +

    #7933, #7949 slightly improve compilation speed.

    +
  • +
  • +

    #7945 future-proof completion scores.

    +
  • +
  • +

    #7878 remove item_scope field from Body.

    +
  • +
  • +

    #7948 delete ContainerId.

    +
  • +
  • +

    #7955 stop fetching ItemTrees for no reason.

    +
  • +
  • +

    #7967 use expect-test for builtin macro/derive tests.

    +
  • +
  • +

    #7974, #7978 (first contribution) use references in CompletionItem builder.

    +
  • +
  • +

    #7985 use Chalk Environment more directly.

    +
  • +
  • +

    #7989 remove ItemTree::source.

    +
  • +
  • +

    #7991 simplify hir_def::TestDB.

    +
  • +
  • +

    #7996 separate Ty and TyKind like in Chalk.

    +
  • +
  • +

    #7998, #8001 use more Chalk IDs.

    +
  • +
  • +

    #8002 create TraitEnvironment through a query.

    +
  • +
  • +

    #8003 move type lowering methods to TyLoweringContext.

    +
  • +
  • +

    #8006 simpify MBE bindings builder.

    +
  • +
  • +

    #8011 add --no-sysroot flag for analysis-stats.

    +
  • +
  • +

    #8012, #8013 replace xtask lint with cargo alias.

    +
  • +
  • +

    #8016 more Chalk adaptations.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/03/22/changelog-69.html b/thisweek/2021/03/22/changelog-69.html new file mode 100644 index 00000000..b8c01bde --- /dev/null +++ b/thisweek/2021/03/22/changelog-69.html @@ -0,0 +1,367 @@ + + + + + + + + + + Changelog #69 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #69

+ +
+
+
+

Commit: 858ad55
+Release: 2021-03-22

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #8000 add HIR formatter infra and use it for hover text:

    +
    +
    +111968849 49d7b180 8b02 11eb 8f0d 4b7bc38d5247 +
    +
    +
  • +
  • +

    #8032 enable proc macros by default (use rust-analyzer.procMacro.enable to disable them).

    +
  • +
  • +

    #7966 add diagnostic for files missing from the module tree.

    +
  • +
  • +

    #7975 include regions in file structure:

    +
    +
    +111967940 4bed4080 8b01 11eb 940a fc8f81d5673b +
    +
    +
  • +
  • +

    #8021 enable reference searching for built-in types:

    +
    +
    +111132711 f69db600 8579 11eb 8c90 22fd6862d11f +
    +
    +
  • +
  • +

    #8020 power up "Go to implementation":

    +
    +
    +111144403 52bb0700 8587 11eb 9205 7a2a5b8b75a3 +
    +
    +
  • +
  • +

    #7992, #8036 improve completions and completion sorting:

    +
    +
    +111018680 0e551e80 836f 11eb 94b1 c88336ecbc6e +
    +
    +
    +
    +111189395 45941d00 8573 11eb 871b 09186b35cbb9 +
    +
    +
  • +
  • +

    #8037, #8040 add "Generate is_empty method from len method" assist.

    +
  • +
  • +

    #7900 show function parameters in completion detail.

    +
  • +
  • +

    #8060 improve "Move bounds" assist.

    +
  • +
  • +

    #8071, #8086 highlight intra-doc links in doc comments:

    +
    +
    +111969661 27926380 8b03 11eb 8e78 70dc95e137fd +
    +
    +
  • +
  • +

    #8124 add lifetime completion:

    +
    +
    +111886437 c9b02f80 89cd 11eb 9bee 340f1536b0de +
    +
    +
  • +
  • +

    #8127 add label completion:

    +
    +
    +111900839 07946e80 8a35 11eb 90f6 a47943e7501d +
    +
    +
  • +
  • +

    #8131 add smart case lookup into flyimport completion:

    +
    +
    +111970038 8821a080 8b03 11eb 9bca b4e06aac565b +
    +
    +
    +
    +111970065 8e178180 8b03 11eb 8a33 8aa245401e8a +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #8025 fix resolution of incomplete fields.

    +
  • +
  • +

    #8015 make runnable detection more resilient to out-of-tree modules.

    +
  • +
  • +

    #7970 fix incorrect diagnostics for failing built in macros.

    +
  • +
  • +

    #8044 fix macro expansion for statements without semicolon.

    +
  • +
  • +

    #8048 fix missing unresolved macro diagnostic in function body.

    +
  • +
  • +

    #8066 handle #[cfg] on call arguments.

    +
  • +
  • +

    #8068 handle #[cfg] on function parameters.

    +
  • +
  • +

    #8067 check whether cursor is on and not between intra-doc links in goto_definition.

    +
  • +
  • +

    #8073 improve diagnostic when including nonexistent file.

    +
  • +
  • +

    #8075 fix use crate as <name>; imports.

    +
  • +
  • +

    #8078 support #[cfg] on all associated items.

    +
  • +
  • +

    #8082 properly handle inner recursive macro_rules!.

    +
  • +
  • +

    #8088 fix "Go to definition" and highlighting for function-like proc macros.

    +
  • +
  • +

    #8089 update info about Eclipse Corrosion.

    +
  • +
  • +

    #8094 fix infinite recursion when computing diagnostics for inner items.

    +
  • +
  • +

    #8083 track source file IDs in source mapping of Attrs.

    +
  • +
  • +

    #8108 fix handling of #![cfg] in outline module files.

    +
  • +
  • +

    #8122 make bare underscore token an Ident rather than Punct in proc-macro.

    +
  • +
  • +

    #8123 do not display unqualified associated item completions.

    +
  • +
  • +

    #8128 expand legacy-scoped macro during collection.

    +
  • +
  • +

    #8133 fix salsa panic.

    +
  • +
  • +

    #8134 (first contribution) fix module resolution in `include!`ed files.

    +
  • +
  • +

    #8137 fix box pattern inference panic.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #7498 switch to a mutable syntax tree implementation.

    +
  • +
  • +

    #8023 move StructureNodeKind from ide_db to ide.

    +
  • +
  • +

    #8022 fix some clippy performance warnings.

    +
  • +
  • +

    #8026 simplify source maps for fields.

    +
  • +
  • +

    #8018, #8038 make Ty wrap TyKind in an Arc.

    +
  • +
  • +

    #8008 clean up CompletionContext::expected_type.

    +
  • +
  • +

    #8030 add diesel to the benchmark suite.

    +
  • +
  • +

    #8029 enable thread-local coverage mark support.

    +
  • +
  • +

    #8035 unqualfied_path completions aren’t responsible for variant pattern completions.

    +
  • +
  • +

    #8028 prepare for returning parents in the "Locate parent module" command.

    +
  • +
  • +

    #8039 use SmallVec for Substs.

    +
  • +
  • +

    #8046 add match vs. if let …​ else entry to the style guide.

    +
  • +
  • +

    #8034 implement Crate::transitive_reverse_dependencies.

    +
  • +
  • +

    #8042 (first contribution) add rustc-perf version to the metrics JSON.

    +
  • +
  • +

    #8061 structural editing API can automatically insert whitespace in simple cases.

    +
  • +
  • +

    #8059 support cfg_attr in doc-comment syntax highlighting.

    +
  • +
  • +

    #8065 handle block doc comments better.

    +
  • +
  • +

    #8069 support highlight injection in block doc comments.

    +
  • +
  • +

    #8080 change ItemTree API to accomodate creating an ItemTree per block expression.

    +
  • +
  • +

    #8087 make MacroDefId’s AstId mandatory when possible.

    +
  • +
  • +

    #8093 record custom derive helpers in DefMap.

    +
  • +
  • +

    #8097 parse extended_key_value_attributes.

    +
  • +
  • +

    #8112 revamp hir_def attribute API.

    +
  • +
  • +

    #8125 don’t use an untyped String for ActiveParam tracking.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/03/29/changelog-70.html b/thisweek/2021/03/29/changelog-70.html new file mode 100644 index 00000000..377909ee --- /dev/null +++ b/thisweek/2021/03/29/changelog-70.html @@ -0,0 +1,258 @@ + + + + + + + + + + Changelog #70 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #70

+ +
+
+
+

Commit: 01dc53a
+Release: 2021-03-29

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #8054 add Move item commands (LSP extension):

    +
    +
    +112793739 7e052200 906e 11eb 9ed4 1b396ef7d6dc +
    +
    +
    +
    +112793747 83626c80 906e 11eb 9a96 a075e8d38d6e +
    +
    +
  • +
  • +

    #8178 show item info when hovering intra-doc links:

    +
    +
    +112197618 91e2fb00 8c0c 11eb 9edc a7923214d2b6 +
    +
    +
  • +
  • +

    #8056 on completion, take into account whether types unify:

    +
    +
    +111338556 46d94e80 8634 11eb 9936 2b20eb9e6756 +
    +
    +
    +
    +111338598 4e005c80 8634 11eb 92e0 69c2c1cda6fc +
    +
    +
  • +
  • +

    #8212 implement basic macros 2.0 support:

    +
    +
    +112712565 6eb99380 8f0b 11eb 88de 5d7f974dfe6d +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #8156 correctly lower `TraitRef`s with default params.

    +
  • +
  • +

    #8144 (first contribution) fix crash when trying to display closure types.

    +
  • +
  • +

    #8142 hide incorrect ref match completions for struct fields/methods.

    +
  • +
  • +

    #8138 set up a search scope when searching for MBE macro references.

    +
  • +
  • +

    #8159 try to ignore proc-macro stdout to prevent IPC crashes.

    +
  • +
  • +

    #8182 trim down IPC JSON size.

    +
  • +
  • +

    #8177 limit hints size by default.

    +
  • +
  • +

    #8183 fix spurious "Missing command" lenses on macros.

    +
  • +
  • +

    #8168 fix "Convert to guarded return" for mutable bindings.

    +
  • +
  • +

    #8189 document unlinked-file diagnostic.

    +
  • +
  • +

    #7907 take visibility into account for autoderef.

    +
  • +
  • +

    #8194 finally fix version string display in release binaries.

    +
  • +
  • +

    #8206 ignore main functions outside of the root module.

    +
  • +
  • +

    #8201 fix recursive macro statements expansion.

    +
  • +
  • +

    #8213 include const generic in impl generation.

    +
  • +
  • +

    #8214 mention the rustup component in the installation instructions.

    +
  • +
  • +

    #8221 prefer adding mod declaration to lib.rs over file.rs in unlinked-file fix.

    +
  • +
  • +

    #8141 don’t suggest long looping paths for imports.

    +
  • +
  • +

    #8155 fix confusion between functions and parameters.

    +
  • +
  • +

    #8191, #8209 fix slight memory leak in syntax.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #8136, #8190 introduce QuantifiedWhereClause and DynTy analogous to Chalk.

    +
  • +
  • +

    #8139 align Canonical and InEnvironment with the Chalk versions.

    +
  • +
  • +

    #8154 rewrite "Merge use trees" assist using mutable syntax trees.

    +
  • +
  • +

    #8165 tweak assist API to fit mutable syntax trees.

    +
  • +
  • +

    #8169 make more use of the HIR in rename::rename_to_self.

    +
  • +
  • +

    #8170 merge bang-macros and derives in name resolution.

    +
  • +
  • +

    #8187 sweep the new TraitEnvironmentQuery.

    +
  • +
  • +

    #8145 document our security stance.

    +
  • +
  • +

    #8146 document patch policy.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/04/05/changelog-71.html b/thisweek/2021/04/05/changelog-71.html new file mode 100644 index 00000000..6206dfae --- /dev/null +++ b/thisweek/2021/04/05/changelog-71.html @@ -0,0 +1,276 @@ + + + + + + + + + + Changelog #71 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #71

+ +
+
+
+

Commit: 19e09a4
+Release: 2021-04-05

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #8231 (first contribution) fold consecutive consts and statics:

    +
    +
    +112835083 b584c600 9090 11eb 968a a95f4e9c1f6c +
    +
    +
  • +
  • +

    #8295 (first contribution) add Convert Into to From assist:

    +
    +
    +113420108 9ce21c00 93c0 11eb 8c49 80b5fb189284 +
    +
    +
  • +
  • +

    #8210 add "Extract type alias" assist:

    +
    +
    +113543910 0005c580 95f0 11eb 8992 d6dffc846c2d +
    +
    +
  • +
  • +

    #8267, #8274 add GIFs of most features to the manual.

    +
  • +
  • +

    #8240 add semantic highlighting modifier for trait items and trait method calls.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #8222 don’t mark unlinked file diagnostic as unused.

    +
  • +
  • +

    #8246 (first contribution) update VIM YCM installation instructions.

    +
  • +
  • +

    #8250 classify associated types in paths more accurately.

    +
  • +
  • +

    #8256 make "Move item" commands work in more cases.

    +
  • +
  • +

    #8261 fix expansion of OR-patterns in match check.

    +
  • +
  • +

    #8266 fix generic argument lowering in qualified trait casts (helps with .await).

    +
  • +
  • +

    #8271 fix error parsing `u128`s in proc macro output.

    +
  • +
  • +

    #8276 lower inner items defined in macros.

    +
  • +
  • +

    #8283 resolve associated types at the IDE layer.

    +
  • +
  • +

    #8265 improve rustc diagnostic mapping.

    +
  • +
  • +

    #8285 improve typechecking performance by avoiding re-checking unchanged obligations in an accidentally quadratic way.

    +
  • +
  • +

    #8284 reduce memory usage by using global Arc-based interning.

    +
  • +
  • +

    #8297 only populate prelude for crate-level `DefMap`s.

    +
  • +
  • +

    #8304 support the new panic!() macro.

    +
  • +
  • +

    #8305 fix "Join lines" panic when triggered on an empty last line.

    +
  • +
  • +

    #8307 make include! work for empty files.

    +
  • +
  • +

    #8318 use shrink_to_fit to reduce DefMap sizes.

    +
  • +
  • +

    #8324 add Body::shrink_to_fit.

    +
  • +
  • +

    #8329 (first contribution) fix moveItem method name in the docs.

    +
  • +
  • +

    #8332 show error when rustfmt component is unavailable.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #8235 make --log-file more discoverable.

    +
  • +
  • +

    #8241 clean up hprof.

    +
  • +
  • +

    #8244 track missing .check_cancelled.

    +
  • +
  • +

    #8247 ensure that runaway type-inference doesn’t block the main loop.

    +
  • +
  • +

    #8254 switch from CLI to internal benchmarking.

    +
  • +
  • +

    #8255 touch up dev readme.

    +
  • +
  • +

    #8262 revive google_cpu_profile infra.

    +
  • +
  • +

    #8186 lower traits to TraitRef instead of TypeRef.

    +
  • +
  • +

    #8269 document semantics of missing names.

    +
  • +
  • +

    #8286 include remaining memory in memory usage stats.

    +
  • +
  • +

    #8292 document Cargo.lock maintenance process.

    +
  • +
  • +

    #8293 document style for helper functions and variables.

    +
  • +
  • +

    #8303 allow interning strings.

    +
  • +
  • +

    #8309 introduce GenericArg like in chalk.

    +
  • +
  • +

    #8315 try to further reduce ItemTree size.

    +
  • +
  • +

    #8323 only remember blocks that have a DefMap.

    +
  • +
  • +

    #8327 move Ty creation methods out of Ty (chalk move preparation).

    +
  • +
  • +

    #8328 move things in hir_ty into submodules.

    +
  • +
  • +

    #8333 allow skipping type inference in analysis-stats.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/04/12/changelog-72.html b/thisweek/2021/04/12/changelog-72.html new file mode 100644 index 00000000..b7897630 --- /dev/null +++ b/thisweek/2021/04/12/changelog-72.html @@ -0,0 +1,264 @@ + + + + + + + + + + Changelog #72 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #72

+ +
+
+
+

Commit: 7be0613
+Release: 2021-04-12

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #8388 auto-close blocks when typing {:

    +
    +
    +114024061 e8d70a00 9873 11eb 89d6 c50296cbf495 +
    +
    +
  • +
  • +

    #8375 show errors from cargo metadata and initial cargo check in the status bar.

    +
  • +
  • +

    #8410 support InsertReplaceSupport capability

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #8433 intern lots of things (great for memory usage):

    +
    +
    +114185930 f1504300 994e 11eb 8e99 7925c54ab3c3 +
    +
    +
  • +
  • +

    #8406 improve indexing of impls (great for analysis speed):

    +
    +
    +114210350 595f5300 9968 11eb 87aa b7835faafdb8 +
    +
    +
  • +
  • +

    #8355 do not drop errors from cargo metadata and cargo check.

    +
  • +
  • +

    #8339 fix "Extract variable" assist in guards.

    +
  • +
  • +

    #8245 properly resolve intra-doc links in hover and goto_definition.

    +
  • +
  • +

    #8371 don’t use HirDisplayWrapper when displaying SourceCode.

    +
  • +
  • +

    #8381 lower attributes on tuple fields.

    +
  • +
  • +

    #8386 avoid O(n²) when constructing AttrSourceMap.

    +
  • +
  • +

    #8389 do not import on the fly inside record literal fields.

    +
  • +
  • +

    #8390 support trait impls in unnamed consts.

    +
  • +
  • +

    #8392 (first contribution) add space after lifetime in "Expand macro" output.

    +
  • +
  • +

    #8394 infer variants through type aliased enums.

    +
  • +
  • +

    #8397 (first contribution) improve "still loading" error message.

    +
  • +
  • +

    #8412 emit folding ranges for multiline array literals.

    +
  • +
  • +

    #8207 offer "Remove `dbg!`" assist on empty calls.

    +
  • +
  • +

    #8421 reduce allocations in "Expand macro" formatter.

    +
  • +
  • +

    #8426 track recursion limit when expanding custom derive.

    +
  • +
  • +

    #8431 add trait member token modifier to associated types.

    +
  • +
  • +

    #8440 fix crash on syn involving lifetimes returned by Chalk.

    +
  • +
  • +

    #8444 shrink unlinked-file diagnostic to 3 characters.

    +
  • +
  • +

    #8447 resolve prelude and crate root names in the root DefMap.

    +
  • +
  • +

    #8450 don’t ignore unnamed consts when looking for definitions.

    +
  • +
  • +

    #8457 don’t assume wrong binary operator return type when primitives are involved.

    +
  • +
  • +

    #8436 fix "Extract function"'s mutability of variables outliving the body.

    +
  • +
  • +

    #8463 support macros in pattern position.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #8334 intern and shrink more data to reduce memory usage.

    +
  • +
  • +

    #8337 explain "extract if condition" refactoring.

    +
  • +
  • +

    #8326 rewrite "Reorder fields" assist to use mutable syntax trees.

    +
  • +
  • +

    #8343 document hypothetical completion problem.

    +
  • +
  • +

    #8348, #8353, #8359, #8366, #8419 type inference now uses Chalk’s types everywhere.

    +
  • +
  • +

    #8350 prepare to store OpQueue results in the queue itself.

    +
  • +
  • +

    #8364 (first contribution) slightly reduce the memory usage of some `enum`s

    +
  • +
  • +

    #8374 intern TypeRefs stored in Body.

    +
  • +
  • +

    #8376, #8380 infer: remove redundant record_field_resolutions and record_pat_field_resolutions fields.

    +
  • +
  • +

    #8379 document broken windows.

    +
  • +
  • +

    #8429 add documentation and test for //! doc comment continuation on Enter.

    +
  • +
  • +

    #8384 use linear regression to catch accidentally super-linear performance regressions.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/04/19/changelog-73.html b/thisweek/2021/04/19/changelog-73.html new file mode 100644 index 00000000..55af5683 --- /dev/null +++ b/thisweek/2021/04/19/changelog-73.html @@ -0,0 +1,223 @@ + + + + + + + + + + Changelog #73 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #73

+ +
+
+
+

Commit: 7570212
+Release: 2021-04-19

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #8467 (first contribution) add "generate Deref impl" assist:

    +
    +
    +115183917 9971b480 a091 11eb 98b0 d847543cde01 +
    +
    +
  • +
  • +

    #8476 avoid checking the whole project during initial loading.

    +
  • +
  • +

    #8481, #8494, #8498 improve performance by delaying computation of fixes for diagnostics.

    +
  • +
  • +

    #8354 distinguish between different operators in semantic highlighting.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #8478 don’t spam repeated error messages when cargo check fails.

    +
  • +
  • +

    #8496 exclude nightly tag from git describe to really fix version string.

    +
  • +
  • +

    #8489 indent block expressions on enter:

    +
    +
    +114444123 cb38d600 9bce 11eb 8af2 8e8d1c0f9908 +
    +
    +
  • +
  • +

    #8415 fix faulty assertion when extracting function with macro call.

    +
  • +
  • +

    #8432 consider outer scopes' #[allow]s in decl_check.

    +
  • +
  • +

    #8526 do not show flyimports in trait or impl declarations.

    +
  • +
  • +

    #8510 move cursor position when using item movers.

    +
  • +
  • +

    #8536 (first contribution) slightly improve status messages.

    +
  • +
  • +

    #8543 (first contribution) fix "Fill match arms" issue with single-element tuples.

    +
  • +
  • +

    #8545 fix primitive shadowing with inner items.

    +
  • +
  • +

    #8539 do not propose inherent traits in flyimports and import assists.

    +
  • +
  • +

    #8546 return CallInfo for unclosed call expressions.

    +
  • +
  • +

    #8550 handle extended key-value attributes in MBE.

    +
  • +
  • +

    #8560 (first contribution) correctly escape characters in doc comments when passed through macros.

    +
  • +
  • +

    #8561 accept E<error_number> notation in doctests.

    +
  • +
  • +

    #8564 expand global_asm! to nothing.

    +
  • +
  • +

    #8569 support inherent impls in unnamed consts.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #8483 clarify who rls-2.0 wg really is.

    +
  • +
  • +

    #8499 don’t use #[should_panic] for tests.

    +
  • +
  • +

    #8500 fix flakiness of "accidentally quadratic?" test.

    +
  • +
  • +

    #8507 follow test style guide in typing.rs.

    +
  • +
  • +

    #8514, #8515 add more profiling spans to type inference.

    +
  • +
  • +

    #8549 fix TestDB::module_at_position with submodules.

    +
  • +
  • +

    #8551 (first contribution) nail down rowan version.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/04/26/changelog-74.html b/thisweek/2021/04/26/changelog-74.html new file mode 100644 index 00000000..09a251ef --- /dev/null +++ b/thisweek/2021/04/26/changelog-74.html @@ -0,0 +1,244 @@ + + + + + + + + + + Changelog #74 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #74

+ +
+
+
+

Commit: 6175353
+Release: 2021-04-26

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #8467 (first contribution) add "generate Deref impl" assist:

    +
    +
    +115183917 9971b480 a091 11eb 98b0 d847543cde01 +
    +
    +
    +

    This feature was included in the last week’s changelog by mistake.

    +
    +
  • +
  • +

    #8317 add "Convert tuple to named struct" assist:

    +
    +
    +116033884 ebef3a00 a66a 11eb 8e34 f95afe788a30 +
    +
    +
  • +
  • +

    #8462 expand macros in type positions.

    +
  • +
  • +

    #8621 make sure nightly regressions don’t break users.

    +
  • +
  • +

    #8570 parse rustc error messages in flycheck for non-Cargo build systems.

    +
  • +
  • +

    #8595 add support for remapping diagnostic paths.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #8611 (first contribution) add support for boolean values to "Fill match arms".

    +
  • +
  • +

    #8658 (first contribution) check more carefully for cases when a rename can’t be done.

    +
  • +
  • +

    #8582 (first contribution) fix typo in comparison semantic token type.

    +
  • +
  • +

    #8600 fix project loading hang.

    +
  • +
  • +

    #8606 fix "Registering progress handler" error.

    +
  • +
  • +

    #8639 fix configuration.property startup error in VS Code.

    +
  • +
  • +

    #8643 change version string to contain hash, build date and channel.

    +
  • +
  • +

    #8524 fix "Extract function" with partial block selection.

    +
  • +
  • +

    #8540 prevent renaming items that are not part of the workspace (LSP extension).

    +
  • +
  • +

    #8565 "Fill match arms" assist: add remaining arms for enum tuples.

    +
  • +
  • +

    #8577 support crates/module roots in external_docs.

    +
  • +
  • +

    #8578 fix inner attributes false positives in docs.

    +
  • +
  • +

    #8587 fix some find_path bugs around inner items (fixes auto-imports with macro calls).

    +
  • +
  • +

    #8601 trigger "Inline variable" assist on variable usages.

    +
  • +
  • +

    #8609 parse outer attributes for RecordPatField.

    +
  • +
  • +

    #8620 avoid unnecessary braces in "Extract function".

    +
  • +
  • +

    #8602 fix panic in "Replace derive with manual implementation".

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #8502 document review requesting etiquette.

    +
  • +
  • +

    #8527 rewrite "Introduce named lifetime" assist to use mutable syntax trees.

    +
  • +
  • +

    #8579 fix "Server status" capability name in docs.

    +
  • +
  • +

    #8580 remove confusion around serverStatusNotification.

    +
  • +
  • +

    #8584 fix slightly broken test.

    +
  • +
  • +

    #8586 replace SyntaxRewriter usage with ted in eager::eager_macro_recur.

    +
  • +
  • +

    #8588 add guidelines for release notes PR descriptions.

    +
  • +
  • +

    #8605 automatically categorize the changelog entries.

    +
  • +
  • +

    #8591 remove SyntaxRewriter usage in insert_use in favor of mutable syntax trees.

    +
  • +
  • +

    #8638 remove SyntaxRewriter::from_fn.

    +
  • +
  • +

    #8647 split out merge_imports module from helpers::insert_use.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/05/03/changelog-75.html b/thisweek/2021/05/03/changelog-75.html new file mode 100644 index 00000000..128bba12 --- /dev/null +++ b/thisweek/2021/05/03/changelog-75.html @@ -0,0 +1,191 @@ + + + + + + + + + + Changelog #75 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #75

+ +
+
+
+

Commit: eb741e8
+Release: 2021-05-03

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #8629 (first contribution) allow pressing | to surround closure arguments in VS Code:

    +
    +
    +115778847 3c257e00 a385 11eb 8c80 e0db970747db +
    +
    +
  • +
  • +

    #8617 (first contribution) add option to opt out of smaller font size for inlay hints in VS Code.

    +
  • +
  • +

    #8660 (first contribution) add mutable semantic token modifier for &mut self methods.

    +
  • +
  • +

    #8624 automatically detect rust library source file map.

    +
  • +
  • +

    #8685 parse const param defaults.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #8693 (first contribution) ensure that only one cache priming task can run at a time.

    +
  • +
  • +

    #8666 report correct version string on Windows and Mac.

    +
  • +
  • +

    #8670 make error message in the status bar more useful.

    +
  • +
  • +

    #8677 return ServerNotInitialized according to the spec.

    +
  • +
  • +

    #8679 don’t show error message for a valid notification.

    +
  • +
  • +

    #8684 correctly parse negated literals as const args.

    +
  • +
  • +

    #8687 improve unification of non-capturing closures.

    +
  • +
  • +

    #8692 fix panic caused by new Try trait definition on nightly toolchains.

    +
  • +
  • +

    #8698 search only crate-level prelude when looking for an item.

    +
  • +
  • +

    #8708 don’t duplicate Progress::Finished for cache priming.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #8661 make normal release after a point release less annoying.

    +
  • +
  • +

    #8668 use more cross-platform utc date argument.

    +
  • +
  • +

    #8683 ensure that client and server-side configs are not mixed up.

    +
  • +
  • +

    #8695 fix naming polarity.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/05/10/changelog-76.html b/thisweek/2021/05/10/changelog-76.html new file mode 100644 index 00000000..1624da26 --- /dev/null +++ b/thisweek/2021/05/10/changelog-76.html @@ -0,0 +1,244 @@ + + + + + + + + + + Changelog #76 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #76

+ +
+
+
+

Commit: fd109fb
+Release: 2021-05-10

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #8482 (first contribution) explain how to customize unsafe highlighting.

    +
  • +
  • +

    #8674 (first contribution) add folding of multi-line where clauses.

    +
  • +
  • +

    #8759 (first contribution) add Kate installation steps to the user manual.

    +
  • +
  • +

    #8774 respect .cargo/config.toml:

    +
    +
    +117545448 1dcaae00 b026 11eb 977a 0f35a5e3f2e0 +
    +
    +
  • +
  • +

    #8784 auto-insert } when typing { in use item:

    +
    +
    +117585742 45983f80 b114 11eb 80fc d44f480fd012 +
    +
    +
  • +
  • +

    #8710 build releases with LTO (link-time optimization).

    +
  • +
  • +

    #8761, #8763 improve troubleshooting guide.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #8712 fix panic in the "Sort methods" assist.

    +
  • +
  • +

    #8715 make CompletionContext::expected_type smarter.

    +
  • +
  • +

    #8711 only resolve the selected assist.

    +
  • +
  • +

    #8719 fix block comment intra-doc link injection ranges.

    +
  • +
  • +

    #8731 complete enum variants through type aliases.

    +
  • +
  • +

    #8742 do not overwrite comments and attrs in trait impl completion.

    +
  • +
  • +

    #8745 support "Go to type definition" on types.

    +
  • +
  • +

    #8748 fix "Add missing fields" panic on raw identifiers.

    +
  • +
  • +

    #8755 direct people to the right repository for the user manual.

    +
  • +
  • +

    #8773 support SelfType when searching for usages.

    +
  • +
  • +

    #8777 correctly escape characters in built-in macros.

    +
  • +
  • +

    #8779 don’t add space before quote in "Join lines".

    +
  • +
  • +

    #8776 fix unnecessary recomputations due to macros.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #8427 (first contribution) move CI to the rust-cache action.

    +
  • +
  • +

    #8714, #8765, #8768, #8769 remove more SyntaxRewriter usages and code.

    +
  • +
  • +

    #8716 replace memmap with memmap2 in proc_macro_api.

    +
  • +
  • +

    #8720, #8725 add integrated completion benchmark.

    +
  • +
  • +

    #8732 refactor expansion queries.

    +
  • +
  • +

    #8743 explain why docs should use have one sentence per line.

    +
  • +
  • +

    #8746 don’t store call-site text offsets in hygiene info.

    +
  • +
  • +

    #8280 borrow text of immutable syntax nodes.

    +
  • +
  • +

    #8718 upgrade to Rust 1.52.

    +
  • +
  • +

    #8753 expose cfg attrs from hir::Crate.

    +
  • +
  • +

    #8762 disable broken incremental builds 😿.

    +
  • +
  • +

    #8764 add rust-analyzer version to panic context.

    +
  • +
  • +

    #8770 add failing test for the "Pull assignment up" assist.

    +
  • +
  • +

    #8781 rewrite Replace impl Trait assist to use mutable syntax trees.

    +
  • +
  • +

    #8782, #8783 improve the make API.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/05/17/changelog-77.html b/thisweek/2021/05/17/changelog-77.html new file mode 100644 index 00000000..6d9492c3 --- /dev/null +++ b/thisweek/2021/05/17/changelog-77.html @@ -0,0 +1,208 @@ + + + + + + + + + + Changelog #77 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #77

+ +
+
+
+

Commit: b824588
+Release: 2021-05-17

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #8791 auto-indent use tree lists:

    +
    +
    +117665627 53e16c80 b1a3 11eb 8906 1b88b394367b +
    +
    +
  • +
  • +

    #8801, #8807 allow viewing the crate graph in a webview (VS Code only):

    +
    +
    +117831361 c4a48980 b274 11eb 9276 240cdf6919aa +
    +
    +
  • +
  • +

    #8799, #8813 add support for array lengths in types.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #8802 (first contribution) keep comments and attributes when extracting struct from enum variant.

    +
  • +
  • +

    #8819 (first contribution) use package root as cargo check working directory.

    +
  • +
  • +

    #8398 fix inference with conditionally compiled tails.

    +
  • +
  • +

    #8800 make "Pull assignment up" assist work in more cases.

    +
  • +
  • +

    #8805 use Cargo target name as crate name.

    +
  • +
  • +

    #8806, #8808 strip delimiters from function-like macro invocations.

    +
  • +
  • +

    #8812 fix dependencies of build scripts.

    +
  • +
  • +

    #8820 return absolute paths in find_path if crate start is ambiguous.

    +
  • +
  • +

    #8823 enable task lists in pulldown_cmark.

    +
  • +
  • +

    #8814 keep doc comments and outer attributes in "Move module to file" assist.

    +
  • +
  • +

    #8830 implement bulit-in concat_idents! macro.

    +
  • +
  • +

    #8831 apply async semantic token modifier to the async/await keywords.

    +
  • +
  • +

    #8840 fix false positive "Missing match arm" when a tuple pattern is shorter than scrutinee type.

    +
  • +
  • +

    #8845 add default type parameters on "Generate Default from new function".

    +
  • +
  • +

    #8848 attach comments to ast::Impl.

    +
  • +
  • +

    #8853 tag Self in impls as a type alias.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #8793, #8825 (first contributions) fix a couple of typos.

    +
  • +
  • +

    #8798 use modern dependency resolver.

    +
  • +
  • +

    #8796 rewrite #[derive] removal to be based on AST (take 2).

    +
  • +
  • +

    #8837, #8838, #8854 use mutable syntax trees in more places.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/05/24/changelog-78.html b/thisweek/2021/05/24/changelog-78.html new file mode 100644 index 00000000..6d386935 --- /dev/null +++ b/thisweek/2021/05/24/changelog-78.html @@ -0,0 +1,247 @@ + + + + + + + + + + Changelog #78 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #78

+ +
+
+
+

Commit: 495c958
+Release: 2021-05-24

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #7698, #8877 (first contribution) add new LSP extension for workspace symbol lookup.

    +
  • +
  • +

    #8873 implement import granularity guessing.

    +
  • +
  • +

    #8948 "Generate getter" assist places the cursor at the generated function.

    +
  • +
  • +

    #8953 "Generate getter" avoids generating types like &Vec<T>.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #8345 (first contribution) add pub mod option to the "Unlinked file" diagnostic fix.

    +
  • +
  • +

    #8766 (first contribution) add async if required in "Extract function" assist.

    +
  • +
  • +

    #8945 make expected type work in more situations:

    +
    +
    +119269023 dd5a5b00 bbf5 11eb 993a b6e122c3b9a6 +
    +
    +
    +
    +119269025 dfbcb500 bbf5 11eb 983c fc415b8428e0 +
    +
    +
  • +
  • +

    #8795 allow semantic tokens for strings to be disabled.

    +
  • +
  • +

    #8858 ignore macro imports from extern crate self.

    +
  • +
  • +

    #8863 don’t add extra whitespace around fields.

    +
  • +
  • +

    #8880 fix module renaming.

    +
  • +
  • +

    #8875 avoid false positive "Missing match arm" when an or-pattern has mismatched types.

    +
  • +
  • +

    #8884 fix "Add explicit type" producing invalid code on @ patterns.

    +
  • +
  • +

    #8893 update outdated auto-import documentation.

    +
  • +
  • +

    #8902 fix code completion not inserting borrow text when client supports InsertAndReplace.

    +
  • +
  • +

    #8910 don’t hang on unresolved attribute on extern block and its children.

    +
  • +
  • +

    #8918 fix hang caused by non-unique attribute IDs.

    +
  • +
  • +

    #8901 speed up fill_match_arms on tuples of large enums.

    +
  • +
  • +

    #8935 mention rust-tools.nvim for nvim-lsp in the manual.

    +
  • +
  • +

    #8936 improve nightly downloads with better local state management.

    +
  • +
  • +

    #8940 give unsafe semantic token modifier to unsafe traits.

    +
  • +
  • +

    #8947 correctly resolve crate name in use paths when import shadows it.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #8856, #8921, #8938 use Chalk for unification.

    +
  • +
  • +

    #8862 reorganize module structure of fixits.

    +
  • +
  • +

    #8871 simplify DefCollector::resolve_macros.

    +
  • +
  • +

    #8882, #8887, #8888 resolve attributes in name resolution (minimal version).

    +
  • +
  • +

    #8885 greatly simplify eager macro representation.

    +
  • +
  • +

    #8889 track in-scope derive helpers during name resolution.

    +
  • +
  • +

    #8898 resolve derive helpers.

    +
  • +
  • +

    #8900 support #[register_attr] and #[register_tool].

    +
  • +
  • +

    #8914 remove StructDefKind.

    +
  • +
  • +

    #8916, #8932 implement ItemTree pretty-printing.

    +
  • +
  • +

    #8868 replace AstTransformer with mutable syntax trees.

    +
  • +
  • +

    #8922, #8923, #8924 add more docs.

    +
  • +
  • +

    #8926 drop uncompressed release artifacts and those following the old naming convention.

    +
  • +
  • +

    #8954 document ItemTree design.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/05/31/changelog-79.html b/thisweek/2021/05/31/changelog-79.html new file mode 100644 index 00000000..5e5684f8 --- /dev/null +++ b/thisweek/2021/05/31/changelog-79.html @@ -0,0 +1,305 @@ + + + + + + + + + + Changelog #79 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #79

+ +
+
+
+

Commit: f438398
+Release: 2021-05-31

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #8955 add support for standalone Rust files:

    +
    +
    +119277037 0b579380 bc26 11eb 8d77 20d46ab4916a +
    +
    +
  • +
  • +

    #8988, #8990 support "Go to implementations" on trait functions and associated constants:

    +
    +
    +119501981 45a45c00 bd1e 11eb 8336 9145f2888643 +
    +
    +
  • +
  • +

    #8942, #8996 add library semantic token modifier to items from other crates.

    +
  • +
  • +

    #8767, #9028 implement range formatting (requires nightly rustfmt).

    +
  • +
  • +

    #9012 add tab stops for keyword completions.

    +
  • +
  • +

    #9027 make attribute completion is context aware.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #8995 create tasks for all workspaces (VS Code only):

    +
    +
    +119575273 74264380 bdbf 11eb 8283 a78bbcb7346e +
    +
    +
  • +
  • +

    #9038 add folding range for return types:

    +
    +
    +119979082 5c62e100 bfb2 11eb 9729 1dea1ce74de1 +
    +
    +
  • +
  • +

    #8968 (first contribution) fix binary installation instructions.

    +
  • +
  • +

    #8967 (first contribution) fix cursor position after move item command.

    +
  • +
  • +

    #8994 (first contribution) check for subdirectories in VFS loader exclusions.

    +
  • +
  • +

    #9051 (first contribution) fix swapped config descriptions.

    +
  • +
  • +

    #8959 fix downloading the server binary on Windows again.

    +
  • +
  • +

    #9046 make include! and other eager macros work in expression position.

    +
  • +
  • +

    #8970 duplicate dependencies that have multiple DepKinds.

    +
  • +
  • +

    #8975 use todo!() as placeholder body for generated match arms.

    +
  • +
  • +

    #8983 fix type mismatch caused by macros.

    +
  • +
  • +

    #8986 add "Go to type definition" for struct fields within struct.

    +
  • +
  • +

    #8989 try to fix type inference for the new Try trait.

    +
  • +
  • +

    #8987 fix lowering of FnOnce() without return type.

    +
  • +
  • +

    #8991 consider trait to be in scope for trait impls.

    +
  • +
  • +

    #8993 don’t show pd/ppd completions where they shouldn’t be.

    +
  • +
  • +

    #9008 remove undesired completions from trait/impl blocks.

    +
  • +
  • +

    #9026 complete modules in associated item lists.

    +
  • +
  • +

    #9033 complete keywords in (Assoc)ItemList with leading attribute.

    +
  • +
  • +

    #9059 only complete derive proc macros in #[derive].

    +
  • +
  • +

    #9064 fix incorrect prefer_inner calls on some attribute completions.

    +
  • +
  • +

    #9020 don’t complete non-macro item paths in impls and modules.

    +
  • +
  • +

    #9032 only complete modules in empty use-statements.

    +
  • +
  • +

    #9002, #9037 move annotations below item attributes.

    +
  • +
  • +

    #9054 fix matches! macro on nightly toolchains.

    +
  • +
  • +

    #9050 hir_ty: use async ret type for inference inside async bodies.

    +
  • +
  • +

    #9065 hir_ty: don’t pass where clauses of associated types down to chalk.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #8973 move diagnostics to hir.

    +
  • +
  • +

    #8965 intern TypeBound and GenericArgs.

    +
  • +
  • +

    #8978 intern AttrInput.

    +
  • +
  • +

    #9017 reduce the number of traits passed through chalk during applicable trait lookup.

    +
  • +
  • +

    #8976 rename hypothetical to speculative.

    +
  • +
  • +

    #8977 minor TokenMap cleanups.

    +
  • +
  • +

    #9005, #9003 document semantic token types and modifiers.

    +
  • +
  • +

    #9007 fix some clippy::redundant_clone warnings.

    +
  • +
  • +

    #9014, #9018, #9019 simplify CompletionContext.

    +
  • +
  • +

    #9068 move more CompletionContext fields to ImmediateLocation

    +
  • +
  • +

    #9015 merge pattern completion related bools into an enum.

    +
  • +
  • +

    #9016 set record_pat_syntax more precisely in CompletionContext.

    +
  • +
  • +

    #9041 implement previous sibling determination for CompletionContext.

    +
  • +
  • +

    #9021 explain the motivation behind early configuration.

    +
  • +
  • +

    #8997 stop expanding UseTrees during ItemTree lowering.

    +
  • +
  • +

    #9024 don’t store supertraits in ItemTree.

    +
  • +
  • +

    #9036 remove undocumented TextDocumentSyncKind::Full support.

    +
  • +
  • +

    #9048 add some lint completion tests.

    +
  • +
  • +

    #9057 thread proc macro types through the HIR.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/06/07/changelog-80.html b/thisweek/2021/06/07/changelog-80.html new file mode 100644 index 00000000..80e4c728 --- /dev/null +++ b/thisweek/2021/06/07/changelog-80.html @@ -0,0 +1,265 @@ + + + + + + + + + + Changelog #80 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #80

+ +
+
+
+

Commit: 13da28c
+Release: 2021-06-07

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9039 complete fields and methods with self. prefixed when inside methods:

    +
    +
    +119984385 a0111700 bfc1 11eb 9dbf 52fdaa4d72b5 +
    +
    +
  • +
  • +

    #9136 add function references hover action (disabled by default):

    +
    +
    +120811670 8422ed80 c54c 11eb 87f5 dd65c1f8ef7d +
    +
    +
  • +
  • +

    #9138 implement hover for lints:

    +
    +
    +120847184 6ae16780 c573 11eb 8a55 d31e2736a234 +
    +
    +
  • +
  • +

    #9140 render documentation for derive completion:

    +
    +
    +120847308 9c5a3300 c573 11eb 958d e0f22f4757ed +
    +
    +
  • +
  • +

    #9149 support "Go to definition" for include! arguments:

    +
    +
    +120891155 3fa85800 c607 11eb 9b20 7ac330dceb4b +
    +
    +
  • +
  • +

    #9128 expand procedural attribute macros (disabled by default).

    +
  • +
  • +

    #9097 implement per-edition preludes.

    +
  • +
  • +

    #9104 implement #[rustc_skip_array_during_method_dispatch].

    +
  • +
  • +

    #9060 diagnose unimplemented built-in macros.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9123 (first contribution) add Gentoo installation instructions.

    +
  • +
  • +

    #9091 fix opening single files.

    +
  • +
  • +

    #8717, #9105 update match checking algorithm.

    +
  • +
  • +

    #9090 fix type inference with arbitrary self types.

    +
  • +
  • +

    #9130 make prefix/suffix parameter inlay hint hiding heuristic is more strict.

    +
  • +
  • +

    #9079 don’t take the parent kind of trailing attributes in attribute completion.

    +
  • +
  • +

    #8952 support doctest runnables in impl blocks.

    +
  • +
  • +

    #9084 avoid panics in the name case diagnostic.

    +
  • +
  • +

    #9087 fix shell injection in task spawning.

    +
  • +
  • +

    #9111 make "Extract type alias" place extracted alias outside impl block.

    +
  • +
  • +

    #9119 some minor "Extract type alias" fixes.

    +
  • +
  • +

    #9108 don’t show the "Extract into variable" assist for unit expressions.

    +
  • +
  • +

    #9112 fix some bugs in the "Extract struct from enum variant" assist.

    +
  • +
  • +

    #9114 fix bind patterns always being treated as ref taking patterns.

    +
  • +
  • +

    #9117 allow "Expand macro" to be invoked anywhere inside a macro call.

    +
  • +
  • +

    #9137 fix incorrect unresolved import error when using derive helpers.

    +
  • +
  • +

    #9141 don’t inline mutable locals in the "Inline local variable" assist.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #8866 update salsa to pick upstream cancellation support.

    +
  • +
  • +

    #9077 use Name instead of String in the completion rendering API.

    +
  • +
  • +

    #9127 make variant fields inherit the enum’s visibility in the item tree.

    +
  • +
  • +

    #9155 replace attribute with equivalent whitespace.

    +
  • +
  • +

    #9025 display unknown types in analysis-stats.

    +
  • +
  • +

    #9145 enable attribute macro expansion in analysis-stats.

    +
  • +
  • +

    #9147 enable proc macros and build scripts by default in analysis-stats.

    +
  • +
  • +

    #9083 simplify proc_macro_srv tests.

    +
  • +
  • +

    #9110 simplify completion code.

    +
  • +
  • +

    #9124 apply a few clippy suggestions.

    +
  • +
  • +

    #9135 reorganize inlay_hints tests.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/06/14/changelog-81.html b/thisweek/2021/06/14/changelog-81.html new file mode 100644 index 00000000..ba81d292 --- /dev/null +++ b/thisweek/2021/06/14/changelog-81.html @@ -0,0 +1,224 @@ + + + + + + + + + + Changelog #81 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #81

+ +
+
+
+

Commit: f0618a8
+Release: 2021-06-14

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9144 (first contribution) extend "Convert tuple to named struct" assist to work for enum variants.

    +
  • +
  • +

    #9106 "Go to definition" on an impl function goes to the corresponding function in the trait.

    +
    +
    +120403989 39aa3280 c2fa 11eb 9359 639346878acd +
    +
    +
  • +
  • +

    #9223 complete associated types in dyn and impl trait.

    +
  • +
  • +

    #9202 make "Memory usage" work on Windows.

    +
  • +
  • +

    #9204 improve memory usage info accuracy on glibc Linux.

    +
  • +
  • +

    #9244 make block-local trait impls work.

    +
  • +
  • +

    #9153 show server status when click on the VS Code status bar entry to show the server status.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9180 fix some IDE functionality inside attribute macros.

    +
  • +
  • +

    #9239 fix coercion in match with expected type.

    +
  • +
  • +

    #9182 don’t complete derive macros as function-like macros.

    +
  • +
  • +

    #9187 fix edge case in import granularity guessing.

    +
  • +
  • +

    #9186 prefer attr macros in "Expand macro recursively".

    +
  • +
  • +

    #9191 don’t descend into MacroCall TokenTree delimiters.

    +
  • +
  • +

    #9196 don’t classify attributes on macro-calls as the macro itself.

    +
  • +
  • +

    #9209 don’t suggest "Remove unused param" in trait impls.

    +
  • +
  • +

    #9215 enable "Change visibility" assist for use and macro items.

    +
  • +
  • +

    #9216 don’t allow lookup by self for unprefixed completions.

    +
  • +
  • +

    #9218 make item search respect trait impl items.

    +
  • +
  • +

    #9221 correctly highlight tuple field accesses.

    +
  • +
  • +

    #9161 fix incorrect config usage in hover references.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+ +
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/06/21/changelog-82.html b/thisweek/2021/06/21/changelog-82.html new file mode 100644 index 00000000..8f67fbc6 --- /dev/null +++ b/thisweek/2021/06/21/changelog-82.html @@ -0,0 +1,210 @@ + + + + + + + + + + Changelog #82 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #82

+ +
+
+
+

Commit: 3898387
+Release: 2021-06-21

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9267 in VS Code extension update the LSP server without asking.

    +
  • +
  • +

    #9275 support goto type for field expressions and patterns.

    +
  • +
  • +

    #9279 document installation via Homebrew.

    +
  • +
  • +

    #9258 rename assits.importPrefix config variants.

    +
  • +
  • +

    #9301, #9310, #9313 better filter out irrelevant completions.

    +
  • +
  • +

    #9318 complete repr attribute parameters.

    +
  • +
  • +

    #9321 substitute generic parameters during auto-complete.

    +
  • +
  • +

    #9334 don’t split glob imports during auto imports (on by default, can be disabled).

    +
  • +
  • +

    #9335 auto-import in #[cfg]-ed blocks adds imports locally.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9262 don’t keep a trailing self token in import paths after unmerge_use.

    +
  • +
  • +

    #9295 highlight unsafe trait refs as unsafe only in impl blocks and definitions.

    +
  • +
  • +

    #9293 show diagnostic fixes before assists.

    +
  • +
  • +

    #9308 create modules in correct directory for nested modules.

    +
  • +
  • +

    #9345 don’t add duplicate & during completion.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #9294 (and a whole bunch of related PRs) introduce minicore — a subset of libcore for testing.

    +
  • +
  • +

    #9320 retire famous_defs_fixture.

    +
  • +
  • +

    #9346 refactor / clean up hir_ty tests.

    +
  • +
  • +

    #9278 document that we don’t #[ignore] tests.

    +
  • +
  • +

    #9290 enforce no #[ignore] and no #[should_panic].

    +
  • +
  • +

    #8951, #9281, #9292 migrate VS Code plugin to use vscode.FileSystem proxy API rather than directly calling into node.

    +
  • +
  • +

    #9260 add <> to URLs in internal doc comments to make them clickable.

    +
  • +
  • +

    #9263 don’t use heuristics in rename (#9344 fixes regression introduced by that PR).

    +
  • +
  • +

    #9265 move rename infrastructure to core IDE services.

    +
  • +
  • +

    #9272, #9276 move diagnostics to a dedicated crate.

    +
  • +
  • +

    #9273 don’t pull tracing via chalk.

    +
  • +
  • +

    #9282 fix package.json error when debugging VS Code extension locally.

    +
  • +
  • +

    #9315 nest all the or-patterns!

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/06/28/changelog-83.html b/thisweek/2021/06/28/changelog-83.html new file mode 100644 index 00000000..77d2e0fa --- /dev/null +++ b/thisweek/2021/06/28/changelog-83.html @@ -0,0 +1,231 @@ + + + + + + + + + + Changelog #83 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #83

+ +
+
+
+

Commit: 1fa82ad
+Release: 2021-06-28

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9375 highlight exit and yield points:

    +
    +
    +123292155 0f235200 d513 11eb 92e0 bef9aaea76a1 +
    +
    +
    +
    +123128988 e1bfa100 d44b 11eb 9c81 6a6031aad740 +
    +
    +
  • +
  • +

    #9396, #9397 highlight loop exit points:

    +
    +
    +123318732 d47be280 d52f 11eb 8a9a cb3f591d4195 +
    +
    +
  • +
  • +

    #9362 massively improve performance for large files.

    +
  • +
  • +

    #9264 make documentation on hover configurable.

    +
  • +
  • +

    #9080 improve completion of cfg attributes.

    +
  • +
  • +

    #9031 add public semantic token modifier for public items.

    +
  • +
  • +

    #9380 add "Go to declaration" support.

    +
  • +
  • +

    #9227 add config setting to disable the cfg(test) cfg in specific crates.

    +
  • +
  • +

    #9348 output to a log file if RA_LOG_FILE is defined in environment.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9353 (first contribution) include extra targets when the pkg_root is not the same as the target root.

    +
  • +
  • +

    #9314 add .await when extracting an async function.

    +
  • +
  • +

    #9355 don’t insert } when typing { in a string.

    +
  • +
  • +

    #9357 update sysroot crates.

    +
  • +
  • +

    #9363 set target directory explicitly to avoid deadlock running cargo.

    +
  • +
  • +

    #9368 prefer identifier tokens in "Expand macro".

    +
  • +
  • +

    #9390 improve type bound completions.

    +
  • +
  • +

    #9400 fix renaming associated trait items with colliding names.

    +
  • +
  • +

    #9347 add note about cfg(debug_assertions).

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #9379 remove one more accidentally quadratic code path.

    +
  • +
  • +

    #9373 factor out pick_best_token ide pattern into ide_db.

    +
  • +
  • +

    #9356 refactor completion tests.

    +
  • +
  • +

    #9383 rewrite token tree lowering to use an explicit stack.

    +
  • +
  • +

    #9413 deduplicate expression AST visiting logic.

    +
  • +
  • +

    #9364 split hover actions config into its own config struct.

    +
  • +
  • +

    #9367 document perf characteristics of SyntaxNodePtr::to_node.

    +
  • +
  • +

    #9369 document source_to_def and its connection to Kotlin and Roslyn.

    +
  • +
  • +

    #9377 count ItemScopes.

    +
  • +
  • +

    #9381 fix compilation on wasm32-unknown-unknown.

    +
  • +
  • +

    #9165 apply some clippy suggestions.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/07/05/changelog-84.html b/thisweek/2021/07/05/changelog-84.html new file mode 100644 index 00000000..be644533 --- /dev/null +++ b/thisweek/2021/07/05/changelog-84.html @@ -0,0 +1,222 @@ + + + + + + + + + + Changelog #84 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #84

+ +
+
+
+

Commit: e5c1c8c
+Release: 2021-07-05

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9452 add "View Crate Graph (Full)" command, which includes external dependencies.

    +
    +
    +124423305 85268500 dd6d 11eb 816c fa28293bed57 +
    +
    +
  • +
  • +

    #9454, #9455, #9465 make "Replace if let with match" work with chained if let …​ {} else if let …​ expressions and guards:

    +
    +
    +124424266 6e812d80 dd6f 11eb 9ea1 95d73d0f3d2f +
    +
    +
  • +
  • +

    #9473 "Join lines" joins two ifs into else if:

    +
    +
    +124359561 3d4d1400 dc2e 11eb 9b54 046f361b0679 +
    +
    +
  • +
  • +

    #9468 make "Inline call" work on methods.

    +
  • +
  • +

    #9489 always prefer postfix snippets on exact match.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9428 fix deduction of dyn Fn closure parameter types.

    +
  • +
  • +

    #9420 make hover on attribute paths work again.

    +
  • +
  • +

    #9422 handle ::{self} imports.

    +
  • +
  • +

    #9423 resolve paths in attribute highlighting.

    +
  • +
  • +

    #9426 watch for Cargo.toml and Cargo.lock changes.

    +
  • +
  • +

    #9269 redesign status page.

    +
  • +
  • +

    #9435, #9464 don’t add test runnables to the wrong file.

    +
  • +
  • +

    #9437 don’t classify paths inside attribute TokenTrees.

    +
  • +
  • +

    #9445 fix inner items defined in nested macros.

    +
  • +
  • +

    #9447 make the "unlinked file" diagnostic a hint again.

    +
  • +
  • +

    #9450 add ModuleOrItem to import granularity guessing.

    +
  • +
  • +

    #9456, #9463 add proc_macrostd dependency edge.

    +
  • +
  • +

    #9477 merge results from different namespaces in auto_import.

    +
  • +
  • +

    #9479 insert fully qualified paths in "Replace qualified name with use".

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #9418 include self in usage search results inside their own definition.

    +
  • +
  • +

    #9431 implement TypeRef::ForLifetime.

    +
  • +
  • +

    #9467 update "Wrap return type in Result" to work on the HIR.

    +
  • +
  • +

    #9476 overhaul codegen.

    +
  • +
  • +

    #9484 make xtask lighter.

    +
  • +
  • +

    #9487 refactor to_proto::completion.

    +
  • +
  • +

    #9488 make CompletionItem and SourceChange consistent.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/07/12/changelog-85.html b/thisweek/2021/07/12/changelog-85.html new file mode 100644 index 00000000..aa284ece --- /dev/null +++ b/thisweek/2021/07/12/changelog-85.html @@ -0,0 +1,243 @@ + + + + + + + + + + Changelog #85 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #85

+ +
+
+
+

Commit: fe00358
+Release: 2021-07-12

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9478, #9494, #9523 (first contribution) show imported trait on autocompletion of associated items:

    +
    +
    +124471905 b5dcdd80 ddb2 11eb 8852 1d703ef6023f +
    +
    +
    +
    +124471923 bffedc00 ddb2 11eb 9571 31b8b95499f1 +
    +
    +
  • +
  • +

    #9568 add for postfix completion:

    +
    +
    +125194692 a0aaf780 e267 11eb 952a 81de7955d9a1 +
    +
    +
  • +
  • +

    #9498 remove "Replace unwrap with match" assist in favor of "Inline call":

    +
    +
    +124482574 b58c1480 dda9 11eb 940d bc6a2fe4050b +
    +
    +
  • +
  • +

    #9503 make "Join lines" behavior configurable:

    +
    +
    +124515923 4504e800 dde9 11eb 8d58 d97945a1a785 +
    +
    +
  • +
  • +

    #9449 emit test names in "Run test" runnables if they come from a macro expansion:

    +
    +
    +124174493 bb81ad00 daac 11eb 96c7 3de6545a62e1 +
    +
    +
  • +
  • +

    #9555 enable auto_import on ident patterns.

    +
  • +
  • +

    #9520 complete crate, super and self in non-use tree paths.

    +
  • +
  • +

    #9548 add self parameter completion.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9541 (first contribution) make "Generate function" add async if the call is followed by await.

    +
  • +
  • +

    #9474, #9500 inline parameters in "Inline call" if possible.

    +
  • +
  • +

    #9497 wrap inlined closures in parens when using "Inline call".

    +
  • +
  • +

    #9499 fix cycle in visibility computation with modules from the same block.

    +
  • +
  • +

    #9496 make file logging line-buffered.

    +
  • +
  • +

    #9526, #9529 coerce array elements to a common type.

    +
  • +
  • +

    #9536 represent opaque types with TyKind::OpaqueType.

    +
  • +
  • +

    #9551 keep qualifier in "Replace qualified name with use".

    +
  • +
  • +

    #9552 make "Add explicit type" respect coercions.

    +
  • +
  • +

    #9557 respect coercions in "Inline call".

    +
  • +
  • +

    #9569 fix highlighting of field shorthands.

    +
  • +
  • +

    #9572 work around older synstructure derives.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #9519 (first contribution) name all spawned threads.

    +
  • +
  • +

    #9505 ensure consistent passing of config params.

    +
  • +
  • +

    #9514 invert boolean literals in assist negation logic.

    +
  • +
  • +

    #9512 record coercion adjustments.

    +
  • +
  • +

    #9545 record autoderef adjustments.

    +
  • +
  • +

    #9563 move some presentation-specific concerns out of the IDE crate.

    +
  • +
  • +

    #9565 document NameClass and NameRefClass.

    +
  • +
  • +

    #9567 remove unneeded NameClass::ExternCrate.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/07/19/changelog-86.html b/thisweek/2021/07/19/changelog-86.html new file mode 100644 index 00000000..721b9cd2 --- /dev/null +++ b/thisweek/2021/07/19/changelog-86.html @@ -0,0 +1,205 @@ + + + + + + + + + + Changelog #86 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #86

+ +
+
+
+

Commit: ea105f9
+Release: 2021-07-19

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9550 (first contribution) add multiple proc macro ABI support.

    +
  • +
  • +

    #9595 show test mod runnable in outline modules:

    +
    +
    +125494747 169c9238 3faa 4eed 9700 90bd730b4e3c +
    +
    +
  • +
  • +

    #9596 include type arguments in "Go to type definition" result:

    +
    +
    +126110831 5a16d375 b7fa 4556 a4f2 eb739b641f60 +
    +
    +
  • +
  • +

    #9594 add mutable semantic token modifier to assignment operators.

    +
  • +
  • +

    #9622 improve parser error recovery for function parameters.

    +
  • +
  • +

    #9619 parse GATs in associated type arguments.

    +
  • +
  • +

    #9585 rename the old server binary before update.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9599 (first contribution) complete true and false keywords.

    +
  • +
  • +

    #9600 (first contribution) fix "Unwrap block" assist on single-line and nested blocks.

    +
  • +
  • +

    #9621 (first contribution) update manual after Neovim 0.5 release.

    +
  • +
  • +

    #9579 set more CARGO_ env vars.

    +
  • +
  • +

    #9604 don’t fold consecutive modules with item lists.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #9535 remove proc macro management thread.

    +
  • +
  • +

    #9582 remove erroneous default impl.

    +
  • +
  • +

    #9583 get rid of a call to slow O(N) visibility_of function.

    +
  • +
  • +

    #9592 split main highlighting function.

    +
  • +
  • +

    #9597 use Type::walk for goto_type_definition.

    +
  • +
  • +

    #9603 move attribute completion tests.

    +
  • +
  • +

    #9605 make folding ranges respect item visibilities.

    +
  • +
  • +

    #9614 simplify "Remove dbg!" assist.

    +
  • +
  • +

    #9620 don’t depend on the current working directory.

    +
  • +
  • +

    #9623 make it clearer where IO happens.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/07/26/changelog-87.html b/thisweek/2021/07/26/changelog-87.html new file mode 100644 index 00000000..11f8e1a2 --- /dev/null +++ b/thisweek/2021/07/26/changelog-87.html @@ -0,0 +1,228 @@ + + + + + + + + + + Changelog #87 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #87

+ +
+
+
+

Commit: 5983d37
+Release: 2021-07-26

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9660 (first contribution) hide keyword suggestions in non-trivial paths:

    +
    +
    +126478222 54c742bb 2bd3 4e5b b533 f835264604be +
    +
    +
    +
    +126479635 819127d8 322b 4e34 acd2 194d1e9ba504 +
    +
    +
  • +
  • +

    #9678 add configuration for "highlight related" features:

    +
    +
    +126728849 a38b560c b687 42c1 9c41 7584ad718469 +
    +
    +
  • +
  • +

    #9665 only complete ancestors and self in visibility path completions.

    +
  • +
  • +

    #9681, #9684 respect #[doc(hidden)] in dot-completion.

    +
  • +
  • +

    #9688 resolve derive attribute input macro paths.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9634 (first contribution) improve rust-analyzer.files.excludeDirs docs.

    +
  • +
  • +

    #9637 overhaul doc_links testing infra and fix several issues.

    +
  • +
  • +

    #9646 show use prefix in completion list for auto-imports.

    +
  • +
  • +

    #9651 restrict completions inside visibility modifiers.

    +
  • +
  • +

    #9662 only import public items from other crates.

    +
  • +
  • +

    #9663 don’t offer "Extract variable" when there is no surrounding block.

    +
  • +
  • +

    #9674 fix pattern name resolution when the name also exists as a type.

    +
  • +
  • +

    #9677 correctly classify renamed imports.

    +
  • +
  • +

    #9691 keep catch-all arm in "Fill match arms" if it has a non-empty expression.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #9453 (first contribution) add Limit struct.

    +
  • +
  • +

    #9631 (fisrt contribution) add some metadata to make cargo deb happy.

    +
  • +
  • +

    #9641 link to the "Explaining Rust Analyzer" series.

    +
  • +
  • +

    #9625 simplify handling of build scripts.

    +
  • +
  • +

    #9633 add TreeId to identify ItemTrees.

    +
  • +
  • +

    #9635 explain why we avoid serializing everything.

    +
  • +
  • +

    #9638 replace some unwraps with types.

    +
  • +
  • +

    #9645 make CI logs easier to skim.

    +
  • +
  • +

    #9644 add simple smoke test for project model.

    +
  • +
  • +

    #9647 remove potentially slow method.

    +
  • +
  • +

    #9652 don’t concat path in the "Replace qualified name with use" assist when it starts with a keyword.

    +
  • +
  • +

    #9675 move and clean up record completion tests.

    +
  • +
  • +

    #9683 move out expression-based unqualified_path completion tests.

    +
  • +
  • +

    #9685 add tests for tuple struct field completion and resolve a FIXME.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/08/02/changelog-88.html b/thisweek/2021/08/02/changelog-88.html new file mode 100644 index 00000000..97dafe16 --- /dev/null +++ b/thisweek/2021/08/02/changelog-88.html @@ -0,0 +1,222 @@ + + + + + + + + + + Changelog #88 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #88

+ +
+
+
+

Commit: df0936b
+Release: 2021-08-02

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9693 (first contribution) add Hover Range capability to get the type of an expression:

    +
    +
    +126914293 0ce49a92 545d 4005 a59e 9294fa2330d6 +
    +
    +
  • +
  • +

    #9715, #9719 make completions respect #[doc(hidden)].

    +
  • +
  • +

    #9731 add "Replace char with string" assist.

    +
  • +
  • +

    #9732 gate custom client-side commands behind capabilities.

    +
  • +
  • +

    #9740 make "Add explicit type" work for closure parameters.

    +
  • +
  • +

    #9593 make "Remove unused param" work for methods and associated functions.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9749 (first contribution) exclude rust-analyzer.server.path from VS Code’s sync feature.

    +
  • +
  • +

    #9744 annotate type hints for pattern name ranges instead of the pattern itself:

    +
    +
    +127741276 e1dd173b 2964 4df0 abae 860283b2e1be +
    +
    +
    +
    +127741277 e7fc2836 4f31 4c45 a3a9 69cbff3d52d9 +
    +
    +
  • +
  • +

    #9558 do not erase Cargo diagnostics from the closed documents.

    +
  • +
  • +

    #9699 parse extra ::s in generic arguments.

    +
  • +
  • +

    #9701 correctly update diagnostics when files are opened and closed.

    +
  • +
  • +

    #9709 add capability for the "Open Cargo.toml" LSP extension.

    +
  • +
  • +

    #9710 don’t qualify self as crate in "Add missing impl members".

    +
  • +
  • +

    #9700 remove the legacy macro scoping hack.

    +
  • +
  • +

    #9722 refine the targets of the "Extract function" assist.

    +
  • +
  • +

    #9728 attach comma token to MATCH_ARM instead of MATCH_ARM_LIST.

    +
  • +
  • +

    #9742 fix hover range for derive inputs.

    +
  • +
  • +

    #9739 favor dereffed types in "Generate function" assist.

    +
  • +
  • +

    #9747 wrap inner tail expressions in the "Missing Ok or Some" diagnostic.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #9718 (first contribution) bump notify version.

    +
  • +
  • +

    #9716 stop reexporting hir_def's ItemInNs from HIR.

    +
  • +
  • +

    #9724 use more strictly-typed syntax nodes for analysis in "Extract function".

    +
  • +
  • +

    #9727 simplify the "Extract function" assist.

    +
  • +
  • +

    #9743 improve completion profiling.

    +
  • +
  • +

    #9746 add API to check what are the max limits in practice.

    +
  • +
  • +

    #9703 fix several typos and grammar mistakes.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/08/09/changelog-89.html b/thisweek/2021/08/09/changelog-89.html new file mode 100644 index 00000000..414d5d81 --- /dev/null +++ b/thisweek/2021/08/09/changelog-89.html @@ -0,0 +1,260 @@ + + + + + + + + + + Changelog #89 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #89

+ +
+
+
+

Commit: 5664a2b
+Release: 2021-08-09

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9752 (first contribution) support proc_macro dependencies in project.json.

    +
  • +
  • +

    #9785 (first contribution) add struct literal completion:

    +
    +
    +128211142 116361e9 7a69 425f 83ea 473c6ea47b26 +
    +
    +
  • +
  • +

    #9814 generate default code when converting #[derive(Debug)] to a manual implementation:

    +
    +
    +128694292 99a3e694 dd2b 42f5 9e38 798217f433b0 +
    +
    +
  • +
  • +

    #9761 show coerced types on hover:

    +
    +
    +127883884 2935b624 a3e5 4f35 861a 7d6d3266d187 +
    +
    +
    +
    +127883951 4ff96b6b 7576 4886 887b 1198c1121841 +
    +
    +
  • +
  • +

    #9800 include suggested replacement in diagnostics:

    +
    +
    +128521022 c16e0967 6cc6 410d 917d 5db5cfbb96be +
    +
    +
  • +
  • +

    #9810 add "missing reference" diagnostic:

    +
    +
    +128681441 9024a0b1 1ef6 4b3c 92e1 01ac3497aa1e +
    +
    +
  • +
  • +

    #9816 implement "Convert if to bool::then" assist:

    +
    +
    +128693801 51eeec03 55e5 4dd8 8fff 5b84251e7a12 +
    +
    +
  • +
  • +

    #9734 add reference semantic highlighting modifier.

    +
  • +
  • +

    #9806 add support for the 1.56 nightly proc macro ABI.

    +
  • +
  • +

    #9772 filter out duplicate macro completions.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9771 (first contribution) give better error message when the rust-analyzer binary path is invalid.

    +
  • +
  • +

    #9801 don’t publish diagnostics in crates.io or sysroot files.

    +
  • +
  • +

    #9762 fix ranged hover result range.

    +
  • +
  • +

    #9764 don’t use the module as the candidate node in fuzzy path flyimport.

    +
  • +
  • +

    #9770 downgrade notify to fix building on NetBSD.

    +
  • +
  • +

    #9773 improve the "Extract function" assist.

    +
  • +
  • +

    #9775 handle ownership in "Extract function".

    +
  • +
  • +

    #9786 fix detection of macro files in the inactive code diagostic.

    +
  • +
  • +

    #9788 don’t move locals defined outside loops in "Extract function".

    +
  • +
  • +

    #9780 support exclusive_range_pattern.

    +
  • +
  • +

    #9790 handle generics correctly in "Extract type alias".

    +
  • +
  • +

    #9794 fix binders with bare dyn Trait.

    +
  • +
  • +

    #9808 gather enum variants and associated trait functions when collecting lang items.

    +
  • +
  • +

    #9812 add ! to macro completions with existing argument list.

    +
  • +
  • +

    #9817 increase chalk overflow depth for tonic.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #9756 make resolve_doc_path is to resolve to macros.

    +
  • +
  • +

    #9757 completion cleanups.

    +
  • +
  • +

    #9758 explain that we don’t ref in style.md.

    +
  • +
  • +

    #9759 simplify inline_local_variable assist.

    +
  • +
  • +

    #9751 make LoadCargoConfig, fn load_workspace_at and fn load_workspace public again.

    +
  • +
  • +

    #9765 introduce TypeInfo to record coercions and other adjustments.

    +
  • +
  • +

    #9793 remove unused structs in ide_db.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/08/16/changelog-90.html b/thisweek/2021/08/16/changelog-90.html new file mode 100644 index 00000000..bb2b6d30 --- /dev/null +++ b/thisweek/2021/08/16/changelog-90.html @@ -0,0 +1,255 @@ + + + + + + + + + + Changelog #90 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #90

+ +
+
+
+

Commit: b641a66
+Release: 2021-08-16

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9828 (first contribution) use graphviz-d3 for the crate graph instead of running an installed binary:

    +
    +
    +128995056 9e70197a 3e83 4eda b813 2485d0800cfe +
    +
    +
  • +
  • +

    #9825, #9835, #9846, #9863 Generate default impls when converting Default, Hash, Clone or PartialEq #[derive]s:

    +
    +
    +129512152 622a7445 e424 4780 9d91 17051989e666 +
    +
    +
  • +
  • +

    #9804 add "Generate method" assist:

    +
    +
    +128745185 4b4674e8 fc5f 45d2 b5a7 22af5c28abfe +
    +
    +
  • +
  • +

    #9837 implement "Convert bool::then to if" assist:

    +
    +
    +129512597 b0f92f9b a73b 4ca4 847f 678357505878 +
    +
    +
  • +
  • +

    #9856 show type actions on ranged type hover:

    +
    +
    +129512807 c8e79a7e 3693 4847 9a93 a4e5fd2c6443 +
    +
    +
  • +
  • +

    #9735 add assist to sort members alphabetically:

    +
    +
    +129513196 4ffc7937 be58 44d4 9ec7 ba8745dcb460 +
    +
    +
  • +
  • +

    #9879, #9886 support if let match guards.

    +
  • +
  • +

    #9833 highlight methods that take self by value as consuming.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9889 (first contribution) add setup instructions for the juCi++ editor.

    +
  • +
  • +

    #9845, #9849 do not drop ..Default::default() completion when typing ...

    +
  • +
  • +

    #9862 fill out expected type for functional update syntax completion.

    +
  • +
  • +

    #9842 substitute generic types in "Inline call".

    +
  • +
  • +

    #9860 fix "Extract function" unnecessarily tagging parameters as mut.

    +
  • +
  • +

    #9861 make "Extract variable" handle selection ranges better.

    +
  • +
  • +

    #9896 only complete type annotations for patterns in function parameters.

    +
  • +
  • +

    #9823 avoid some pathological macro expansions.

    +
  • +
  • +

    #9893 don’t use uncached syntax nodes in generate_function for sema lookups.

    +
  • +
  • +

    #9874 always add implicit proc_macro dependency.

    +
  • +
  • +

    #9871 jump to generated function after triggering assist.

    +
  • +
  • +

    #9882 fix source map detection for debugging.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #9832 (first contribution) switch Code extension from rollup to esbuild.

    +
  • +
  • +

    #9807 generate implicit Sized bounds for trait solving.

    +
  • +
  • +

    #9826, #9827 drop latest requests tracking.

    +
  • +
  • +

    #9892, #9897, #9900, #9901 remove old editing APIs.

    +
  • +
  • +

    #9890 refactor binary operator handling.

    +
  • +
  • +

    #9834 unify subcommand handling between ra and xtask.

    +
  • +
  • +

    #9830 enable more assists to generate default trait body implementations.

    +
  • +
  • +

    #9838 document codebase stance on using functional combinators.

    +
  • +
  • +

    #9854 document that ascription is preferred to a turbofish.

    +
  • +
  • +

    #9841 print total size of source code in analysis-stats.

    +
  • +
  • +

    #9894 use standard test style.

    +
  • +
  • +

    #9905 drop serde_path_to_error from LSP deserialization to reduce compile time.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/08/23/changelog-91.html b/thisweek/2021/08/23/changelog-91.html new file mode 100644 index 00000000..ee2ad6b7 --- /dev/null +++ b/thisweek/2021/08/23/changelog-91.html @@ -0,0 +1,212 @@ + + + + + + + + + + Changelog #91 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #91

+ +
+
+
+

Commit: 996300f
+Release: 2021-08-23

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #9855 (first contribution) add "Destructure tuple" assist:

    +
    +
    +129020107 775d7c94 dca7 4d1f a0a2 cd63cabf4132 +
    +
    +
  • +
  • +

    #9941 include full path in workspace cyclic deps errors.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #9936 (first contribution) make compiler commit and date optional in proc macros.

    +
  • +
  • +

    #9962 (first contribution) improve "Replace match with if let" code generation.

    +
  • +
  • +

    #9963 resolve core::arch module.

    +
  • +
  • +

    #9973, #9988 refactor and improve handling of overloaded binary operators.

    +
  • +
  • +

    #9943 don’t strip items with built-in attributes.

    +
  • +
  • +

    #9976 hide functional update completion with qualified identifier.

    +
  • +
  • +

    #9979 fix token mapping with derive macros.

    +
  • +
  • +

    #9924 fix Debug code generation in assist.

    +
  • +
  • +

    #9950 fix documentation for generated is_ enum methods.

    +
  • +
  • +

    #9928 highlight function exit points on fn keywords.

    +
  • +
  • +

    #9929 handle all rename special cases for record pattern fields.

    +
  • +
  • +

    #9955 refuse to rename macro-generated definitions.

    +
  • +
  • +

    #9942 don’t trigger related highlighting on unrelated tokens.

    +
  • +
  • +

    #9966 determine expected parameters from expected return types in calls.

    +
  • +
  • +

    #9978 expand attributes recursively in "Expand macros".

    +
  • +
  • +

    #9908 fix toolchain path check.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #9934 (first contribution) upgrade notify again.

    +
  • +
  • +

    #9984, #9985, #9987, #9989 (first contribution) fix "a"/"an" typos.

    +
  • +
  • +

    #9921 don’t expand all macros in source_to_def.

    +
  • +
  • +

    #9960 use ExpandResult in all TokenExpanders.

    +
  • +
  • +

    #9972 refactor "Generate function" assist.

    +
  • +
  • +

    #9961 prepare for the 2021 edition.

    +
  • +
  • +

    #9982, #9983 reduce crate interdependence.

    +
  • +
  • +

    #9937 pester rust-analyzer developers to fix panics.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/08/30/changelog-92.html b/thisweek/2021/08/30/changelog-92.html new file mode 100644 index 00000000..f9f2b74e --- /dev/null +++ b/thisweek/2021/08/30/changelog-92.html @@ -0,0 +1,230 @@ + + + + + + + + + + Changelog #92 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #92

+ +
+
+
+

Commit: d15f646
+Release: 2021-08-30

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10008 highlight declarations and references for both definitions in field shorthands:

    +
    +
    +131287051 f42dce5e 2892 44fe ba9e 04347f2c5d66 +
    +
    +
  • +
  • +

    #9994 make Generate function work for static methods:

    +
    +
    +130415812 57192e15 eab9 4596 92ec b102c3b3bcd2 +
    +
    +
  • +
  • +

    #9993 merge assignments in Join lines:

    +
    +
    +130366571 3ebb1753 f8d5 4884 be8f 222cda71a2a7 +
    +
    +
  • +
  • +

    #10014 expand derive macros under cursor in Expand Macro Recursively:

    +
    +
    +130638252 5125d41f 2cc0 48fa af77 9a7f85016438 +
    +
    +
    +
    +130638250 debe0a1a 2584 426a 8377 72d6d46276eb +
    +
    +
  • +
  • +

    #9970 implement attribute input token mapping and fix attribute item token mapping:

    +
    +
    +130328577 4c1ad72c 51b1 47c3 8d3d 3242ec44a355 +
    +
    +
  • +
  • +

    #10067 downmap tokens to all token descendants instead of just the first:

    +
    +
    +131233056 7e645b1d b82f 468c bf19 d3335a2cf7c2 +
    +
    +
  • +
  • +

    #10059 enable diagnostics in const and static items.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10004 update rowan to fix a memory leak.

    +
  • +
  • +

    #10032 fix false positive missing unsafe diagnostic on nightly toolchains.

    +
  • +
  • +

    #10057 remove incorrect assertion in Extract function.

    +
  • +
  • +

    #10001 fix sorting of enum variants.

    +
  • +
  • +

    #10024 fix reporting of build script errors.

    +
  • +
  • +

    #10029, #10030 improve Expand Macro Recursively.

    +
  • +
  • +

    #10055 don’t use fake text range in original node search as is in completions.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10053 (first contribution) remove workaround for old Node versions.

    +
  • +
  • +

    #10062 (first contribution) set esbuild target to Node 14.

    +
  • +
  • +

    #9944 introduce in-place indenting API.

    +
  • +
  • +

    #9999 use single env var to controll all benchmarks.

    +
  • +
  • +

    #10010 use idiomatic form of assertions.

    +
  • +
  • +

    #10025 don’t mutate syntax trees when preparing proc-macro input.

    +
  • +
  • +

    #10069 use ManuallyDrop in RootDatabase to improve build times.

    +
  • +
  • +

    #10066, #10071, #10074 slightly improve compile times.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/09/06/changelog-93.html b/thisweek/2021/09/06/changelog-93.html new file mode 100644 index 00000000..5b0b89a8 --- /dev/null +++ b/thisweek/2021/09/06/changelog-93.html @@ -0,0 +1,234 @@ + + + + + + + + + + Changelog #93 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #93

+ +
+
+
+

Commit: b73b321
+Release: 2021-09-06

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10088 only run cache priming after load to improve CPU usage.

    +
  • +
  • +

    #10092 improve "Extract struct from enum variant" output.

    +
  • +
  • +

    #10076 use struct init shorthand in "Fill struct fields" assist.

    +
  • +
  • +

    #9954 show try (?) operator propagated types on ranged hover:

    +
    +
    +130111025 f7ee0742 214a 493b 947a b4a671e4be92 +
    +
    +
    +
    +130111024 f9caef82 92e4 4070 b3dd f2ff9e5d87a9 +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10139 (first contribution) fix for loop to for_each conversion with range expressions.

    +
  • +
  • +

    #10085 avoid panic when parsing extern block.

    +
  • +
  • +

    #10091 fix disjunction in conjunction panic in cfg parsing.

    +
  • +
  • +

    #10097 allow inherent impls for arrays.

    +
  • +
  • +

    #9405 fix missing parameters in "Extract function" with macros.

    +
  • +
  • +

    #10108 make "Go to implementation" multi-token mapping aware.

    +
  • +
  • +

    #10103 make "Find references" multi-token mapping aware.

    +
  • +
  • +

    #10109 enable flyimport for ident patterns.

    +
  • +
  • +

    #10114 deduplicate imports for "Qualify path".

    +
  • +
  • +

    #10124 use correct search scopes for macros.

    +
  • +
  • +

    #10127 don’t bail on failed macro call expansions when descending tokens:

    +
    +
    +131887786 ced9988b 80fa 4e8f b114 337572950cc3 +
    +
    +
  • +
  • +

    #10147 don’t panic if the client sends invalid request.

    +
  • +
  • +

    #10146 use placeholder as default type in "Generate function" and "Extract into function".

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #9906, #10132 (first contribution) switch from the log crate to tracing.

    +
  • +
  • +

    #10081 (first contribution) fix some error messages.

    +
  • +
  • +

    #10078 use Ubuntu 18.04 on CI.

    +
  • +
  • +

    #10079 make upstream bug less annoying.

    +
  • +
  • +

    #10080 refactor panic handling in the main loop.

    +
  • +
  • +

    #10015 more declarative re-indentation API.

    +
  • +
  • +

    #10005 extend CargoConfig.unset_test_crates.

    +
  • +
  • +

    #10094 split database loading time in anaysis-stats into components.

    +
  • +
  • +

    #10095 augment panic context when resolving path.

    +
  • +
  • +

    #10100, #10101 clean up proc macro server error handling.

    +
  • +
  • +

    #10161 remove accidental code re-use.

    +
  • +
  • +

    #10148 make dev docs more discoverable.

    +
  • +
  • +

    #10145 update deps and pin libc to fix build error in rust-lang/rust.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/09/13/changelog-94.html b/thisweek/2021/09/13/changelog-94.html new file mode 100644 index 00000000..4ef63d0a --- /dev/null +++ b/thisweek/2021/09/13/changelog-94.html @@ -0,0 +1,198 @@ + + + + + + + + + + Changelog #94 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #94

+ +
+
+
+

Commit: 516eb40
+Release: 2021-09-13

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10152 (first contribution) quote raw identifier in completion:

    +
    +
    +132110362 c21b713d acaf 4a6d 9749 ff812172cbce +
    +
    +
  • +
  • +

    #10162 enable completions after . in some macros:

    +
    +
    +133029878 127e4022 999b 4a53 829a 16ad0e0723c0 +
    +
    +
    +
    +133030167 edc88366 ac46 491d 811e d1cf533ba9f4 +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10093 (first contribution) fix cargo task filtering in Code workspaces.

    +
  • +
  • +

    #10154 (first contribution) complete #![recursion_limit = "N"] instead of #![recursion_limit = N].

    +
  • +
  • +

    #10157 (first contribution) document enabling flycheck with rust-project.json.

    +
  • +
  • +

    #10188 (first contribution) add multi-token mapping support to runnables.

    +
  • +
  • +

    #10180 fix resolution of inherent array methods.

    +
  • +
  • +

    #10177 treat path dependencies like workspace members.

    +
  • +
  • +

    #10193 fix type mismatches with panic!() on Rust 1.55.

    +
  • +
  • +

    #10174 fix path display with crate and super prefixes.

    +
  • +
  • +

    #10186 configure colorizedBracketPairs for Code.

    +
  • +
  • +

    #10202 show correct Sized bounds on type param hover.

    +
  • +
  • +

    #10212 avoid a type inference panic on BitSlice methods.

    +
  • +
  • +

    #10215 use correct file for decl_access computation in find_all_refs.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10165 (first contribution) bump tracing-tree to avoid a syn dependency.

    +
  • +
  • +

    #10206 remove unused dependencies.

    +
  • +
  • +

    #10168 make name consistent with usage.

    +
  • +
  • +

    #10169 parser cleanup.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/09/20/changelog-95.html b/thisweek/2021/09/20/changelog-95.html new file mode 100644 index 00000000..d220a797 --- /dev/null +++ b/thisweek/2021/09/20/changelog-95.html @@ -0,0 +1,224 @@ + + + + + + + + + + Changelog #95 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #95

+ +
+
+
+

Commit: f1d7f98
+Release: 2021-09-20

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10204 (first contribution) show dereferenced types in hover:

    +
    +
    +134001136 00ddbb95 11b4 45bf 8592 b5fd96f814d9 +
    +
    +
  • +
  • +

    #10257 (first contribution) add Convert while to loop assist:

    +
    +
    +134001921 433c5b9b 5c40 4a00 9219 7786106e97dc +
    +
    +
  • +
  • +

    #10126 speculatively expand attributes in completions:

    +
    +
    +133163858 91930072 1441 4ce4 9979 b0ad2727b47f +
    +
    +
  • +
  • +

    #10274 make inlay hints work in some attributed items:

    +
    +
    +133887500 091675db f473 44f8 9bf5 8313ecfbc9e7 +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10252 (first contribution) make "Go to definition" multi-token mapping aware.

    +
  • +
  • +

    #10233 (first contribution) add multi-token mapping support to hovers.

    +
  • +
  • +

    #10199 detect even a second change to Cargo.toml.

    +
  • +
  • +

    #10229 do not complete builtin attributes for qualified paths.

    +
  • +
  • +

    #10230 fix expansion order for fn-like macros and attributes when descending tokens.

    +
  • +
  • +

    #10237 do not wrap inlined local in parens when at block tail position.

    +
  • +
  • +

    #10247 don’t highlight unsafe traits as unsafe in safe impls.

    +
  • +
  • +

    #10048 correctly complete macro call when cursor on !.

    +
  • +
  • +

    #10264 don’t seek outside of character boundaries in completion handler.

    +
  • +
  • +

    #10260 fix name generation in "Generate function" assist.

    +
  • +
  • +

    #10267 narrow if-let to match assist range.

    +
  • +
  • +

    #10282 don’t allow two turbo-fishes in generic arguments.

    +
  • +
  • +

    #10289 only strip derive attributes when preparing macro input.

    +
  • +
  • +

    #10293 don’t bail on parse errors in macro input for built-in expansion.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10221 prevent possible bugs when adding magical comments.

    +
  • +
  • +

    #10222 work around bad error reporting when renaming the server binary.

    +
  • +
  • +

    #10225 add proc-macro fixture directive.

    +
  • +
  • +

    #10232 add more tests for ide functionality in attributed items.

    +
  • +
  • +

    #10248 remove dead code.

    +
  • +
  • +

    #10250 improve call_hierarchy and incoming/outgoing_calls.

    +
  • +
  • +

    #10265, #10269, #10275, #10276, #10268, #10270, #10280, #10287 parser cleanups.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/09/27/changelog-96.html b/thisweek/2021/09/27/changelog-96.html new file mode 100644 index 00000000..dffb9d42 --- /dev/null +++ b/thisweek/2021/09/27/changelog-96.html @@ -0,0 +1,204 @@ + + + + + + + + + + Changelog #96 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #96

+ +
+
+
+

Commit: 009e6ce
+Release: 2021-09-27

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10211 (first contribution) add assist to convert file module to directory:

    +
    +
    +134807312 cd82dd6a 753b 479c 9f11 02f71a6074a8 +
    +
    +
  • +
  • +

    #10320 Make hover and Go to definition work in macro invocations and doc attribute strings:

    +
    +
    +134554781 b903d33d 674f 4ed4 8acb 71ff5913f1cb +
    +
    +
  • +
  • +

    #10352 implement "Inline into callers" assist:

    +
    +
    +134812039 d9389522 eb1d 4654 b00c 77381a31f513 +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10334 (first contribution) set error context when spawning rustfmt fails.

    +
  • +
  • +

    #10105 (first contribution) use todo!() instead of () in "Fill missing fields".

    +
  • +
  • +

    #10315 (first contribution) fix manual page title.

    +
  • +
  • +

    #10306 use better names for consts and statics in "Generate function" parameters.

    +
  • +
  • +

    #10328 fix incorrect mod.rs handling in "Unlinked file" fixes.

    +
  • +
  • +

    #10338 fix diagnostics in unnamed consts.

    +
  • +
  • +

    #10339 fix reporting of item-level macro errors.

    +
  • +
  • +

    #10321 change the global setting when toggling inlay hints.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10284 (first contribution) refactor hover and go to definition lookups.

    +
  • +
  • +

    #10313 (first contribution) tell Git that the benchmark files are binary.

    +
  • +
  • +

    #10303 add a mirror proc macro expander for tests.

    +
  • +
  • +

    #10304 generate ast nodes for each ast trait.

    +
  • +
  • +

    #10319, #10322 clean up and split the hover code.

    +
  • +
  • +

    #10335 avoid some Arc cloning.

    +
  • +
  • +

    #10358 remove inherent methods from ast nodes that do non-syntactic complex tasks.

    +
  • +
  • +

    #10343, #10354, #10350, #10360 parser cleanups.

    +
  • +
  • +

    #10357 fix and force-disable block validation.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/10/04/changelog-97.html b/thisweek/2021/10/04/changelog-97.html new file mode 100644 index 00000000..1c4657fe --- /dev/null +++ b/thisweek/2021/10/04/changelog-97.html @@ -0,0 +1,252 @@ + + + + + + + + + + Changelog #97 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #97

+ +
+
+
+

Commit: 4b7675f
+Release: 2021-10-04

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10395 (first contribution) add pub(super) keyword completion.

    +
  • +
  • +

    #10398 (first contribution) set defaultLibrary semantic token on standard library items.

    +
  • +
  • +

    #10403 add semantic token modifier for crate root.

    +
  • +
  • +

    #10362 add assist to convert a/mod.rs into a.rs:

    +
    +
    +134837717 074c23e9 1ca2 4207 b780 8443b2241272 +
    +
    +
  • +
  • +

    #10412 highlight asm! as format string:

    +
    +
    +135606261 a1cb6caf 0a7f 45f7 9dde 0275370b0889 +
    +
    +
  • +
  • +

    #10441 hide type inlay hints for constructors:

    +
    +
    +135773135 caa363a2 ff40 42c2 baea 95809b85017f +
    +
    +
  • +
  • +

    #10181 add basic LSIF support.

    +
  • +
  • +

    #10384 add native onEnterRules for Code.

    +
  • +
  • +

    #10385 make extern crate test; work.

    +
  • +
  • +

    #10366 enable attribute proc macros by default.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10416 (first contribution) about vscode-vim in the onEnter docs.

    +
  • +
  • +

    #10374 make stringify! insert/collapse whitespace when needed.

    +
  • +
  • +

    #10418 add whitespace between lifetime and mut keyword in expand macro command.

    +
  • +
  • +

    #10377 fix proc macro crash on nightly.

    +
  • +
  • +

    #10378 implement most proc_macro span handling methods.

    +
  • +
  • +

    #10305 move GenericParams's handling of impl Trait into GenericParams::generic_params_query.

    +
  • +
  • +

    #10382 fix inline_call breaking RecordExprField shorthands.

    +
  • +
  • +

    #10373, #10399 fix into_iterator completion on Vec<{unknown}>.

    +
  • +
  • +

    #10389 use the right HirFileId when expanding macros in function parameters.

    +
  • +
  • +

    #10397, #10400, #10413 fix format string highlighting for panic!, assert!, todo!, unimplemented!, concat! and unreachable!.

    +
  • +
  • +

    #10402 don’t show flyimport completions in use renames.

    +
  • +
  • +

    #10411 parenthesize expressions in if_to_bool_then assist where required.

    +
  • +
  • +

    #10422 overwrite files when calling patchelf.

    +
  • +
  • +

    #10425 only highlight the semicolon in "Remove semicolon" diagnostics.

    +
  • +
  • +

    #10430 fix rename trying to edit the same range multiple times for certain macro inputs.

    +
  • +
  • +

    #10437 fix extract_variable not working on macro calls.

    +
  • +
  • +

    #10436 fix await insertion with ? during extract_function.

    +
  • +
  • +

    #10439 fix insert_use incorrectly merging glob imports.

    +
  • +
  • +

    #10442 limit depth to 1 when searching for Cargo.toml to prevent activation in non-Rust projects.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10353 (first contribution) remove GenericParams::new.

    +
  • +
  • +

    #10364 rename Dyn* to Any* nodes.

    +
  • +
  • +

    #10406 restructure syntax element highlighting into node and token branches.

    +
  • +
  • +

    #10414 add some profiling calls to name resolution.

    +
  • +
  • +

    #10426 use naming that matches intended use case.

    +
  • +
  • +

    #10429 remove deprecated method.

    +
  • +
  • +

    #10431 clean up MBE a bit.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/10/11/changelog-98.html b/thisweek/2021/10/11/changelog-98.html new file mode 100644 index 00000000..606ef3b8 --- /dev/null +++ b/thisweek/2021/10/11/changelog-98.html @@ -0,0 +1,206 @@ + + + + + + + + + + Changelog #98 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #98

+ +
+
+
+

Commit: ed4b312
+Release: 2021-10-11

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10476 (first contribution) add replace_try_expr_with_match assist:

    +
    +
    +136434480 f0ae5b34 36cb 4bbf 98ca 4b77b58482e1 +
    +
    +
  • +
  • +

    #10447 (first contribution) implement enum variant code lens:

    +
    +
    +136690713 9eb5f108 af80 41c3 86e2 8250b6ef9a40 +
    +
    +
  • +
  • +

    #10458 implement custom user snippets:

    +
    +
    +136059454 ceccfc2c 2c90 46da 8ad1 bac9c2e83ec1 +
    +
    +
  • +
  • +

    #10459 add "Generate constant" assist:

    +
    +
    +135885262 c80de86f 5555 4f84 9508 822243f8a876 +
    +
    +
  • +
  • +

    #10474 support let…​else.

    +
  • +
  • +

    #10499 make "mismatched arggument counts" diagnostic range more precise.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10479 fix index out of bounds panic in name resolution.

    +
  • +
  • +

    #10456 avoid cycle when lowering predicates for associated item lookup.

    +
  • +
  • +

    #10482 fix inline_call trying to use an uncached syntax node in Semantics.

    +
  • +
  • +

    #10460 only add proc_macro to prelude in proc-macro crates.

    +
  • +
  • +

    #10477 fix parsing of macro call inside generic args.

    +
  • +
  • +

    #10449 fix parsing of Some(1..).

    +
  • +
  • +

    #10420 parse outer attributes on StructPatternEtCetera.

    +
  • +
  • +

    #10480 change snake case fix to match rustc implementation.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+ +
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/10/18/changelog-99.html b/thisweek/2021/10/18/changelog-99.html new file mode 100644 index 00000000..d10d83c8 --- /dev/null +++ b/thisweek/2021/10/18/changelog-99.html @@ -0,0 +1,235 @@ + + + + + + + + + + Changelog #99 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #99

+ +
+
+
+

Commit: 91cbda4
+Release: 2021-10-18

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10529 generate PartialOrd implementations:

    +
    +
    +137682192 12f729c3 c70b 456e 9b6c a92fa4ea275f +
    +
    +
  • +
  • +

    #10434 allow Locate parent module in Cargo.toml:

    +
    +
    +137682837 46cb51b3 f6fa 41b1 b947 ae65f9a6509c +
    +
    +
  • +
  • +

    #10539 add "Generate delegate methods" assist:

    +
    +
    +137555191 2f9ff184 a235 4afb 87c7 aa03cea4a96f +
    +
    +
  • +
  • +

    #10546 implement "Promote local to const" assist:

    +
    +
    +137555943 51a11a43 5e8f 4309 8178 417b677d74ad +
    +
    +
  • +
  • +

    #10417 add "Unwrap Result return type" assist:

    +
    +
    +137636737 06a3d47d f647 45dd 85a2 fe0579ef24a7 +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10519 (first contribution) set toolinfo in LSIF export.

    +
  • +
  • +

    #10522 (first contribution) fix serialization of SignatureHelp response.

    +
  • +
  • +

    #10534 (first contribution) improve logo rendering on dark backgrounds.

    +
  • +
  • +

    #10538 (first contribution) make brace matching prefer the one to the right of the cursor.

    +
  • +
  • +

    #10542 (first contribution) use workspace cargo to fetch rust-src metadata.

    +
  • +
  • +

    #10543 (first contribution) narrow "Add missing match arms" assist range.

    +
  • +
  • +

    #10491 (first contribution) support nested type in "Replace if-let with match".

    +
  • +
  • +

    #10533 fix AssistContext panic on sole whitespace selection.

    +
  • +
  • +

    #10503 only include targets of packages that are workspace members.

    +
  • +
  • +

    #10517 report cargo check failures.

    +
  • +
  • +

    #10552 fix "Missing fields" diagnostic fix replacing wrong text ranges.

    +
  • +
  • +

    #10557 fix qualified path completion not completing macros.

    +
  • +
  • +

    #10562 fix clippy attribute completions always inserting clippy::.

    +
  • +
  • +

    #10569 skip non clippy completions when completing a clippy path.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10532 (first contribution) rename descend_into_macros functions.

    +
  • +
  • +

    #10525 regenerate lints and features.

    +
  • +
  • +

    #10526 improve user snippet import performance.

    +
  • +
  • +

    #10528, #10533 make selections in assists with trailing/leading whitespace more forgiving.

    +
  • +
  • +

    #10423 refactor for mdbook plugin.

    +
  • +
  • +

    #10309 use ControlFlow in "Extract function" assist.

    +
  • +
  • +

    #10558 refactor lifetime completion context fields.

    +
  • +
  • +

    #10561 don’t turn local names into strings in CompletionContext.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/10/25/changelog-100.html b/thisweek/2021/10/25/changelog-100.html new file mode 100644 index 00000000..7e7dad0a --- /dev/null +++ b/thisweek/2021/10/25/changelog-100.html @@ -0,0 +1,190 @@ + + + + + + + + + + Changelog #100 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #100

+ +
+
+
+

Commit: 1f47693
+Release: 2021-10-25

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10602 (first contribution) add "Qualify method call" assist:

    +
    +
    +138670976 837b64aa bf46 40bc 81c2 a9bdd62cdafe +
    +
    +
  • +
  • +

    #9939 add "Extract module" assist:

    +
    +
    +138672377 9f5ca92b 13bc 4aa2 8ad1 8cdd70fe5b88 +
    +
    +
  • +
  • +

    #10563 make "Generate getter" assist use semantic info.

    +
  • +
  • +

    #10551 pull in new lsp-types for Visual Studio 2022 compatibility.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10608 (first contribution) amend the rustup installation instructions.

    +
  • +
  • +

    #10574, #10578 fix "Generate PartialOrd implementation" codegen.

    +
  • +
  • +

    #10568 improve codegen for "Unwrap Result return type".

    +
  • +
  • +

    #10585 resolve derive attributes even when shadowed.

    +
  • +
  • +

    #10587 fix add_missing_match_arm panicking on failed upmapping.

    +
  • +
  • +

    #10589 expand unused glob import into {}.

    +
  • +
  • +

    #10594 generate and complete rustdoc lints.

    +
  • +
  • +

    #10597 fix standard library doclinks not going to the correct page.

    +
  • +
  • +

    #10603 don’t resolve attributes to non-attribute macros.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10607, #10617 migrate to the 2021 edition.

    +
  • +
  • +

    #10586 make derive completions work on HIR, not names.

    +
  • +
  • +

    #10588 parse const trait bounds.

    +
  • +
  • +

    #10387 move IdxRange into la-arena.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/11/01/changelog-101.html b/thisweek/2021/11/01/changelog-101.html new file mode 100644 index 00000000..502d90e8 --- /dev/null +++ b/thisweek/2021/11/01/changelog-101.html @@ -0,0 +1,196 @@ + + + + + + + + + + Changelog #101 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #101

+ +
+
+
+

Commit: 04f03a3
+Release: 2021-11-01

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10629 add assist to replace turbofish with explicit type:

    +
    +
    +139633425 11b38f56 f56e 48bb 9a86 a70c07301062 +
    +
    +
  • +
  • +

    #10657 make unqualified derive attributes flyimportable:

    +
    +
    +139436613 1e6eb8fd f591 4fca 9383 ff7408ee9b18 +
    +
    +
  • +
  • +

    #10672 (potentially breaking) upgrade Ubuntu builders to 20.04.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10656 enable auto-import and qualify-path in derive attributes.

    +
  • +
  • +

    #10630 don’t for reload when changing HoverAction config in VSCode.

    +
  • +
  • +

    #10631 fix postfix completion panic.

    +
  • +
  • +

    #10633 implement most proc_macro span handling for the other ABIs.

    +
  • +
  • +

    #10635 fix "Extract variable" not working on macro calls.

    +
  • +
  • +

    #10637 make goto_type_definition multi-token mapping aware.

    +
  • +
  • +

    #10592 fix rendering of ## in doc comments.

    +
  • +
  • +

    #10639 make goto_declaration multi-token mapping aware.

    +
  • +
  • +

    #10641 make expand_macro multi-token mapping aware.

    +
  • +
  • +

    #10648 don’t discard attributed items when a proc-macro unexpectedly fails to expand.

    +
  • +
  • +

    #10662 fix plain-text textDocument/hover content type.

    +
  • +
  • +

    #10668 fix for-loop expressions breaking with BlockExpr iterable.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10649 remove CompletionKind in favor of CompletionItemKind.

    +
  • +
  • +

    #10623 replace L_DOLLAR/R_DOLLAR with parenthesis hack.

    +
  • +
  • +

    #10654 refactor ide handling for paths in derive inputs.

    +
  • +
  • +

    #10595 fix links in Code setting descriptions.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/11/08/changelog-102.html b/thisweek/2021/11/08/changelog-102.html new file mode 100644 index 00000000..7cae3a76 --- /dev/null +++ b/thisweek/2021/11/08/changelog-102.html @@ -0,0 +1,164 @@ + + + + + + + + + + Changelog #102 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #102

+ +
+
+
+

Commit: 2c0f433
+Release: 2021-11-08

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10596 set server status to warning when proc-macro sources change.

    +
    +
    +138102552 208d3edf a843 49e6 9f48 1e911f54a4ba +
    +
    +
  • +
  • +

    #10701, #10703, #10704 speed up completion and highlighting in the presence of macros.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10645 make rename multi-token mapping aware.

    +
  • +
  • +

    #10685 enable Markdown table rendering in comments.

    +
  • +
  • +

    #10680 implement Literal::from_str in the proc macro API (fixes rtic 0.6-dev).

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10696 replace more Name::to_string usages with Name::to_smol_str.

    +
  • +
  • +

    #10699 make CompletionItem label and lookup fields SmolStrs.

    +
  • +
  • +

    #10698 implement multi-token mapping for ssr.

    +
  • +
  • +

    #10667 expose version string of crates from hir.

    +
  • +
  • +

    #10686 add Semantics::original_ast_node for up-mapping nodes out of macro files.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/11/15/changelog-103.html b/thisweek/2021/11/15/changelog-103.html new file mode 100644 index 00000000..e6991c59 --- /dev/null +++ b/thisweek/2021/11/15/changelog-103.html @@ -0,0 +1,171 @@ + + + + + + + + + + Changelog #103 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #103

+ +
+
+
+

Commit: 7366833
+Release: 2021-11-15

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10761 show constructor inlay hints by default, add option to disable.

    +
  • +
  • +

    #10743 index fewer crates on startup/reload.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10731 (first contribution) show the right check command in Code.

    +
  • +
  • +

    #10756 (first contribution) allow the check command to terminate with no output.

    +
  • +
  • +

    #10729 lookup impls in local def maps.

    +
  • +
  • +

    #10722 fix proc-macro attributes being shadowed by their functions in IDE layer.

    +
  • +
  • +

    #10689 handle pub tuple fields in tuple structs.

    +
  • +
  • +

    #10720 don’t ascribe types in pattern completion for param patterns twice.

    +
  • +
  • +

    #10747 remove faulty logic for ascending test attributes for runnables.

    +
  • +
  • +

    #10762 trigger flyimport on enum variants.

    +
  • +
  • +

    #10759 make add_missing_match_arms applicable at the end of the match.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10688 type-check TS on CI.

    +
  • +
  • +

    #10738 do not search through all three namespaces in ItemScope::name_of.

    +
  • +
  • +

    #10741, #10745 flatten Definition::ModuleDef variant.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/11/22/changelog-104.html b/thisweek/2021/11/22/changelog-104.html new file mode 100644 index 00000000..f99da8dd --- /dev/null +++ b/thisweek/2021/11/22/changelog-104.html @@ -0,0 +1,208 @@ + + + + + + + + + + Changelog #104 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #104

+ +
+
+
+

Commit: 183ef04
+Release: 2021-11-22

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10769 Add proc macro ABI for rustc 1.58

    +
  • +
  • +

    #10785, #10796 Show values of `const`s and `static`s in hover

    +
    +
    +142163890 b6aa2ab4 7bd0 4dd3 b35d 5eaa83fffb7f +
    +
    +
  • +
  • +

    #10798 Show "go to type" for function return type on hover

    +
    +
    +142375722 4a385216 494b 45a4 be1c 59664213b8d6 +
    +
    +
  • +
  • +

    #10812, #10823 Format Fn traits using parentheses

    +
  • +
  • +

    #10810 Add toggle to disable cache priming

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10773 Reimplement mapping out of test/bench attributes for runnables

    +
  • +
  • +

    #10734 Add generic parameters in "convert to manual impl" assist

    +
  • +
  • +

    #10776 Remove validation of super in use paths

    +
  • +
  • +

    #10799 Fix proc macro ABI version checks

    +
  • +
  • +

    #10794 Parse range patterns inside tuple patterns

    +
  • +
  • +

    #10795 Fix crash in doc path resolution

    +
  • +
  • +

    #10804 Diagnose using derive on non-adt items

    +
  • +
  • +

    #10806 Make inlay param hint hiding heurstic case unsensitive

    +
  • +
  • +

    #10807 Diagnose invalid derive attribute input

    +
  • +
  • +

    #10808 Really show custom check-command

    +
  • +
  • +

    #10821 Wrap inline_call and inline_into_callers if it inlines into the left side of a binary expression

    +
  • +
  • +

    #10805 Dedupe or merge hover actions

    +
  • +
  • +

    #10817 Omit redundant {unnamed} where clauses on hover

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10777 Allow disabling perf counters access via RA_DISABLE_PERF

    +
  • +
  • +

    #10778 Skip test/bench attr expansion in resolution instead of collection

    +
  • +
  • +

    #10781 Do not use reference search in runnables::related_tests

    +
  • +
  • +

    #10789 Check for derive attributes by item path, not derive identifier

    +
  • +
  • +

    #10819 Replace some Vec occurences with Box

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/11/29/changelog-105.html b/thisweek/2021/11/29/changelog-105.html new file mode 100644 index 00000000..30f0583c --- /dev/null +++ b/thisweek/2021/11/29/changelog-105.html @@ -0,0 +1,183 @@ + + + + + + + + + + Changelog #105 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #105

+ +
+
+
+

Commit: d9b2291
+Release: 2021-11-29

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10840 omit generic defaults for types in hover messages.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10846 (first contribution) qualify struct name in constructor completion.

    +
  • +
  • +

    #10809 don’t discard formatting of use lines.

    +
  • +
  • +

    #10834 make lint groups work correctly with warningsAsInfo and warningsAsHint.

    +
  • +
  • +

    #10839 fix mbe::Shift::new not accounting for non-ident token ids.

    +
  • +
  • +

    #10849 fix string highlight injection for macros.

    +
  • +
  • +

    #10853 remove possible multiline details in completions.

    +
  • +
  • +

    #10847 improve derive attribute path handling in replace_derive_with_manual_impl.

    +
  • +
  • +

    #10824 print full command if cargo metadata fails to run.

    +
  • +
  • +

    #10859 prioritize tuple fields in highlight_related.

    +
  • +
  • +

    #10870 fix macro expansion for as _.

    +
  • +
  • +

    #10876 show parameter hints unconditionally for logical not expressions.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10863, #10865 build per-block ItemTrees.

    +
  • +
  • +

    #10828 doc: document absence of stability guarantees.

    +
  • +
  • +

    #10838 add the ability to emit token map ids in macro expansion tests.

    +
  • +
  • +

    #10832 split parts of ide_db::call_info off into ide.

    +
  • +
  • +

    #10833 set upstream branch when promoting.

    +
  • +
  • +

    #10835 pull website before generating new changelog.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/12/06/changelog-106.html b/thisweek/2021/12/06/changelog-106.html new file mode 100644 index 00000000..26046cf3 --- /dev/null +++ b/thisweek/2021/12/06/changelog-106.html @@ -0,0 +1,204 @@ + + + + + + + + + + Changelog #106 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #106

+ +
+
+
+

Commit: 7d6fcbc
+Release: 2021-12-06

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10915 resolve built-in attributes and tools in ide:

    +
    +
    +144661639 dbd324df 807c 4cc0 b860 4953a98b9fa5 +
    +
    +
    +
    +144661637 e9276cc8 e975 420e ab32 29fa7732a21f +
    +
    +
  • +
  • +

    #10943 enable completions for attributes:

    +
    +
    +144752483 5dd868fb b0f3 4f69 9db3 859f0414dc06 +
    +
    +
  • +
  • +

    #10916 implement while let …​ to loop { if let …​} conversion in the convert_while_to_loop assist.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10906 (first contribution) "add return type" assist when missing whitespace before brace.

    +
  • +
  • +

    #10896 resolve associated trait types in paths.

    +
  • +
  • +

    #10902 handle multiple cargo check quick fix spans.

    +
  • +
  • +

    #10920 shorten spans of mismatched_arg_count diagnostics.

    +
  • +
  • +

    #10930 fix self highlighting in imports.

    +
  • +
  • +

    #10899 add hack to highlight self properly with some proc macro crates.

    +
  • +
  • +

    #10937 add back highlighting hack for unresolved attributes.

    +
  • +
  • +

    #10841 emit moniker in LSIF.

    +
  • +
  • +

    #10891 emit trait names in moniker identifier.

    +
  • +
  • +

    #10871, #10905, #10940 try to respect http.proxyStrictSSL.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10872 build symbol index from crate def map

    +
  • +
  • +

    #10887 update bug report template to include version info.

    +
  • +
  • +

    #10919 add missing semantic tokens to package.json.

    +
  • +
  • +

    #10897 make client-side tests actually work.

    +
  • +
  • +

    #10903 replace mocha with a custom test runner.

    +
  • +
  • +

    #10929 split up macro/attribute semantic tokens a bit more.

    +
  • +
  • +

    #10944 prefer resolution of inert attributes.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/12/13/changelog-107.html b/thisweek/2021/12/13/changelog-107.html new file mode 100644 index 00000000..21bd6f1a --- /dev/null +++ b/thisweek/2021/12/13/changelog-107.html @@ -0,0 +1,188 @@ + + + + + + + + + + Changelog #107 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #107

+ +
+
+
+

Commit: db2a708
+Release: 2021-12-13

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #10951 (first contribution) add assist to generate documentation templates:

    +
    +
    +145762247 8f6f3f01 2eec 494d a18d 3c4d163118a1 +
    +
    +
  • +
  • +

    #10877 make syntax hightlighting linear.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #10979 don’t show trait flyimports for impl trait and placeholders.

    +
  • +
  • +

    #10976 show case-insensitive exact matches instead of fuzzy flyimport for short paths.

    +
  • +
  • +

    #10986 fix lint completions not working for unclosed attributes.

    +
  • +
  • +

    #10960 fix handling of macros in extern blocks.

    +
  • +
  • +

    #10957 fix some TryToNav impls not upmapping ranges out of macros.

    +
  • +
  • +

    #10966 fix library target overriding sysroot deps.

    +
  • +
  • +

    #10977 fix concat! with captured expression.

    +
  • +
  • +

    #10987 respect inner attributes for Structs and Enums.

    +
  • +
  • +

    #10988 fix expected type calculation in struct literal followed by comma.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10995 switch from trait-based TokenSource to simple struct of arrays.

    +
  • +
  • +

    #10978 only prime direct dependencies of the workspace crates.

    +
  • +
  • +

    #10958 add Shuffle Crate Graph command.

    +
  • +
  • +

    #10950 split out more PathKinds from ImmediateLocation.

    +
  • +
  • +

    #10975 shrink TraitImpls and InherentImpls hashmaps.

    +
  • +
  • +

    #10981 remove some allocations.

    +
  • +
  • +

    #10949 bump parser step limit.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/12/20/changelog-108.html b/thisweek/2021/12/20/changelog-108.html new file mode 100644 index 00000000..7abbf89a --- /dev/null +++ b/thisweek/2021/12/20/changelog-108.html @@ -0,0 +1,200 @@ + + + + + + + + + + Changelog #108 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #108

+ +
+
+
+

Commit: 0add6e9
+Release: 2021-12-20

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11035 include clippy lint groups in autocomplete:

    +
    +
    + +
    +
    +
  • +
  • +

    #10998 add number representation assists:

    +
    +
    +145726792 47700215 26f2 4fdc 9520 63d1487901e5 +
    +
    +
    +
    +145726802 f528a2f7 9159 41d3 b459 fc3fae033e60 +
    +
    +
  • +
  • +

    #11053 (possibly breaking) publish platform-specific Code extensions with bundled server binaries.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11054 (first contribution) don’t trim twice in Unwrap block.

    +
  • +
  • +

    #11017 (first contribution) support Move condition to guard with an else branch.

    +
  • +
  • +

    #11030 add missing comma in Move condition to guard.

    +
  • +
  • +

    #11043 fix incorrect mismatched argument count diagnostic with std::arch functions.

    +
  • +
  • +

    #11050 show primitive docs when hovering fn keyword inside function pointer type.

    +
  • +
  • +

    #11004 infer associated methods in local scope.

    +
  • +
  • +

    #11040 don’t duplicate attribute completions.

    +
  • +
  • +

    #11000 insert whitespace into associated items for Implement missing members for macro-generated structs.

    +
  • +
  • +

    #11002 add support for v6 macro metadata format for recent nightly support.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10527 remove a few snippet completions, replace them with user snippets definitions.

    +
  • +
  • +

    #11046 move all lexing to the parser crate.

    +
  • +
  • +

    #11009 extract doc-links tests into a separate module.

    +
  • +
  • +

    #11021 use default XCode version on MacOS 11 builders.

    +
  • +
  • +

    #11029 refactor release workflow to reduce duplication, upgrade to MacOS 11 builders, set target version to 10.15.

    +
  • +
  • +

    #11047 prepare Code extension for server bundling.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2021/12/27/changelog-109.html b/thisweek/2021/12/27/changelog-109.html new file mode 100644 index 00000000..adde1668 --- /dev/null +++ b/thisweek/2021/12/27/changelog-109.html @@ -0,0 +1,234 @@ + + + + + + + + + + Changelog #109 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #109

+ +
+
+
+

Commit: 6831918
+Release: 2021-12-27

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

Known Issues

+
+
+

There are some recent known issues related to the VS Code extension and the update mechanism:

+
+
+
    +
  • +

    Since last week, users running VSCodium or another open-source build of Code might have issues opening projects. This is caused by a change to bundle the server binary with the extension, instead of downloading it on the first load. Unfortunately, Open VSX, which is the marketplace used by VSCodium and other forks does not support platform-specific, sometimes serving users binaries for the wrong platform. The workaround is to manually download the VSIX for your platform from GitHub releases, or to install the non-free version of Code.

    +
  • +
  • +

    Since last Wednesday, if you install the rust-analyzer from Code, you might get an older version of the extension (0.2.853, from two weeks ago). This is caused by us publishing the nightlies as pre-release version to the Marketplace, which was done to avoid having to download VSIX updates from GitHub for users on the nightly channel. Unfortunately, after publishing the first pre-release version, the Marketplace stopped showing the latest stable version (0.2.867, from last week). The workaround is to manually download the VSIX from GitHub releases, or to switch to the pre-release version, then back to the stable one which appears to fix it, probably by triggering another Code bug.

    +
  • +
  • +

    VS Code allows installing VSIX files that don’t match your platform. Please don’t do that.

    +
  • +
  • +

    If you’re running a 32-bit version of VS Code on a 64-bit Windows system, please install the 64-bit version of Code instead. This configuration used to work thanks to a workaround in the extension (it downloaded the 64-bit binary), but it’s no longer supported. If you are actually running 32-bit Windows, you don’t need to do anything different since that’s not a supported platform anyway.

    +
  • +
  • +

    It’s not yet known how updating between stable versions works.

    +
  • +
+
+
+

If you’re not running one of the supported platforms, GitHub releases have a VSIX without an included server, but you’ll need to compile the server or obtain it by using rustup, just like before.

+
+
+

If you have any problems, please check the version you’re running against the one published on the Marketplace, check if you’ve set rust-analyzer.server.path (it’s not required on the supported platforms), and maybe file an issue if it still doesn’t work.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11071 build and publish pre-release Code extension versions.

    +
  • +
  • +

    #11106 remove network updates from the Code extension.

    +
  • +
  • +

    #10933 show values of constants in hover.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11122 remove note about alpha status Code extension description.

    +
  • +
  • +

    #11062 don’t say "a reference to" Copy types in the docs created by Generate getter.

    +
  • +
  • +

    #11069 partially fix ide_db::search for crate roots.

    +
  • +
  • +

    #11073 fix Windows not finding the PDB file.

    +
  • +
  • +

    #11074 bump default CHALK_SOLVER_MAX_SIZE.

    +
  • +
  • +

    #11083 fix Inline local assist not working in let statement initializer.

    +
  • +
  • +

    #11093 complete std::mem::drop instead of Drop::drop.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #10484 update match checking algorithm to match rustc.

    +
  • +
  • +

    #11065 don’t kick off inference in Semantics::descend_into_macros_impl.

    +
  • +
  • +

    #11082 do less work in hir::Semantics.

    +
  • +
  • +

    #11067 store function parameter names in ItemTree.

    +
  • +
  • +

    #11086 simplify completion rendering.

    +
  • +
  • +

    #11089 render more completions from HIR instead of AST.

    +
  • +
  • +

    #11090 deduplicate lowering ctx hygiene field.

    +
  • +
  • +

    #11092 directly use the self parameter in completions instead of searching for it.

    +
  • +
  • +

    #11095 disable unstable APIs for nightly releases.

    +
  • +
  • +

    #11103 improve GitHub release action.

    +
  • +
  • +

    #11117 replace TreeSink with a data structure.

    +
  • +
  • +

    #11118 move whitespace attachment logic to the parser crate.

    +
  • +
  • +

    #11120 move parser tests to the parser crate.

    +
  • +
  • +

    #11028 bump MSRV to 1.57.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/01/03/changelog-110.html b/thisweek/2022/01/03/changelog-110.html new file mode 100644 index 00000000..9418a90a --- /dev/null +++ b/thisweek/2022/01/03/changelog-110.html @@ -0,0 +1,180 @@ + + + + + + + + + + Changelog #110 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #110

+ +
+
+
+

Commit: 8e9ccbf
+Release: 2022-01-03

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11151 correctly fall back to notify if the client-side file watching is not supported.

    +
  • +
  • +

    #11173 allow partially resolved types in Add explicit type.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11136 (first contribution) use the right numbers of placeholders in Add turbofish.

    +
  • +
  • +

    #11088 hide some trivial type hints.

    +
  • +
  • +

    #11158 enable completions for <_>::$0.

    +
  • +
  • +

    #11171, #11175 fix tool module classification.

    +
  • +
  • +

    #11144 fix server path on NixOS.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11131 avoid speculation when completing macros.

    +
  • +
  • +

    #11156 record unresolved derive invocations in hir.

    +
  • +
  • +

    #11160 use a basic NonEmptyVec in mbe::syntax_bridge.

    +
  • +
  • +

    #11169, #11177 handle macro calls better in highlighting.

    +
  • +
  • +

    #11134 tighten up parser API.

    +
  • +
  • +

    #11141, #11152, #11153 add tests for extra parser entry points.

    +
  • +
  • +

    #11163 add tests for top-level parser entry points.

    +
  • +
  • +

    #11164 more macro tests.

    +
  • +
  • +

    #11165, #11167 start enforcing invariants for top-level entry points.

    +
  • +
  • +

    #11127 set a timeout on the Octokit client.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/01/10/changelog-111.html b/thisweek/2022/01/10/changelog-111.html new file mode 100644 index 00000000..1d7d3871 --- /dev/null +++ b/thisweek/2022/01/10/changelog-111.html @@ -0,0 +1,226 @@ + + + + + + + + + + Changelog #111 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #111

+ +
+
+
+

Commit: 0f8c96c
+Release: 2022-01-10

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11112 evaluate constants in array repeat expression:

    +
    +
    +148725908 da1a03de 83dd 4e4e afd1 b3ae326e298b +
    +
    +
  • +
  • +

    #11193 add setting to replace specific proc-macros with dummy expanders:

    +
    +
    +148529907 12f2442d 627a 4484 8e16 aa903a249bc8 +
    +
    +
  • +
  • +

    #11208 expand attribute macros on impl and trait items.

    +
  • +
  • +

    #11214 poke user when supplying faulty configurations.

    +
  • +
  • +

    #11145 add setting to use reasonable default expressions when filling missing fields.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11107 (first contribution) fix generic type substitution when implementing trait with associated type.

    +
  • +
  • +

    #11061 support Move if to guard on if-else chains.

    +
  • +
  • +

    #11178 keep block modifiers in Replace match with if let.

    +
  • +
  • +

    #11184 pass through mutable parameter references when extracting a function.

    +
  • +
  • +

    #11195 pass through reference modifiers when extracting a variable.

    +
  • +
  • +

    #11190 improve function parameter completion.

    +
  • +
  • +

    #11200, #11207 always put a space after dyn and impl in macro pretty-printing.

    +
  • +
  • +

    #11201 fix completions not considering ancestor items for attribute search.

    +
  • +
  • +

    #11202 fix hang in apply_demorgan assist.

    +
  • +
  • +

    #11204 shorten replacement path in replace_qualified_name_with_use.

    +
  • +
  • +

    #11211 fix parsing of #[derive] paths.

    +
  • +
  • +

    #11218 don’t insert &mut twice in parameter completion.

    +
  • +
  • +

    #11194 don’t include lifetime when generating documentation for new.

    +
  • +
  • +

    #11220 don’t include lifetime arguments in add_turbo_fish.

    +
  • +
  • +

    #11238 shrink the span of errors from attribute macros and derives.

    +
  • +
  • +

    #11187 rename and use the 1.55 proc macro ABI for 1.54.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11115 refactor: avoid separate traversal in Replace filter_map().next() with find_map().

    +
  • +
  • +

    #11157 remove SemanticScope::speculative_resolve_as_mac.

    +
  • +
  • +

    #11189 remove lossy Definition::{from_token,from_node} methods.

    +
  • +
  • +

    #11216 support registered tools and attributes in ide layer.

    +
  • +
  • +

    #11225, #11230, #11237 clean up doc and attribute handling.

    +
  • +
  • +

    #11232 filter out macro calls by file id in when building DynMap.

    +
  • +
  • +

    #11235 record attribute calls on assoc items in TraitData and ImplData.

    +
  • +
  • +

    #11236 avoid InFile wrapping of DynMap keys.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/01/17/changelog-112.html b/thisweek/2022/01/17/changelog-112.html new file mode 100644 index 00000000..a6a2b9ed --- /dev/null +++ b/thisweek/2022/01/17/changelog-112.html @@ -0,0 +1,180 @@ + + + + + + + + + + Changelog #112 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #112

+ +
+
+
+

Commit: e6e7280
+Release: 2022-01-17

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11258 (first contribution) Kate uses rust-analyzer by default now.

    +
  • +
  • +

    #11210, #11292 deprioritize ops and comparison methods in completion.

    +
  • +
  • +

    #11248 take arm types into consideration in Merge match arms assist.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11247 print a single ellipsis for any number of omitted types.

    +
  • +
  • +

    #11257 report missing macro diagnostics in item bodies.

    +
  • +
  • +

    #11259 fix use super::{super::…​};.

    +
  • +
  • +

    #11261 don’t complete attributes with existing expressions.

    +
  • +
  • +

    #11263 don’t drop param completions when fully typing out a pattern.

    +
  • +
  • +

    #11265 fix postfix completion panic.

    +
  • +
  • +

    #11282 properly cache files in Semantics when ascending macros.

    +
  • +
  • +

    #11283 adjust auto-indentation when typing ..

    +
  • +
  • +

    #11287 quiet down "overly long loop turn" messages during project load.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11266, #11267, #11274 restore hir API boundary.

    +
  • +
  • +

    #11284 remove redundant recursion limit.

    +
  • +
  • +

    #11276 clean up HasFormatSpecifier::lex_format_specifier slightly.

    +
  • +
  • +

    #11286 clean up associated item collection.

    +
  • +
  • +

    #11294 move format specifier lexing from syntax to ide_db.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/01/24/changelog-113.html b/thisweek/2022/01/24/changelog-113.html new file mode 100644 index 00000000..fdddcaa7 --- /dev/null +++ b/thisweek/2022/01/24/changelog-113.html @@ -0,0 +1,141 @@ + + + + + + + + + + Changelog #113 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #113

+ +
+
+
+

Commit: 17afa2e
+Release: 2022-01-24

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11310 (first contribution) remove pipe from surroundingPairs.

    +
  • +
  • +

    #11311 insert auto-imports after header comments.

    +
  • +
  • +

    #11307 allow macros to expand to or-patterns.

    +
  • +
  • +

    #11314 don’t load auxiliary crates outside the workspace.

    +
  • +
  • +

    #11334 avoid panic in semantics due to cfg_attr disrupting offsets.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11327 remove redundant Option from eager macro expansions.

    +
  • +
  • +

    #11308 status: output all crates a file belongs to.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/01/31/changelog-114.html b/thisweek/2022/01/31/changelog-114.html new file mode 100644 index 00000000..623f2e58 --- /dev/null +++ b/thisweek/2022/01/31/changelog-114.html @@ -0,0 +1,159 @@ + + + + + + + + + + Changelog #114 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #114

+ +
+
+
+

Commit: fd3942e
+Release: 2022-01-31

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11360 add support for the #![recursion_limit] attribute.

    +
  • +
  • +

    #11281 implement parallel cache priming.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11288 (first contribution) enable <code> blocks in hover.

    +
  • +
  • +

    #11347, #11354 fix resolution of eager macro contents.

    +
  • +
  • +

    #11382 fix IDE panics caused by #[cfg_attr].

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11340 make syntax bridge fully infallible.

    +
  • +
  • +

    #11353 set current working directory for procedural macros.

    +
  • +
  • +

    #11356 roll back env vars changed by a proc macro.

    +
  • +
  • +

    #11365 allow proc_macro_srv users to disable copying of compiled macros.

    +
  • +
  • +

    #11348 fix merge commit check for git 2.35.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/02/07/changelog-115.html b/thisweek/2022/02/07/changelog-115.html new file mode 100644 index 00000000..349cc8d6 --- /dev/null +++ b/thisweek/2022/02/07/changelog-115.html @@ -0,0 +1,205 @@ + + + + + + + + + + Changelog #115 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #115

+ +
+
+
+

Commit: ba33054
+Release: 2022-02-07

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11384 complete local function and closure parameters from surrounding scopes:

    +
    +
    +152641087 78f8e4c4 275c 4259 a17e 9fe2cc698269 +
    +
    +
  • +
  • +

    #11401 add ABI string completions:

    +
    +
    +152686208 4546f830 e6bd 47f0 ae48 4bb48b499a73 +
    +
    +
  • +
  • +

    #11293, #11395 implement format string completion:

    +
    +
    + +
    +
    +
  • +
  • +

    #11393 complete functions and methods from block level impls.

    +
  • +
  • +

    #11394 de-prioritize completions of private but editable definitions.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11182 (first contribution) don’t panic on seeing an unexpected offset.

    +
  • +
  • +

    #11412 (first contribution) include fn/type/const keyword in trait impl completion item source ranges.

    +
  • +
  • +

    #11388 fix proc-macro server not using the supplied span in Ident::new:

    +
    +
    +151827812 c03b8fc7 7ecf 4959 804a 2680d8e61e8b +
    +
    +
  • +
  • +

    #11390 de-prioritize completions of qualified operator function completions.

    +
  • +
  • +

    #11322 include comments in "Extract function".

    +
  • +
  • +

    #11399 fix associated type shorthand from method bounds.

    +
  • +
  • +

    #11402 fix visibility restriction path completions always using the parent module.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11416 (first contribution) fix eslint LSP config.

    +
  • +
  • +

    #11418 (first contribution) bump pulldown-cmark-to-cmark to fix link rendering bug.

    +
  • +
  • +

    #11291 make range up-mapping more precise.

    +
  • +
  • +

    #11397 refactor completion module split.

    +
  • +
  • +

    #11403 shrink mbe::ExpandError and mbe::ParseError.

    +
  • +
  • +

    #11406 update install notes for bundled servers.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/02/14/changelog-116.html b/thisweek/2022/02/14/changelog-116.html new file mode 100644 index 00000000..8097555d --- /dev/null +++ b/thisweek/2022/02/14/changelog-116.html @@ -0,0 +1,163 @@ + + + + + + + + + + Changelog #116 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #116

+ +
+
+
+

Commit: 02904e9
+Release: 2022-02-14

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11444 fix up syntax errors in attribute macro inputs to make completion work more often:

    +
    +
    +153276465 81f780ed 8cc1 44ff 88a7 9080ce58116a +
    +
    +
  • +
  • +

    #11437 render whether a function is async / const / unsafe in completion details:

    +
    +
    +153089518 5419afe4 b2c6 4be8 80f7 585f5c514ff2 +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11459 (first contribution) add missing experimental capabilities.

    +
  • +
  • +

    #11442 (first contribution) use text range of a mod name after macro expansion when renaming a module.

    +
  • +
  • +

    #11436 don’t change references to super when renaming a module.

    +
  • +
  • +

    #11460 fix documentation of SsrParams.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11453 make ascend_call_token iterative instead of recursive.

    +
  • +
  • +

    #11427 fix serialization of WorkspaceSymbolParams.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/02/21/changelog-117.html b/thisweek/2022/02/21/changelog-117.html new file mode 100644 index 00000000..ad71c74b --- /dev/null +++ b/thisweek/2022/02/21/changelog-117.html @@ -0,0 +1,161 @@ + + + + + + + + + + Changelog #117 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #117

+ +
+
+
+

Commit: d6ed146
+Release: 2022-02-21

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11369 (first contribution) add type hints for keyword expression hovers:

    +
    +
    +151611737 12325c23 a1f9 4fca ae48 279b374bdcdf +
    +
    +
  • +
  • +

    #11484 infer array size for slice patterns.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11458 (first contribution) parse immovable generator syntax (static ||).

    +
  • +
  • +

    #11477 fix Merge Imports dropping imports.

    +
  • +
  • +

    #11480 fix keyword hover on macro-expanded tokens.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11470 (first contribution) fix typo in GlobalState docs.

    +
  • +
  • +

    #11475 avoid temporary Vec in MBE.

    +
  • +
  • +

    #11511 wrap MacroCallKind::Attr attr_args field in an Arc.

    +
  • +
  • +

    #11512 remove name fields from MacroCallKind.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/02/28/changelog-118.html b/thisweek/2022/02/28/changelog-118.html new file mode 100644 index 00000000..79b8d99c --- /dev/null +++ b/thisweek/2022/02/28/changelog-118.html @@ -0,0 +1,251 @@ + + + + + + + + + + Changelog #118 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #118

+ +
+
+
+

Commit: 4e72700
+Release: 2022-02-28

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11549 (first contribution) add support for concat_bytes!.

    +
  • +
  • +

    #11481 display parameter names when hovering over a function pointer alias:

    +
    +
    +155932516 2459a4e5 dae8 40bc a094 adc64d48025e +
    +
    +
  • +
  • +

    #11513 expand derive attribute into a pseudo expansion:

    +
    +
    +155107902 abca028d f985 408a b2ec 97aa34e8ae83 +
    +
    +
    +
    +155108170 b0e81d69 3533 4ad3 8f81 c34ce87dc46b +
    +
    +
  • +
  • +

    #11462 highlight continue points:

    +
    +
    +155933288 3e1a1e43 6dcc 4ced 9385 f469d9a39a99 +
    +
    +
  • +
  • +

    #11375 add support for if- and while- let chains.

    +
  • +
  • +

    #11538 disable private-editable completions by default (controlled by rust-analyzer.completion.privateEditable.enable).

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11461 (first-contribution) filter generics in Extract struct from enum variant.

    +
  • +
  • +

    #11531 (first contribution) make fill_match_arms assist handle #[doc(hidden)] and #[non_exhaustive].

    +
  • +
  • +

    #11535 (first contribution) add install instructions for Kakoune and Helix.

    +
  • +
  • +

    #11524 (first contribution) state that only the latest stable toolchain is officially supported.

    +
  • +
  • +

    #11424 pass required features to cargo when using the Run action.

    +
  • +
  • +

    #11540 resolve private fields in type inference.

    +
  • +
  • +

    #11490 fix doc test formatting with generics.

    +
  • +
  • +

    #11525 drop generic args in path in replace_qualified_name_with_use.

    +
  • +
  • +

    #11562 don’t emit unresolvedReference highlight tags in unlinked files.

    +
  • +
  • +

    #11516 don’t count commas when looking for the derive attribute in diagnostics.

    +
  • +
  • +

    #11517 fix qualified record literal completion triggering too eagerly.

    +
  • +
  • +

    #11522 make code lenses work on attributed items.

    +
  • +
  • +

    #11530 fix expand_macro always expanding the first listed derive.

    +
  • +
  • +

    #11472 fix visibility in impl items and change pub(crate) to pub in extract_module.

    +
  • +
  • +

    #11552 properly display $crate in hovers.

    +
  • +
  • +

    #11554 fix type mismatches with unreachable! in Rust 1.59.

    +
  • +
  • +

    #11565 fix body selection in while loops with block conditions.

    +
  • +
  • +

    #11567 fix if with block conditions.

    +
  • +
  • +

    #11514 update manual for coc-rust-analyzer.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11573 reuse buffer in TextEdit::apply and add tests.

    +
  • +
  • +

    #11550 refactor autoderef/method resolution.

    +
  • +
  • +

    #11455 handle proc-macro functions as the proc-macro they resolve to.

    +
  • +
  • +

    #11527 split unresolved proc-macro error out of mbe.

    +
  • +
  • +

    #11536 resolve functions as proc-macros via FileAstId.

    +
  • +
  • +

    #11537 reduce visibility of proc-macros to pub(crate) in nameres.

    +
  • +
  • +

    #11548 add CSV output to analysis-stats.

    +
  • +
  • +

    #11564 clean up highlighting tests.

    +
  • +
  • +

    #11560 update url to make webrender build when computing metrics.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/03/07/changelog-119.html b/thisweek/2022/03/07/changelog-119.html new file mode 100644 index 00000000..b38cb971 --- /dev/null +++ b/thisweek/2022/03/07/changelog-119.html @@ -0,0 +1,230 @@ + + + + + + + + + + Changelog #119 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #119

+ +
+
+
+

Commit: 5fae65d
+Release: 2022-03-07

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

A Message from the Team

+
+
+

We of the rust-analyzer team never took the opportunity to introduce ourselves, but we want to make an exception because of the current events.

+
+
+

One of the early rust-analyzer contributors is currently in Kyiv, amidst falling missiles and artillery shells.

+
+
+

Our friend did not ask for this, did not ask to be liberated or saved by the Russian Army. +Neither did the other countless Ukrainians who are today at risk. +Their fault is having been born in a country which a bully decided shouldn’t exist.

+
+
+

In Ukraine, Putin’s army is committing war crimes, while those at home have no idea because independent journalism has been outlawed.

+
+
+

So please, speak up. +If you have friends or family in Russia, call and tell them what millions of people are going through. +And consider making a donation or going to a protest.

+
+
+

Thank you and Slava Ukraini!

+
+
+
+
+

Heads-up

+
+
+

The latest Visual Studio Code version (1.65, released on March 3) has native support for inlay hints. +We have been using a custom implementation of that, but would like to switch to the upstream one in #11445, planned to be merged next week. +This means that the next release will require VS Code 1.65.

+
+
+

Unfortunately, the upstream implementation brings some regressions. +Specifically, the caret behaves differently when passing over the hint, and the styling is not necessarily better. +In addition, Code only updates the hints about four times per second while typing, causing them to feel more sluggish.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11620 support locals with multiple declaration sites:

    +
    +
    +156833306 6bdb97ae 1fb3 4fd0 9f7d 1783c54c23a5 +
    +
    +
  • +
  • +

    #11598 parse destructuring assignments.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11609 add another case to the syntax fixup code.

    +
  • +
  • +

    #11140 preserve order of generic args.

    +
  • +
  • +

    #11616 fix semantic highlighting breaking for lifetimes in macros.

    +
  • +
  • +

    #11595 lower string literal values.

    +
  • +
  • +

    #11622 show variadic args in hover function signature.

    +
  • +
  • +

    #11623 add type variable table to InferenceTableSnapshot.

    +
  • +
  • +

    #11629 fix macro-calls expanding to items in if/while conditions.

    +
  • +
  • +

    #11630 recognize Self as a proper keyword.

    +
  • +
  • +

    #11613 add abort to safe intrinsics list.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11593 build release binaries on Ubuntu 18.04.

    +
  • +
  • +

    #11610 add currently failing test for #11242.

    +
  • +
  • +

    #11574 slightly refactor TextEdit.

    +
  • +
  • +

    #11631 refactor syntax_highlighting.

    +
  • +
  • +

    #11632 bring back syntax highlighting in test data.

    +
  • +
  • +

    #11639 re-arrange ide_db modules.

    +
  • +
  • +

    #11633 automatically change text color in logo based on dark mode.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/03/14/changelog-120.html b/thisweek/2022/03/14/changelog-120.html new file mode 100644 index 00000000..6e38bc22 --- /dev/null +++ b/thisweek/2022/03/14/changelog-120.html @@ -0,0 +1,198 @@ + + + + + + + + + + Changelog #120 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #120

+ +
+
+
+

Commit: 5e85158
+Release: 2022-03-14

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11686 (first contribution) improve enum variant field completion, enum variant / struct consistency.

    +
  • +
  • +

    #11687 (first contribution) highlight escape sequences in byte strings.

    +
  • +
  • +

    #11445, #11647, #11658 BREAKING: switch to upstream inlay hints (requires Code 1.65):

    +
    +
    +157213798 0bb2dd91 2e40 41c7 939c a63d366d9001 +
    +
    +
  • +
  • +

    #11691 suggest union literals, suggest union fields within an empty union literal:

    +
    +
    +158023335 84c03e39 daf0 4a52 b969 f40b01501cc8 +
    +
    +
    +
    +158023398 4695ae34 ce64 4f40 8494 68731a3030c6 +
    +
    +
  • +
  • +

    #11676 offer qualified path completions in derives.

    +
  • +
  • +

    #11684 allow configuration of colons in inlay hints (rust-analyzer.inlayHints.renderColons).

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11672 (first contribution) add support for new where clause location in associated types.

    +
  • +
  • +

    #11683 (first contribution) stop wrapping ConstParam default values in ConstArg.

    +
  • +
  • +

    #11660 insert dummy values for const generics in subst.

    +
  • +
  • +

    #11664 properly handle proc-macro crate types for nameres.

    +
  • +
  • +

    #11662 fix extract_module on inherent impls.

    +
  • +
  • +

    #11680 show what file paths were expected for unresolved modules.

    +
  • +
  • +

    #11644 emit more detailed highlighting for %, >>, <<.

    +
  • +
  • +

    #11696 detect NixOS when /etc/os-release includes quotes.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11663 add hir_def::MacroId, add Macro{Id} to ModuleDef{Id}.

    +
  • +
  • +

    #11685 simplify CompletionContext.

    +
  • +
  • +

    #11693 remove ide_completion::render::build_ext module.

    +
  • +
  • +

    #11692 another round of clippy fixes.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/03/21/changelog-121.html b/thisweek/2022/03/21/changelog-121.html new file mode 100644 index 00000000..a2a40148 --- /dev/null +++ b/thisweek/2022/03/21/changelog-121.html @@ -0,0 +1,243 @@ + + + + + + + + + + Changelog #121 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #121

+ +
+
+
+

Commit: b594f9c
+Release: 2022-03-21

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11731 add return type hints for closures with block bodies (enable with rust-analyzer.inlayHints.closureReturnTypeHints):

    +
    +
    +158839001 de6ec76d e4e9 4c70 98e0 2c0c4a62b42c +
    +
    +
  • +
  • +

    #11755 implement lifetime elision hints (enable with rust-analyzer.inlayHints.lifetimeElisionHints and rust-analyzer.inlayHints.lifetimeElisionHints.useParameterNames):

    +
    +
    +159134856 e2c75d2d f17c 45c7 9a78 3da5ee8b1acd +
    +
    +
    +
    +159134857 30fac3a1 825e 4f49 ba9b 9fa0bb215694 +
    +
    +
  • +
  • +

    #11771 visualize compiler inserted reborrows via inlay hints (enable using rust-analyzer.inlayHints.reborrowHints):

    +
    +
    +159165178 baaf968a 4381 468e 933f 5326ca1b203d +
    +
    +
  • +
  • +

    #11760 provide signature help when editing generic args:

    +
    +
    +159067106 3917a355 ca77 4d23 ad56 945dcc945425 +
    +
    +
  • +
  • +

    #11774 tag macro calls as unsafe if they expand to unsafe expressions:

    +
    +
    +159177375 619c59fb 565f 42cd a2f5 73c2c11e77e6 +
    +
    +
  • +
  • +

    #11690 add Inline type alias assist:

    +
    +
    +158020510 fed78b5c 4c7e 46d1 9151 3044a29b9990 +
    +
    +
    +
    +158020516 8a2deb6d c6ec 4adf a15b c514fc97dc43 +
    +
    +
  • +
  • +

    #11713, #11753 complete associated consts in patterns.

    +
    +
    +159210559 f93461b2 9d05 4f44 a31d 0d91ec3d822d +
    +
    +
  • +
  • +

    #11688, #11718, #11735 (partially) add const generics support.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11708 (first contribution) update manual for inlay hint customization

    +
  • +
  • +

    #11739 (first contribution) emit #[must_use] in Generate getter and generate_is_empty_from_len.

    +
  • +
  • +

    #11737, #11741 emit #[must_use] in Generate new and Generate enum is_variant.

    +
  • +
  • +

    #11714 fix completions in for loop patterns.

    +
  • +
  • +

    #11720 mark chaining hints as types.

    +
  • +
  • +

    #11694 preserve break and continue labels in Extract to function.

    +
  • +
  • +

    #11743 properly unify receivers during method resolution.

    +
  • +
  • +

    #11750 fix runnables trying to add doc tests in the crate root from #[macro_export] macros.

    +
  • +
  • +

    #11765 fix closure hints using macro ranges.

    +
  • +
  • +

    #11710 fix crash when parsing /etc/os-release.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11700, #11727, #11734 bump xshell.

    +
  • +
  • +

    #11775 treat global_asm and asm macros as unsafe.

    +
  • +
  • +

    #11726 more ide_completion refactoring.

    +
  • +
  • +

    #11752 allow explicitly specifying end of fixture annotations.

    +
  • +
  • +

    #11761 rename call info to signature help.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/03/28/changelog-122.html b/thisweek/2022/03/28/changelog-122.html new file mode 100644 index 00000000..3f4cdb26 --- /dev/null +++ b/thisweek/2022/03/28/changelog-122.html @@ -0,0 +1,210 @@ + + + + + + + + + + Changelog #122 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #122

+ +
+
+
+

Commit: bc08b8e
+Release: 2022-03-28

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11780 add experimental type mismatch diagnostic (can be disabled using "rust-analyzer.diagnostics.disabled": ["type-mismatch"]):

    +
    +
    + +
    +
    +
  • +
  • +

    #11772 support constants in const eval:

    +
    +
    +159888144 52e538c6 2034 4e61 b947 a4c4296ee46a +
    +
    +
  • +
  • +

    #11809 disable experimental diagnostics by default (can be re-enabled using rust-analyzer.diagnostics.enableExperimental).

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11789 rename lifetime elision hint configuration key to rust-analyzer.inlayHints.lifetimeElisionHints.enable.

    +
  • +
  • +

    #11805 don’t try to resolve methods on unknown types.

    +
  • +
  • +

    #11800 fix #[macro_use] no longer importing non-macro_rules! macros.

    +
  • +
  • +

    #11806 fix async block type inference using containing function return type.

    +
  • +
  • +

    #11797 fix unwrap on a None value in proc macros built with Rust 1.57.0.

    +
  • +
  • +

    #11801 avoid returning None from Span::join to fix some proc macros.

    +
  • +
  • +

    #11826 stop emitting #[must_use] in Generate new assist.

    +
  • +
  • +

    #11782 fix flyimport showing functions in pattern position.

    +
  • +
  • +

    #11785 fix tuple- and record struct completions not working with existing braces.

    +
  • +
  • +

    #11786 don’t add wildcard pattern for fill_match_arms with local enums.

    +
  • +
  • +

    #11795 correctly suggest auto importing traits from aliases.

    +
  • +
  • +

    #11791 fix and improve signature help.

    +
  • +
  • +

    #11802 add stubs to make proc macros work that use the SourceFile API.

    +
  • +
  • +

    #11825 don’t complete Drop::drop for qualified paths.

    +
  • +
  • +

    #11831 disable ref_match for qualified paths as well.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11793 (first contribution) consolidate LSIF references into a single edge where possible.

    +
  • +
  • +

    #11788 improve find_path and extern prelude handling.

    +
  • +
  • +

    #11833 move mismatched arg count diagnostic to inference.

    +
  • +
  • +

    #11776 replace write! with direct Formatter calls.

    +
  • +
  • +

    #11810 rename the 1.47 proc macro ABI to 1.48.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/04/04/changelog-123.html b/thisweek/2022/04/04/changelog-123.html new file mode 100644 index 00000000..fd5badea --- /dev/null +++ b/thisweek/2022/04/04/changelog-123.html @@ -0,0 +1,226 @@ + + + + + + + + + + Changelog #123 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #123

+ +
+
+
+

Commit: 46d7ee6
+Release: 2022-04-04

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11699 (first contribution) add assist to remove unneeded asyncs:

    +
    +
    + +
    +
    +
  • +
  • +

    #11879 suggest inferred types in completion (add : and trigger it manually):

    +
    +
    + +
    +
    +
  • +
  • +

    #10802 allow clients to configure the global workspace search limit.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11869 (first contribution) allow tildes as code block fences:

    +
    +
    +161207693 8e39997c 9ca6 4e69 8c65 e9b70899f7db +
    +
    +
  • +
  • +

    #11866 (first contribution) avoid underflows in range conversion.

    +
  • +
  • +

    #11857, #11886 decrease relevance of postfix completions.

    +
  • +
  • +

    #11840 fix another const generic panic.

    +
  • +
  • +

    #11842 fix duplicate type mismatches with blocks.

    +
  • +
  • +

    #11844 fix divergence detection for bare match arms.

    +
  • +
  • +

    #11852 expand asm! to infinite loops to improve type inference.

    +
  • +
  • +

    #11863 allow varargs in any param position.

    +
  • +
  • +

    #11870 recover from missing type annotation.

    +
  • +
  • +

    #11878 paper over GAT panic.

    +
  • +
  • +

    #11881 don’t rely on lang items to find primitive impls.

    +
  • +
  • +

    #11877 don’t add self when splitting glob imports.

    +
  • +
  • +

    #11887 add missing fields diagnostic fix for patterns.

    +
  • +
  • +

    #11865 select correct insert position for disabled group import.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11849 (first contribution) change by_self to self and by_crate to crate in docs.

    +
  • +
  • +

    #11867, #11874 (first contribution) create Generate is, as, try_into assist group.

    +
  • +
  • +

    #11861 add View file text command to debug sync issues.

    +
  • +
  • +

    #11827 enforce invariant that Resolver always contains a ModuleScope.

    +
  • +
  • +

    #11871 move rust.ungram into rust-analyzer/crates/syntax.

    +
  • +
  • +

    #11872 remove PathResolution::AssocItem.

    +
  • +
  • +

    #11875 simplify completion.

    +
  • +
  • +

    #11882 record outline child modules with missing backing file in def map.

    +
  • +
  • +

    #11890 delete FUNDING.yml.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/04/11/changelog-124.html b/thisweek/2022/04/11/changelog-124.html new file mode 100644 index 00000000..06a5ef29 --- /dev/null +++ b/thisweek/2022/04/11/changelog-124.html @@ -0,0 +1,203 @@ + + + + + + + + + + Changelog #124 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #124

+ +
+
+
+

Commit: 24cf957
+Release: 2022-04-11

+
+
+
+
+

Sponsors

+
+
+

Become a sponsor: On OpenCollective or +GitHub Sponsors.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11938 improve associated item completion in trait impls:

    +
    +
    +162481277 2a0d2f21 dc20 4452 804d 6370766216b6 +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11894 (first contribution) complete pattern args based on type name

    +
  • +
  • +

    #11891 show error message when flycheck fails.

    +
  • +
  • +

    #11915 attempt to heuristically resolve paths in const arguments in IDE layer.

    +
  • +
  • +

    #11953 make extract_module more lazy.

    +
  • +
  • +

    #11896 show path to be created in the unresolved-module fix label.

    +
  • +
  • +

    #11899 skip match check on patterns of unexpected TyKind::FnDef.

    +
  • +
  • +

    #11911 use correct text ranges in SearchScope for macro-emitted inline modules.

    +
  • +
  • +

    #11914 fix path qualifiers not resolving generic type params when shadowed by trait.

    +
  • +
  • +

    #11926 fix panics with #[cfg]’d-out `self parameter.

    +
  • +
  • +

    #11920 fix spurious type mismatch error for const generics with value parameters.

    +
  • +
  • +

    #11931 flyimport: omit types when completing where-clause

    +
  • +
  • +

    #11936 ignore Drop and Destruct bounds for now.

    +
  • +
  • +

    #11942 check whether a parameter can be converted to a local.

    +
  • +
  • +

    #11943 don’t create hir::Locals from const path patterns.

    +
  • +
  • +

    #11954 parse for<'a> closure syntax.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11904 wrap macros in expr position in MacroExpr node.

    +
  • +
  • +

    #11905 remove hir_expand macro recursion check.

    +
  • +
  • +

    #11916 add more doc-link tests.

    +
  • +
  • +

    #11924 remove FnFlags::IS_IN_EXTERN_BLOCK.

    +
  • +
  • +

    #11927 use bitflags for FnFlags.

    +
  • +
  • +

    #11925 add and start using HirFormatter::write_{str,char}.

    +
  • +
  • +

    #11930 move function unsafety determination out of the ItemTree.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/04/18/changelog-125.html b/thisweek/2022/04/18/changelog-125.html new file mode 100644 index 00000000..1fa64067 --- /dev/null +++ b/thisweek/2022/04/18/changelog-125.html @@ -0,0 +1,226 @@ + + + + + + + + + + Changelog #125 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #125

+ +
+
+
+

Commit: 65fbe0a
+Release: 2022-04-18

+
+
+
+
+

Announcement

+
+
+

Since this week, rust-analyzer has a new home! +The repository now lives in the rust-lang GitHub organization. +If you’re an existing user or contributor there’s no need to take action but if you encounter any glitches, please keep calm and report them.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11935, #12006 switch to LSP inlay hints (requires VS Code 1.66).

    +
  • +
  • +

    #11961 deprioritize already-imported names in use items:

    +
    +
    +162790376 6b133925 7cf9 46c5 b0e2 d8c3cba61d47 +
    +
    +
  • +
  • +

    #11971 add trailing ; when typing = in assignment:

    +
    +
    +163022079 1ed114ef 7c75 490f a8ed 731a13f0b44d +
    +
    +
  • +
  • +

    #11956 allow customizing the command for running build scripts.

    +
  • +
  • +

    #12014 attempt to format expand_macro output with rustfmt if possible.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #11957 (first contribution) fix GAT panics.

    +
  • +
  • +

    #11883 move module directory on rename.

    +
  • +
  • +

    #11967 fix trait impl completions not triggering after fn/const/type:

    +
    +
    +162996087 56540f5e a6be 4111 a4a5 8de21f483a5e +
    +
    +
  • +
  • +

    #11969 add trailing ; when completing associated const/type in trait impl.

    +
  • +
  • +

    #11992 resolve uN::method even when use std::uN; is present.

    +
  • +
  • +

    #11993 enable ADT keyword completions in block expressions.

    +
  • +
  • +

    #12000 tag macro_rules macro bang with MacroBang tag.

    +
  • +
  • +

    #12001 do reference search on all downmapped tokens with the same kind only.

    +
  • +
  • +

    #12002, #12008 fix source root panic in global state when switching git branches.

    +
  • +
  • +

    #11991 fix completion detail for async functions and RPITs.

    +
  • +
  • +

    #12011 show impl Trait in argument positon in completion details.

    +
  • +
  • +

    #12013 support associated_const_equality in parser.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11980 (first contribution) update repository URL.

    +
  • +
  • +

    #11964 unset test feature in rustc source crates.

    +
  • +
  • +

    #11970 bump chalk to fix most type mismatches in the rust-analyzer repo.

    +
  • +
  • +

    #11958 show config deseralization failures on start up.

    +
  • +
  • +

    #11960 show more project building errors to the user.

    +
  • +
  • +

    #11990 improve ItemTree pretty print output.

    +
  • +
  • +

    #11999 update feature list in VS Code extension README.

    +
  • +
  • +

    #12003 remove duplicated crate id field from hir::Type.

    +
  • +
  • +

    #12005 remove frequent Arc<Body> clones in type checking.

    +
  • +
  • +

    #12009 add more visibility into why the project gets reloaded.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/04/25/changelog-126.html b/thisweek/2022/04/25/changelog-126.html new file mode 100644 index 00000000..229d4ee4 --- /dev/null +++ b/thisweek/2022/04/25/changelog-126.html @@ -0,0 +1,171 @@ + + + + + + + + + + Changelog #126 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #126

+ +
+
+
+

Commit: b5d7a71
+Release: 2022-04-25

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12032 display signature help when applying the Add ::<> assist.

    +
  • +
  • +

    #12041 prefer core and alloc over std in auto-imports in conditionally-#[no_std] crates.

    +
  • +
  • +

    #12024 don’t suggest existing #[derive]s in completion.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12044 (first contribution) fix CargoWorkspace panic when rustcSource is set.

    +
  • +
  • +

    #12040 improve parameter completion.

    +
  • +
  • +

    #12054 fix const generic panic in dyn Trait.

    +
  • +
  • +

    #12058 increase stack size in the LSP and proc-macro servers.

    +
  • +
  • +

    #12037 remove rust-analyzer.inlayHints.enable and set language scope when toggling hints.

    +
  • +
  • +

    #12042 remove angle brackets from language configuration.

    +
  • +
  • +

    #12063 fall back to parameter definitions on error types in signature help.

    +
  • +
  • +

    #12064 fix ide_db::search not searching bodies of attributed items.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12053 (first contribution) export lc.LanguageClient from the VSCode extension.

    +
  • +
  • +

    #12015 (first contribution) update developer documentation link.

    +
  • +
  • +

    #12023 add more visibility why switching workspaces happens.

    +
  • +
  • +

    #12021 add a NameContext to CompletionContext, move out some ImmediateLocation variants.

    +
  • +
  • +

    #12028 fix changelog generation after repository move.

    +
  • +
  • +

    #12051 add triagebot.toml.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/05/02/changelog-127.html b/thisweek/2022/05/02/changelog-127.html new file mode 100644 index 00000000..668ea6ef --- /dev/null +++ b/thisweek/2022/05/02/changelog-127.html @@ -0,0 +1,197 @@ + + + + + + + + + + Changelog #127 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #127

+ +
+
+
+

Commit: 5dce1ff
+Release: 2022-05-02

+
+
+
+
+

Configuration Revamp

+
+
+

#12010 renames most configuration keys to allow for more flexibility. +Once it gets merged (probably next week), the VS Code extension should still seamlessly support the old versions.

+
+
+

However, if you are using a different client, you might need to update your settings. +The linked PR contains a comprehensive description of the keys that were renamed.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12103 diagnose unresolved derive macros:

    +
    +
    +165591059 c759f035 2400 4bb1 84b0 9332e86c65d5 +
    +
    +
  • +
  • +

    #12110 make Inline type alias work for Self in impls.

    +
  • +
  • +

    #12074 reduce priority of flyimport completions.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12072 (first contribution) fix associated type resolution.

    +
  • +
  • +

    #12089 (first contribution) handle raw identifiers in move_module_to_file.

    +
  • +
  • +

    #12071 (first contribution) change tabs to spaces in macro_rules snippet.

    +
  • +
  • +

    #12057 (first contribution) disable visibility token validation in trait impls with attributes.

    +
  • +
  • +

    #12111 fix outline mod completion with partial module name:

    +
    +
    +165821068 a673a154 ce53 4489 af60 56d09dc9061c +
    +
    +
  • +
  • +

    #12099 resolve variants in patterns when qualified through type aliases.

    +
  • +
  • +

    #12075 don’t emit a quickfix for placeholder suggestions from rustc/clippy.

    +
  • +
  • +

    #12082 use correct parameter list for methods in signature help.

    +
  • +
  • +

    #12085 fix filtering in function parameter completion.

    +
  • +
  • +

    #12007 restart proc-macro client when reloading the workspace.

    +
  • +
  • +

    #12098 show macro_rules snippet in blocks.

    +
  • +
  • +

    #12090 use pattern recovery set when parsing ident patterns.

    +
  • +
  • +

    #12097 revert quoting of runnable names.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12118, #12133 (first contribution) rename crates to kebab-case.

    +
  • +
  • +

    #12127 update actions/checkout@v2 to v3.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/05/09/changelog-128.html b/thisweek/2022/05/09/changelog-128.html new file mode 100644 index 00000000..22b74de1 --- /dev/null +++ b/thisweek/2022/05/09/changelog-128.html @@ -0,0 +1,195 @@ + + + + + + + + + + Changelog #128 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #128

+ +
+
+
+

Commit: 5d5bbec
+Release: 2022-05-09

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12123 provide Self in record literal completion:

    +
    +
    +167346272 7e1effe9 ec72 4e62 986a 06c8ff9de016 +
    +
    +
  • +
  • +

    #12142 update Sort methods by trait definition assist to sort all associated items:

    +
    +
    +166491828 0bc10dbd 91be 408f 9fe0 636ef5e99377 +
    +
    +
  • +
  • +

    #12157 lower values of char and byte literals:

    +
    +
    +166866713 6430869a 594b 4fe8 bf9e 1bc5c3ce0aa7 +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12093 (first contribution) reload project on .cargo/config[.toml] changes.

    +
  • +
  • +

    #12143 improve the default constructor mode when filling fields

    +
  • +
  • +

    #12120 don’t show signature help after closing bracket.

    +
  • +
  • +

    #12086 use RPIT bounds of current function in inference.

    +
  • +
  • +

    #12150 fix keyword doc links in hover.

    +
  • +
  • +

    #12149, #12177, #12178, #12185 split float literal tokens at . to fix parsing of tuple field accesses.

    +
  • +
  • +

    #12171 fix inlay hints flashing after being re-enabled due to state invalidation.

    +
  • +
  • +

    #12175 fix snippets triggering where they shouldn’t.

    +
  • +
  • +

    #12188 allow auto-importing starting segments of use items.

    +
  • +
  • +

    #12134 fix incorrect double braces in HirDisplay implementations.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12136 add a Converter type for token conversion.

    +
  • +
  • +

    #12159 lift out macro bang property from completion PathKind enum.

    +
  • +
  • +

    #12161 lift out item list path completions from (un)qualified_path.

    +
  • +
  • +

    #12164, #12168 remove unqualified_path, qualified_path completions modules.

    +
  • +
  • +

    #12173 make completion PathKind mandatory.

    +
  • +
  • +

    #12174 improve completion tests by checking that the offset is included in the source_range of items.

    +
  • +
  • +

    #12187 more completion context refactoring.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/05/16/changelog-129.html b/thisweek/2022/05/16/changelog-129.html new file mode 100644 index 00000000..ec55b5b5 --- /dev/null +++ b/thisweek/2022/05/16/changelog-129.html @@ -0,0 +1,204 @@ + + + + + + + + + + Changelog #129 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #129

+ +
+
+
+

Commit: ac4ce42
+Release: 2022-05-16

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12208 Include associated types in trait signature help

    +
    +
    +167658642 8df42fba 523a 46fe a0f6 e0e041b3659d +
    +
    +
  • +
  • +

    #12215 Support variable substitution in VSCode settings

    +
  • +
  • +

    #12226 Allow reborrow inlay hints to be restricted to mutable reborrows only

    +
  • +
  • +

    #12010 Revamp the server configuration to be more consistent and future-proof

    +
  • +
  • +

    #12238 Change VSCode extension publisher to rust-lang

    +
  • +
+
+
+

Note: due to the publisher change, you might get a "Server returned 404" error message. +If that happens, try uninstalling and reinstalling the extension.

+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12197 Fix import insertion inserting after last comment in a file

    +
  • +
  • +

    #12198 Resolve assoc. types of supertraits in the IDE layer

    +
  • +
  • +

    #12199 Don’t show assoc. type binding completions when invalid

    +
  • +
  • +

    #12201 Add cast expressions to param name inlay hint heuristics

    +
  • +
  • +

    #12202 Don’t panic at fully qualified call syntax in signature help

    +
  • +
  • +

    #12209 #12213 #12228 #12229 #12245 #12246 Follow-up fixes to the config revamp

    +
  • +
  • +

    #12231 Fix X is not a valid punct panic with floats in macros

    +
  • +
  • +

    #12241 Revert float parsing fix to avoid macro-related panics

    +
  • +
  • +

    #12212 Fix a typo in the inlayHints.renderColons option description

    +
  • +
  • +

    #12220 Fix character semantic token type definition

    +
  • +
  • +

    #12190 Fix cargo check diagnostics getting mapped incorrectly with non-BMP codepoints

    +
  • +
  • +

    #12262 Insert whitespace between 'mut' and 'self' in macro expansion

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #11983 Remove handling of #[rustc_deprecated]

    +
  • +
  • +

    #12204 Move keyword expressions to expr completions module

    +
  • +
  • +

    #12223 Rename primeCaches config keys

    +
  • +
  • +

    #12225 Add token mapping test for float literals

    +
  • +
  • +

    #12224 Remove redundant offset data in annotations

    +
  • +
  • +

    #12252 Make VSCode config more GUI edit friendly

    +
  • +
  • +

    #12251 Vendor lsp-server

    +
  • +
  • +

    #12242 Improve extension description and README

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/05/17/changelog-129-5.html b/thisweek/2022/05/17/changelog-129-5.html new file mode 100644 index 00000000..22c80812 --- /dev/null +++ b/thisweek/2022/05/17/changelog-129-5.html @@ -0,0 +1,178 @@ + + + + + + + + + + Changelog #129.5 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #129.5

+ +
+
+
+

Commit: 7e95c14
+Release: 2022-05-17

+
+
+

Bonus Release 🎉

+
+
+

This release increments the VS Code extension version to fix installation problems on the stable channel.

+
+
+

The VS Code extension version of this release is v0.3.1059. +It corresponds to the nightly release v0.4.1058.

+
+
+

If you get a "Server returned 404" error when upgrading, try uninstalling and reinstalling the extension.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12253 Add binding mode inlay hints

    +
    +
    +168427387 2f299438 a0cc 496b a9a5 d689ef6a2b55 +
    +
    +
  • +
  • +

    #12244 Show inlay hints after a } to indicate the closed item

    +
    +
    +168338713 4cedef50 3611 4667 aa6a 49e154ec16a7 +
    +
    +
  • +
  • +

    #12274 #12275 Handle getters and setters in documentation template assist

    +
  • +
  • +

    #12276 Improve Generate Deref impl assist

    +
  • +
  • +

    #12285 Implement inlay hint tooltips

    +
    +
    +168842815 0c814163 25ab 4a63 aae6 bd63e3562857 +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12272 Fix signature help LSP offset conversion

    +
  • +
  • +

    #12289 Fix incorrect config key in client config update

    +
  • +
  • +

    #12271 Fix type mismatch error with Box

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12284 Cleanup lifetime elision hints

    +
  • +
  • +

    #12292 Bump extension version

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/05/23/changelog-130.html b/thisweek/2022/05/23/changelog-130.html new file mode 100644 index 00000000..4c7380aa --- /dev/null +++ b/thisweek/2022/05/23/changelog-130.html @@ -0,0 +1,213 @@ + + + + + + + + + + Changelog #130 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #130

+ +
+
+
+

Commit: 84be2ea
+Release: 2022-05-23

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12334 (first contribution) add Generate enum variant assist:

    +
    +
    + +
    +
    +
  • +
  • +

    #12345 (first contribution) add escapeSequence semantic token type.

    +
  • +
  • +

    #12263 hide type inlay hints for let statements that initialize a closure (enable using rust-analyzer.inlayHints.typeHints.hideClosureInitialization):

    +
    +
    +168470158 6cb77b18 068e 4431 a8b5 e2b22d50d263 +
    +
    +
  • +
  • +

    #12130 add assist to turn let-else statements into let and match:

    +
    +
    + +
    +
    +
  • +
  • +

    #12316 show parameter inlay hints for closure invocations:

    +
    +
    +169746543 bf3e7de1 896f 4af7 bf5c 766bc6f8e4be +
    +
    +
  • +
  • +

    #11830 add "on typing" handler for angle brackets (<, >).

    +
  • +
  • +

    #12303 improve docs generation assist.

    +
  • +
  • +

    #12326 add cargo clippy task preset.

    +
  • +
  • +

    #12329 don’t swallow build script errors.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12320 (first contribution) hide closure return hints if type is specified.

    +
  • +
  • +

    #12277 fix Show implementations link display error.

    +
  • +
  • +

    #12309 fix incorrect expected type in completions for trailing match arms.

    +
  • +
  • +

    #12301 adjust rustc diagnostic ranges for DOS line endings.

    +
  • +
  • +

    #12325 clear cargo check diagnostics when turning off flycheck.

    +
  • +
  • +

    #12342 avoid async callback to make Join lines work again.

    +
  • +
  • +

    #12346 special-case base URLs of BuiltinTypes to core.

    +
  • +
  • +

    #12281 increase default chalk overflow depth to fix some crashes.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12311 improve inlay hint tooltips.

    +
  • +
  • +

    #12349 publish universal VSIX to make Code happy.

    +
  • +
  • +

    #12294 switch to Prettier for TypeScript formatting.

    +
  • +
  • +

    #12327 rename Expr::Lambda to Expr::Closure.

    +
  • +
  • +

    #12337 document overall approach to reload.

    +
  • +
  • +

    #12313 remove duplicate word in cachePriming.numThreads description.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/05/30/changelog-131.html b/thisweek/2022/05/30/changelog-131.html new file mode 100644 index 00000000..ae210422 --- /dev/null +++ b/thisweek/2022/05/30/changelog-131.html @@ -0,0 +1,179 @@ + + + + + + + + + + Changelog #131 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #131

+ +
+
+
+

Commit: f94fa62
+Release: 2022-05-30

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12395 lower f32 and f64 literals:

    +
    +
    +170912650 5b5fe34a d9dc 4c8d bde9 ab7437a812a1 +
    +
    +
  • +
  • +

    #12359, #12365, #12366 fix publishing to VS Code Marketplace after extension move.

    +
  • +
  • +

    #12376 insert whitespace into trait-impl completions produced by macros.

    +
  • +
  • +

    #12357 when reference searching macro inputs, don’t search everything that was downmapped.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12382 make auto-closing angle brackets configurable, disabled by default.

    +
  • +
  • +

    #12341 make files.excludeDirs work.

    +
  • +
  • +

    #12355 fix inference when pattern matching a tuple field with a wildcard.

    +
  • +
  • +

    #12409 fix overflow during type inference for tuple struct patterns.

    +
  • +
  • +

    #12384, #12386 Generate variant: insert code in file with enum definition.

    +
  • +
  • +

    #12370 insert whitespaces around _ in macro expansion.

    +
  • +
  • +

    #12360 fix completions not working after attributes.

    +
  • +
  • +

    #12383 clear native diagnostics for deleted files.

    +
  • +
  • +

    #12371 vscode: fix extraEnv handling of numeric values.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12361 simplify DotAccess representation in completions.

    +
  • +
  • +

    #12373 refactor record pattern/expression handling in completion context.

    +
  • +
  • +

    #12388 make use of the statusBarItem colors in VSCode.

    +
  • +
  • +

    #12393 remove Interned usage from nameres collector.

    +
  • +
  • +

    #12350 fix build on OpenBSD (and probably other BSDs too).

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/06/06/changelog-132.html b/thisweek/2022/06/06/changelog-132.html new file mode 100644 index 00000000..8595c0ba --- /dev/null +++ b/thisweek/2022/06/06/changelog-132.html @@ -0,0 +1,205 @@ + + + + + + + + + + Changelog #132 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #132

+ +
+
+
+

Commit: ad6810e
+Release: 2022-06-06

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12451 (first contribution) support $$ in macros.

    +
  • +
  • +

    #12333 (first contribution) order auto-imports by relevance.

    +
  • +
  • +

    #12416 add implicit static lifetime hints:

    +
    +
    +172144439 cf0f987f 4e8d 4e16 80fc f4be7589b9af +
    +
    +
  • +
  • +

    #12452 support merging multiple imports in Merge imports.

    +
  • +
  • +

    #12431 fix completions disappearing when typing quickly.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12387 (first contribution) fix module rename to not try to edit directories instead of files.

    +
  • +
  • +

    #12440 don’t remove diagnostics with empty message:

    +
    +
    +171412661 9b9575e9 e71b 4b84 a5c0 00271548d50c +
    +
    +
  • +
  • +

    #12406 add option to show return inlay hints for closures without a block.

    +
  • +
  • +

    #12412 retrigger visibility completion after opening bracket.

    +
  • +
  • +

    #12347 fix panic in Extract module and improve import resolution.

    +
  • +
  • +

    #12425 fix float display in hover.

    +
  • +
  • +

    #12336 fix a type mismatch with associated types.

    +
  • +
  • +

    #12427 fix VSCode config patching incorrectly patching some configs.

    +
  • +
  • +

    #12444 implement parsing of ? opt-out trait bounds.

    +
  • +
  • +

    #12467 fix Match to if-let assist for wildcard patterns.

    +
  • +
  • +

    #12470, #12472 avoid duplicating output channels when restarting the server.

    +
  • +
  • +

    #12471 restart the server instead of reloading the window when config changes.

    +
  • +
  • +

    #12475 fix insert position in trait impl completions.

    +
  • +
  • +

    #12435 Code: clear status bar color, command when server status is ok.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12418 improve completion filtering with existing item qualifiers.

    +
  • +
  • +

    #12461 move trait impl completion analysis into CompletionContext.

    +
  • +
  • +

    #12459 clean up keyword completion handling.

    +
  • +
  • +

    #12456 shorten main thread names.

    +
  • +
  • +

    #12457, #12465 don’t log default build script output.

    +
  • +
  • +

    #12466 increase worker thread stack and give them names.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/06/13/changelog-133.html b/thisweek/2022/06/13/changelog-133.html new file mode 100644 index 00000000..17699394 --- /dev/null +++ b/thisweek/2022/06/13/changelog-133.html @@ -0,0 +1,168 @@ + + + + + + + + + + Changelog #133 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #133

+ +
+
+
+

Commit: 366bd72
+Release: 2022-06-13

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12481 introduce Add label to loop assist.

    +
  • +
  • +

    #12477 restart server automatically on configuration changes.

    +
  • +
  • +

    #12492 add proc macro ABI for rustc 1.63.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12487 (first contribution) hide parameter inlay hint when argument is function-like macro with similar name.

    +
  • +
  • +

    #12508 don’t respond to cancelled requests when retrying them, thus fixing NO_RESULT_CALLBACK_FOUND errors in Neovim.

    +
  • +
  • +

    #12455 fix false-positive type-mismatch error with generic future.

    +
  • +
  • +

    #12515 pass the build data to rustc_private crates.

    +
  • +
  • +

    #12464 fix Inline variable producing a type mismatch.

    +
  • +
  • +

    #12473 avoid adding enum brackets in use paths.

    +
  • +
  • +

    #12490 prioritize enums in use completions.

    +
  • +
  • +

    #12504 fix config patching for callable snippets.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12449 bring the version number in line with other Rust tools.

    +
  • +
  • +

    #12509 remove Generics::type_iter in favor of Generics::iter.

    +
  • +
  • +

    #12513 simplify hir_ty::utils.

    +
  • +
  • +

    #12514 improve proc-macro errors.

    +
  • +
  • +

    #12502, #12501 bump dependencies.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/06/20/changelog-134.html b/thisweek/2022/06/20/changelog-134.html new file mode 100644 index 00000000..049901f8 --- /dev/null +++ b/thisweek/2022/06/20/changelog-134.html @@ -0,0 +1,179 @@ + + + + + + + + + + Changelog #134 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #134

+ +
+
+
+

Commit: 427061d
+Release: 2022-06-20

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12519 render docs from trait declaration when hovering associated items:

    +
    +
    +174540431 17118771 c8c9 4159 b430 e7bf897f15b7 +
    +
    +
  • +
  • +

    #12576 add folding ranges for multi-line match arm list.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12517 (first contribution) fix completion for methods in trait generated by macro.

    +
  • +
  • +

    #12545 (first contribution) insert imports after the shebang if present.

    +
  • +
  • +

    #12528 check the correct proc-macro settings in missing proc-macro diagnostics.

    +
  • +
  • +

    #12544 show proc-macro loading errors in unresolved-proc-macro diagnostics.

    +
  • +
  • +

    #12584 fix attribute macro diagnostics.

    +
  • +
  • +

    #12529 ask the user to reload the vscode window when changing server settings.

    +
  • +
  • +

    #12541 clear proc-macro changed flag when reloading workspace.

    +
  • +
  • +

    #12554 don’t complete local items should not be completed in parent.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12560, #12563, #12565 more completions refactoring.

    +
  • +
  • +

    #12562 split completion context module into definitions and analysis parts.

    +
  • +
  • +

    #12564 collapse completion ctx path qualifier and is_absolute_path into enum.

    +
  • +
  • +

    #12570 only run completion functions if their corresponding context is active.

    +
  • +
  • +

    #12573 split flyimport into its three applicable contexts.

    +
  • +
  • +

    #12577 make NameRefKind classification mandatory.

    +
  • +
  • +

    #12580 move things out of CompletionContext::function_def into more specific parts.

    +
  • +
  • +

    #12581 handle fractional release numbers in changelog naming.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/06/27/changelog-135.html b/thisweek/2022/06/27/changelog-135.html new file mode 100644 index 00000000..86e8517a --- /dev/null +++ b/thisweek/2022/06/27/changelog-135.html @@ -0,0 +1,155 @@ + + + + + + + + + + Changelog #135 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #135

+ +
+
+
+

Commit: b74e96f
+Release: 2022-06-27

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12599 only apply cfg(test) for local crates, helping crates using #[cfg(not(test))].

    +
  • +
  • +

    #12629 improve proc macro errors.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12605 (first contribution) fix auto-links in doc comments:

    +
    +
    +174696581 3b1140a5 cdf0 4eda 9a11 ec648e4e7d21 +
    +
    +
  • +
  • +

    #12596 don’t trigger pattern completions when typing a wildcard pattern.

    +
  • +
  • +

    #12597 fix auto-ref completions inserting in the wrong locations.

    +
  • +
  • +

    #12625 completes non-exhaustive enum variants within the defining crate.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12520 bring back JodChild into flycheck for cancellation.

    +
  • +
  • +

    #12588, #12604 more completion refactoring.

    +
  • +
  • +

    #12594 lift out IdentContext from CompletionContext.

    +
  • +
  • +

    #12628 minor hir simplifications.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/07/04/changelog-136.html b/thisweek/2022/07/04/changelog-136.html new file mode 100644 index 00000000..cf65af43 --- /dev/null +++ b/thisweek/2022/07/04/changelog-136.html @@ -0,0 +1,176 @@ + + + + + + + + + + Changelog #136 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #136

+ +
+
+
+

Commit: 75b2232
+Release: 2022-07-04

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12634 show witnesses of non-exhaustiveness in missing-match-arm diagnostic:

    +
    +
    +177103408 995f4fb9 42b8 4793 864e 45c3b7b9ff9f +
    +
    +
  • +
  • +

    #12428, #12680 implement destructuring assignment.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12662 (first contribution) disambiguate function names in Extract Function.

    +
  • +
  • +

    #12626 (first contribution) avoid trailing : in inactive code reason with empty directive list.

    +
  • +
  • +

    #12635 (first contribution) improve target_feature completion.

    +
  • +
  • +

    #12642 deduplicate cfg completions.

    +
  • +
  • +

    #12643 fix completions for locals inside macro calls.

    +
  • +
  • +

    #12627 complete enum variants as patterns in pattern paths.

    +
  • +
  • +

    #12636 complete raw identifiers with r# prefix.

    +
  • +
  • +

    #12668 fix completion after some macro calls and simplify macro statement expansion handling.

    +
  • +
  • +

    #12678 trigger again flyimport completions in item lists.

    +
  • +
  • +

    #12648 report proc macro errors in expressions.

    +
  • +
  • +

    #12660 fix flycheck sending cancel progress with no running process.

    +
  • +
  • +

    #12650 improve whitespace insertion in pretty printer.

    +
  • +
  • +

    #12670, #12671 fix attribute macros on assoc items being discarded with disabled proc macros.

    +
  • +
  • +

    #12655 ignore the bin artifact for bench targets.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12652 set up publishing to OpenVSX (currently broken).

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/07/11/changelog-137.html b/thisweek/2022/07/11/changelog-137.html new file mode 100644 index 00000000..0ba82c9a --- /dev/null +++ b/thisweek/2022/07/11/changelog-137.html @@ -0,0 +1,150 @@ + + + + + + + + + + Changelog #137 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #137

+ +
+
+
+

Commit: 5342f47
+Release: 2022-07-11

+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12676 fix Extract into function in trait impls.

    +
  • +
  • +

    #12706 handle captured variables in Extract into Function.

    +
  • +
  • +

    #12727 improve suggested names for extracted variables.

    +
  • +
  • +

    #12695 improve associated type completions.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12690 update inert attribute list.

    +
  • +
  • +

    #12704 use SmallVec to slightly shrink ModPath size.

    +
  • +
  • +

    #12687 improve documentation for buildScripts.overrideCommand / checkOnSave.overrideCommand.

    +
  • +
  • +

    #12719 remove unnecessary unsafe from format_args! expansion.

    +
  • +
  • +

    #12716 fix publishing of ra_ap_ crates.

    +
  • +
  • +

    #12722 update remaining GitHub URLs.

    +
  • +
  • +

    #12702 Code: use a different scheme for each custom view.

    +
  • +
  • +

    #12694 remove old bors.toml.

    +
  • +
  • +

    #12732 bump npm deps.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/07/18/changelog-138.html b/thisweek/2022/07/18/changelog-138.html new file mode 100644 index 00000000..5488f0ed --- /dev/null +++ b/thisweek/2022/07/18/changelog-138.html @@ -0,0 +1,192 @@ + + + + + + + + + + Changelog #138 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #138

+ +
+
+
+

Commit: 897a7ec
+Release: 2022-07-18

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12539 (first contribution) automatically instantiate trivial structs in Generate new and Fill struct fields.

    +
  • +
  • +

    #12778, #12785 (first contribution) support negative, char & bool const generics:

    +
    +
    +179379863 b62475dd e7bf 41f2 b437 08dfe55951af +
    +
    +
  • +
  • +

    #12696 add quick fix for &str to String type mismatch:

    +
    +
    + +
    +
    +
  • +
  • +

    #12745 implement ignore and index metavar expressions.

    +
  • +
  • +

    #12747 update 1.63 proc macro ABI to match rustc.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12781 fix stack overflows and wrong type inference of associated type shorthands.

    +
  • +
  • +

    #12691 fix unresolved proc macro diagnostics pointing to macro expansions.

    +
  • +
  • +

    #12754 fix VSCode status bar tooltip not showing the error messages.

    +
  • +
  • +

    #12556 support generics in Extract function.

    +
  • +
  • +

    #12765 insert imports after doc comments in inline modules.

    +
  • +
  • +

    #12766 don’t show qualified path completions for private items.

    +
  • +
  • +

    #12773 improve self param completion applicability.

    +
  • +
  • +

    #12775 improve syntax fixup, handle incomplete if.

    +
  • +
  • +

    #12712 ignore renames for crate root.

    +
  • +
  • +

    #12735 make super:: completions depth-aware.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12742 (first contribution) fix references to obsolete config keys.

    +
  • +
  • +

    #12772 remove allocation in DefCollector::reseed_with_unresolved_attribute.

    +
  • +
  • +

    #12689 record all macro definitions in ItemScope.

    +
  • +
  • +

    #12764, #12776 remove deprecated actions-rs/toolchain action.

    +
  • +
  • +

    #12755 set server binary version for GitHub builds.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/07/25/changelog-139.html b/thisweek/2022/07/25/changelog-139.html new file mode 100644 index 00000000..17bb3ea4 --- /dev/null +++ b/thisweek/2022/07/25/changelog-139.html @@ -0,0 +1,246 @@ + + + + + + + + + + Changelog #139 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #139

+ +
+
+
+

Commit: 7e2b983
+Release: 2022-07-25

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12549, #12841 make Go to implementation work on trait methods:

    +
    +
    + +
    +
    +
  • +
  • +

    #12286 don’t ignore the path prefix in Generate constant:

    +
    +
    + +
    +
    +
    +
    + +
    +
    +
  • +
  • +

    #12798 drop support for the 1.47–1.58 proc macro ABIs.

    +
  • +
  • +

    #12795 add support for the 1.64 nightly proc macro ABI.

    +
  • +
  • +

    #12859 don’t highlight the whole fn on return-type mismatch.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12821 (first contribution) don’t generate default PartialEq::ne.

    +
  • +
  • +

    #12811 (first contribution) insert pub(crate) after doc comments and attribute macros.

    +
  • +
  • +

    #12863 fix missing fields check on destructuring assignment.

    +
  • +
  • +

    #12809 work around Code bug with empty diagnostics.

    +
  • +
  • +

    #12789 prevent panic on overlapping ranges in Remove Unused Parameter.

    +
  • +
  • +

    #12788 fix Extract variable for subexpression with mutable borrow.

    +
  • +
  • +

    #12646 escape receiver texts in completion

    +
  • +
  • +

    #12825 make searching for associated trait items consistent.

    +
  • +
  • +

    #12844 improve syntax highlighting in attributes

    +
  • +
  • +

    #12847 don’t duplicate language clients in Restart server.

    +
  • +
  • +

    #12850 fix error tooltip message for VSCode status bar item.

    +
  • +
  • +

    #12851 don’t add braces to 'if' completion in match guard position.

    +
  • +
  • +

    #12832 don’t try to implement default members.

    +
  • +
  • +

    #12861 include receiver in struct field autocomplete.

    +
  • +
  • +

    #12807 add basic support for completion item details.

    +
  • +
  • +

    #12804 clarify rust-analyzer.files.watcher and add enum variants for it.

    +
  • +
  • +

    #12796 use to_owned instead of to_string in &str to String.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12827 construct fewer AstIdMaps while lowering.

    +
  • +
  • +

    #12840 use ItemTree for variant, field and module attribute collection in attrs_query.

    +
  • +
  • +

    #12849 don’t parse files unnecessarily in scope_for_offset.

    +
  • +
  • +

    #12800 find original AST node before calling compute_ref_match.

    +
  • +
  • +

    #12817 bump expect-test and set CARGO_WORKSPACE_DIR.

    +
  • +
  • +

    #12826 enable (and fix) extra lint groups required for building inside rust-lang/rust.

    +
  • +
  • +

    #12828 rename proc macro server from Rustc to RustAnalyzer.

    +
  • +
  • +

    #12829 remove check_merge_commits test.

    +
  • +
  • +

    #12831 build proc-macro-test-impl out-of-tree.

    +
  • +
  • +

    #12833 add proc-macro-srv integration test that clones literals.

    +
  • +
  • +

    #12834 add PROC_MACRO_TEST_TOOLCHAIN environment variable.

    +
  • +
  • +

    #12835 introduce proc-macro-srv/sysroot-abi feature.

    +
  • +
  • +

    #12854 fix generate_new description.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/08/01/changelog-140.html b/thisweek/2022/08/01/changelog-140.html new file mode 100644 index 00000000..bf6365ae --- /dev/null +++ b/thisweek/2022/08/01/changelog-140.html @@ -0,0 +1,206 @@ + + + + + + + + + + Changelog #140 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #140

+ +
+
+
+

Commit: 2b472f6
+Release: 2022-08-01

+
+
+
+
+

An Update on Proc Macros

+
+
+

Rust toolchains newer than 2022-07-29 contain a proc macro server that should be compatible with macros built by the matching compiler. +Since today’s release, the server is automatically detected by and used rust-analyzer. +This means that, from now on, proc macros will keep working when the proc_macro crate changes.

+
+
+

For more details, you can read @fasterthanlime’s blog post.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12864, #12881 resolve derive helper attributes in IDE layer:

    +
    +
    +180647125 98cae13b a7b4 446b 8a64 fae014f982e2 +
    +
    +
    +
    +180642110 699bdc73 e1f3 4692 94f2 21544f824ab9 +
    +
    +
  • +
  • +

    #12858, #12878 add rust-analyzer-proc-macro-srv binary and use it if found in sysroot.

    +
  • +
  • +

    #12856 spawn a proc-macro-srv instance per Cargo workspace.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12877 (first contribution) insert whitespace when inlining a function defined in a macro.

    +
  • +
  • +

    #12886 cache the resulting file in Semantics::original_ast_node.

    +
  • +
  • +

    #12887 don’t duplicate existing &mut in completions.

    +
  • +
  • +

    #12895 compte completions after type anchors.

    +
  • +
  • +

    #12830 insert references in the correct position in macros.

    +
  • +
  • +

    #12898 don’t add unnecessary brackets in pattern completions.

    +
  • +
  • +

    #12899 offer completions in path qualifier position.

    +
  • +
  • +

    #12901 don’t complete marker traits in expression position.

    +
  • +
  • +

    #12906 complete paths of existing record expressions.

    +
  • +
  • +

    #12913 fix highlight injection with doc comments.

    +
  • +
  • +

    #12891 increase stack size on macro expander thread.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12890 assume condition/iterable is missing if there is only a BlockExpr in for and while loops.

    +
  • +
  • +

    #12902 sort ItemScope::entries results.

    +
  • +
  • +

    #12900 use cargo ws rename to rename crates for publishing.

    +
  • +
  • +

    #12903 only run rainbow highlighting test on 64-bit Unix.

    +
  • +
  • +

    #12904 be more explicit when filtering built-in completions.

    +
  • +
  • +

    #12915 update xtask promote and release instructions.

    +
  • +
  • +

    #12871 sync from rust-lang/rust.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/08/08/changelog-141.html b/thisweek/2022/08/08/changelog-141.html new file mode 100644 index 00000000..f8079a1f --- /dev/null +++ b/thisweek/2022/08/08/changelog-141.html @@ -0,0 +1,177 @@ + + + + + + + + + + Changelog #141 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #141

+ +
+
+
+

Commit: 634cfe3
+Release: 2022-08-08

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12837 support record and tuple variants in Generate Enum Variant:

    +
    +
    + +
    +
    +
  • +
  • +

    #12948 handle operators like their trait methods in the IDE layer:

    +
    +
    +183076683 c9899bd6 60d3 461b 965f 0c0f9745e2e8 +
    +
    +
  • +
  • +

    #12920 publish extension for 32-bit ARM (arm-linux-gnueabihf) systems.

    +
  • +
  • +

    #12808 only flycheck the workspace that contains the saved file.

    +
  • +
  • +

    #12934 add setting to disable comment continuation in VS Code (rust-analyzer.typing.continueCommentsOnNewline).

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12880 (first contribution) implement syntax fixup for while loops.

    +
  • +
  • +

    #12939 (first contribution) fix diagnostics location when hovering unresolved types.

    +
  • +
  • +

    #12918 remove whitespace from doctest names when running them.

    +
  • +
  • +

    #12947 don’t switch workspace on VFS file changes from libraries.

    +
  • +
  • +

    #12949 fix incorrect token pick rankings.

    +
  • +
  • +

    #12919 normalize extension spelling to rust-analyzer.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12931, #12956 add more constructors and entry APIs for la-arena.

    +
  • +
  • +

    #12933 use an empty expander for ignored non-attribute proc-macros.

    +
  • +
  • +

    #12953 avoid RUSTUP_TOOLCHAIN in tests, to work around rustup bug.

    +
  • +
  • +

    #12959 fix test_rainbow_highlighting gate.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/08/15/changelog-142.html b/thisweek/2022/08/15/changelog-142.html new file mode 100644 index 00000000..c8eefae6 --- /dev/null +++ b/thisweek/2022/08/15/changelog-142.html @@ -0,0 +1,187 @@ + + + + + + + + + + Changelog #142 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #142

+ +
+
+
+

Commit: b6d59f2
+Release: 2022-08-15

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12905 generate Rust type from JSON:

    +
    +
    + +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12937 (first contribution) implement syntax fix-up for match and for loops.

    +
  • +
  • +

    #13010 actually call rustc from the RUSTC_WRAPPER when run by build scripts (fixes feature detection for anyhow).

    +
  • +
  • +

    #12942 make concat! work with characters.

    +
  • +
  • +

    #12990 improve whitespace insertion in macro-expansion.

    +
  • +
  • +

    #12992 infer byte string pattern as &[u8] when matched against slices.

    +
  • +
  • +

    #12962 parse range patterns in struct and slice without trailing comma.

    +
  • +
  • +

    #12986 fix pattern field completions not working for unions.

    +
  • +
  • +

    #12987 recover from missing ellipsis in record literals for path expressions.

    +
  • +
  • +

    #12967 Code: make ToggleInlayHints understand {off,on}UntilPressed.

    +
  • +
  • +

    #12997 fix panic in no_such_field when using tuple fields on record structs.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #12981 (first contribution) drop imports from the 2021 Edition prelude.

    +
  • +
  • +

    #13000 (first contribution) Code: use new id when debugging the extension.

    +
  • +
  • +

    #12951 document CLI flag stability.

    +
  • +
  • +

    #12974 fix printing of compound assignment ops.

    +
  • +
  • +

    #12984 pass --keep-going cargo flag when building build scripts.

    +
  • +
  • +

    #12989 remove incomplete 1.64 ABI.

    +
  • +
  • +

    #12993 make Name hold escaped name.

    +
  • +
  • +

    #13007 switch to Node 16 on CI and upgrade lockfile version.

    +
  • +
  • +

    #13016, #13017 move VSCode diagnostics workaround into client code.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/08/22/changelog-143.html b/thisweek/2022/08/22/changelog-143.html new file mode 100644 index 00000000..c94151d7 --- /dev/null +++ b/thisweek/2022/08/22/changelog-143.html @@ -0,0 +1,185 @@ + + + + + + + + + + Changelog #143 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #143

+ +
+
+
+

Commit: a670ff8
+Release: 2022-08-22

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13036 (first contribution) add Inline type alias into uses assist:

    +
    +
    +184905226 9cb8ac81 1439 4387 a13b e18ad4ecf208 +
    +
    +
  • +
  • +

    #12982 (first contribution) implement type inference for IntoFuture.

    +
  • +
  • +

    #13074 consider bounds on inherent impl in method resolution (fixes nalgebra constructors).

    +
  • +
  • +

    #13063 add LSP extension for cancelling running flychecks.

    +
  • +
  • +

    #13045 allow running tests in inline module from anywhere in parent file.

    +
  • +
  • +

    #13037 support disabling keyword hover popups (rust-analyzer.hover.documentation.keywords.enable).

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13049 resolve associated types of bare dyn types.

    +
  • +
  • +

    #13053 resolve path Self alone in value namespace.

    +
  • +
  • +

    #13041 support Self::assoc() syntax in Generate function.`

    +
  • +
  • +

    #13061 replace Self in Inline call.

    +
  • +
  • +

    #13027 fix incorrect type mismatch with cfg_if! and other macros in expression position.

    +
  • +
  • +

    #13028 fix record completion filtering.

    +
  • +
  • +

    #13034 escape keywords used as names in earlier editions.

    +
  • +
  • +

    #13038 revert #12947, trigger workspace switches on all structure changes again.

    +
  • +
  • +

    #13064 log rustfmt parsing errors as warnings.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13071 build release binaries on ubuntu-20.04.

    +
  • +
  • +

    #13065 document interaction of checkOnSave.overrideCommand and multiple linked projects.

    +
  • +
  • +

    #13024 add an HIR pretty-printer.

    +
  • +
  • +

    #13026 make resolve_name_in_module a bit more lazy.

    +
  • +
  • +

    #13044 fix a bunch of typos.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/08/29/changelog-144.html b/thisweek/2022/08/29/changelog-144.html new file mode 100644 index 00000000..9a7a292d --- /dev/null +++ b/thisweek/2022/08/29/changelog-144.html @@ -0,0 +1,176 @@ + + + + + + + + + + Changelog #144 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #144

+ +
+
+
+

Commit: e8e598f
+Release: 2022-08-29

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #12965 (first contribution) mark #[cfg]-ed out associated items as inactive:

    +
    +
    +187130565 0a0f0d88 2036 44b0 93f2 daf14f837f95 +
    +
    +
  • +
  • +

    #12976 emit subcommand to emit SCIP.

    +
  • +
  • +

    #13084, #13099 add more highlighting configurations, disable some by default.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13021 (first contribution) paper over panics on GATs with const generics.

    +
  • +
  • +

    #13092 use correct offsets in macro inputs for reference autocompletions.

    +
  • +
  • +

    #13096 accept leading | in more pattern positions.

    +
  • +
  • +

    #13100 resolve doc links on impl blocks.

    +
  • +
  • +

    #13110 make Extract type as type alias work on arrays using const generics.

    +
  • +
  • +

    #13088 show an error when flycheck can’t be restarted.

    +
  • +
  • +

    #13090 do not substitute Self in the same impl block in Inline call.

    +
  • +
  • +

    #13095 avoid error message when using Live Share.

    +
  • +
  • +

    #13133 move empty diagnostics workaround back into the server.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13078 (first contribution) remove unnecessary writer try_clone in lsp-server.

    +
  • +
  • +

    #13087 remove automatic config patching from the VS Code extension.

    +
  • +
  • +

    #13116 use identity hashing for FileId and CrateId.

    +
  • +
  • +

    #13101 re-export standard semantic token types and modifiers.

    +
  • +
  • +

    #13001 replace crossbeam scoped threads with standard library ones.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/09/05/changelog-145.html b/thisweek/2022/09/05/changelog-145.html new file mode 100644 index 00000000..6c00c445 --- /dev/null +++ b/thisweek/2022/09/05/changelog-145.html @@ -0,0 +1,207 @@ + + + + + + + + + + Changelog #145 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #145

+ +
+
+
+

Commit: 67920f7
+Release: 2022-09-05

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13005 (first contribution) add Convert match to matches! assist:

    +
    +
    + +
    +
    +
  • +
  • +

    #13120 (first contribution) add assist to change between XXX_or and XXX_or_else:

    +
    +
    + +
    +
    +
  • +
  • +

    #13145 add Unmerge match arm assist:

    +
    +
    + +
    +
    +
  • +
  • +

    #13167 add support for unstable #[feature(exhaustive_patterns)] feature.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13134 highlight name references by syntax until proc macros are loaded.

    +
  • +
  • +

    #13149 unescape all occurrences of module name in module resolution.

    +
  • +
  • +

    #13151 prefer expression type in Replace turbofish with type.

    +
  • +
  • +

    #12793 sort and deduplicate auto traits in trait object types.

    +
  • +
  • +

    #13051 don’t move attributes when extracting a struct from an enum variant.

    +
  • +
  • +

    #13161 lower float literals containing underscores.

    +
  • +
  • +

    #13160 parse TypePathFn with preceding ::.

    +
  • +
  • +

    #13187 fix broken return completion.

    +
  • +
  • +

    #13165 properly handle break resolution inside non-breakable expressions.

    +
  • +
  • +

    #13183 fix nested break expressions expecting unknown types.

    +
  • +
  • +

    #13154 drop the expander borrow in all control flow paths.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13174 lift out the module scope into a field in the Resolver.

    +
  • +
  • +

    #13056 use format arg captures in syntax::make.

    +
  • +
  • +

    #13156 remove hir::Expr::MacroStmts.

    +
  • +
  • +

    #13171 ignore failures when publishing to OVSX.

    +
  • +
  • +

    #12963 make generated code nice to read.

    +
  • +
  • +

    #13173 don’t store SyntheticSyntax in the reverse maps in BodySourceMap.

    +
  • +
  • +

    #13175 clarify the state of (extern) preludes for block def maps.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/09/12/changelog-146.html b/thisweek/2022/09/12/changelog-146.html new file mode 100644 index 00000000..e4a9bec0 --- /dev/null +++ b/thisweek/2022/09/12/changelog-146.html @@ -0,0 +1,151 @@ + + + + + + + + + + Changelog #146 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #146

+ +
+
+
+

Commit: 2e9f120
+Release: 2022-09-12

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13200 (first contribution) add sysroot proc macro server support to rust-project.json projects.

    +
  • +
  • +

    #13158 make clicking a closing brace inlay hint go to the opening brace:

    +
    +
    + +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13192 sort all bounds on trait object types.

    +
  • +
  • +

    #13185 insert whitespace when hovering over static and const items.

    +
  • +
  • +

    #13139 suggest struct record literal when completing enum variant.

    +
  • +
  • +

    #13091 remove alias definition after Inline type alias.

    +
  • +
  • +

    #13207 complete semicolons after mod.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13214 (first contribution) switch back to Ubuntu 18.04 when building x86_64-unknown-linux-gnu release binaries.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/09/19/changelog-147.html b/thisweek/2022/09/19/changelog-147.html new file mode 100644 index 00000000..cda11b64 --- /dev/null +++ b/thisweek/2022/09/19/changelog-147.html @@ -0,0 +1,174 @@ + + + + + + + + + + Changelog #147 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #147

+ +
+
+
+

Commit: 187bee0
+Release: 2022-09-19

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13058 (first contribution) allow setting env vars when running cargo (cargo.extraEnv and checkOnSave.extraEnv):

    +
  • +
  • +

    #13221 (first contribution) add option to move lenses above doc comments (rust-analyzer.lens.location):

    +
    +
    +189570298 b4fcbf9c ee49 4b79 aae6 1037ae4f26af +
    +
    +
  • +
  • +

    #13216 add Extract format argument assist:

    +
    +
    + +
    +
    +
  • +
  • +

    #13212, #13227 add rust-analyzer.imports.prefer.no.std config to unconditionally prefer core over std imports.

    +
  • +
  • +

    #13186, #13228 add rust-analyzer.references.excludeImports option to filter out imports on Find all references.

    +
  • +
  • +

    #13215 VS Code: remove the Toggle inlay hints command.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13147, #13257 handle trait methods as inherent methods for trait-related types (fixes resolution of try_into).

    +
  • +
  • +

    #13223, #13225 handle lifetime variables in projection normalization.

    +
  • +
  • +

    #13235 fix prelude injection.

    +
  • +
  • +

    #13242 complete variants and associated items in path pattern through type aliases.

    +
  • +
  • +

    #13239 fix Add reference quick fix over macro calls.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13222 (first contribution) remove redundant resolve_obligations_as_possible call.

    +
  • +
  • +

    #13232 refactor macro-by-example code.

    +
  • +
  • +

    #13243 use memchr::memmem when searching for usages in ide-db.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/09/26/changelog-148.html b/thisweek/2022/09/26/changelog-148.html new file mode 100644 index 00000000..43ecd078 --- /dev/null +++ b/thisweek/2022/09/26/changelog-148.html @@ -0,0 +1,149 @@ + + + + + + + + + + Changelog #148 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #148

+ +
+
+
+

Commit: 73ab709
+Release: 2022-09-26

+
+
+
+
+

New Features

+
+
+ +
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13268 fix operator highlighting tags applying too broadly.

    +
  • +
  • +

    #13289 use the sysroot proc macro server for analysis-stats.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13262 (first contribution) remove reference to Toggle inlay hints.

    +
  • +
  • +

    #13264 ensure TyKind::DynTy has at least one trait bound.

    +
  • +
  • +

    #13286 don’t run proc-macro-srv tests on the rust-analyzer repo.

    +
  • +
  • +

    #13259 simplify feature representation in CargoConfig.

    +
  • +
  • +

    #13260 simplify extraEnv handling.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/10/03/changelog-149.html b/thisweek/2022/10/03/changelog-149.html new file mode 100644 index 00000000..482f9c21 --- /dev/null +++ b/thisweek/2022/10/03/changelog-149.html @@ -0,0 +1,187 @@ + + + + + + + + + + Changelog #149 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #149

+ +
+
+
+

Commit: 5c28ad1
+Release: 2022-10-03

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13248 (first contribution) add assist to unwrap tuple declarations:

    +
    +
    + +
    +
    +
  • +
  • +

    #13209 add type inference for generators.

    +
  • +
  • +

    #13327 add config for supplying sysroot path.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13296 (first contribution) store package instead of crate name in PackageInformation.

    +
  • +
  • +

    #13311 infer for loop item type with IntoIterator and Iterator.

    +
  • +
  • +

    #13275 use the correct module for visibility computation in find_path.

    +
  • +
  • +

    #13189 emit unconfigured code diagnostics for enum variants and struct/union fields.

    +
  • +
  • +

    #13320 render generic parameters in type alias hovers.

    +
  • +
  • +

    #13318 fix annotations not resolving when lens location is set to whole item.

    +
  • +
  • +

    #13321 make move_format_string_arg token tree-aware.

    +
  • +
  • +

    #13324 fix trait impl item completions using macro file text ranges.

    +
  • +
  • +

    #13326 do not use the sysroot proc macro server when a server path is given explicitly.

    +
  • +
  • +

    #13328 add proc-macro dependency to rustc crates.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13272 (first contribution) fix Analysis and AnalysisHost doc links.

    +
  • +
  • +

    #13280 (first contribution) add RequestFailed LSP error code.

    +
  • +
  • +

    #13202, #13319 don’t retry requests that have already been cancelled.

    +
  • +
  • +

    #13237 aggregate changes by file in process_changes.

    +
  • +
  • +

    #13295 remove obsolete in-rust-tree feature from sourcegen.

    +
  • +
  • +

    #13300 use cfg(any()) instead of cfg(FALSE) to disable proc macro tests.

    +
  • +
  • +

    #13301 make assist tests panic again on empty source changes.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/10/10/changelog-150.html b/thisweek/2022/10/10/changelog-150.html new file mode 100644 index 00000000..6fb38db0 --- /dev/null +++ b/thisweek/2022/10/10/changelog-150.html @@ -0,0 +1,129 @@ + + + + + + + + + + Changelog #150 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #150

+ +
+
+
+

Commit: 61504c8
+Release: 2022-10-10

+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13353 (first contribution) fix assertion failure in type inference.

    +
  • +
  • +

    #13362 make go-to-def work for #[doc = include_str!(path)]

    +
  • +
  • +

    #13342 revert "add proc-macro dependency to rustc crates".

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+ +
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/10/17/changelog-151.html b/thisweek/2022/10/17/changelog-151.html new file mode 100644 index 00000000..30e67bc3 --- /dev/null +++ b/thisweek/2022/10/17/changelog-151.html @@ -0,0 +1,201 @@ + + + + + + + + + + Changelog #151 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #151

+ +
+
+
+

Commit: 0531aab
+Release: 2022-10-17

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13358 (first contribution) complete Cargo environment variables in env! and option_env!:

    +
    +
    + +
    +
    +
  • +
  • +

    #13303 add Convert named to tuple struct assist:

    +
    +
    + +
    +
    +
  • +
  • +

    #13354 diagnose some incorrect usages of the question mark operator:

    +
    +
    + +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13420 (first contribution) don’t trigger auto-import assist on parameter names.

    +
  • +
  • +

    #13391 (first contribution) update installation instructions for the stable rustup component.

    +
  • +
  • +

    #13380 honor cfg attributes on params when lowering patterns.

    +
  • +
  • +

    #13384 expand unmatched macro-by-example fragments to reasonable default token trees.

    +
  • +
  • +

    #13382 reorder dyn bounds on render.

    +
  • +
  • +

    #13392 prefer similar tokens when expanding macros speculatively.

    +
  • +
  • +

    #13333 fix placement of and indentation inside generated methods.

    +
  • +
  • +

    #13377 underline only intra-doc links instead of the whole doc comment.

    +
  • +
  • +

    #13402 cast runnableEnv items to string.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13397 (first contribution) fix links in syntax.md.

    +
  • +
  • +

    #13376 add GenericParamList::to_generic_args and {TypeParam,ConstParam}::remove_default APIs.

    +
  • +
  • +

    #13385 don’t report build scripts and proc macros as metadata progress.

    +
  • +
  • +

    #13386 refactor completion expansion.

    +
  • +
  • +

    #13357 allow minicore flags specifications to be order independent.

    +
  • +
  • +

    #13401 run analysis-stats on CI, with opt-level = 1.

    +
  • +
  • +

    #13415 set a timeout when publishing to OVSX.

    +
  • +
  • +

    #13408 bump chalk.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/10/24/changelog-152.html b/thisweek/2022/10/24/changelog-152.html new file mode 100644 index 00000000..219bfce7 --- /dev/null +++ b/thisweek/2022/10/24/changelog-152.html @@ -0,0 +1,170 @@ + + + + + + + + + + Changelog #152 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #152

+ +
+
+
+

Commit: 43fb956
+Release: 2022-10-24

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13427 make flycheck progress reports cancellable:

    +
    +
    +196205329 2df93451 c143 4d1b a700 d988edf55efa +
    +
    +
  • +
  • +

    #13423 substitute some variables in the VS Code client.

    +
  • +
  • +

    #13365 add multiple getters mode to Generate getter.

    +
  • +
  • +

    #13426, #13444 refactor language client handling and add a "stop server" command.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13433 revert "#13354 diagnose some incorrect usages of the question mark operator".

    +
  • +
  • +

    #13463 support const generics in built-in derive macros.

    +
  • +
  • +

    #13428, #13447 fix formatting requests hanging during start-up.

    +
  • +
  • +

    handle projects sharing common dependencies in once strategy.

    +
  • +
  • +

    #13448 work around a Python extension polyfill.

    +
  • +
  • +

    #13451 handle language configuration changes properly.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13460 (first contribution) clean up the SCIP implementation slightly.

    +
  • +
  • +

    #13128, #13466, #13471 allow running build scripts and check only once, in the workspace root.

    +
  • +
  • +

    #13453 handle Code commands when the server is stopped.

    +
  • +
  • +

    #13399 migrate assists to format args captures, part 2.

    +
  • +
  • +

    #13461 remove unnecessary continue.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/10/31/changelog-153.html b/thisweek/2022/10/31/changelog-153.html new file mode 100644 index 00000000..2fcdb4e7 --- /dev/null +++ b/thisweek/2022/10/31/changelog-153.html @@ -0,0 +1,162 @@ + + + + + + + + + + Changelog #153 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #153

+ +
+
+
+

Commit: ba28e19
+Release: 2022-10-31

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13494 implement type inference for generic associated types:

    +
    +
    +A screenshot showing type inference working for a GAT +
    +
    +
  • +
  • +

    #13510 stop or restart the server when clicking the status bar item:

    +
    +
    + +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13478 run flycheck for the correct workspace.

    +
  • +
  • +

    #13475 test all generic args for trait when finding matching impl.

    +
  • +
  • +

    #13476 don’t respond with an error when requesting a shutdown while starting.

    +
  • +
  • +

    #13512 always set up VS Code commands.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13484 switch to upstream positionEncoding.

    +
  • +
  • +

    #13496 clarify feature policy.

    +
  • +
  • +

    #13513 properly handle VS Code workspace changes.

    +
  • +
  • +

    #13505 clean up tests and add documentation for GAT-related stuff.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/11/07/changelog-154.html b/thisweek/2022/11/07/changelog-154.html new file mode 100644 index 00000000..851e5c9f --- /dev/null +++ b/thisweek/2022/11/07/changelog-154.html @@ -0,0 +1,209 @@ + + + + + + + + + + Changelog #154 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #154

+ +
+
+
+

Commit: d03c1c8
+Release: 2022-11-07

+
+
+
+
+

An Update on OpenVSX

+
+
+

Many users of VS Code are actually running an open-source version of the editor. +These include VSCodium and the code package in Arch Linux. +The "free" builds are not allowed to connect to the Microsoft Marketplace and instead they download extensions from OpenVSX.

+
+
+

For a long time, the version of rust-analyzer available on OpenVSX was outdated and did not work very well with recent Rust toolchains. +But because of various technical reasons, we were not able to publish new versions there. +This caused countless of disappointed users, and dozens of duplicate issues filed against our tracker.

+
+
+

Last week, with the help of the OpenVSX maintainers, we managed to sort out the issues. +And for the first time in almost a year, rust-analyzer is available on OpenVSX. +Unfortunately, we had to remove the existing versions, under the identifier of matklad.rust-analyzer. +If you have that version installed, it will not be automatically switched over to the new one (rust-lang.rust-analyzer).

+
+
+

So if you are not running a Microsoft build of VS Code, our advice is to reinstall rust-analyzer from Code’s extension page. +This will ensure that you get updated versions in the future. +If you’ve installed a VSIX from GitHub since March, it should get updated automatically, but it doesn’t hurt to check.

+
+
+

If you are using an official build of Code, or a different editor, you don’t need to take any action.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13525 show signature help when calling generic types implementing FnOnce:

    +
    +
    +A screenshot showing signature help when calling a `FnOnce` parameter +
    +
    +
  • +
  • +

    #13516 add "Convert match to let-else" assist:

    +
    +
    + +
    +
    +
  • +
  • +

    #13527 use let-else statements in "Convert to guarded return".

    +
  • +
  • +

    #13359 add rust-analyzer.assist.emitMustUse config for inserting #[must_use] in generate_enum_as_method.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13454 (first contribution) handle shadowing of locals in "Inline call".

    +
  • +
  • +

    #13508 (first contribution) don’t offer to remove unnecessary async in trait items.

    +
  • +
  • +

    #13523 disregard type variable expectation for if expressions.

    +
  • +
  • +

    #13546 lower unsafety of function pointer and item types.

    +
  • +
  • +

    #13517 make custom expression prefix completions understand references.

    +
  • +
  • +

    #13549 fix reference searching accounting for substrings instead of whole identifiers.

    +
  • +
  • +

    #13456 generate SCIP symbols for local crates.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13445 (first contribution) fix some broken links in guide.md.

    +
  • +
  • +

    #13536, #13556 (first contribution) mention auto-published crates in the manual.

    +
  • +
  • +

    #13379, #13435 migrate assists to format args captures, parts 1 and 3.

    +
  • +
  • +

    #13544 add rustbot features related to PR state labels.

    +
  • +
  • +

    #13541 clarify which VS Code commands are meant for debugging.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/11/14/changelog-155.html b/thisweek/2022/11/14/changelog-155.html new file mode 100644 index 00000000..e41cbfc3 --- /dev/null +++ b/thisweek/2022/11/14/changelog-155.html @@ -0,0 +1,189 @@ + + + + + + + + + + Changelog #155 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #155

+ +
+
+
+

Commit: 45ec315
+Release: 2022-11-14

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13545 generalize reborrow hints as adjustment hints:

    +
    +
    +A screenshot showing a plethora of inlay hints for reborrows and other adjustments +
    +
    +
  • +
  • +

    #13582 nest Cargo.lock under Cargo.toml in VS Code.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12991 (first contribution) place method extracted method from trait impl in existing impl:

    +
    +
    + +
    +
    +
  • +
  • +

    #13568 (first contribution) fix the length displayed for byte string literals with escaped newlines.

    +
  • +
  • +

    #13552 use a process group allow cancelling flycheck.

    +
  • +
  • +

    #13602 check visibility of each path segment.

    +
  • +
  • +

    #13548 fix tt::Punct spacing computation.

    +
  • +
  • +

    #13573 error out instead of panicking on invalid file range.

    +
  • +
  • +

    #13581 fix item completions following unit structs and outline modules.

    +
  • +
  • +

    #13584 fix panic when computing signature of generic FnOnce callable.

    +
  • +
  • +

    #13604 prefer similarly-kinded tokens when hovering attributed items.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13547 optimize apply_document_changes a bit.

    +
  • +
  • +

    #13606 add trait alias grammar to rust.ungram.

    +
  • +
  • +

    #13590 add proc-macro dependency to rustc_private crates.

    +
  • +
  • +

    #13607 add version info to unsupported proc macro ABI error.

    +
  • +
  • +

    #13565 update sysroot crates.

    +
  • +
  • +

    #13603, #13605 send status notification if no workspaces were found.

    +
  • +
  • +

    #13572 use Cancellable in favor of Result for clarity.

    +
  • +
  • +

    #13569 bump manifest rust-version fields to latest stable.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/11/21/changelog-156.html b/thisweek/2022/11/21/changelog-156.html new file mode 100644 index 00000000..fee4a983 --- /dev/null +++ b/thisweek/2022/11/21/changelog-156.html @@ -0,0 +1,172 @@ + + + + + + + + + + Changelog #156 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #156

+ +
+
+
+

Commit: 2656297
+Release: 2022-11-21

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13290 (first contribution) support multiple targets for checkOnSave (with cargo 1.64+):

    +
    +
    +Screenshot showing an editor highlighting two warnings in code gated for different targets on one side and the `cargo check` output on the other side, with the same warnings. It also shows how to configure multiple targets as a `build.target` array in `.cargo/config.toml`. +
    +
    +
  • +
  • +

    #13633 allow viewing the full compiler diagnostic in a readonly textview:

    +
    +
    +Screen cast showing  a compilation error in VS Code. The diagnostics pop-up has a `Click here for full compiler diagnostic` link which, when clicked, displays the `rustc` output in another tab, including the ASCII art showing the various spans of the error. +
    +
    +
  • +
  • +

    #13629 make "Remove dbg!()" work on selections.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13642 don’t emit associated consts with a value in "Implement missing members".

    +
  • +
  • +

    #13622 include generic parameters in GAT completions.

    +
  • +
  • +

    #13623 strip comments and attributes off all trait item completions.

    +
  • +
  • +

    #13624 resolve inference variable before applying adjustments.

    +
  • +
  • +

    #13639 fix proc-macro-srv search paths for Arch Linux.

    +
  • +
  • +

    #13641 fix some format expression parsing edge-cases.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13615 (first contribution) bump some crates to bring support for the new Tier 3 Windows targets.

    +
  • +
  • +

    #13653 (first contribution) fix typo in anchor.

    +
  • +
  • +

    #13649 (first contribution) improve grammar of architecture.md.

    +
  • +
  • +

    #13625 update proc-macro-srv tests.

    +
  • +
  • +

    #13632 make it more obvious which SCIP features are not yet emitted.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/11/28/changelog-157.html b/thisweek/2022/11/28/changelog-157.html new file mode 100644 index 00000000..7de0ade1 --- /dev/null +++ b/thisweek/2022/11/28/changelog-157.html @@ -0,0 +1,167 @@ + + + + + + + + + + Changelog #157 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #157

+ +
+
+
+

Commit: 6d61be8
+Release: 2022-11-28

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13592 (first contribution) add "Generate trait impl" assist.

    +
  • +
  • +

    #13638 add hover hint to .. in record patterns:

    +
    +
    +Screenshot showing a hover tooltip with the missing fields over a `..` in a record pattern +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13576 (first contribution) suppress "Implement default members" inside contained items.

    +
  • +
  • +

    #13661 (first contribution) handle empty checkOnSave.targets values.

    +
  • +
  • +

    #13647 (first contribution) fix tuple to named struct conversion inside macro calls.

    +
  • +
  • +

    #13652 unquote strings in compile_error! expansions.

    +
  • +
  • +

    #13667 handle sysroot config in detached-files workspaces.

    +
  • +
  • +

    #13670 add deriveHelper to the semanticTokenTypes section of package.json.

    +
  • +
  • +

    #13611 don’t trigger completions after single colon.

    +
  • +
  • +

    #13671 improve Go to declaration.

    +
  • +
  • +

    #13681 check tail expressions more precisely in "Extract function".

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13678 reduce the size of HirFileId from 8 to 4 bytes.

    +
  • +
  • +

    #13676 mega-sync from rust-lang/rust.

    +
  • +
  • +

    #13669 properly implement Drop for JodGroupChild.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/12/05/changelog-158.html b/thisweek/2022/12/05/changelog-158.html new file mode 100644 index 00000000..9db6c3f8 --- /dev/null +++ b/thisweek/2022/12/05/changelog-158.html @@ -0,0 +1,154 @@ + + + + + + + + + + Changelog #158 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #158

+ +
+
+
+

Commit: a2beeb8
+Release: 2022-12-05

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13690 implement vararg parameter type inference.

    +
  • +
  • +

    #13707 add move_const_to_impl assist:

    +
    +
    + +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13686 (first contribution) don’t show runnable code lenses in libraries outside of the workspace.

    +
  • +
  • +

    #13713 (first contribution) don’t show implementing methods in call hierarchy.

    +
  • +
  • +

    #13696 make signature help show up when the caret is between )) or >>.

    +
  • +
  • +

    #13717 handle raw identifiers in proc macro server.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13697 version the inlay hint resolve data.

    +
  • +
  • +

    #13721 add support for rustc_has_incoherent_inherent_impls.

    +
  • +
  • +

    #13695 bump chalk.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/12/12/changelog-159.html b/thisweek/2022/12/12/changelog-159.html new file mode 100644 index 00000000..d5e3046e --- /dev/null +++ b/thisweek/2022/12/12/changelog-159.html @@ -0,0 +1,165 @@ + + + + + + + + + + Changelog #159 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #159

+ +
+
+
+

Commit: 21e61be
+Release: 2022-12-12

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13733 add "Remove redundant parentheses" assist:

    +
    +
    +Screen recording showing how the assist can remove the brackets in `_ = (4 * 2) + 1;` +
    +
    +
  • +
  • +

    #13490, #13745 compute data layout of types:

    +
    +
    +Screenshot showing the size and alignment of a struct containing a `Box`, an `u64`, and two `usize`s +
    +
    +
    +
    +Screenshot showing the size and alignment of a field in a struct enum variant +
    +
    +
  • +
  • +

    #13725 resolve associated constants of traits.

    +
  • +
  • +

    #13728 upgrade chalk to make solver fuel work again (works around most trait solving hangs).

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13749 don’t show duplicated adjustment hints for blocks, ifs and matches.

    +
  • +
  • +

    #13742 only shift BoundVars that come from outside lowering context (fixes a crash with GATs).

    +
  • +
  • +

    #13750 normalize projection after discarding free BoundVars in RPIT (fixes a crash during normalization).

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13722 add VS Code schema for rust-project.json.

    +
  • +
  • +

    #13730 support built-in derive macro helper attributes.

    +
  • +
  • +

    #13756 make assoc_resolutions always have a Substitution.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/12/19/changelog-160.html b/thisweek/2022/12/19/changelog-160.html new file mode 100644 index 00000000..bdac7c9b --- /dev/null +++ b/thisweek/2022/12/19/changelog-160.html @@ -0,0 +1,147 @@ + + + + + + + + + + Changelog #160 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #160

+ +
+
+
+

Commit: 9ed1829
+Release: 2022-12-19

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13785 add a command for manually running flycheck (Run flycheck).

    +
  • +
  • +

    #13792 add a command to clear flycheck diagnostics (Clear flycheck diagnostics).

    +
  • +
  • +

    #13769 parse half-open ..=X patterns.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13732 (first contribution) add fallback case to generated PartialEq impl.

    +
  • +
  • +

    #13726 allow "Unwrap block" in let initializers.

    +
  • +
  • +

    #13762 fix parsing of _ = x in closure body.

    +
  • +
  • +

    #13715 fix snippet completions on numeric literals.

    +
  • +
  • +

    #13746 keep comments in "Extract function".

    +
  • +
  • +

    #13774 resolve all inference variables in InferenceResult::assoc_resolutions.

    +
  • +
  • +

    #13777 parse if correctly after a half-open range in match.

    +
  • +
  • +

    #13783, #13784 add parentheses to binding mode hints when they attach to an Or-pattern.

    +
  • +
  • +

    #13766 fix config patching logic for addCallParenthesis.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2022/12/26/changelog-161.html b/thisweek/2022/12/26/changelog-161.html new file mode 100644 index 00000000..8cd48686 --- /dev/null +++ b/thisweek/2022/12/26/changelog-161.html @@ -0,0 +1,181 @@ + + + + + + + + + + Changelog #161 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #161

+ +
+
+
+

Commit: 74ae2dd
+Release: 2022-12-26

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13699 implement location links for type inlay hints (disabled until Code 1.76 release because of a bug):

    +
    +
    +Screen recording showing clicking on inlay hint parts +
    +
    +
  • +
  • +

    #13817 add option to hide adjustment hints outside of unsafe blocks and functions:

    +
    +
    +Screenshot showing an <unsize>&raw mut * on the RHS of let ptr: *mut \[u8\] = &mut \[\] +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13805 (first contribution) complete enum variants without parens when snippets are disabled.

    +
  • +
  • +

    #13794 fix "parser seems stuck" panics when parsing colossal files.

    +
  • +
  • +

    #13795 use the correct edition when formatting code in path dependencies.

    +
  • +
  • +

    #13800 don’t match let expressions and inline consts in expr MBE fragments.

    +
  • +
  • +

    #13820 fix binding mode hints always adding parentheses to or-patterns.

    +
  • +
  • +

    #13831 don’t autofill associated type trait bounds when generating an implementation.

    +
  • +
  • +

    #13764 correctly check for redundant parentheses in the remove_parentheses assist.

    +
  • +
  • +

    #13806 skip hints for identity (TT) adjustments.

    +
  • +
  • +

    #13814, #13818 calculate the TargetDataLayout correctly for the selected target.

    +
  • +
  • +

    #13840 handle lifetime variables in CallableSig query.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13828, #13829, #13835 (first contributions) fix redundant_clone, explicit_auto_deref, uninlined_format_args clippy warnings.

    +
  • +
  • +

    #13830 use a default derives and strip_prefix.

    +
  • +
  • +

    #13771 add xtask command for publishing release notes on GitHub Releases.

    +
  • +
  • +

    #13804 split inlay hints into modules by type.

    +
  • +
  • +

    #13822 thread FamousDefs through the inlay hints.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/01/02/changelog-162.html b/thisweek/2023/01/02/changelog-162.html new file mode 100644 index 00000000..40b9ade7 --- /dev/null +++ b/thisweek/2023/01/02/changelog-162.html @@ -0,0 +1,162 @@ + + + + + + + + + + Changelog #162 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #162

+ +
+
+
+

Commit: 643bc02
+Release: 2023-01-02

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13870, #13875 diagnose private field and associated item accesses:

    +
    +
    +Screenshot showing an error when accessing a private field of a struct +
    +
    +
  • +
  • +

    #13856 fix inference of try {} blocks:

    +
    +
    +Screen recording showing the inferred type of a `try { 42 }` block +
    +
    +
  • +
  • +

    #13857 implement yeeting:

    +
    +
    +Screenshot showing no type errors on `fn test() → Result<(), u32> { do yeet 1 }` +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13866 (first contribution) use rustc_safe_intrinsic attribute to check for intrinsic safety.

    +
  • +
  • +

    #13867 fall back to inaccessible associated functions and constants if no visible resolutions are found.

    +
  • +
  • +

    #13869 improve exit point highlighting for for and while loops in tail position.

    +
  • +
  • +

    #13871 merge multiple intersecting ranges to fix panic in "Extract module".

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13861 (first contribution) derive Hash for FileId.

    +
  • +
  • +

    #13841 fix a couple more Clippy lints.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/01/09/changelog-163.html b/thisweek/2023/01/09/changelog-163.html new file mode 100644 index 00000000..a32541fb --- /dev/null +++ b/thisweek/2023/01/09/changelog-163.html @@ -0,0 +1,161 @@ + + + + + + + + + + Changelog #163 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #163

+ +
+
+
+

Commit: f77b68a
+Release: 2023-01-09

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13832 add enum variant discriminants hints:

    +
    +
    +Screenshot showing the discriminant values on an enum +
    +
    +
  • +
  • +

    #13876 package Windows release artifacts as ZIP and add symbols file.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13894 apply fallback before final obligation resolution.

    +
  • +
  • +

    #13854 support multi-character punct tokens in MBE.

    +
  • +
  • +

    #13877 prefix prelude items whose name collides in current scope.

    +
  • +
  • +

    #13887 only set machine-applicable rustc diagnostics as preferred.

    +
  • +
  • +

    #13882 remember adjustments introduced by binary operators.

    +
  • +
  • +

    #13853 use diagnostic code as link to full message.

    +
  • +
  • +

    #13886 add a ZWNJ to prevent VS Code from forming ligatures between hints and code.

    +
  • +
  • +

    #13885 skip lifetime elision hints on fn pointers and fn trait types.

    +
  • +
  • +

    #13893 complete record enum variants without parens when snippets are disabled.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13860 fix a bunch of clippy lints.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/01/16/changelog-164.html b/thisweek/2023/01/16/changelog-164.html new file mode 100644 index 00000000..5f280477 --- /dev/null +++ b/thisweek/2023/01/16/changelog-164.html @@ -0,0 +1,230 @@ + + + + + + + + + + Changelog #164 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #164

+ +
+
+
+

Commit: ff4d55e
+Release: 2023-01-16

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13684 (first contribution) add Extract format expression assist:

    +
    +
    + +
    +
    +
  • +
  • +

    #13810 (first contribution) add an assist to expand a macro once, inline

    +
    +
    +Screen recording showing a macro invocation being replaced by its expansion +
    +
    +
  • +
  • +

    #13744 (first contribution) add the ability to limit the thread pool size (rust-analyzer.numThreads).

    +
  • +
  • +

    #13816 add option to make adjustment (reborrow) hints postfix:

    +
    +
    +Screenshot showing some postfix reborrow hints like `db.*.&.<unsize>` +
    +
    +
  • +
  • +

    #13825 add Unqualify method call assist:

    +
    +
    +Screen recording showing the assist converting `Add::add(1, 2)` to `1.add(2)` +
    +
    +
  • +
  • +

    #13848 colorize cargo check diagnostics in the full view in VSCode:

    +
    +
    +Screen recording showing colors and ASCII art when displaying the compiler output +
    +
    +
  • +
  • +

    #13934 make unlinked_file diagnostic quickfixes work for inline modules:

    +
    +
    +Screen recording showing a `mod` declaration added into a parent inline module +
    +
    +
  • +
  • +

    #13458 add assist to replace plain arithmetic operations with wrapping/checked/saturating ones.

    +
  • +
  • +

    #13946 remove hover inlay tooltips, replace them with location links.

    +
  • +
  • +

    #13799 rename checkOnSave settings to check.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13843 (first contribution) add missing await in generated delegate methods.

    +
  • +
  • +

    #13753 (first contribution) increase proc macro expansion token limit (fixes the visitors in swc).

    +
  • +
  • +

    #13940 (first contribution) fix a panic in the match-to-let-else assist.

    +
  • +
  • +

    #13763 add type bounds to generated #[derive] implementations.

    +
  • +
  • +

    #13891 keep whitespace in extracted functions.

    +
  • +
  • +

    #13890 unescape inline module names when resolving modules.

    +
  • +
  • +

    #13897 resolve inherent methods implemented in ancestor blocks.

    +
  • +
  • +

    #13948 make inlay hint location links work for more types.

    +
  • +
  • +

    #13945 handle or-patters in missing match diagnostics.

    +
  • +
  • +

    #13923 revert "add a ZWNJ to prevent VS Code from forming ligatures between hints and code".

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13956 (first contribution) upgrade command-group to fix build on Haiku OS.

    +
  • +
  • +

    #13915 make it clearer when the server expects an initialized notification.

    +
  • +
  • +

    #13917 split out hir-def attribute handling parts into hir-expand.

    +
  • +
  • +

    #13933 refine reference search for const and function associated items.

    +
  • +
  • +

    #13941 explain the idea behind rust-project.json.

    +
  • +
  • +

    #13928, #13929, #13862, #13919, #13936, #13937 fix some Clippy lints.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/01/23/changelog-165.html b/thisweek/2023/01/23/changelog-165.html new file mode 100644 index 00000000..de76f481 --- /dev/null +++ b/thisweek/2023/01/23/changelog-165.html @@ -0,0 +1,186 @@ + + + + + + + + + + Changelog #165 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #165

+ +
+
+
+

Commit: daa0138
+Release: 2023-01-23 (0.3.1377)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #13935 (first contribution) add assist to desugar doc-comments:

    +
    +
    + +
    +
    +
  • +
  • +

    #13947 add basic tooltips to adjustment hints:

    +
    +
    +Screenshot showing a `T → &T (borrow coercion)` tooltip over a `.&` adjustment hint +
    +
    +
  • +
  • +

    #13963 unconditionally enable location links in inlay hints.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #13983 (first contribution) parse const_closures syntax.

    +
  • +
  • +

    #13993 (first contribution) VS Code: substitute variables in config.serverPath.

    +
  • +
  • +

    #13981 don’t run flycheck on startup unless checkOnSave is enabled.

    +
  • +
  • +

    #13966 don’t compute layout if TargetDataLayout is not available.

    +
  • +
  • +

    #13971 improve inference for binary operations more precise.

    +
  • +
  • +

    #13961 don’t generate PartialEq/PartialOrd methods body when types don’t match.

    +
  • +
  • +

    #13984 fix target data layout fetching incorrectly passing rustc to rustc.

    +
  • +
  • +

    #13978 handle slice patterns in Fill match arms.

    +
  • +
  • +

    #13985 don’t respond with ContentModified while loading the workspace.

    +
  • +
  • +

    #13988 fix whitespace handling in hover Markdown removal.

    +
  • +
  • +

    #13980 fix checkOnSave config patching.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #13964 specify authors, edition, license and rust-version via workspace.package.

    +
  • +
  • +

    #13969 use workspace.dependencies to declare local dependencies.

    +
  • +
  • +

    #13989 remove hover fallback in favor of ranged hover.

    +
  • +
  • +

    #14001 replace SmolStr usage with enum for lang items.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/01/30/changelog-166.html b/thisweek/2023/01/30/changelog-166.html new file mode 100644 index 00000000..d549c543 --- /dev/null +++ b/thisweek/2023/01/30/changelog-166.html @@ -0,0 +1,181 @@ + + + + + + + + + + Changelog #166 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #166

+ +
+
+
+

Commit: f1b257f
+Release: 2023-01-30 (0.3.1386)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14012 (first contribution) add installation instructions for Visual Studio.

    +
  • +
  • +

    #14024 (first contribution) update documentation for Emacs.

    +
  • +
  • +

    #14041 show signature help for record literals:

    +
    +
    +Screenshot showing signature help for the fields in a struct literal +
    +
    +
  • +
  • +

    #14007 add "Open server logs" button to the error notification:

    +
    +
    +Screen recording showing a button that opens the logs when `cargo check` fails to run +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14015 (first contribution) don’t include lifetime or label apostrophe when renaming.

    +
  • +
  • +

    #14020 fix associated item search finding unrelated definitions.

    +
  • +
  • +

    #14006 replace soft breaks in Markdown with spaces.

    +
  • +
  • +

    #14019, #14023 substitute VS Code variables more generally

    +
  • +
  • +

    #14004 don’t escape non-snippets in Move const to impl.

    +
  • +
  • +

    #14011 fix Unwrap block for let statements.

    +
  • +
  • +

    #14037 handle boolean scrutinees better in Match to if-let assist.

    +
  • +
  • +

    #14039 make Add missing impl members work for impls inside blocks.

    +
  • +
  • +

    #14038 don’t fail workspace loading if sysroot can’t be found.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14025 improve deduplication in process_changes.

    +
  • +
  • +

    #14009 🧹 lsp_ext.ts.

    +
  • +
  • +

    #14017 remove TypeWalk.

    +
  • +
  • +

    #14026 try to fix auto-publishing of lib crates.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/02/06/changelog-167.html b/thisweek/2023/02/06/changelog-167.html new file mode 100644 index 00000000..69594cdd --- /dev/null +++ b/thisweek/2023/02/06/changelog-167.html @@ -0,0 +1,177 @@ + + + + + + + + + + Changelog #167 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #167

+ +
+
+
+

Commit: 0b32b65
+Release: 2023-02-06 (0.3.1394)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14065 support generic functions in the generate_function assist.

    +
  • +
  • +

    #14057 handle complex patterns in match to let-else assist.

    +
  • +
  • +

    #14063 drop support for the 1.58 proc-macro ABI.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14036 record method resolution for the remaining operator expressions.

    +
  • +
  • +

    #14067 Code: create the trace output channel lazily.

    +
  • +
  • +

    #14068 apply unsize adjustments after pointer casts.

    +
  • +
  • +

    #14071 don’t render field-less discriminant inlay hints for data-carrying enums.

    +
  • +
  • +

    #14082 support non-ASCII characters in case conversion.

    +
  • +
  • +

    #14043 use relative offsets when inserting ident token in macro expansion for completion.

    +
  • +
  • +

    #14058 fix display of negative trait bounds in outline view.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14010 (first contribution) make the fuzzing harness build again.

    +
  • +
  • +

    #14072 (first contribution) mention all three Visual Studio extensions in the manual.

    +
  • +
  • +

    #14049 add installation instructions for Flatpak VS Code.

    +
  • +
  • +

    #14070 implement proc-macro API versioning.

    +
  • +
  • +

    #14061 make tt generic over the span data.

    +
  • +
  • +

    #14056 parse #[allow_internal_unsafe] on macros.

    +
  • +
  • +

    #14062 set the current edition to 2021.

    +
  • +
  • +

    #14034 tweak change collapsing some more.

    +
  • +
  • +

    #14083 add more basic issue templates.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/02/13/changelog-168.html b/thisweek/2023/02/13/changelog-168.html new file mode 100644 index 00000000..0e82a048 --- /dev/null +++ b/thisweek/2023/02/13/changelog-168.html @@ -0,0 +1,191 @@ + + + + + + + + + + Changelog #168 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #168

+ +
+
+
+

Commit: 646f973
+Release: 2023-02-13 (0.3.1402)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14095 (first contribution) add unsafe postfix completions.

    +
  • +
  • +

    #14098 (first contribution) add support for DidChangeWorkspaceFolders notifications.

    +
  • +
  • +

    #13991 add an "Add braces" assist:

    +
    +
    +Screen recording showing an assist that adds braces around the bodies of a closure and a `match` arm +
    +
    +
  • +
  • +

    #14087, #14094 support computing layout of RPIT.

    +
  • +
  • +

    #13986 add a setting to limit the number of completions.

    +
  • +
  • +

    #14127 build i686-pc-windows-msvc binaries.

    +
  • +
  • +

    #14135 add Lapce installation instructions.

    +
  • +
  • +

    #14134 add clippy configuration section to the manual.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14114 (first contribution) insert spaces when inlining macros.

    +
  • +
  • +

    #14084 fix parsing of nested tuple field accesses (in a cursed way).

    +
  • +
  • +

    #14092 don’t panic on broken syntax trees in adjustment inlay hints.

    +
  • +
  • +

    #14099 properly use location links for type hints of impl Future and its associated type.

    +
  • +
  • +

    #14103 don’t insert a semicolon when typing = if parse errors are encountered.

    +
  • +
  • +

    #14110 fix completions after functions with no bodies.

    +
  • +
  • +

    #14111 hide proc macro server version detection errors.

    +
  • +
  • +

    #14125 don’t render bind pattern inlay hints for constants.

    +
  • +
  • +

    #14116 render discriminant inlay hints for mixed variants if at least one discriminant is specified.

    +
  • +
  • +

    #13975 suppress extra indent after the end of field and function chains.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14091 support sysroot library source being defined inside the workspace.

    +
  • +
  • +

    #14100 allow specifying what proc-macro server to run in rust_analyzer::load_cargo.

    +
  • +
  • +

    #14119 remove a few allocations in hir_ty::utils.

    +
  • +
  • +

    #14090 unify language configuration folding markers with server behaviour.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/02/20/changelog-169.html b/thisweek/2023/02/20/changelog-169.html new file mode 100644 index 00000000..afa049d9 --- /dev/null +++ b/thisweek/2023/02/20/changelog-169.html @@ -0,0 +1,180 @@ + + + + + + + + + + Changelog #169 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #169

+ +
+
+
+

Commit: a6603fc
+Release: 2023-02-20 (v0.3.1418)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    GitHub Discussions are now enabled on the rust-analyzer repository.

    +
  • +
  • +

    #14141 support UTF-32 position encoding; together with this change, fixes Emacs lsp-mode emoji crashes.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14162 (first contribution) check snippet capability in "Generate getter".

    +
  • +
  • +

    #14140 fix delimiter stripping in proc-macro-server.

    +
  • +
  • +

    #14123 don’t trigger postfix completion before else.

    +
  • +
  • +

    #14122 don’t expand macros in the same expansion tree after overflow.

    +
  • +
  • +

    #14144 strip prefix when searching for raw identifiers.

    +
  • +
  • +

    #14138 don’t include r# prefix in filesystem changes.

    +
  • +
  • +

    #14157 adjust binding mode inlay hints to render better with @ patterns.

    +
  • +
  • +

    #14160 bring back hovering call parentheses for return type information.

    +
  • +
  • +

    #14149 trigger call info for more signature completions.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14153 (first contribution) add v7 proc macro metadata support.

    +
  • +
  • +

    #14171 (first contribution) fix link in architecture.md.

    +
  • +
  • +

    #14128 improve parser recovery for delimited lists.

    +
  • +
  • +

    #14150 don’t allocate the generic_args Vec in hir_def::Path if every element is None (~9 MB win on analysis-stats self).

    +
  • +
  • +

    #14152 replace some often empty Vecs with boxed slices (~2 MB win on analysis-stats self).

    +
  • +
  • +

    #14151 enable smallvec's union feature (~4 MB win on analysis-stats self).

    +
  • +
  • +

    #14156 don’t reconstruct ref match completion in to_proto manually.

    +
  • +
  • +

    #14165 make CompletionItem more POD-like.

    +
  • +
  • +

    #14147 don’t rely on VSCode internal commands in the server.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/02/27/changelog-170.html b/thisweek/2023/02/27/changelog-170.html new file mode 100644 index 00000000..5a66ddc1 --- /dev/null +++ b/thisweek/2023/02/27/changelog-170.html @@ -0,0 +1,137 @@ + + + + + + + + + + Changelog #170 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #170

+ +
+
+
+

Commit: 4e29820
+Release: 2023-02-27 (v0.3.1410)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14175 (first contribution) add "Open Docs" command to the context menu:

    +
    +
    +Screen recording showing the Open Docs in the context menu and how it opens docs.rs +
    +
    +
  • +
  • +

    #14207 (first contribution) respect CARGO_HOME in toolchain detection.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14203 (first contribution) add check for extra path segments after a fully qualified one.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14183 try to improve the rustfmt.overrideCommand docs.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/03/06/changelog-171.html b/thisweek/2023/03/06/changelog-171.html new file mode 100644 index 00000000..1524a64b --- /dev/null +++ b/thisweek/2023/03/06/changelog-171.html @@ -0,0 +1,187 @@ + + + + + + + + + + Changelog #171 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #171

+ +
+
+
+

Commit: 0a956ec
+Release: 2023-03-06 (v0.3.1426)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14240 diagnose break with value in incorrect positions:

    +
    +
    +Screenshot showing an error on `while true { break 0; }` and `for _ in [()] { break 0; }` +
    +
    +
  • +
  • +

    #14243 diagnose unresolved field, method call and call expression:

    +
    +
    +"Screenshot showing errors on various unresolved fields and methods +
    +
    +
  • +
  • +

    #14238 allow "Generate function" to create functions in a different local crate.

    +
  • +
  • +

    #14222, #14245 implement pattern mismatch diagnostics, but keep them disabled.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14185 (first contribution) fix running doctests for structs with lifetime parameters.

    +
  • +
  • +

    #14208 (first contribution) fix path resolution in the presence of functions and structs with the same name.

    +
  • +
  • +

    #14223 implement rendering of tuples in constant values.

    +
  • +
  • +

    #14225 removing nested dbg!()s in "Remove dbg!()".

    +
  • +
  • +

    #14176 fix associated item visibility in block-local impls.

    +
  • +
  • +

    #14239 load the sysroot in all CLI commands.

    +
  • +
  • +

    #14247 generate correct completion edits for missing macro arguments.

    +
  • +
  • +

    #14255 bring back the hex display in const hover.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14040 introduce a MIR and use it for constant evaluation.

    +
  • +
  • +

    #14218, #14234 de-duplicate source roots that have overlapping include paths.

    +
  • +
  • +

    #14184 handle trait alias definitions.

    +
  • +
  • +

    #14244 report type metrics for patterns.

    +
  • +
  • +

    #14251 set unit type expectation for expression statements without a semicolon.

    +
  • +
  • +

    #14252 handle fields called as method calls as the fields they resolve to.

    +
  • +
  • +

    #14213 add API to get raw_ptr type.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/03/13/changelog-172.html b/thisweek/2023/03/13/changelog-172.html new file mode 100644 index 00000000..7ec97b58 --- /dev/null +++ b/thisweek/2023/03/13/changelog-172.html @@ -0,0 +1,196 @@ + + + + + + + + + + Changelog #172 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #172

+ +
+
+
+

Commit: f1e51af
+Release: 2023-03-13 (v0.3.1435)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14232, #14316 MIR episode 2, add need-mut and experimental unused-mut diagnostics:

    +
    +
    +Screenshot showing an error when reassigning a non-mut variable +
    +
    +
  • +
  • +

    #14313 add fancy buttons to the VS Code status message:

    +
    +
    +Screenshot showing the status and Stop, Reload, Restart and Open logs options in a status bar menu +
    +
    +
  • +
  • +

    #14266 make replace_or_with_or_else assists more generally applicable.

    +
  • +
  • +

    #14328 allow passing extra cargo args when running build scripts.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14323 (first contribution) fix source root de-duplication.

    +
  • +
  • +

    #14267 mark unresolved field, unresolved method and expected function diagnostics as experimental.

    +
  • +
  • +

    #14297 add libcore dependency to proc macros.

    +
  • +
  • +

    #14282 load proc macros for rustc_private crates.

    +
  • +
  • +

    #14260 tighten replace_match_with_if_let applicability range.

    +
  • +
  • +

    #14271 don’t trigger unresolved method/field diagnostics on types containing errors.

    +
  • +
  • +

    #14284 highlight unresolved derives as such.

    +
  • +
  • +

    #14248 show diagnostic for } followed by else in let-else statement.

    +
  • +
  • +

    #14283 don’t send error notifications for workspace failures if server status is supported.

    +
  • +
  • +

    #14286 fix block defmap not looking into tail expressions for macro calls.

    +
  • +
  • +

    #14291 fix handling of multiple definition bindings in convert_match_to_let_else.

    +
  • +
  • +

    #14299 fix searching inside bodies of attributed items.

    +
  • +
  • +

    #14300 watch both stdout and stderr in flycheck.

    +
  • +
  • +

    #14306 fix block with no termination in or-patterns.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14261 reuse the resolver in InferenceContext instead of rebuilding it when needed.

    +
  • +
  • +

    #14302 add missing queries to per_query_memory_usage.

    +
  • +
  • +

    #14311 don’t attempt to compute diagnostics in library crates.

    +
  • +
  • +

    #14326 rename match_expr field of hir::diagnostics::MissingMatchArms.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/03/20/changelog-173.html b/thisweek/2023/03/20/changelog-173.html new file mode 100644 index 00000000..f2fbcb04 --- /dev/null +++ b/thisweek/2023/03/20/changelog-173.html @@ -0,0 +1,208 @@ + + + + + + + + + + Changelog #173 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #173

+ +
+
+
+

Commit: 825833c
+Release: 2023-03-20 (v0.3.1443)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14281 add quick fix for inserting an unsafe block:

    +
    +
    + +
    +
    +
  • +
  • +

    #13789 prioritize missing variants in match pattern completions:

    +
    +
    +Screenshot showing existing enum variants being de-prioritized in a match +
    +
    +
  • +
  • +

    #14354 add signature help for record and tuple struct patterns:

    +
    +
    +Screenshot showing the doc comments and fields of a struct in a pattern +
    +
    +
  • +
  • +

    #13994 lint incoherent inherent impls:

    +
    +
    +Screenshot showing an error on `impl Vec<i32> {}` +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #12958 fix return type of async closures.

    +
  • +
  • +

    #14337 allow the status bar item to be clicked again.

    +
  • +
  • +

    #14347 add StorageDead for let bindings without initializer (fixes false positive needs-mut in loops).

    +
  • +
  • +

    #14348 fix rustc proc-macro handling in the rustc workspace.

    +
  • +
  • +

    #14349 respect parent blocks in visibility resolution.

    +
  • +
  • +

    #14338 only skip reborrow adjustment hints for block, if and match expressions.

    +
  • +
  • +

    #14353 don’t replace SyntaxToken with SyntaxNode in "Inline call".

    +
  • +
  • +

    #14355 don’t emit unnecessary reference completions.

    +
  • +
  • +

    #14357 don’t pass feature flags to rustc private crates metadata invocation.

    +
  • +
  • +

    #14359 don’t retry inlay hint requests.

    +
  • +
  • +

    #14361 fix ast::IfExpr child accessors.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14307 add Cargo-style project discovery for Buck and Bazel users.

    +
  • +
  • +

    #14362 prioritize "Remove dbg!" assist over "Inline macro".

    +
  • +
  • +

    #14358 report sysroot and rustc crate loading errors.

    +
  • +
  • +

    #14334, #14336 add is_float, is_char and as_slice to hir::Type.

    +
  • +
  • +

    #14378 bump chalk to fix a GAT bug.

    +
  • +
  • +

    #14342 add path of workspace root folders to status output.

    +
  • +
  • +

    #14340 rename AstDatabase to ExpandDatabase.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/03/27/changelog-174.html b/thisweek/2023/03/27/changelog-174.html new file mode 100644 index 00000000..74cf2982 --- /dev/null +++ b/thisweek/2023/03/27/changelog-174.html @@ -0,0 +1,147 @@ + + + + + + + + + + Changelog #174 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #174

+ +
+
+
+

Commit: b99d5eb
+Release: 2023-03-27 (v0.3.1451)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14405, #14409, #14415 load proc macros asynchronously.

    +
  • +
  • +

    #14368 MIR episode 3, add support for ?, function pointers and trait objects.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14385 (first contribution) fix VS Code status message formatting error.

    +
  • +
  • +

    #14407 fix renames of locals used in macro calls.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14380 coalesce adjacent Indels.

    +
  • +
  • +

    #14402 reject symlinks in rust-project.json.

    +
  • +
  • +

    #14408 only intern blocks that declare items.

    +
  • +
  • +

    #14412 handle proc macro fetching via OpQueue.

    +
  • +
  • +

    #14404 remove client side proc-macro version check.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/04/03/changelog-175.html b/thisweek/2023/04/03/changelog-175.html new file mode 100644 index 00000000..3257a16f --- /dev/null +++ b/thisweek/2023/04/03/changelog-175.html @@ -0,0 +1,189 @@ + + + + + + + + + + Changelog #175 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #175

+ +
+
+
+

Commit: 2365762
+Release: 2023-04-03 (v0.3.1459)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14366 prompting the user to add a Cargo.toml of unlinked file to the linkedProjects.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14422 (first contribution) don’t escape double hashes outside of Rust code blocks.

    +
  • +
  • +

    #14444 (first contribution) pass environment variables to debug runnables.

    +
  • +
  • +

    #14424 check ancestor blocks for local trait impls.

    +
  • +
  • +

    #14434 use struct_tail_without_normalization in Expectation::rvalue_hint.

    +
  • +
  • +

    #14440 handle box and raw pointers correctly in builtin_deref.

    +
  • +
  • +

    #14461 use async block in async function type inference.

    +
  • +
  • +

    #14435 add missing autoborrow adjustment for index expressions.

    +
  • +
  • +

    #14426 fix stack overflow in inhabitedness checking.

    +
  • +
  • +

    #14464 fix false-positive needs-mut on array.

    +
  • +
  • +

    #14449 recover from pub() visibility modifier.

    +
  • +
  • +

    #14468 don’t append ! to derive and attribute macros in "Expand macro recursively".

    +
  • +
  • +

    #14419 use the right CrateIds for proc macros in rust-project.json workspaces.

    +
  • +
  • +

    #14427 allow subsequent rust-project.json-based workspaces to get proc macro expansion.

    +
  • +
  • +

    #14430 canonicalize rust-project.json manifest path.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14465 (first contribution) add limited syntax support for return type notations.

    +
  • +
  • +

    #14425 (first contribution) fix typo in comment.

    +
  • +
  • +

    #14410 add config to specifiy LRU capacities for all queries.

    +
  • +
  • +

    #14445 introduce StructFlags.

    +
  • +
  • +

    #14448 don’t expose InferenceTable outside of hir-ty.

    +
  • +
  • +

    #14439 set durability to high for enable_proc_attr_macros input.

    +
  • +
  • +

    #14454 refine CrateOrigin variants.

    +
  • +
  • +

    #14458 clean up CrateGraph construction.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/04/10/changelog-176.html b/thisweek/2023/04/10/changelog-176.html new file mode 100644 index 00000000..a60d7019 --- /dev/null +++ b/thisweek/2023/04/10/changelog-176.html @@ -0,0 +1,191 @@ + + + + + + + + + + Changelog #176 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #176

+ +
+
+
+

Commit: 01120f1
+Release: 2023-04-10 (v0.3.1472)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14433 (first contribution) add #[doc(alias(..))]-based completions.

    +
  • +
  • +

    #14512 highlight escapes in char literals:

    +
    +
    +Screenshot showing highlighted char escapes +
    +
    +
  • +
  • +

    #14455 add assist to convert nested functions to closures.

    +
  • +
  • +

    #14432 drop support for non-syroot proc macro ABIs (proc macros no longer expand with Rust 1.63).

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14486 desugar async fn completely.

    +
  • +
  • +

    #14481 fix VS Code project linking pop-up buttons being swapped.

    +
  • +
  • +

    #14482 use the correct path accessor in the project linking pop-up.

    +
  • +
  • +

    #14483 do autoderef in "Generate delegate methods".

    +
  • +
  • +

    #14493 insert whitespace between text and attribute macros.

    +
  • +
  • +

    #14505 fix block-local trait impl solving regressions.

    +
  • +
  • +

    #14520 unify types in infer_expr_coerce_never().

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14521, #14526, #14528 add bounds for fields in derive macros.

    +
  • +
  • +

    #14436 normalize associated types in paths in expressions.

    +
  • +
  • +

    #14490 use an arena instead of a hash map in the crate graph.

    +
  • +
  • +

    #14442 implement structured API for snippets.

    +
  • +
  • +

    #14509 resolve labels in body lowering.

    +
  • +
  • +

    #14511 always reborrow mutable reference receiver in methods.

    +
  • +
  • +

    #14517 shuffle around some hir-def modules.

    +
  • +
  • +

    #14519 don’t recreate Hygiene unnecessarily.

    +
  • +
  • +

    #14518 remove unnecessary Names from FunctionData::params.

    +
  • +
  • +

    #14525 remove parameter names from function item tree.

    +
  • +
  • +

    #14524 render function parameters in hir-def pretty printing.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/04/17/changelog-177.html b/thisweek/2023/04/17/changelog-177.html new file mode 100644 index 00000000..d5202b6c --- /dev/null +++ b/thisweek/2023/04/17/changelog-177.html @@ -0,0 +1,215 @@ + + + + + + + + + + Changelog #177 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #177

+ +
+
+
+

Commit: bab80da
+Release: 2023-04-17 (v0.3.1481)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14533 make inlay hints insertable:

    +
    +
    + +
    +
    +
  • +
  • +

    #14561 map tokens from include! expansion to the included file:

    +
    +
    + +
    +
    +
  • +
  • +

    #14470 compute closure captures.

    +
  • +
  • +

    #14549, #14551 don’t suggest unstable items on stable toolchain.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14536 (first contribution) restrict the applicability range of Sort trait items.

    +
  • +
  • +

    #14540 (first contribution) allow extracting function from single brace of block expression.

    +
  • +
  • +

    #14579 (first contribution) accept unknown notification during initialization.

    +
  • +
  • +

    #14538 fix project linking popup appearing for modules that can be linked to a crate.

    +
  • +
  • +

    #14550 fix type inference in nested closures.

    +
  • +
  • +

    #14544 infer types of nested RPITs.

    +
  • +
  • +

    #14576 fix explicit deref problems in closure capture.

    +
  • +
  • +

    #14560 fix view crate graph being broken due to webworker usage.

    +
  • +
  • +

    #14559, #14570 skip code lens resolution for mismatched document versions.

    +
  • +
  • +

    #14580 parse more exclusive range and inline const patterns.

    +
  • +
  • +

    #14547 fix receiver adjustments for Extract variable.

    +
  • +
  • +

    #14535 use the Rust file’s parent directory instead of the workspace folder when running the discoverProjectCommand.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14556 warn when loading sysroot fails to find the core library.

    +
  • +
  • +

    #14446 only run TypeScript CI when the VS Code extension changes.

    +
  • +
  • +

    #14572 encode closing delimiter span in FlatTrees.

    +
  • +
  • +

    #14573 allocate ExprScope entries in a single arena instead of per-ScopeData.

    +
  • +
  • +

    #14575 put Attrs behind a query instead of AttsWithOwner.

    +
  • +
  • +

    #14574 make block_def_map infallible.

    +
  • +
  • +

    #14578 make inherent_impls_in_block and trait_impls_in_block infallible.

    +
  • +
  • +

    #14585 make ExpandDatabase::parse_macro_expansion and ExpandDatabase::parse_or_expand infallible.

    +
  • +
  • +

    #14581 move layout logic from hir-def to hir-ty.

    +
  • +
  • +

    #14583 report macro definition errors on the definition.

    +
  • +
  • +

    #14584, #14587, #14588 report item-level macro expansion syntax errors.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/04/24/changelog-178.html b/thisweek/2023/04/24/changelog-178.html new file mode 100644 index 00000000..c3e6536f --- /dev/null +++ b/thisweek/2023/04/24/changelog-178.html @@ -0,0 +1,180 @@ + + + + + + + + + + Changelog #178 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #178

+ +
+
+
+

Commit: bc78ebd
+Release: 2023-04-24 (v0.3.1489)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14610 resolve $crate in derive paths.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14591 (first contribution) restrict Sort items assist range.

    +
  • +
  • +

    #14618 (first contribution) respect editor.parameterHints.enabled after triggering a completion.

    +
  • +
  • +

    #14598 fix release channel detection for unstable completion filtering.

    +
  • +
  • +

    #14619 fix false need-mut positive and too large span in closures.

    +
  • +
  • +

    #14625 fix token conversion for doc-comments.

    +
  • +
  • +

    #14634 report remaining macro errors in associated item collection.

    +
  • +
  • +

    #14643 fix const eval panic with parameter destructing.

    +
  • +
  • +

    #14603 try to de-duplicate workspaces by top level cargo workspace.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14577 (first contribution) fix all spelling mistakes.

    +
  • +
  • +

    #14621 (first contribution) support type parameters in make::impl_trait.

    +
  • +
  • +

    #14622 add syntax::make::ty_alias.

    +
  • +
  • +

    #14632 increase LRU cache size for parse_expansion and macro_expand queries.

    +
  • +
  • +

    #14633 don’t reparse files when trying to expand assoc item macro calls.

    +
  • +
  • +

    #14630 replace Arc<String> with Arc<str>.

    +
  • +
  • +

    #14594 move Expander and LowerCtx into separate modules.

    +
  • +
  • +

    #14604 add minicore smoke test.

    +
  • +
  • +

    #14599 add RA_UNSTABLE_SYSROOT_HACK.

    +
  • +
  • +

    #14628 restructure symbol queries.

    +
  • +
  • +

    #14629 add additional query information to status ouput.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/05/01/changelog-179.html b/thisweek/2023/05/01/changelog-179.html new file mode 100644 index 00000000..379a9600 --- /dev/null +++ b/thisweek/2023/05/01/changelog-179.html @@ -0,0 +1,176 @@ + + + + + + + + + + Changelog #179 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #179

+ +
+
+
+

Commit: 3a27518
+Release: 2023-05-01 (v0.3.1498)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14690 add hover for closures:

    +
    +
    +Screenshot showing a a closure hover with details about captured fields +
    +
    +
  • +
  • +

    #14513 add #[doc(alias(..))]-based field and function completions.

    +
  • +
  • +

    #14659 de-duplicate crates when extending crate graphs.

    +
  • +
  • +

    #14644, #14686 don’t underline whole for loops and iterator chains on errors.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14647 (first contribution) remove extra rustc argument in target layout loading.

    +
  • +
  • +

    #14641 register obligations during path inference.

    +
  • +
  • +

    #14652 fix pat fragment handling in the 2021 edition.

    +
  • +
  • +

    #14651 fix VS Code workspace root de-duplication.

    +
  • +
  • +

    #14689 force InitializeParams path drives to uppercase on Windows.

    +
  • +
  • +

    #14667 handle nested types in unwrap_result_return_type.

    +
  • +
  • +

    #14671 fix proc-macro-srv path config.

    +
  • +
  • +

    #14678 fix "Restart server" button trying to start instead of restart the server.

    +
  • +
  • +

    #14639 fix some typos in StructFlags.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14648 (first contribution) specify --pre-release when publishing on the Code Marketplace.

    +
  • +
  • +

    #14658 remove proc-macro server command from the rust-analyzer binary.

    +
  • +
  • +

    #14654 fix status command panicking when additional LRU caches are set up.

    +
  • +
  • +

    #14636 remove unnecessary is_derive field from MacroCallKind::Attr.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/05/08/changelog-180.html b/thisweek/2023/05/08/changelog-180.html new file mode 100644 index 00000000..f9d670a3 --- /dev/null +++ b/thisweek/2023/05/08/changelog-180.html @@ -0,0 +1,200 @@ + + + + + + + + + + Changelog #180 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #180

+ +
+
+
+

Commit: 833d530
+Release: 2023-05-08 (v0.3.1506)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #11557 (first contribution) add dependency tree explorer:

    +
    +
    +Screenshot showing a new VS Code panel with a tree of the project dependencies +
    +
    +
  • +
  • +

    #14662 (first contribution) support locally-built documentation for experimental/externalDocs with compatible clients.

    +
  • +
  • +

    #14664 MIR episode 4, support arithmetic assignment operators, statics, constants in patterns and associated constants in traits.

    +
  • +
  • +

    #14711 highlight closure captures when cursor is on | or move.

    +
  • +
  • +

    #14732 fix pattern type mismatches for bindings, enable pattern type mismatch diagnostics again.

    +
  • +
  • +

    #14725 emit function bodies when expanding built-in derives.

    +
  • +
  • +

    #14749 define problem matcher for panics, F8 will go to the panic location in Code.

    +
  • +
  • +

    #14758 add rust-analyzer.hover.memoryLayout.enable config for disabling memory layout info on hover.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14745 (first contribution) sort dependencies in VS Code tree view.

    +
  • +
  • +

    #14707 don’t generate already-existing methods on generate_delegate_methods.

    +
  • +
  • +

    #14713 don’t highlight escapes in raw strings.

    +
  • +
  • +

    #14714 exclude Sized from go-to actions in hover.

    +
  • +
  • +

    #14705 fix floating point evaluation and try block tracking in MIR.

    +
  • +
  • +

    #14712 only pass unstable flags to cargo metadata from extra args config.

    +
  • +
  • +

    #14738 use block def maps in body lowering.

    +
  • +
  • +

    #14739 parse bare dyn types with leading lifetime.

    +
  • +
  • +

    #14750 ignore impls with #[rustc_reservation_impl]

    +
  • +
  • +

    #14748 show memory layout type aliases.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14716 reduce memory consumption by not merging trait_impls_in_deps results (saves 59 MB on self).

    +
  • +
  • +

    #14720 use boxed slices instead of Vecs in declarative macros (saves 8 MB on self).

    +
  • +
  • +

    #14718 use triomphe::Arc instead of std::sync::Arc (saves 4 MB on self).

    +
  • +
  • +

    #14715 refactor symbol index.

    +
  • +
  • +

    #14710 refactor notification handlers.

    +
  • +
  • +

    #14733 publish line-index and switch to nohash_hasher.

    +
  • +
  • +

    #14757 fix library publish branch filter.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/05/15/changelog-181.html b/thisweek/2023/05/15/changelog-181.html new file mode 100644 index 00000000..9f57e06e --- /dev/null +++ b/thisweek/2023/05/15/changelog-181.html @@ -0,0 +1,173 @@ + + + + + + + + + + Changelog #181 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #181

+ +
+
+
+

Commit: e5c7228
+Release: 2023-05-15 (v0.3.1514)

+
+
+
+
+

A Note on Today’s Release

+
+
+

Because of an infrastructure issue, today’s release is not available on the VS Code Marketplace and OpenVSX. +The VSIX can still be downloaded manually from GitHub Releases, and Code should be able to update it automatically in the future.

+
+
+

We hope we can get everything sorted out by next Monday.

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14742 add closure capture inlay hints, disabled by default:

    +
    +
    +A screenshow showing capture hints, like move(&mut count) || { count += 1; } +
    +
    +
  • +
  • +

    #14777 add rust-analyzer.semanticHighlighting.nonStandardTokens setting to control the usage of non-standard tokens and modifiers.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14781, #14800 introduce macro sub-namespaces and macro_use prelude.

    +
  • +
  • +

    #14727 evaluate consts lazily in path_to_const.

    +
  • +
  • +

    #14795 add macro modifier for highlighting tokens in macro calls.

    +
  • +
  • +

    #14797 fix perf regression from symbol index refactor.

    +
  • +
  • +

    #14801 fix process_changes duplicating change events.

    +
  • +
  • +

    #14788 fix derived Debug implementation for unsized structs.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14799 (first contribution) remove root component from patched Windows UNC path prefix.

    +
  • +
  • +

    #14735 drop canonicalization of paths and normalize all rust-project.json paths.

    +
  • +
  • +

    #14808 add metrics for unevaluated constants, failed MIR bodies and failed data layouts.

    +
  • +
  • +

    #14747 add more APIs to la_arena::IdxRange.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/05/22/changelog-182.html b/thisweek/2023/05/22/changelog-182.html new file mode 100644 index 00000000..febf5503 --- /dev/null +++ b/thisweek/2023/05/22/changelog-182.html @@ -0,0 +1,229 @@ + + + + + + + + + + Changelog #182 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #182

+ +
+
+
+

Commit: 7ac161c
+Release: 2023-05-22 (v0.3.1524)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14775 add #[doc(alias(..))]-based method completions:

    +
    +
    +Screenshot showing completion for method aliases +
    +
    +
  • +
  • +

    #14811 render hover actions for closure captures and signature:

    +
    +
    +Screenshot showing a closure hover with 'Go to' links for returned and captured types, and also its signature +
    +
    +
  • +
  • +

    #14812 highlight used associated trait items when cursor is on trait import or trait bound:

    +
    +
    +"Screenshot showing usages of a trait items +
    +
    +
  • +
  • +

    #14789 add moved-out-of-ref diagnostic:

    +
    +
    +Screenshot showing a diagnostic when a local is moved out of a reference +
    +
    +
  • +
  • +

    #14845 add layout info for enum variant and locals:

    +
    +
    +Screenshot showing the size of an enum variant on hover +
    +
    +
  • +
  • +

    #14837 support C string literals.

    +
  • +
  • +

    #14787 MIR episode 5, lower slice patterns and anonymous const blocks.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14848 (first contribution) traverse else blocks of let-else in preorder_expr.

    +
  • +
  • +

    #14809 support #[macro_use(name, …​)].

    +
  • +
  • +

    #14824 diagnose non-value return and break type mismatches.

    +
  • +
  • +

    #14825 fix evaluation of negation for floating point types.

    +
  • +
  • +

    #14828 process macro_use prelude in semantic scope resolver.

    +
  • +
  • +

    #14823 only render discriminant hints for data-carrying enums with primitive repr.

    +
  • +
  • +

    #14822 force-disable the augmentsSyntaxTokens capability on VS Code.

    +
  • +
  • +

    #14802 fix layout for hir_ty::Ty and friends.

    +
  • +
  • +

    #14820 expand format_args! with more details.

    +
  • +
  • +

    #14851 handle match scrutinee in closure captures.

    +
  • +
  • +

    #14855 consider block impls in lookup_impl_assoc_item_for_trait_ref.

    +
  • +
  • +

    #14863 consider all tokens in macro calls when analyzing locals.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14746 parse unstable associated return type bounds.

    +
  • +
  • +

    #14794, #14818, #14835 restructure InlayHint, no longer derive properties from its kind.

    +
  • +
  • +

    #14810 inline handlers module.

    +
  • +
  • +

    #14834 do less file parsing for symbol index generation.

    +
  • +
  • +

    #14836 bump rustc_lexer.

    +
  • +
  • +

    #14843 partially support panic message in MirEvalError.

    +
  • +
  • +

    #14847 reduce MIR memory usage.

    +
  • +
  • +

    #14857 shrink ProcMacroExpander from 8 to 4 bytes.

    +
  • +
  • +

    #14819 fix division by zero in analysis-stats.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/05/29/changelog-183.html b/thisweek/2023/05/29/changelog-183.html new file mode 100644 index 00000000..819d4852 --- /dev/null +++ b/thisweek/2023/05/29/changelog-183.html @@ -0,0 +1,217 @@ + + + + + + + + + + Changelog #183 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #183

+ +
+
+
+

Commit: 505fd09
+Release: 2023-05-29 (v0.3.1533)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14866 (first contribution) add Markdown syntax highlighting to doc-comments in VS Code:

    +
    +
    +Screenshot showing Markdown highlighting in a block comment +
    +
    +
  • +
  • +

    #14849 implement symbol search by alias:

    +
    +
    +Screen recording of symbol search including aliases +
    +
    +
  • +
  • +

    #14816 add assist to replace a named generic parameter with impl trait:

    +
    +
    + +
    +
    +
  • +
  • +

    #14916 add diagnostic for incorrect _ expressions:

    +
    +
    +Screenshot of an error on `let _s: String = _; +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14752 (first contribution) fix indentation in generate_derive, add_missing_impl_members and add_missing_default_members.

    +
  • +
  • +

    #14878 implement ${count()} metavariable expressions.

    +
  • +
  • +

    #14872 introduce new type variable when expectation for ref pattern is not a reference.

    +
  • +
  • +

    #14891, #14897 evaluate UnevaluatedConst during unification.

    +
  • +
  • +

    #14913 evaluate UnevaluatedConst before trait solving.

    +
  • +
  • +

    #14890 use ::core instead of $crate in option_env! expansion.

    +
  • +
  • +

    #14893 fix need-mut false positive in closure capture of match scrutinee.

    +
  • +
  • +

    #14874 change how #![cfg(FALSE)] behaves on crate root.

    +
  • +
  • +

    #14895 don’t try to determine type of token inside macro calls.

    +
  • +
  • +

    #14904 render size, align and offset hover values in hex.

    +
  • +
  • +

    #14906 add a toggle to disable the dependency explorer.

    +
  • +
  • +

    #14910 filter out unused cargo features from config.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14894 (first contribution) allow overriding the SCIP output path.

    +
  • +
  • +

    #14914 (first contribution) update outdated rustup installation instructions.

    +
  • +
  • +

    #14859 specify thread types using Quality of Service API.

    +
  • +
  • +

    #14880 remove double lookups from Interned.

    +
  • +
  • +

    #14881 replace Display impl for Name to support interning.

    +
  • +
  • +

    #14889 add context to "overly long loop" message.

    +
  • +
  • +

    #14901 move flycheck and config errors to status notification.

    +
  • +
  • +

    #14909 run CI on nightly rust when proc-macro-* crates change.

    +
  • +
  • +

    #14755 fix a TODO and some Clippy lints.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/06/05/changelog-184.html b/thisweek/2023/06/05/changelog-184.html new file mode 100644 index 00000000..3bca6dfa --- /dev/null +++ b/thisweek/2023/06/05/changelog-184.html @@ -0,0 +1,197 @@ + + + + + + + + + + Changelog #184 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #184

+ +
+
+
+

Commit: 2f1b7ce
+Release: 2023-06-05 (v0.3.1541)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14938 add signature help for tuple patterns and expressions:

    +
    +
    +Screenshot showing a signature help of (i32, &str, char) for (0, +
    +
    +
  • +
  • +

    #14892, #14942 MIR episode 6, separate monomorphization and speed up interpretation.

    +
  • +
  • +

    #14905 render niches on hover.

    +
  • +
  • +

    #14911 allow setting cfgs (rust-analyzer.cargo.cfgs).

    +
  • +
  • +

    #14929 add render configuration for memory layout hovers.

    +
  • +
  • +

    #14888 prioritize threads affected by user typing.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14935 don’t duplicate sysroot crates in rustc workspace.

    +
  • +
  • +

    #14939 don’t discard file id from differing macro upmapping in nav target calculation.

    +
  • +
  • +

    #14947 add enum, reference, array and slice to render_const_scalar.

    +
  • +
  • +

    #14952 make assignment operators right associative.

    +
  • +
  • +

    #14971 consider outer binders when folding captured items' type.

    +
  • +
  • +

    #14912 don’t add --all-targets to runnables for no_std or no_core crates.

    +
  • +
  • +

    #14945 don’t trigger "replace generic with impl trait" assist when it would produce broken code.

    +
  • +
  • +

    #14920 fix edits for convert_named_struct_to_tuple_struct.

    +
  • +
  • +

    #14950 support floating-point intrinsics in const eval.

    +
  • +
  • +

    #14951 fix string pattern matching in mir interpreter.

    +
  • +
  • +

    #14955 remove unnecessary StorageDead.

    +
  • +
  • +

    #14961 fix drop scopes problems in mir.

    +
  • +
  • +

    #14970 detect multiple bindings for one identifier in the same pattern and suppress need-mut.

    +
  • +
  • +

    #14972 fix unused-mut false positive for Box.

    +
  • +
  • +

    #14976 fix missing terminator for slice pattern.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #14941 shrink DefMap, share crate level items with block def maps.

    +
  • +
  • +

    #14842 improve ast::make.

    +
  • +
  • +

    #14969 update built-in attribute list.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/06/12/changelog-185.html b/thisweek/2023/06/12/changelog-185.html new file mode 100644 index 00000000..3e90ae7f --- /dev/null +++ b/thisweek/2023/06/12/changelog-185.html @@ -0,0 +1,186 @@ + + + + + + + + + + Changelog #185 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #185

+ +
+
+
+

Commit: a4407b4
+Release: 2023-06-12 (v0.3.1549)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14925 (first contribution) add "Inline constant as literal" assist.

    +
  • +
  • +

    #15028 give rustfmt jobs a separate thread.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #14960 (first contribution) add span to token groups.

    +
  • +
  • +

    #14974 (first contribution) properly format documentation for SignatureHelpRequests.

    +
  • +
  • +

    #14978 emit '_ for lifetime generics in HirDisplay.

    +
  • +
  • +

    #15000 only generate derived trait bound for associated types in field types.

    +
  • +
  • +

    #15006 fix panic in format_args! expansion.

    +
  • +
  • +

    #15012 infer async return type in generate_function.

    +
  • +
  • +

    #14875 handle lifetimes in assists.

    +
  • +
  • +

    #14989, #15025 derive source scope from syntax node to be transformed.

    +
  • +
  • +

    #15019 fix panic in displaying const trait objects.

    +
  • +
  • +

    #15022 fix panic in displaying unsized structs.

    +
  • +
  • +

    #14998 make eager macros lazier.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15005 (first contribution) fix typo in reload.rs.

    +
  • +
  • +

    #14980, #14988 sync from downstream.

    +
  • +
  • +

    #14984, #14997 bring back the sysroot-abi feature.

    +
  • +
  • +

    #14979 migrate some assists to use the structured snippet API.

    +
  • +
  • +

    #15014 document the sysroot field in JsonProject.

    +
  • +
  • +

    #15020 show query entry counts in memory usage command.

    +
  • +
  • +

    #14827 offset version number when auto-publishing.

    +
  • +
  • +

    #14994 fix CI to actually run when proc-macro things change.

    +
  • +
  • +

    #14995 fix proc-macro slow test.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/06/19/changelog-186.html b/thisweek/2023/06/19/changelog-186.html new file mode 100644 index 00000000..0bedaf43 --- /dev/null +++ b/thisweek/2023/06/19/changelog-186.html @@ -0,0 +1,159 @@ + + + + + + + + + + Changelog #186 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #186

+ +
+
+
+

Commit: cd3bf9f
+Release: 2023-06-19 (v0.3.1557)

+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15026, #15044 deduplicate fields, and tuple indices in deref handling for completion.

    +
  • +
  • +

    #14932 lower const params with a bad id.

    +
  • +
  • +

    #15054 use correct const param and default type names in "Implement missing members".

    +
  • +
  • +

    #15032 exclude Markdown injection grammar from .vscodeignore.

    +
  • +
  • +

    #15040 use a more obscure hasher name in #[derive] expansion.

    +
  • +
  • +

    #15075 add binding definition for for-expr iterator desugared binding.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15076 shrink size of hir::Binding.

    +
  • +
  • +

    #15036 give ConstBlockId and InTypeConstId named Location types.

    +
  • +
  • +

    #15047 record file dependencies in crate graph construction.

    +
  • +
  • +

    #15053 add a CrateRootModuleId that encodes a module id that is always a crate root.

    +
  • +
  • +

    #15058 improve "terminator is none" message.

    +
  • +
  • +

    #14693 support Pointee trait.

    +
  • +
  • +

    #15065 do not allocate unnecessarily when importing macros from parent modules.

    +
  • +
  • +

    #15067 add more context to "overly long loop turn" messages.

    +
  • +
  • +

    #15066 analyze all bodies in analysis-stats, not just functions.

    +
  • +
  • +

    #15069 add body lowering step, track time of each step separtely.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/06/26/changelog-187.html b/thisweek/2023/06/26/changelog-187.html new file mode 100644 index 00000000..2752373f --- /dev/null +++ b/thisweek/2023/06/26/changelog-187.html @@ -0,0 +1,176 @@ + + + + + + + + + + Changelog #187 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #187

+ +
+
+
+

Commit: 4a2ceef
+Release: 2023-06-26 (v0.3.1566)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14948 add "generate delegate impl" assist:

    +
    +
    +Screen recording showing the assist generating code that delegates a trait implementation to a field. +
    +
    +
  • +
  • +

    #15116 remove Markdown injection grammar.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15105 (first contribution) fix display of negative integers.

    +
  • +
  • +

    #15074 fix inlining of async functions.

    +
  • +
  • +

    #15112 support manual implementation of Fn traits in the MIR interpreter.

    +
  • +
  • +

    #15119 support more intrinsics in the MIR interpreter.

    +
  • +
  • +

    #15135 fix some unsizing problems in MIR.

    +
  • +
  • +

    #15085 include project path in workspace loading errors.

    +
  • +
  • +

    #15104 skip mutability diagnostics on synthetic bindings.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15093 use ArgumentV1 instead of Argument.

    +
  • +
  • +

    #15071, #15089 remove spurious regex dependency.

    +
  • +
  • +

    #15087, #15097, #15100 use consistent style for error handling.

    +
  • +
  • +

    #15086 intern use and extern crate items like other items.

    +
  • +
  • +

    #15095 change in-tree libs to workspace dependencies and bump versions.

    +
  • +
  • +

    #15098 use lib crates from crates.io.

    +
  • +
  • +

    #15070 report metric timings for file item trees and crate def map creation.

    +
  • +
  • +

    #15110 add run-tests CLI command.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/07/03/changelog-188.html b/thisweek/2023/07/03/changelog-188.html new file mode 100644 index 00000000..5e8ede01 --- /dev/null +++ b/thisweek/2023/07/03/changelog-188.html @@ -0,0 +1,192 @@ + + + + + + + + + + Changelog #188 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #188

+ +
+
+
+

Commit: ff485b6
+Release: 2023-07-03 (v0.3.1575)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15136 (first contribution) drop matching brace key binding.

    +
  • +
  • +

    #15185 bump chalk.

    +
  • +
  • +

    #15151 update VS Code extension dependencies and require 1.78.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15148 fix self and super path resolution in block modules.

    +
  • +
  • +

    #15157 fix runnable detection for #[tokio::test].

    +
  • +
  • +

    #15173 fix data layout of reference to nested unsized structs.

    +
  • +
  • +

    #15184 disable MIR interpreter for targets with different pointer size from host.

    +
  • +
  • +

    #15168 fix MIR realloc allocating a smaller destination.

    +
  • +
  • +

    #15189 fix overflow checking in shift operator.

    +
  • +
  • +

    #15194 fix layout of SIMD types and respect alignment in MIR interpreter.

    +
  • +
  • +

    #15101, #15177, #15180 check client workspace.workspaceEdit.resourceOperations capability.

    +
  • +
  • +

    #15138 rename runnableEnv to runnables.extraEnv.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15030, #15163 (first contribution) run metrics on parallel.

    +
  • +
  • +

    #15172 support #[derive_const(Trait)].

    +
  • +
  • +

    #15140 add comment explaining why HasSource::source() returns Option.

    +
  • +
  • +

    #15161 add library fixture meta.

    +
  • +
  • +

    #15175 drop cross-env npm dep.

    +
  • +
  • +

    #15174 switch to @vscode/vsce.

    +
  • +
  • +

    #15153 clean up Code extension activationEvents.

    +
  • +
  • +

    #15154 use @tsconfig/strictest for type checking rules.

    +
  • +
  • +

    #15159 enable noImplicitOverride.

    +
  • +
  • +

    #15169 use anonymous lifetime where possible.

    +
  • +
  • +

    #15142 rename crates after removing libs from workspace.

    +
  • +
  • +

    #15195 don’t specify proc-macro-test version.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/07/10/changelog-189.html b/thisweek/2023/07/10/changelog-189.html new file mode 100644 index 00000000..c6be7c1d --- /dev/null +++ b/thisweek/2023/07/10/changelog-189.html @@ -0,0 +1,220 @@ + + + + + + + + + + Changelog #189 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #189

+ +
+
+
+

Commit: ff15634
+Release: 2023-07-10 (v0.3.1583)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15081 (first contribution) add a memory layout viewer:

    +
    +
    +Screenshot showing a memory layout view for a struct with `i32`, `u8`, `Vec<bool>` and `usize` fields. +
    +
    +
  • +
  • +

    #15152 add Generate trait from impl assist:

    +
    +
    +Screen recording showing the assist generating a trait from an `impl` block +
    +
    +
  • +
  • +

    #14990 map our diagnostics to the rustc and clippy ones.

    +
  • +
  • +

    #15186 don’t add panics to error jump list by default.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15118 (first contribution) follow raw pointers in autoderef chain when resolving methods with custom receiver.

    +
  • +
  • +

    #15235 (first contribution) don’t insert semicolon when extracting match arm.

    +
  • +
  • +

    #15226 make Expand glob import work on enum imports.

    +
  • +
  • +

    #15211 support GATs in bounds for associated types.

    +
  • +
  • +

    #15223 don’t show unresolved-field diagnostic for missing names.

    +
  • +
  • +

    #15216 don’t mark braces around self imports as unnecessary.

    +
  • +
  • +

    #15212 recover from missing associated items and generic const defaults.

    +
  • +
  • +

    #15245 fix missing terminator in pattern matching of consts.

    +
  • +
  • +

    #15222 fix size_of_val and support min_align_of_val intrinsic.

    +
  • +
  • +

    #15244 support read_via_copy intrinsic.

    +
  • +
  • +

    #15228 implement recursion in MIR interpreter without recursion.

    +
  • +
  • +

    #15230 use Debug impl for const eval result rendering.

    +
  • +
  • +

    #15227 indent after pressing enter on a blank line.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15202 don’t diagnose built-in derives.

    +
  • +
  • +

    #15204 add analysis-stats flag to trigger some IDE features.

    +
  • +
  • +

    #15149 speed up line index calculation via SSE2.

    +
  • +
  • +

    #15219 unify Generate getter and setter assists.

    +
  • +
  • +

    #15205 split out project loading capabilities from the rust-analyzer crate.

    +
  • +
  • +

    #15203 shuffle some proc_macro_expand query things around.

    +
  • +
  • +

    #15209 use stronger typing for AstId and AstIdMap.

    +
  • +
  • +

    #15181 clean up ImportMap.

    +
  • +
  • +

    #15210 remove CfgExpander.

    +
  • +
  • +

    #15206 format let-else.

    +
  • +
  • +

    #15224 replace x with it.

    +
  • +
  • +

    #15160 enable noUncheckedIndexedAccess and noPropertyAccessFromIndexSignature TypeScript options.

    +
  • +
  • +

    #15234 remind user to check PATH after installation.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/07/17/changelog-190.html b/thisweek/2023/07/17/changelog-190.html new file mode 100644 index 00000000..6312ab62 --- /dev/null +++ b/thisweek/2023/07/17/changelog-190.html @@ -0,0 +1,171 @@ + + + + + + + + + + Changelog #190 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #190

+ +
+
+
+

Commit: d824511
+Release: 2023-07-17 (v0.3.1591)

+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15248 fix eager token mapping panics.

    +
  • +
  • +

    #15297 normalize type alias in projected_ty.

    +
  • +
  • +

    #15258 support getrandom syscall in MIR.

    +
  • +
  • +

    #15268 add write_bytes and ctlz intrinsics.

    +
  • +
  • +

    #15282 add type_name intrinsic and give real discriminant_type to chalk.

    +
  • +
  • +

    #15284 add sched_getaffinity and enable cfg(miri) in analysis.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15257 (first contribution) ignore Content-Length header case in lsp-server.

    +
  • +
  • +

    #15270 (first contribution) make fields of mir::Terminator public.

    +
  • +
  • +

    #15292 (first contribution) fix typo in command line help.

    +
  • +
  • +

    #15295 (first contribution) fix rust-analzyer ssr help message.

    +
  • +
  • +

    #15251 skip building subtrees for built-in derives.

    +
  • +
  • +

    #15231, #15260 migrate more assists to use the structured snippet API.

    +
  • +
  • +

    #15263 enable derive feature for serde in lsp-server.

    +
  • +
  • +

    #15267 mark MIR execution limit test as slow.

    +
  • +
  • +

    #15252 enable useUnknownInCatchVariables TypeScript option.

    +
  • +
  • +

    #15259 use type imports.

    +
  • +
  • +

    #15254 add FIXME for exactOptionalPropertyTypes.

    +
  • +
  • +

    #15264, #15265 bump npm dependencies.

    +
  • +
  • +

    #15266 set .editorconfig default indent size to 4.

    +
  • +
  • +

    #15275 default to stable toolchain in the metrics workflow.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/07/24/changelog-191.html b/thisweek/2023/07/24/changelog-191.html new file mode 100644 index 00000000..58fb7043 --- /dev/null +++ b/thisweek/2023/07/24/changelog-191.html @@ -0,0 +1,162 @@ + + + + + + + + + + Changelog #191 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #191

+ +
+
+
+

Commit: 99718d0
+Release: 2023-07-24 (v0.3.1599)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15303 fix highlighting of byte escape sequences.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15277 (first contribution) limit change_visibility assist to top-level items.

    +
  • +
  • +

    #15312 don’t follow raw pointer derefs when considering method receiver candidates.

    +
  • +
  • +

    #15317 look up supertraits in is_dyn_method.

    +
  • +
  • +

    #15320 report incorrect-ident-case for inner items.

    +
  • +
  • +

    #15325 normalize expected type in call arguments.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15290 (first contribution) use notification command links for debugger installation.

    +
  • +
  • +

    #15313 (first contribution) add configuration example for Kate.

    +
  • +
  • +

    #15301 support reading uncompressed proc macro metadata.

    +
  • +
  • +

    #15287 remove crate visibility modifier.

    +
  • +
  • +

    #15316 pass TraitEnvironment into layout_ty and const_eval.

    +
  • +
  • +

    #15323 optimize DepKindInfo to DepKind conversion.

    +
  • +
  • +

    #15304 use .kind(Interner) instead of .data(Interner).kind.

    +
  • +
  • +

    #15281 break down VS Code extension CI steps to make them clearer.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/07/31/changelog-192.html b/thisweek/2023/07/31/changelog-192.html new file mode 100644 index 00000000..4feafee6 --- /dev/null +++ b/thisweek/2023/07/31/changelog-192.html @@ -0,0 +1,138 @@ + + + + + + + + + + Changelog #192 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #192

+ +
+
+
+

Commit: 429a381
+Release: 2023-07-31 (v0.3.1607)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15308 add platform-specific runnable environment variables.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15356 fix bad unwrap in eager_macro_recur.

    +
  • +
  • +

    #15357 do not create function-like macro calls with non-fn expanders.

    +
  • +
  • +

    #15271 properly infer types with type casts.

    +
  • +
  • +

    #15360 fix up path fragments upon MBE transcription.

    +
  • +
  • +

    #15353 add manual implementation of clone for tuples in MIR interpreter and fence intrinsics.

    +
  • +
  • +

    #15363 support Self without field in MIR lowering.

    +
  • +
  • +

    #15349 show anonymous FnDef types as function pointers.

    +
  • +
  • +

    #15359 include proc macro server spawn errors in the status text.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/08/07/changelog-193.html b/thisweek/2023/08/07/changelog-193.html new file mode 100644 index 00000000..d247006a --- /dev/null +++ b/thisweek/2023/08/07/changelog-193.html @@ -0,0 +1,190 @@ + + + + + + + + + + Changelog #193 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #193

+ +
+
+
+

Commit: baee6b3
+Release: 2023-08-07 (v0.3.1615)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #14723 (first contribution) add "Remove unused imports" assist:

    +
    +
    + +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15361 expand eager macros to delimited comma-separated expression list.

    +
  • +
  • +

    #15366 remove faulty unwrap in eager macro expansion.

    +
  • +
  • +

    #15367 strip unused token ids from eager macro input token maps.

    +
  • +
  • +

    #15380 fix unsized struct problems in MIR eval.

    +
  • +
  • +

    #15348 exclude non-identifier aliases from completions.

    +
  • +
  • +

    #15050 skip #[doc(hidden)] methods in "Implement default members" and "Convert #[derive] to manual impl".

    +
  • +
  • +

    #15376 make "Convert match to matches!" assist trigger on non-literal bool arms.

    +
  • +
  • +

    #15345 don’t provide add_missing_match_arms assist when up-mapping match arm list failed.

    +
  • +
  • +

    #15397 remove unwraps from "Generate delegate trait".

    +
  • +
  • +

    #15406 don’t provide generate_default_from_new when impl self type is missing.

    +
  • +
  • +

    #15391 set the default status bar button action to "Open logs".

    +
  • +
  • +

    #15392 use the warning color when server is stopped.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15373 (first contribution) desugar while to loop and break.

    +
  • +
  • +

    #15390 improve MIR interpreter performance by caching.

    +
  • +
  • +

    #15269 defer structured snippet rendering to allow escaping snippet bits.

    +
  • +
  • +

    #15377 record extern crate declarations in the HIR.

    +
  • +
  • +

    #15401 turn unresolved proc macro expansions into missing expressions.

    +
  • +
  • +

    #15378 rename Import to Use in hir-def, add unused placeholder variants for UseId.

    +
  • +
  • +

    #15393 qualify parameters by the containing function in SCIP.

    +
  • +
  • +

    #15358 add triagebot no-merges config.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/08/14/changelog-194.html b/thisweek/2023/08/14/changelog-194.html new file mode 100644 index 00000000..4fc1c7e7 --- /dev/null +++ b/thisweek/2023/08/14/changelog-194.html @@ -0,0 +1,171 @@ + + + + + + + + + + Changelog #194 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #194

+ +
+
+
+

Commit: 2fbe69d
+Release: 2023-08-14 (v0.3.1623)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15262 (first contribution) add rust-analyzer.check.ignore setting to ignore specific check diagnostics.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15350 handle #[cfg]s on generic parameters.

    +
  • +
  • +

    #15405 support doc links that resolve to fields.

    +
  • +
  • +

    #15416 correctly display fully-qualified associated types correctly.

    +
  • +
  • +

    #15419 add MIR lowering support for tuple destructing assignment.

    +
  • +
  • +

    #15415 fix float parser hack creating empty NameRef tokens.

    +
  • +
  • +

    #15250 don’t use control flow when keeping the tail expression of the original function.

    +
  • +
  • +

    #15445 fix only_types config filtering out traits from world symbols.

    +
  • +
  • +

    #15438 fix parser getting stuck in eager macro inputs.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15217 (first contribution) convert unwrap to expect in lsp-server and add a debug log.

    +
  • +
  • +

    #15422 record import source IDs.

    +
  • +
  • +

    #15435 derive block attributes from block item tree.

    +
  • +
  • +

    #15436 preserve resolve_obligations_as_possible allocation across calls.

    +
  • +
  • +

    #15423, #15433 de-unwrap convert_named_struct_to_tuple_struct and remove_unused_imports.

    +
  • +
  • +

    #15417 use Cast::cast() instead of explicit interning.

    +
  • +
  • +

    #15428 fix pinned version of lsp-types.

    +
  • +
  • +

    #15421 add more error context when failing to invoke the Rust toolchain.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/08/21/changelog-195.html b/thisweek/2023/08/21/changelog-195.html new file mode 100644 index 00000000..9ad5e38c --- /dev/null +++ b/thisweek/2023/08/21/changelog-195.html @@ -0,0 +1,162 @@ + + + + + + + + + + Changelog #195 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #195

+ +
+
+
+

Commit: 83b3ba1
+Release: 2023-08-21 (v0.3.1631)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15477 record import aliases in symbol index.

    +
  • +
  • +

    #15446 add status bar button to toggle check on save.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15463 show generic constant defaults in hover.

    +
  • +
  • +

    #15473 honor #[doc(hidden)] in auto-import and completions.

    +
  • +
  • +

    #15383 suggest type completions for type arguments and constant completions for constant arguments.

    +
  • +
  • +

    #15418 fix signature help of methods generated by macros.

    +
  • +
  • +

    #15410 rewrite De Morgan’s assist to avoid string manipulation.

    +
  • +
  • +

    #15179 substitute default values of const params in "Add missing members".

    +
  • +
  • +

    #15420 increase the buffer size for the discover project command.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15466 add offset param to token descend API.

    +
  • +
  • +

    #15472 record import origins in ItemScope and PerNs.

    +
  • +
  • +

    #15426, #15429, #15434 de-unwrap convert_to_guarded_return, generate_delegate_methods and generate_derive.

    +
  • +
  • +

    #15461 always collect memory usage info in analysis-stats.

    +
  • +
  • +

    #15482 pin serde to the last non-blobby release.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/08/28/changelog-196.html b/thisweek/2023/08/28/changelog-196.html new file mode 100644 index 00000000..0a361074 --- /dev/null +++ b/thisweek/2023/08/28/changelog-196.html @@ -0,0 +1,147 @@ + + + + + + + + + + Changelog #196 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #196

+ +
+
+
+

Commit: 144526c
+Release: 2023-08-28 (v0.3.1641)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15374 (first contribution) implement extern crate completion.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15512 update offset intrinsic to match 1.72.

    +
  • +
  • +

    #15517 fix unknown label diagnostics for while let loop with label in condition.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15385 (first contribution) pass target in proc-macro-test to fix cross-compilation on Darwin hosts.

    +
  • +
  • +

    #15490 fix help text for rust-analyzer.check.invocation{Strategy,Location}.

    +
  • +
  • +

    #15503 report the rust-analyzer version in the SCPI metadata.

    +
  • +
  • +

    #15494 sync from downstream.

    +
  • +
  • +

    #15523 use RUSTC_BOOTSTRAP when running analysis-stats on the standard library.

    +
  • +
  • +

    #15495 unpin serde.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/09/04/changelog-197.html b/thisweek/2023/09/04/changelog-197.html new file mode 100644 index 00000000..5bc68db8 --- /dev/null +++ b/thisweek/2023/09/04/changelog-197.html @@ -0,0 +1,141 @@ + + + + + + + + + + Changelog #197 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #197

+ +
+
+
+

Commit: 2df30e1
+Release: 2023-09-04 (v0.3.1649)

+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15527 respect #[allow(unused_braces)].

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15465 fix cargo handle logging in flycheck.

    +
  • +
  • +

    #15542 less once_cell, more std.

    +
  • +
  • +

    #15543 remove some allocations in borrowck.

    +
  • +
  • +

    #15544 shuffle some locking around.

    +
  • +
  • +

    #15549 add a few more db.unwind_if_cancelled() calls.

    +
  • +
  • +

    #15548 restructure some modules in the rust-analyzer crate.

    +
  • +
  • +

    #15551 move doc-comment handling into ide-db.

    +
  • +
  • +

    #15552 bump rustc-perf checkout for metrics, replace webrender, diesel and ripgrep with newer versions.

    +
  • +
  • +

    #15553 add hyper 0.14.18 to metrics.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/09/11/changelog-198.html b/thisweek/2023/09/11/changelog-198.html new file mode 100644 index 00000000..dbe8adb3 --- /dev/null +++ b/thisweek/2023/09/11/changelog-198.html @@ -0,0 +1,196 @@ + + + + + + + + + + Changelog #198 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #198

+ +
+
+
+

Commit: 326f37e
+Release: 2023-09-11 (v0.3.1657)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15578 diagnose mismatched argument count for tuple struct patterns:

    +
    +
    +A screenshot showing an error on `let S(a, b) = todo!()` +
    +
    +
  • +
  • +

    #15584 diagnose private fields in record constructor:

    +
    +
    +A screenshot showing an error when using a private field in a pattern +
    +
    +
  • +
  • +

    #15557 parse builtin# syntax and add type checking for builtin#offset_of.

    +
  • +
  • +

    #15559 implement builtin#format_args, using rustc’s format_args parser.

    +
  • +
  • +

    #15532 on-type format (, by adding closing ) automatically.

    +
  • +
  • +

    #15573 add "into to qualified from" assist.

    +
  • +
  • +

    #15524 add "Bind unused parameter" assist.

    +
  • +
  • +

    #15528 enable cfg(rust_analyzer) when code is being analyzed.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15574 use crate name for CARGO_CRATE_NAME.

    +
  • +
  • +

    #15577 clear native diagnostics for closed files.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15568 replace format_args parser with upstream fork.

    +
  • +
  • +

    #15565 implement write_via_move intrinsic for MIR eval.

    +
  • +
  • +

    #15571 remove allocation on MIR eval memory write.

    +
  • +
  • +

    #15567 ignore enum variants in analysis stats of MIR bodies.

    +
  • +
  • +

    #15575 intern projections in MIR place.

    +
  • +
  • +

    #15430 de-unwrap wrap_return_type_in_result.

    +
  • +
  • +

    #15529 do not send inlay hint refresh requests on file edits.

    +
  • +
  • +

    #15522 resolve inlay hint data lazily.

    +
  • +
  • +

    #15586, #15592 shrink some stuff.

    +
  • +
  • +

    #15564 use current folder’s rustfmt.toml with custom configurations.

    +
  • +
  • +

    #15560 when using rust-project.json, prefer the sysroot-defined rustc over discovery in $PATH.

    +
  • +
  • +

    #15558 remove rust-analyzer.discoverProjectCommand in favor of a companion VS Code extension.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/09/18/changelog-199.html b/thisweek/2023/09/18/changelog-199.html new file mode 100644 index 00000000..763ba45c --- /dev/null +++ b/thisweek/2023/09/18/changelog-199.html @@ -0,0 +1,135 @@ + + + + + + + + + + Changelog #199 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #199

+ +
+
+
+

Commit: 0566644
+Release: 2023-09-18 (v0.3.1665)

+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15597 (first contribution) update field shorthands in promote_local_to_const.

    +
  • +
  • +

    #15232 disallow renaming of non-local items.

    +
  • +
  • +

    #15601 "temporarily" skip declaration checks in derive expansions.

    +
  • +
  • +

    #15625 don’t skip closure captures after let-else.

    +
  • +
  • +

    #15611 prefer stable paths in import path.

    +
  • +
  • +

    #15606 fix above_whole_item lens location breaking lenses.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15431 de-unwrap extract_function.

    +
  • +
  • +

    #15609 remove most of the duplication from Semantics{,Impl} using deref.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/09/25/changelog-200.html b/thisweek/2023/09/25/changelog-200.html new file mode 100644 index 00000000..dea68023 --- /dev/null +++ b/thisweek/2023/09/25/changelog-200.html @@ -0,0 +1,159 @@ + + + + + + + + + + Changelog #200 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #200

+ +
+
+
+

Commit: 862a300
+Release: 2023-09-25 (v0.3.1673)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15582 (first contribution) add option to show full signatures in completion docs.

    +
  • +
  • +

    #15484 add "bool to enum" assist, to replace variables, fields, constants and statics with a new enum.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15621 (first contribution) give unmerge_use a label explaining what it will affect.

    +
  • +
  • +

    #15651 wrap inlined closures in parentheses.

    +
  • +
  • +

    #15635 compute inlayHint.textEdit eagerly for VS Code.

    +
  • +
  • +

    #15587 fix autoimport on traits already imported as _.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15615 (first contribution) fix some Clippy lints.

    +
  • +
  • +

    #15620 (first contribution) change exclude_labels to exclude_titles in triagebot config.

    +
  • +
  • +

    #15632 use load_workspace_at for rust-analyzer scip.

    +
  • +
  • +

    #15492 extend check.overrideCommand and buildScripts.overrideCommand docs.

    +
  • +
  • +

    #15616 use in-tree rustc dependencies with a cfg flag.

    +
  • +
  • +

    #15637 update chalk.

    +
  • +
  • +

    #15432, #15594 de-unwrap inline_call, add_missing_match_arms, convert_comment_block and desugar_doc_comment.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/10/02/changelog-201.html b/thisweek/2023/10/02/changelog-201.html new file mode 100644 index 00000000..011bda1d --- /dev/null +++ b/thisweek/2023/10/02/changelog-201.html @@ -0,0 +1,155 @@ + + + + + + + + + + Changelog #201 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #201

+ +
+
+
+

Commit: 0840038
+Release: 2023-10-02 (v0.3.1681)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15659, #15693 add unused_variables native diagnostic:

    +
    +
    +A screenshot showing a native rust-analyzer warning on an unused variable +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15662 fix panic in wrapping and unwrapping Result return type assists.

    +
  • +
  • +

    #15667 make bool_to_enum assist create enum at top-level.

    +
  • +
  • +

    #15682 recover better on missing parameter in parameter list.

    +
  • +
  • +

    #15688 make rustc_layout_scalar_valid_range attributes work for non-decimal literals.

    +
  • +
  • +

    #15692 don’t trigger completion when typing underscore in types or patterns.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15680 (first contribution) re-generate lints.rs.

    +
  • +
  • +

    #15633 allow customizing SCIP config.

    +
  • +
  • +

    #15677 allocate AST ids for parameters.

    +
  • +
  • +

    #15686 only run tests on Linux for pull requests.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/10/09/changelog-202.html b/thisweek/2023/10/09/changelog-202.html new file mode 100644 index 00000000..e626b31f --- /dev/null +++ b/thisweek/2023/10/09/changelog-202.html @@ -0,0 +1,157 @@ + + + + + + + + + + Changelog #202 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #202

+ +
+
+
+

Commit: b1f89a8
+Release: 2023-10-09 (v0.3.1689)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15668 (first contribution) add backtick to surrounding and auto-closing pairs.

    +
  • +
  • +

    #15700 add assist for applying De Morgan’s law to Iterator::all and Iterator::any:

    +
    +
    + +
    +
    +
  • +
  • +

    #15707 allow configuring the status bar click action in VS Code.

    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15690 (first contribution) fix line and column regex in the VS Code problem matcher.

    +
  • +
  • +

    #15701 strip base prefix in layout_scalar_valid_range.

    +
  • +
  • +

    #15698 allow more kinds of if-let patterns in guarded return assist.

    +
  • +
  • +

    #15709 recognize #[export_name = "main"] function as binary entrypoint for runnables.

    +
  • +
  • +

    #15641 fix path syntax produced by the into_to_qualified_from assist.

    +
  • +
  • +

    #15600 ensure rustfmt runs when configured with ./.

    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15721 shrink PatPtr by swapping its AstPtr and Either wrap order.

    +
  • +
+
+
+
+
+ +
+ + + + + diff --git a/thisweek/2023/10/16/changelog-203.html b/thisweek/2023/10/16/changelog-203.html new file mode 100644 index 00000000..a8203547 --- /dev/null +++ b/thisweek/2023/10/16/changelog-203.html @@ -0,0 +1,185 @@ + + + + + + + + + + Changelog #203 + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+ + +
+
+

Changelog #203

+ +
+
+
+

Commit: 6572ec8
+Release: 2023-10-16 (v0.3.1697)

+
+
+
+
+

New Features

+
+
+
    +
  • +

    #15728 (first contribution) VS Code: support opening local documentation if available:

    +
    +
    + +
    +
    +
  • +
  • +

    #15743, #15752, #15755 (first contribution) add assist to convert is_some / is_ok and to if let:

    +
    +
    +"Screen recording showing an assist that rewrites `if a.is_some()` to `if let Some(_tmp) = a` +
    +
    +
  • +
  • +

    #15681 (first contribution) add rust-analyzer.rust.analyzerTargetDir option to use rust-analyzer specific target directory.

    +
  • +
  • +

    #15696 add tuple return to tuple struct assist:

    +
    +
    + +
    +
    +
  • +
+
+
+
+
+

Fixes

+
+
+
    +
  • +

    #15744 (first contribution) add diagnostics for char and byte literal errors:

    +
    +
    +Screenshot showing errros on invalid char and byte literal +
    +
    +
  • +
  • +

    #15713 offer prefix match flyimport completions for one and two character paths:

    +
    +
    +Screenshot showing `IpAddr`, `Ipv4Addr` and `Ipv6Addr` completions for `Ip` +
    +
    +
  • +
+
+
+
+
+

Internal Improvements

+
+
+
    +
  • +

    #15745 (first contribution) add Zed to the manual IDE list.

    +
  • +
  • +

    #15725 fix automatic rustc / rustdoc lint generation.

    +
  • +
  • +

    #15618 port anymap to stdx.

    +
  • +
  • +

    #15760 make some mir::ProjectionStore methods public.

    +
  • +
  • +

    #15762 try to use deploy key in the metrics workflow.

    +
  • +
  • +

    #15691 update rustc_abi dependency.

    +
  • +
+
+
+
+
+ +
+ + + + +