aboutsummaryrefslogtreecommitdiff
path: root/crates/ide_assists
Commit message (Collapse)AuthorAgeFilesLines
...
| * | SimplifyLukas Wirth2021-04-191-23/+14
| | |
| | |
| \ \
*-. \ \ Merge #8524 #8527bors[bot]2021-04-192-38/+138
|\ \ \ \ | |_|/ / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 8524: Fix extract function with partial block selection r=matklad a=brandondong **Reproduction:** ```rust fn foo() { let n = 1; let mut v = $0n * n;$0 v += 1; } ``` 1. Select the snippet ($0) and use the "Extract into function" assist. 2. Extracted function is incorrect and does not compile: ```rust fn foo() { let n = 1; let mut v = fun_name(n); v += 1; } fn fun_name(n: i32) {} ``` 3. Omitting the ending semicolon from the selection fixes the extracted function: ```rust fn fun_name(n: i32) -> i32 { n * n } ``` **Cause:** - When `extraction_target` uses a block extraction (semicolon case) instead of an expression extraction (no semicolon case), the user selection is directly used as the TextRange. - However, the existing function extraction logic for blocks requires that the TextRange spans from start to end of complete statements to work correctly. - For example: ```rust fn foo() { let m = 2; let n = 1; let mut v = m $0* n; let mut w = 3;$0 v += 1; w += 1; } ``` produces ```rust fn foo() { let m = 2; let n = 1; let mut v = m let mut w = fun_name(n); v += 1; w += 1; } fn fun_name(n: i32) -> i32 { let mut w = 3; w } ``` - The user selected TextRange is directly replaced by the function call which is now in the middle of another statement. The extracted function body only contains statements that were fully covered by the TextRange and so the `* n` code is deleted. The logic for calculating variable usage and outlived variables for the function parameters and return type respectively search within the TextRange and so do not include `m` or `v`. **Fix:** - Only extract full statements when using block extraction. If a user selected part of a statement, extract that full statement. 8527: Switch introduce_named_lifetime assist to use mutable syntax tree r=matklad a=iDawer This extends `GenericParamsOwnerEdit` trait with `get_or_create_generic_param_list` method Co-authored-by: Brandon <[email protected]> Co-authored-by: Dawer <[email protected]>
| | * | Switch introduce_named_lifetime assist to use mutable syntax treeDawer2021-04-141-36/+76
| | | |
| * | | Fix extract function with partial block selectionBrandon2021-04-151-2/+62
| | | |
* | | | Merge #8565bors[bot]2021-04-191-28/+100
|\ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 8565: Fill match arms assist: add remaining arms for tuple of enums r=iDawer a=iDawer Fix for #8493 However, the assist is still flaky and does not use `hir_ty::diagnostics::match_check` Co-authored-by: Dawer <[email protected]>
| * | | | Unindent test according to the style guide.Dawer2021-04-191-23/+23
| | | | |
| * | | | Return to the status quo in #8129Dawer2021-04-181-0/+2
| | | | |
| * | | | Prevent adding useless match armsDawer2021-04-181-11/+27
| | | | |
| * | | | Test fill-match-arms assist: partial with wildcardsDawer2021-04-171-0/+34
| | | | |
| * | | | Fill partial match arms for a tuple of enumsDawer2021-04-161-17/+37
| | | | |
* | | | | Merge #8467bors[bot]2021-04-194-0/+257
|\ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 8467: Adds impl Deref assist r=jhgg a=jhgg This PR adds a new `generate_deref` assist that automatically generates a deref impl for a given struct field. Check out this gif: ![2021-04-11_00-33-33](https://user-images.githubusercontent.com/5489149/114296006-b38e1000-9a5d-11eb-9112-807c01b8fd0a.gif) -- I have a few Q's: - [x] Should I write more tests, if so, what precisely should I test for? - [x] I have an inline question on line 65, can someone provide guidance? :) - [x] I can implement this for `ast::TupleField` too. But should it be a separate assist fn, or should I try and jam both into the `generate_deref`? - [x] I want to follow this up with an assist on `impl $0Deref for T {` which would automatically generate a `DerefMut` impl that mirrors the Deref as well, however, I could probably use some pointers on how to do that, since I'll have to reach into the ast of `fn deref` to grab the field that it's referencing for the `DerefMut` impl. Co-authored-by: jake <[email protected]>
| * | | | | implement field stuff toojake2021-04-191-22/+106
| | | | | |
| * | | | | Adds impl Deref assistjake2021-04-114-0/+173
| | |_|/ / | |/| | |
* | | | | Add some more error messages to fixture failure casesLukas Wirth2021-04-171-2/+4
| |/ / / |/| | |
* | | | Fill match arms for a tuple of a single enum.Dawer2021-04-161-10/+12
| |/ / |/| |
* | | Merge #8415bors[bot]2021-04-131-2/+46
|\ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 8415: Fix faulty assertion when extracting function with macro call r=matklad a=brandondong **Reproduction:** ```rust fn main() { let n = 1; let k = n * n; dbg!(n); } ``` 1. Select the second and third lines of the main function. Use the "Extract into function" code assist. 2. Panic occurs in debug, error is logged in release: "[ERROR ide_assists::handlers::extract_function] assertion failed: matches!(path, ast :: Expr :: PathExpr(_))". 3. Function generates successfully on release where the panic was bypassed. ```rust fn fun_name(n: i32) { let k = n * n; dbg!(n); } ``` **Cause:** - The generated function will take `n` as a parameter. The extraction logic needs to search the usages of `n` to determine whether it is used mutably or not. The helper `path_element_of_reference` is called for each usage but the second usage is a macro call and fails the `Expr::PathExpr(_)` match assertion. - The caller of `path_element_of_reference` does implicitly assume it to be a `Expr::PathExpr(_)` in how it looks at its parent node for determining whether it is used mutably. This logic will not work for macros. - I'm not sure if there are any other cases besides macros where it could be something other than a `Expr::PathExpr(_)`. I tried various examples and could not find any. **Fix:** - Update assertion to include the macro case. - Add a FIXME to properly handle checking if a macro usage requires mutable access. For now, return false instead of running the existing logic that is tailored for `Expr::PathExpr(_)`'s. Co-authored-by: Brandon <[email protected]>
| * | | Add macro testBrandon2021-04-111-0/+32
| | | |
| * | | Add FIXME for macro caseBrandon2021-04-081-0/+13
| | | |
| * | | Fix faulty assertion when extracting function with macro callBrandon2021-04-081-2/+1
| | | |
* | | | internal: don't use `#[should_panic]` for testsAleksey Kladov2021-04-131-16/+2
| | | |
* | | | internal: unfork code paths for unresolved and resolved assistAleksey Kladov2021-04-131-0/+2
| |/ / |/| |
* | | Merge #8436bors[bot]2021-04-101-19/+109
|\ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 8436: Fix extract function's mutability of variables outliving the body r=matklad a=brandondong **Reproduction:** ```rust fn main() { let mut k = 1; let mut j = 2; j += 1; k += j; } ``` 1. Select the first to third lines of the main function. Use the "Extract into function" code assist. 2. The output is the following which does not compile because the outlived variable `k` is declared as immutable: ```rust fn main() { let (k, j) = fun_name(); k += j; } fn fun_name() -> (i32, i32) { let mut k = 1; let mut j = 2; j += 1; (k, j) } ``` 3. We would instead expect the output to be: ```rust fn main() { let (mut k, j) = fun_name(); k += j; } ``` **Fix:** - Instead of declaring outlived variables as immutable unconditionally, check for any mutable usages outside of the extracted function. Co-authored-by: Brandon <[email protected]>
| * | | Fix extract function's mutability of variables outliving the bodyBrandon2021-04-091-19/+109
| |/ /
* | | Insert unnamed consts to ChildBySource DynMapLukas Wirth2021-04-091-1/+1
| | |
* | | Merge #8207bors[bot]2021-04-081-11/+94
|\ \ \ | |/ / |/| | | | | | | | | | | | | | | | | | | | 8207: Show dbg remove assist on empty contents r=edwin0cheng a=ivan770 Closes #8185 Co-authored-by: ivan770 <[email protected]> Co-authored-by: ivan770 <[email protected]>
| * | Apply test style fixes to all empty remove_dbg testsivan7702021-03-291-21/+17
| | |
| * | Update crates/ide_assists/src/handlers/remove_dbg.rs ivan7702021-03-291-5/+9
| | | | | | | | | | | | | | | Apply standard test style fixes Co-authored-by: Aleksey Kladov <[email protected]>
| * | Replace empty dbg with unit in letexprs, better removal in blocksivan7702021-03-271-13/+72
| | |
| * | Replace match on option with ifivan7702021-03-271-3/+4
| | |
| * | Remove dbg expression and newline as wholeivan7702021-03-271-6/+28
| | |
| * | Show dbg remove assist on empty contentsivan7702021-03-261-8/+9
| | |
* | | Merge #8339bors[bot]2021-04-051-18/+55
|\ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 8339: fix: extract variable works in guards r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
| * | | fix: extract variable works in guardsAleksey Kladov2021-04-051-18/+55
| | |/ | |/| | | | | | | closes #8336
* | | Merge #8326bors[bot]2021-04-051-39/+50
|\ \ \ | |/ / |/| | | | | | | | | | | | | | | | | 8326: Rewrite reorder fields assist to use mutable syntax trees r=matklad a=Veykril This also instead uses `Either` to use the typed `RecordPat` and `RecordExpr` nodes, this unfortunately gives a bit of code duplication Co-authored-by: Lukas Wirth <[email protected]>
| * | Rewrite reorder fields assist to use mutable syntax treesLukas Wirth2021-04-031-39/+50
| | |
* | | Convert Into to From assistGraeme Coupar2021-04-033-0/+389
|/ / | | | | | | | | | | | | | | | | | | | | | | This adds a "Convert Into to From" assist, useful since clippy has recently started adding lints on every `Into`. It covers converting the signature, and converting any `self`/`Self` references within the body to the correct types. It does assume that every instance of `Into` can be converted to a `From`, which I _think_ is the case now. Let me know if there's something I'm not thinking of and I can try and make it smarter.
* | Merge #8210bors[bot]2021-03-314-1/+174
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | 8210: Implement "Extract type alias" assist r=jonas-schievink a=jonas-schievink Co-authored-by: Jonas Schievink <[email protected]> Co-authored-by: Jonas Schievink <[email protected]>
| * | Don't use snippetsJonas Schievink2021-03-292-19/+14
| | |
| * | Use `find_node_at_range`Jonas Schievink2021-03-292-26/+7
| | |
| * | Snippet support in extract_type_aliasJonas Schievink2021-03-272-15/+26
| | |
| * | Implement "Extract type alias" assistJonas Schievink2021-03-263-0/+186
| |/
* | Merge #8267bors[bot]2021-03-311-0/+2
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 8267: Adding gifs and screenshots for features in manual r=matklad a=MozarellaMan For #6539 This includes most of gif or screenshot examples of most items in the "Features" header. With the exceptions of: - **On Typing Assists** - couldn't get it to work for a demo, I'm probably missing something? - **Structural search and replace** - looked to be already a visual example of the feature - **Workspace symbol** - wasn't sure how best to show this, all of the examples maybe? Also wasn't sure of the best code example to show it off - **Semantic Syntax Highlighting** - seemed obvious enough to not need a screenshot, but I could easily add this All the gifs/pngs are hosted in this [comment](https://github.com/rust-analyzer/rust-analyzer/issues/6539#issuecomment-809574840). Please let me know if any of them aren't suitable (and why) and I'll improve it! Or if you don't like the theme/font Co-authored-by: Ayomide Bamidele <[email protected]>
| * | Gifs and screenshots for features in manualAyomide Bamidele2021-03-311-0/+2
| | |
* | | Rename target_ty to self_tyLukas Wirth2021-03-293-4/+4
|/ /
* | Merge #8213bors[bot]2021-03-272-5/+21
|\ \ | | | | | | | | | | | | | | | | | | | | | 8213: Added support for const generics in impl generation r=Veykril a=ivan770 Closes #8211 Co-authored-by: ivan770 <[email protected]>
| * | Added support for const generics in impl generationivan7702021-03-272-5/+21
| |/
* / syntax: return owned string instead of leaking stringcynecx2021-03-265-7/+9
|/
* refine comment style of testshi-rustin2021-03-242-48/+48
|
* Merge #8168bors[bot]2021-03-241-7/+70
|\ | | | | | | | | | | | | | | 8168: correct `convert to guard return` let_stmt r=Veykril a=hi-rustin close https://github.com/rust-analyzer/rust-analyzer/issues/8074 Co-authored-by: hi-rustin <[email protected]>
| * correct `convert to guard return` let_stmthi-rustin2021-03-241-7/+70
| | | | | | | | | | | | | | | | fix fix add check