aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* feature: massively improve performance for large filesAleksey Kladov2021-06-211-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This story begins in #8384, where we added a smart test for our syntax highting, which run the algorithm on synthetic files of varying length in order to guesstimate if the complexity is O(N^2) or O(N)-ish. The test turned out to be pretty effective, and flagged #9031 as a change that makes syntax highlighting accidentally quadratic. There was much rejoicing, for the time being. Then, lnicola asked an ominous question[1]: "Are we sure that the time is linear right now?" Of course it turned out that our sophisticated non-linearity detector *was* broken, and that our syntax highlighting *was* quadratic. Investigating that, many brave hearts dug deeper and deeper into the guts of rust-analyzer, only to get lost in a maze of traits delegating to traits delegating to macros. Eventually, matklad managed to peel off all layers of abstraction one by one, until almost nothing was left. In fact, the issue was discovered in the very foundation of the rust-analyzer -- in the syntax trees. Worse, it was not a new problem, but rather a well-know, well-understood and event (almost) well-fixed (!) performance bug. The problem lies within `SyntaxNodePtr` type -- a light-weight "address" of a node in a syntax tree [3]. Such pointers are used by rust-analyzer all other the place to record relationships between IR nodes and the original syntax. Internally, the pointer to a syntax node is represented by node's range. To "dereference" the pointer, you traverse the syntax tree from the root, looking for the node with the right range. The inner loop of this search is finding a node's child whose range contains the specified range. This inner loop was implemented by naive linear search over all the children. For wide trees, dereferencing a single `SyntaxNodePtr` was linear. The problem with wide trees though is that they contain a lot of nodes! And dereferencing pointers to all the nodes is quadratic in the size of the file! The solution to this problem is to speed up the children search -- rather than doing a linear lookup, we can use binary search to locate the child with the desired interval. Doing this optimization was one of the motivations (or rather, side effects) of #6857. That's why `rowan` grew the useful `child_or_token_at_range` method which does exactly this binary search. But looks like we've never actually switch to this method? Oups. Lesson learned: do not leave broken windows in the fundamental infra. Otherwise, you'll have to repeatedly re-investigate the issue, by digging from the top of the Everest down to the foundation! [1]: https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Frust-analyzer/topic/.60syntax_highlighting_not_quadratic.60.20failure/near/240811501 [2]: https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Frust-analyzer/topic/Syntax.20highlighting.20is.20quadratic [3]: https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Frust-analyzer/topic/Syntax.20highlighting.20is.20quadratic/near/243412392
* Merge #9165bors[bot]2021-06-2119-80/+66
|\ | | | | | | | | | | | | | | 9165: Apply some clippy suggestions r=matklad a=clemenswasser Co-authored-by: Clemens Wasser <[email protected]>
| * Apply some clippy suggestionsClemens Wasser2021-06-2119-80/+66
| |
* | Merge #9264bors[bot]2021-06-216-115/+132
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | 9264: feat: Make documentation on hover configurable r=Veykril a=Veykril This also implements deprecation support for config options as this renames `hoverActions_linksInHover` to `hover_linksInHover`. Fixes #9232 Co-authored-by: Lukas Wirth <[email protected]>
| * | Remove deprecation support in configLukas Wirth2021-06-213-50/+13
| | |
| * | typoLukas Wirth2021-06-141-1/+1
| | |
| * | Add configuration deprecationLukas Wirth2021-06-143-10/+50
| | |
| * | Don't ignore hover documentation setting for keyword hoversLukas Wirth2021-06-141-2/+4
| | |
| * | Make documentation on hover configurableLukas Wirth2021-06-146-113/+125
| | |
* | | Merge #9314bors[bot]2021-06-211-6/+20
|\ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9314: Fix extract_function with await r=sasurau4 a=sasurau4 Fix #9287 Co-authored-by: Daiki Ihara <[email protected]>
| * | | Fix var nameDaiki Ihara2021-06-211-7/+7
| | | |
| * | | Fix pointed outDaiki Ihara2021-06-211-5/+16
| | | |
| * | | Fix extract_function with awaitDaiki Ihara2021-06-211-2/+5
| | | |
* | | | Merge #9227bors[bot]2021-06-217-49/+130
|\ \ \ \ | |_|_|/ |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9227: Add a config setting to disable the 'test' cfg in specified crates r=matklad a=lf- If you are opening libcore from rust-lang/rust as opposed to e.g. goto definition from some other crate which would use the sysroot instance of libcore, a `#![cfg(not(test))]` would previously have made all the code excluded from the module tree, breaking the editor experience. Core does not need to ever be edited with `#[cfg(test)]` enabled, as the tests are in another crate. This PR puts in a slight hack that checks for the crate name "core" and turns off `#[cfg(test)]` for that crate. Fixes #9203 Fixes #9226 Co-authored-by: Jade <[email protected]>
| * | | Implement a config override for the default #[cfg(test)] in cargo cratesJade2021-06-197-55/+108
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixes crates which vanish when the 'test' cfg atom is set. Fix #7243. Fix #9203. Fix #7225.
| * | | Fix libcore not being included in rust-lang/rust module treeJade2021-06-192-2/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If you are opening libcore from rust-lang/rust as opposed to e.g. goto definition from some other crate which would use the sysroot instance of libcore, a `#![cfg(not(test))]` would previously have made all the code excluded from the module tree, breaking the editor experience. This puts in a slight hack that checks for the crate name "core" and turns off `#[cfg(test)]`.
* | | | Merge #9357bors[bot]2021-06-211-6/+5
|\ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9357: fix: Update sysroot crates r=jonas-schievink a=jonas-schievink Removes `rtstartup`, since that's not a Cargo crate (its files are compiled into object files and linked alongside the stdlib). Adds `std_detect`. Part of https://github.com/rust-analyzer/rust-analyzer/issues/9352 (doesn't fix it since std_detect is full of `cfg_if!`) bors r+ Co-authored-by: Jonas Schievink <[email protected]>
| * | | | Update sysroot cratesJonas Schievink2021-06-211-6/+5
|/ / / /
* | | | Merge #9356bors[bot]2021-06-2110-677/+557
|\ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9356: internal: Move out and regroup more completion tests r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <[email protected]>
| * | | | Various keyword completion fixesLukas Wirth2021-06-214-16/+22
| | | | |
| * | | | Move out completion type position testsLukas Wirth2021-06-215-206/+198
| | | | |
| * | | | Move out completion pattern testsLukas Wirth2021-06-215-467/+349
| | | | |
* | | | | Merge #9355bors[bot]2021-06-211-3/+33
|\ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9355: Don't insert `}` when typing `{` in string r=jonas-schievink a=jonas-schievink Checks that the token at the cursor is `L_CURLY`. Fixes https://github.com/rust-analyzer/rust-analyzer/issues/9351 bors r+ Co-authored-by: Jonas Schievink <[email protected]>
| * | | | | Don't insert `}` when typing `{` in stringJonas Schievink2021-06-211-3/+33
| | |_|/ / | |/| | |
* | | | | Merge #9347bors[bot]2021-06-211-0/+5
|\ \ \ \ \ | |/ / / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9347: add note about passing cfg(debug_assertions) r=matklad a=rezural add note about passing cfg(debug_assertions) to rustc on build. The server will not spin on start without this arcane hack Co-authored-by: rezural <[email protected]>
| * | | | add note about passing cfg(debug_assertions)rezural2021-06-201-0/+5
| | | | | | | | | | | | | | | add note about passing cfg(debug_assertions) to rustc on build. The server will not spin without this arcane hack
* | | | | Merge #9346bors[bot]2021-06-2012-996/+557
|\ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9346: Refactor / clean up hir_ty tests r=flodiebold a=flodiebold Notable changes: - unify `check_types` and `check_mismatches` into `check`, which supports both kinds of annotations (`check_types` still exists because I didn't want to change all the annotations, but uses the same implementation) - because of that, `check_types` now fails on any type mismatches; also annotations always have to hit the exact range - there's also `check_no_mismatches` for when we explicitly just want to check that there are no type mismatches without giving any annotations (`check` will fail without annotations) - test annotations can now be overlapping (they point to the nearest line that has actual code in that range): ``` // ^^^^ annotation // ^^^^^^^^^ another annotation ``` Co-authored-by: Florian Diebold <[email protected]>
| * | | | | Fix `benchmark_include_macro`Florian Diebold2021-06-201-1/+1
| | | | | |
| * | | | | More cleanups, use `check` for `display_source_code` testsFlorian Diebold2021-06-202-85/+67
| | | | | |
| * | | | | Clean up coercion testsFlorian Diebold2021-06-201-552/+117
| | | | | |
| * | | | | test_utils: Make overlapping annotations possibleFlorian Diebold2021-06-201-6/+44
| | | | | |
| * | | | | Unify check_mismatches and check_typesFlorian Diebold2021-06-209-380/+353
| | | | | |
| * | | | | Add coverage mark for block local implsFlorian Diebold2021-06-201-1/+4
|/ / / / /
* | | | | Merge #9345bors[bot]2021-06-202-68/+72
|\ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9345: fix: don't add duplicate `&` during completion r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
| * | | | | fix: don't add duplicate `&` during completionAleksey Kladov2021-06-202-68/+72
|/ / / / /
* | | | | Merge #9344bors[bot]2021-06-201-24/+22
|\ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9344: fix: rename works when invoked on a reference r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
| * | | | | fix: rename works when invoked on a referenceAleksey Kladov2021-06-201-24/+22
| | | | | |
* | | | | | Merge #9328bors[bot]2021-06-202-25/+25
|\ \ \ \ \ \ | |_|/ / / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9328: internal: Update deps r=lnicola a=kjeremy Co-authored-by: kjeremy <[email protected]>
| * | | | | Update testkjeremy2021-06-181-1/+1
| | | | | |
| * | | | | cargo updatekjeremy2021-06-181-24/+24
| | | | | |
* | | | | | Merge #9339bors[bot]2021-06-193-91/+78
|\ \ \ \ \ \ | |_|_|/ / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9339: minor: Cleanup insert_use tests r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <[email protected]>
| * | | | | Cleanup insert_use testsLukas Wirth2021-06-193-91/+78
|/ / / / /
* | | | | Merge #9338bors[bot]2021-06-191-6/+1
|\ \ \ \ \ | |_|_|/ / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9338: minor: use minicore r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
| * | | | minor: use minicoreAleksey Kladov2021-06-191-6/+1
| | | | |
* | | | | Merge #9335bors[bot]2021-06-184-32/+118
|\ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9335: feat: Don't insert imports outside of cfg attributed items r=Veykril a=Veykril Closes #6939 Co-authored-by: Lukas Wirth <[email protected]>
| * | | | | Don't insert imports outside of cfg attributed itemsLukas Wirth2021-06-184-32/+118
|/ / / / /
* | | | | Merge #9334bors[bot]2021-06-1814-17/+99
|\ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9334: feat: Allow to disable import insertion on single path glob imports r=Veykril a=Veykril On by default as I feel like this is something the majority would prefer. Closes #8490 Co-authored-by: Lukas Wirth <[email protected]>
| * | | | | Allow to disable import insertion on single path glob importsLukas Wirth2021-06-1814-17/+99
| | | | | |
* | | | | | Merge #9333bors[bot]2021-06-184-36/+18
|\ \ \ \ \ \ | | |/ / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9333: minor: use minicore r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
| * | | | | minor: use minicoreAleksey Kladov2021-06-184-36/+18
| | | | | |