about summary refs log tree commit diff
path: root/src/tools/rust-analyzer
AgeCommit message (Collapse)AuthorLines
2024-08-24Handle associated types that are lang itemsChayim Refael Friedman-5/+13
Previously we were ignoring them.
2024-08-24Add `gen` modifier to functionsChayim Refael Friedman-4/+38
We don't yet lower or maybe even parse them, but blocks already have `gen`, so why not.
2024-08-24Preserve all spans for closure captures, not just oneChayim Refael Friedman-179/+456
This is important for the "convert closure to fn" assist, as it needs to find and modify the places the captures are used.
2024-08-24Fix few bugs in closure capture computation, and add testsChayim Refael Friedman-3/+291
Also create a test infrastructure for capture computation.
2024-08-23Include buildfile path in watcher listWilfred Hughes-0/+17
2024-08-24fix: Wrong `Self: Sized` predicate for trait assoc itemsShoyu Vanilla-8/+32
2024-08-23Auto merge of #17857 - ChayimFriedman2:rust-project-cfg-group, r=Veykrilbors-4/+619
feat: Allow declaring cfg groups in rust-project.json, to help sharing common cfgs Closes #17815.
2024-08-23Auto merge of #17946 - Veykril:flycheck-crates-for, r=Veykrilbors-22/+26
internal: Don't requery crates_for for flycheck when crates are known
2024-08-23internal: Don't requery crates_for for flycheck when crates are knownLukas Wirth-22/+26
2024-08-23Auto merge of #17936 - Veykril:module_path, r=Veykrilbors-71/+278
feat: Implement `module_path` macro Turns out this is a pain to implement because of our hir-def hir-expand split :)
2024-08-23Auto merge of #17927 - ChayimFriedman2:speedup-new-usages, r=Veykrilbors-80/+707
perf: Speed up search for short associated functions, especially very common identifiers such as `new` `@Veykril` said in https://github.com/rust-lang/rust-analyzer/pull/17908#issuecomment-2292958068 that people complain searches for `new()` are slow (they are right), so here I am to help! The search is used by IDE features such as rename and find all references. The search is slow because we need to verify each candidate, and that requires analyzing it; the key to speeding it up is to avoid the analysis where possible. I did that with a bunch of tricks that exploits knowledge about the language and its possibilities. The first key insight is that associated methods may only be referenced in the form `ContainerName::func_name` (parentheses are not necessary!) (Rust doesn't include a way to `use Container::func_name`, and even if it will in the future most usages are likely to stay in that form. Searching for `::` will help only a bit, but searching for `Container` can help considerably, since it is very rare that there will be two identical instances of both a container and a method of it. However, things are not as simple as they sound. In Rust a container can be aliased in multiple ways, and even aliased from different files/modules. If we will try to resolve the alias, we will lose any gain from the textual search (although very common method names such as `new` will still benefit, most will suffer because there are more instances of a container name than its associated item). This is where the key trick enters the picture. The key insight is that there is still a textual property: a container namer cannot be aliased, unless its name is mentioned in the alias declaration, or a name of alias of it is mentioned in the alias declaration. This becomes a fixpoint algorithm: we expand our list of aliases as we collect more and more (possible) aliases, until we eventually reach a fixpoint. A fixpoint is not guaranteed (and we do have guards for the rare cases where it does not happen), but it is almost so: most types have very few aliases, if at all. We do use some semantic information while analyzing aliases. It's a balance: too much semantic analysis, and the search will become slow. But too few of it, and we will bring many incorrect aliases to our list, and risk it expands and expands and never reach a fixpoint. At the end, based on benchmarks, it seems worth to do a lot to avoid adding an alias (but not too much), while it is worth to do a lot to avoid the need to semantically analyze func_name matches (but again, not too much). After we collected our list of aliases, we filter matches based on this list. Only if a match can be real, we do semantic analysis for it. The results are promising: searching for all references on `new()` in `base-db` in the rust-analyzer repository, which previously took around 60 seconds, now takes as least as two seconds and a half (roughly), while searching for `Vec::new()`, almost an upper bound to how much a symbol can be used, that used to take 7-9 minutes(!) now completes in 100-120 seconds, and with less than half of non-verified results (aka. false positives). This is the less strictly correct (but faster) branch of this patch; it can miss some (rare) cases (there is a test for that - `goto_ref_on_short_associated_function_complicated_type_magic_can_confuse_our_logic()`). There is another branch that have no false negatives but is slower to search (`Vec::new()` never reaches a fixpoint in aliases collection there). I believe it is possible to create a strategy that will have the best of both worlds, but it will involve significant complexity and I didn't bother, especially considering that in the vast majority of the searches the other branch will be more than enough. But all in all, I decided to bring this branch (of course if the maintainers will agree), since our search is already not 100% accurate (it misses macros), and I believe there is value in the additional perf. You can find the strict branch at https://github.com/ChayimFriedman2/rust-analyzer/tree/speedup-new-usages-strict. Should fix #7404, I guess (will check now).
2024-08-23Remove incorrect FIXME commentLukas Wirth-1/+0
2024-08-23Auto merge of #17912 - alibektas:cargo_check_on_binary, r=Veykrilbors-22/+69
fix: run flycheck without rev_deps when target is specified Since querying for a crate's target is a call to salsa and therefore blocking, flycheck task is now deferred out of main thread by using `GlobalState`s `deferred_task_queue`. Fixes #17829 and https://github.com/rust-lang/rustlings/issues/2071
2024-08-22Apply changesAli Bektas-35/+51
2024-08-22Add cov_marks to test #17927Chayim Refael Friedman-0/+19
2024-08-22Speed up search for short associated functions, especially very common ↵Chayim Refael Friedman-80/+657
identifiers such as `new` The search is used by IDE features such as rename and find all references. The search is slow because we need to verify each candidate, and that requires analyzing it; the key to speeding it up is to avoid the analysis where possible. I did that with a bunch of tricks that exploits knowledge about the language and its possibilities. The first key insight is that associated methods may only be referenced in the form `ContainerName::func_name` (parentheses are not necessary!) (Rust doesn't include a way to `use Container::func_name`, and even if it will in the future most usages are likely to stay in that form. Searching for `::` will help only a bit, but searching for `Container` can help considerably, since it is very rare that there will be two identical instances of both a container and a method of it. However, things are not as simple as they sound. In Rust a container can be aliased in multiple ways, and even aliased from different files/modules. If we will try to resolve the alias, we will lose any gain from the textual search (although very common method names such as `new` will still benefit, most will suffer because there are more instances of a container name than its associated item). This is where the key trick enters the picture. The key insight is that there is still a textual property: a container namer cannot be aliased, unless its name is mentioned in the alias declaration, or a name of alias of it is mentioned in the alias declaration. This becomes a fixpoint algorithm: we expand our list of aliases as we collect more and more (possible) aliases, until we eventually reach a fixpoint. A fixpoint is not guaranteed (and we do have guards for the rare cases where it does not happen), but it is almost so: most types have very few aliases, if at all. We do use some semantic information while analyzing aliases. It's a balance: too much semantic analysis, and the search will become slow. But too few of it, and we will bring many incorrect aliases to our list, and risk it expands and expands and never reach a fixpoint. At the end, based on benchmarks, it seems worth to do a lot to avoid adding an alias (but not too much), while it is worth to do a lot to avoid the need to semantically analyze func_name matches (but again, not too much). After we collected our list of aliases, we filter matches based on this list. Only if a match can be real, we do semantic analysis for it. The results are promising: searching for all references on `new()` in `base-db` in the rust-analyzer repository, which previously took around 60 seconds, now takes as least as two seconds and a half (roughly), while searching for `Vec::new()`, almost an upper bound to how much a symbol can be used, that used to take 7-9 minutes(!) now completes in 100-120 seconds, and with less than half of non-verified results (aka. false positives). This is the less strictly correct (but faster) of this patch; it can miss some (rare) cases (there is a test for that - `goto_ref_on_short_associated_function_complicated_type_magic_can_confuse_our_logic()`). There is another branch that have no false negatives but is slower to search (`Vec::new()` never reaches a fixpoint in aliases collection there). I believe it is possible to create a strategy that will have the best of both worlds, but it will involve significant complexity and I didn't bother, especially considering that in the vast majority of the searches the other branch will be more than enough. But all in all, I decided to bring this branch (of course if the maintainers will agree), since our search is already not 100% accurate (it misses macros), and I believe there is value in the additional perf.
2024-08-22When descending into macros in search, first check if there is a need to - ↵Chayim Refael Friedman-0/+31
i.e. if we are inside a macro call This avoids the need to analyze the file when we are not inside a macro call. This is especially important for the optimization in the next commit(s), as there the common case will be to descent into macros but then not analyze.
2024-08-22Auto merge of #17943 - Veykril:diags, r=Veykrilbors-3/+4
fix: Improve proc-macro panic message and workspace loading failure diagnostic
2024-08-22Improve proc-macro panic message and workspace loading failure diagnosticLukas Wirth-3/+4
2024-08-22Auto merge of #17898 - Veykril:descend-2.0, r=Veykrilbors-419/+487
internal: Improve macro token mapping heuristics Fixes https://github.com/rust-lang/rust-analyzer/issues/16235
2024-08-22Fix sorting order for tokens in hoverLukas Wirth-13/+15
2024-08-22Consider interleaving hover kindsLukas Wirth-84/+95
2024-08-22Sort hover results by relevanceLukas Wirth-6/+18
2024-08-22Thread file id through descension API for semantic highlightingLukas Wirth-75/+117
2024-08-22Rename macro descension functionsLukas Wirth-19/+16
2024-08-22Fully remove old macro descension APILukas Wirth-103/+66
2024-08-22Remove DescendPreference::SameKindLukas Wirth-37/+53
2024-08-22Implement floating point casts in const evalhkalbasi-3/+102
2024-08-22Drop MacroInputKindLukas Wirth-74/+24
2024-08-22Remove DescendPreference::SameTextLukas Wirth-229/+304
2024-08-22fix: Wrong `Sized` predicate for `generic_predicates_for_param`Shoyu Vanilla-0/+4
2024-08-21internal: Implement `module_path` macroLukas Wirth-71/+279
2024-08-21Run flycheck only on crate if target is binary.Ali Bektas-27/+58
2024-08-20Auto merge of #17913 - alibektas:ratoml_improvements, r=alibektasbors-113/+164
fix: Add workspace level config to ratoml
2024-08-20Auto merge of #17930 - Veykril:config-user-config, r=alibektasbors-65/+75
Remove the ability to configure the user config path Being able to do this makes little sense as this is effectively a cyclic dependency (and we do not want to fixpoint this really).
2024-08-20Old configs are backAli Bektas-0/+61
2024-08-20Next up : generating configs for workspace level configsAli Bektas-110/+48
2024-08-20Define workspace level configs.Ali Bektas-90/+142
2024-08-20fix: Fix panics for semantic highlighting at startupLukas Wirth-4/+14
2024-08-19ServerStatusParams should consider 'prime caches' in quiescent statusWilfred Hughes-4/+19
Priming caches is a performance win, but it takes a lock on the salsa database and prevents rust-analyzer from responding to e.g. go-to-def requests. This causes confusion for users, who see the spinner next to rust-analyzer in the VS Code footer stop, so they start attempting to navigate their code. Instead, set the `quiescent` status in LSP to false during cache priming, so the VS Code spinner persists until we can respond to any LSP request.
2024-08-19fix: Panic when a TAIT exists in a RPITShoyu Vanilla-11/+85
2024-08-19Allow user config to not existLukas Wirth-15/+10
2024-08-19Remove the ability to configure the user config pathLukas Wirth-66/+81
2024-08-19Improve documentation for `InvocationStrategy`Lukas Wirth-23/+29
2024-08-19Auto merge of #17928 - roife:fix-issue-17869, r=Veykrilbors-8/+89
fix: keep comments in convert_while_to_loop Fix #17869.
2024-08-19fix: keep comments in convert_while_to_looproife-8/+89
2024-08-19Auto merge of #17888 - Tyrubias:remove-invocation-location, r=Veykrilbors-173/+33
chore(config): remove `invocationLocation` in favor of `invocationStrategy` These flags were added to help rust-analyzer integrate with repos requiring non-Cargo invocations. The consensus is that having two independent settings are no longer needed. This change removes `invocationLocation` in favor of `invocationStrategy` and changes the internal representation of `InvocationStrategy::Once` to hold the workspace root. Closes #17848.
2024-08-19chore(config): remove `invocationLocation` in favor of `invocationStrategy`Victor Song-173/+33
These flags were added to help rust-analyzer integrate with repos requiring non-Cargo invocations. The consensus is that having two independent settings are no longer needed. This change removes `invocationLocation` in favor of `invocationStrategy` and changes the internal representation of `InvocationStrategy::Once` to hold the workspace root.
2024-08-18Include generics when lowering extern typeDavid Richey-5/+21
2024-08-17Auto merge of #17915 - Veykril:offline-no-deps, r=Veykrilbors-24/+85
feat: Make rust-analyzer work partially when offline Helps out with https://github.com/rust-lang/rust-analyzer/issues/12499 a bit