10174: fix: path display error when start with `crate` r=flodiebold a=dzvon

Fixes  #10172

Co-authored-by: Dezhi Wu <wu543065657@163.com>
This commit is contained in:
bors[bot] 2021-09-08 14:40:54 +00:00 committed by GitHub
commit 6a8062092b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 5 deletions

View file

@ -1141,20 +1141,22 @@ impl HirDisplay for Path {
write!(f, ">")?; write!(f, ">")?;
} }
(_, PathKind::Plain) => {} (_, PathKind::Plain) => {}
(_, PathKind::Abs) => write!(f, "::")?, (_, PathKind::Abs) => {}
(_, PathKind::Crate) => write!(f, "crate")?, (_, PathKind::Crate) => write!(f, "crate")?,
(_, PathKind::Super(0)) => write!(f, "self")?, (_, PathKind::Super(0)) => write!(f, "self")?,
(_, PathKind::Super(n)) => { (_, PathKind::Super(n)) => {
write!(f, "super")?; for i in 0..*n {
for _ in 0..*n { if i > 0 {
write!(f, "::super")?; write!(f, "::")?;
}
write!(f, "super")?;
} }
} }
(_, PathKind::DollarCrate(_)) => write!(f, "{{extern_crate}}")?, (_, PathKind::DollarCrate(_)) => write!(f, "{{extern_crate}}")?,
} }
for (seg_idx, segment) in self.segments().iter().enumerate() { for (seg_idx, segment) in self.segments().iter().enumerate() {
if seg_idx != 0 { if !matches!(self.kind(), PathKind::Plain) || seg_idx > 0 {
write!(f, "::")?; write!(f, "::")?;
} }
write!(f, "{}", segment.name)?; write!(f, "{}", segment.name)?;

View file

@ -962,6 +962,50 @@ fn main() { let foo_test = fo$0o(); }
``` ```
"#]], "#]],
); );
// Use literal `crate` in path
check(
r#"
pub struct X;
fn foo() -> crate::X { X }
fn main() { f$0oo(); }
"#,
expect![[r#"
*foo*
```rust
test
```
```rust
fn foo() -> crate::X
```
"#]],
);
// Check `super` in path
check(
r#"
pub struct X;
mod m { pub fn foo() -> super::X { super::X } }
fn main() { m::f$0oo(); }
"#,
expect![[r#"
*foo*
```rust
test::m
```
```rust
pub fn foo() -> super::X
```
"#]],
);
} }
#[test] #[test]