Commit Graph

14176 Commits

Author SHA1 Message Date
bors[bot]
3bf4cec799
Merge #7128
7128: Implement HasAttrs for GenericParam r=matklad a=Veykril



Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
2021-01-03 08:49:59 +00:00
bors[bot]
895d97cfa0
Merge #7135
7135: Fix warnings on nightly r=lnicola a=cynecx



Co-authored-by: cynecx <me@cynecx.net>
2021-01-02 20:47:27 +00:00
cynecx
3e9847f747 Use fully qualified Itertools::intersperse call to silence nightly warnings about a potential name collision due to recent libstd api additions 2021-01-02 20:58:53 +01:00
cynecx
59fe884ef5 Fix warnings on rust-nightly 2021-01-02 20:48:39 +01:00
bors[bot]
a88d4f8c72
Merge #7133
7133: Proper handling $crate and local_inner_macros r=jonas-schievink a=edwin0cheng

This PR introduces `HygineFrames` to store the macro definition/call site hierarchy in hyginee and when resolving `local_inner_macros` and `$crate`, we use the token to look up the corresponding frame and return the correct value.

See also: https://rustc-dev-guide.rust-lang.org/macro-expansion.html#hygiene-and-hierarchies

fixe #6890 and  #6788

r? @jonas-schievink 

Co-authored-by: Edwin Cheng <edwin0cheng@gmail.com>
2021-01-02 17:42:45 +00:00
bors[bot]
510abef5da
Merge #7130
7130: Add extract_assignment assist r=Jesse-Bakker a=Jesse-Bakker

Add extract-assignment assist (#7006).

Assist is for now only implemented on if/match-statements where the assigment is the last statement in every block,
as for other cases, one would have to check whether the assignment has effects on the rest of the block and
extract a temporary variable for it in the block.



Co-authored-by: Jesse Bakker <github@jessebakker.com>
2021-01-02 16:23:06 +00:00
Jesse Bakker
bfe6a8e71a Add support for MatchExpr to extract_assigment assist 2021-01-02 17:10:46 +01:00
Jesse Bakker
31204e3590 Add extract-assignment assist 2021-01-02 16:59:01 +01:00
Edwin Cheng
3545289603 Use arena instead of vec 2021-01-02 22:48:22 +08:00
bors[bot]
3b347eaa4e
Merge #7134
7134: Fix infer error of macro invocation in array expr r=edwin0cheng a=edwin0cheng

Fixed following infer error:

```rust
macro_rules! bar { () => {0u32} }
fn test() {
    let a = [bar!()];   // a : [unknown]
}
```

bors r+

Co-authored-by: Edwin Cheng <edwin0cheng@gmail.com>
2021-01-02 14:16:26 +00:00
Edwin Cheng
63e330f402 Fix infer error of macro invocation in array expr 2021-01-02 22:06:59 +08:00
Edwin Cheng
fe5340d970 Introduce HygieneFrames for proper token hyginee 2021-01-02 20:39:57 +08:00
Lukas Wirth
68336fdb61 Implement HasAttrs for Type-, Const- and LifetimeParam 2021-01-02 12:11:46 +01:00
bors[bot]
aa3ce16f26
Merge #7132
7132: Stop using beta toolchain in xtask dist r=lnicola a=lnicola

bors r+

Co-authored-by: Laurențiu Nicola <lnicola@dend.ro>
2021-01-02 07:52:30 +00:00
Laurențiu Nicola
08e609bef0 Stop using beta toolchain in xtask dist 2021-01-02 09:51:41 +02:00
Lukas Wirth
ec448ca4b3 Impl HasAttrs for GenericParam 2021-01-02 00:44:59 +01:00
bors[bot]
b4a7caedb0
Merge #7125
7125: Don't emit arg count diagnostics for method calls with unknown receiver r=flodiebold a=flodiebold

Fixes #7098.

Co-authored-by: Florian Diebold <flodiebold@gmail.com>
2021-01-01 19:50:02 +00:00
Florian Diebold
29acd39800 Don't emit arg count diagnostics for method calls with unknown receiver
Fixes #7098.
2021-01-01 20:49:18 +01:00
bors[bot]
c92c9fdc52
Merge #7123
7123: Add support for Rust 2021. r=lnicola a=m-ou-se

This adds `2021` in all places where rust-analyzer already knew about `2015` and `2018`.

The only edition-specific behaviour I could find in the source code was gated on a direct comparison with `Edition2015`, so `Edition2021` should (correctly) behave the same as `Edition2018`:

56a7bf7ede/crates/hir_def/src/nameres/path_resolution.rs (L132)

Co-authored-by: Mara Bos <m-ou.se@m-ou.se>
2021-01-01 16:33:45 +00:00
Mara Bos
273d2f9123 Formatting. 2021-01-01 17:31:32 +01:00
Mara Bos
4833972067 Add support for Rust 2021. 2021-01-01 17:22:23 +01:00
bors[bot]
56a7bf7ede
Merge #7121
7121: Show lifetimes and labels on hover r=Veykril a=Veykril



Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
2021-01-01 14:20:51 +00:00
Lukas Wirth
bbc0b41c37 Show lifetimes and labels on hover 2021-01-01 15:19:47 +01:00
bors[bot]
0e5fe47153
Merge #7080
7080: Implement ConstParams for HIR r=Veykril a=Veykril

r? @flodiebold 

Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
2021-01-01 13:45:10 +00:00
Lukas Wirth
18bf2e5af5 Add ConstParams to the ide layer 2021-01-01 14:43:16 +01:00
bors[bot]
51d29fe554
Merge #7116
7116: Fix deep syntax tree bug generated by proc-macro r=jonas-schievink a=edwin0cheng

This PR fixed a bug from `semver-parser` and `pest_derive` crates which generate a very deep syntax tree such that serde reject to de-serialize. To fix this bug, we disabled recursion limit in `serde` (by calling [`Deserializer::disable_recursion_limit`](https://docs.rs/serde_json/1.0.61/serde_json/struct.Deserializer.html#method.disable_recursion_limit))

I have a feeling that we still need some way to protect against bad proc-macro generating huge syntax node, but I have no  idea right now.

r? @jonas-schievink 

Fixes #7103 

Co-authored-by: Edwin Cheng <edwin0cheng@gmail.com>
2021-01-01 11:06:27 +00:00
Lukas Wirth
0acdb73076 Add ConstParams to the HIR 2021-01-01 10:06:42 +01:00
bors[bot]
ff0c976979
Merge #7117
7117: Use stable instead of beta on macos-11 release runner r=lnicola a=lnicola

Because beta was promoted to stable yesterday.

bors r+

Co-authored-by: Laurențiu Nicola <lnicola@dend.ro>
2021-01-01 07:45:19 +00:00
Laurențiu Nicola
407a4f1120 Use stable instead of beta on macos-11 release runner 2021-01-01 09:44:01 +02:00
Edwin Cheng
ae92baba6a Remove serde_stacker which depends on cc 2021-01-01 15:26:55 +08:00
Edwin Cheng
a65025604d Fix deep syntax tree bug generated by proc-macro 2021-01-01 15:09:27 +08:00
bors[bot]
f687d738be
Merge #7102
7102: Fix completion of Default struct update syntax r=Veykril a=nick96

Previously the inserted text was always `..Default::default()` which ends up as `...Default::default()`
if `.` was typed. Now  checks if the current token is `.` and inserts `.Default::default()`
if it is, so `..Default::default()` is correctly completed.

I think there's probably a better way to implement this context aware completion because I've seen it in other parts of rust-analyzer as a user but I'm not sure how to do it.

Fixes #6969

Co-authored-by: Nick Spain <nicholas.spain@stileeducation.com>
2021-01-01 00:32:59 +00:00
Nick Spain
3d95c66556 Strip completion prefix of what has already been typed
Per Veykril's suggestion, this removes the need to repeat the completion text twice. It also handles the completion
in a more general case.
2021-01-01 11:17:15 +11:00
Nick Spain
49eeeb61ae Add a test for correct completion of ..Default::default() 2021-01-01 11:10:22 +11:00
bors[bot]
339aab3774
Merge #7112
7112: deny_clippy test works with cfg_attr r=matklad a=matklad

bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
2020-12-31 23:01:23 +00:00
Aleksey Kladov
8106893dc6 deny_clippy test works with cfg_attr 2021-01-01 01:58:04 +03:00
bors[bot]
a485c9b21d
Merge #7071
7071: Pass --all-targets to "cargo check" when discovering external resources r=matklad a=WasabiFan

There is a repro case and background in the linked issue.

In short, the goal of this MR is to allow rust-analyzer to discover proc-macros which come from your tests (including, most importantly, dev-dependencies).

By default, `cargo check` implies the equivalent of `--lib --bins`, meaning it'll check your libraries and binaries -- but not tests! This means proc-macros (or, I guess, build scripts as well) weren't discovered by rust-analyzer if they came from tests.

One solution would be to manually add `--lib --bins --tests` (i.e., just augment the effective options to include tests). However, in this MR, I threw in `--all-targets`, which [according to the docs](https://doc.rust-lang.org/cargo/commands/cargo-check.html#target-selection) implies `--benches --examples` too. I have absolutely no idea what repercussions that will have on rust-analyzer for other projects, nor do I know if it's a problem that build scripts will now be discovered for tests/examples/benches. But I am not aware of a reason you _wouldn't_ want to discover these things in your examples too.

I think the main drawback of this change is that it will likely slow down the `cargo check`. At a minimum, it'll now be checking your tests _and_ their dependencies. The `cargo check` docs also say that including `--tests` as I have here may cause your lib crate to be built _twice_, once for the normal target and again for unit tests. My reading of that caveat suggests that "building twice" means it's built once for the tests _inside_ your lib, with a test profile, and again for any consumers of your lib, now using a normal release profile or similar. This doesn't seem surprising.

Very minor caveat: `--tests`  will not include tests within a binary if it has `test = false` set in `Cargo.toml`. (I discovered this manually by trial-and-error, but hey, it actually says that in the docs!) This is likely not an issue, but _does_ mean that if you are -- for whatever reason -- disabling tests like that and then manually specifying `cargo test --package <...> --bin <...>` to run them, rust-analyzer will remain unaware of proc-macros in your tests.

I have confirmed this fixes the original issue in my sandbox example linked in #7034 and in my own project in which I originally discovered this. I've left it configured as my default RA language server and will report back if I notice any unexpected side-effects.

Fixes #7034


Co-authored-by: Kaelin Laundry <wasabifan@outlook.com>
2020-12-31 15:29:26 +00:00
bors[bot]
0a3d08e2e3
Merge #7106
7106: Split textDocument/formatting TextEdit with diff r=matklad a=Jesse-Bakker

#7044 

Co-authored-by: Jesse Bakker <github@jessebakker.com>
2020-12-31 15:11:14 +00:00
Jesse Bakker
f355a6d831 Split textDocument/formatting TextEdit with diff 2020-12-31 15:33:20 +01:00
bors[bot]
fda022592b
Merge #7107
7107: add working dir to cargo metadata fail messages r=matklad a=lf-

Context: I was having an error in my workspace config that I couldn't figure out without this added output. In particular, I have a Code workspace with a docs folder and one of my top level crates [which each have their own custom target], which was picking up the Cargo workspace level Cargo.toml incorrectly [which in my project should not ever be used for the editor], and ultimately had to override it with `linkedProjects`.

Here's a sample of the changed output:

```
[INFO rust_analyzer::main_loop] handle_event(Workspaces([Err(Failed to read Cargo metadata from Cargo.toml file /home/jade/dev/mu/Cargo.toml, cargo 1.50.0-nightly (75d5d8cff 2020-12-22)

Caused by:
    0: Failed to run `cargo metadata --manifest-path /home/jade/dev/mu/Cargo.toml` in `/home/jade/dev/mu`
    1: Error during execution of `cargo metadata`: error: target path "../../riscv64imac-mu-shoo-elf.json" is not a valid file
       
       Caused by:
         No such file or directory (os error 2)
       ), Err(Failed to read Cargo metadata from Cargo.toml file /home/jade/dev/mu/shoo/Cargo.toml, cargo 1.50.0-nightly (75d5d8cff 2020-12-22)

Caused by:
    0: Failed to run `cargo metadata --manifest-path /home/jade/dev/mu/shoo/Cargo.toml` in `/home/jade/dev/mu/shoo`
    1: Error during execution of `cargo metadata`: error: target path "../../riscv64imac-mu-shoo-elf.json" is not a valid file
       
       Caused by:
         No such file or directory (os error 2)
       )]))
```

Co-authored-by: lf- <lf-@users.noreply.github.com>
2020-12-31 13:04:29 +00:00
lf-
27a0fd23d8 add working dir to cargo metadata fail messages 2020-12-31 04:42:59 -08:00
bors[bot]
53e2cdf18e
Merge #7055
7055: Install rustfmt if needed during formatting request r=matklad a=kinnison

In order to fix #6052 and to fix #4249 this PR installs `rustfmt` using `rustup` if `rustfmt --help` fails.

In theory we ought to memoise the attempts (both the `--help` and the installation) so that we don't keep retrying something which will fail (e.g. if nightly is missing rustfmt), but this is a first-pass for opinions.

In order to make it possible to notify the user of what happened, I added a facility for `GlobalStateSnapshot` to send *messages* to the client indicating what happened.  There may be a cleaner way to do this as well but I wasn't sure exactly what might be best given this is my first time in this codebase.

It may be worth, longer term, working with `rustup` to provide a way to detect a missing component binary since `rustup` returns `1` if `rustfmt` is not installed, which is not ideal.


Co-authored-by: Daniel Silverstone <dsilvers@digital-scurf.org>
2020-12-31 11:21:23 +00:00
Daniel Silverstone
5ce420ac84
handle_formatting: Notice if rustfmt is missing and report
In an attempt to fix #6052 and #4249 this attempts to detect
if rustfmt is a rustup proxy which isn't installed, and reports
the error message to the user for them to fix.

In theory this ought to be memoised but for now it'll do as-is.

Future work might be to ask the user if they would like us to
trigger the installation (if possible).

Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
2020-12-31 10:25:51 +00:00
bors[bot]
558206f70e
Merge #7105
7105: Fix `==` in in format causes mismatched-arg-count r=edwin0cheng a=edwin0cheng

Fixes #7085 

Co-authored-by: Edwin Cheng <edwin0cheng@gmail.com>
2020-12-31 10:04:19 +00:00
Edwin Cheng
74a557857b Fix == in in format causes mismatched-arg-count 2020-12-31 17:59:29 +08:00
bors[bot]
a90bc53df7
Merge #7104
7104: Remove some unneeded string allocations r=Veykril a=Veykril

bors r+

Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
2020-12-31 09:14:22 +00:00
Lukas Wirth
816190c6f6 Remove some unneeded string allocations 2020-12-31 10:13:14 +01:00
bors[bot]
a9814fa9c0
Merge #7101
7101: Fix spacing bug in proc-macro TokenStream::to_string r=edwin0cheng a=edwin0cheng

bors r+

fixes #7100

Co-authored-by: Edwin Cheng <edwin0cheng@gmail.com>
2020-12-31 05:37:08 +00:00
Edwin Cheng
1bd1830f50 Fix spacing in proc-macro tokens to_string 2020-12-31 13:36:19 +08:00
Nick Spain
4cc3a6d4fe Fix completion of Default struct update syntax
Previously the inserted text was always `..Default::default()` which ends up as `...Default::default()`
if `.` was typed. Now  checks if the current token is `.` and inserts `.Default::default()`
if it is, so `..Default::default()` is correctly completed.

Fixes #6969
2020-12-31 16:23:05 +11:00