bors[bot] [Sun, 10 May 2020 14:48:04 +0000 (14:48 +0000)]
Merge #4412
4412: infer: Make expected rhs type for plain assign the lhs type r=flodiebold a=kiljacken
This fixes an issue where the following code sample would fail to infer
the type contained in the option:
```rust
fn main() {
let mut end = None; // Was Option<{unknown}>, is now Option<bool>
loop {
end = Some(true);
}
}
```
Co-authored-by: Emil Lauridsen <mine809@gmail.com>
Emil Lauridsen [Sun, 10 May 2020 14:20:13 +0000 (16:20 +0200)]
infer: Make expected rhs type for plain assign the lhs type
This fixes an issue where the following code sample would fail to infer
the type contained in the option:
```rust
fn main() {
let mut end = None; // TODO: Fix inference for this in RA
loop {
end = Some(true);
}
}
```
bors[bot] [Sat, 9 May 2020 09:29:11 +0000 (09:29 +0000)]
Merge #4175
4175: Introduce HirDisplay method for rendering source code & use it in add_function assist r=flodiebold a=TimoFreiberg
Next feature for #3639.
So far the only change in the new `HirDisplay` method is that paths are qualified, but more changes will be necessary (omitting the function name from function types, returning an error instead of printing `"{unknown}"`, probably more).
Is that approach okay?
Co-authored-by: Timo Freiberg <timo.freiberg@gmail.com>
bors[bot] [Fri, 8 May 2020 20:37:14 +0000 (20:37 +0000)]
Merge #4379
4379: Handle coercing function types to function pointers in match r=matklad a=flodiebold
E.g. in
```rust
match x {
1 => function1,
2 => function2,
}
```
we need to try coercing both to pointers. Turns out this is a special case in
rustc as well (see the link in the comment).
Florian Diebold [Fri, 8 May 2020 20:12:16 +0000 (22:12 +0200)]
Handle coercing function types to function pointers in match
E.g. in
```rust
match x {
1 => function1,
2 => function2,
}
```
we need to try coercing both to pointers. Turns out this is a special case in
rustc as well (see the link in the comment).
bors[bot] [Fri, 8 May 2020 18:09:25 +0000 (18:09 +0000)]
Merge #4377
4377: Implement better handling of divergence r=matklad a=flodiebold
Divergence here means that for some reason, the end of a block will not be reached. We tried to model this just using the never type, but that doesn't work fully (e.g. in `let x = { loop {}; "foo" };` x should still have type `&str`); so this introduces a `diverges` flag that the type checker keeps track of, like rustc does. We also add some checking for `break`, but no support for break-with-value or labeled breaks yet.
bors[bot] [Fri, 8 May 2020 17:19:02 +0000 (17:19 +0000)]
Merge #4366
4366: Unified debug lens r=matklad a=vsrs
Right now every debug engine gets the debug executable and exports the errors on its own.
This PR unifies the way all engines work. And adds an option to configure each engine separably.
For example, this adds visualizers for both `CodeLLDB` and `C++ tools Windows debugger`
```json
"rust-analyzer.debug.engineSettings": {
"cppvsdbg": {
"visualizerFile": "${workspaceRoot}/rdisk.natvis"
},
"lldb": {
"initCommands": [
"command script import ${workspaceRoot}/rdisk.vis.py"
]
}
}
```
Florian Diebold [Fri, 8 May 2020 15:36:11 +0000 (17:36 +0200)]
Implement better handling of divergence
Divergence here means that for some reason, the end of a block will not be
reached. We tried to model this just using the never type, but that doesn't work
fully (e.g. in `let x = { loop {}; "foo" };` x should still have type `&str`);
so this introduces a `diverges` flag that the type checker keeps track of, like
rustc does.
bors[bot] [Fri, 8 May 2020 10:11:19 +0000 (10:11 +0000)]
Merge #4329
4329: Look for `cargo`, `rustc`, and `rustup` in standard installation path r=matklad a=cdisselkoen
Discussed in #3118. This is approximately a 90% fix for the issue described there.
This PR creates a new crate `ra_env` with a function `get_path_for_executable()`; see docs there. `get_path_for_executable()` improves and generalizes the function `cargo_binary()` which was previously duplicated in the `ra_project_model` and `ra_flycheck` crates. (Both of those crates now depend on the new `ra_env` crate.) The new function checks (e.g.) `$CARGO` and `$PATH`, but also falls back on `~/.cargo/bin` manually before erroring out. This should allow most users to not have to worry about setting the `$CARGO` or `$PATH` variables for VSCode, which can be difficult e.g. on macOS as discussed in #3118.
I've attempted to replace all calls to `cargo`, `rustc`, and `rustup` in rust-analyzer with appropriate invocations of `get_path_for_executable()`; I don't think I've missed any in Rust code, but there is at least one invocation in TypeScript code which I haven't fixed. (I'm not sure whether it's affected by the same problem or not.) https://github.com/rust-analyzer/rust-analyzer/blob/a4778ddb7a00f552a8e653bbf56ae9fd69cfe1d3/editors/code/src/cargo.ts#L79
I'm sure this PR could be improved a bunch, so I'm happy to take feedback/suggestions on how to solve this problem better, or just bikeshedding variable/function/crate names etc.
bors[bot] [Thu, 7 May 2020 16:29:01 +0000 (16:29 +0000)]
Merge #4346
4346: Fix rename of enum variant visible from module r=matklad a=montekki
Probably fixes #4237
It looks like the ref is found correctly in this case but it's visibility is not correctly determined. I took a stab at fixing that by adding an implementation of `HasVisibility` for `EnumVariant` so it works more or less the same way it does for struct fields.
In other words, the `search_range` here does not contain the ref since it's not considered visible:
Before that I tried to populate `ItemScope` with visible enum variants but that ended up with breaking tests all over the place and also it looked illogical in the end: `ItemScope` is not populated with, say, public struct fields and the same should be true for `enum` variants.
I've added two more or less identical tests: one for the case with a struct field rename and one for enum variant rename; the test for struct should probably be removed and the names should be changed.
As mentioned in [Zulip](https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Fwg-rls-2.2E0/topic/resolve_path.20between.20fixture.20files) :)
I think always allowing unindented first lines is friendlier than making the user fix it and I don't see any drawbacks.
Co-authored-by: Timo Freiberg <timo.freiberg@gmail.com>