Auto merge of #149535 - Jamesbarford:chore/refactor-struct-placeholder, r=lcnr

Move `struct Placeholder<T>`

r? ghost

Couple of issues I've encountered;
- `compiler/rustc_infer/src/infer/region_constraints/mod.rs` `GenericKind` I can't call `write!(f, "{p}")` due to error 1. Which looks like I may need to implement `Lift` for `Placeholder`?
- Using the `define_print_and_forward_display!` for `ty::PlaceholderType` caused error 2, as I've moved the struct it no longer exists in the crate. I suspect because I'm not using that macro it causes the error for `GenericKind`

<details>
<summary>Error 1</summary>

```
error: lifetime may not live long enough
   --> compiler/rustc_infer/src/infer/region_constraints/mod.rs:672:38
    |
668 | impl<'tcx> fmt::Display for GenericKind<'tcx> {
    |      ---- lifetime `'tcx` defined here
...
672 |             GenericKind::Placeholder(ref p) => write!(f, "{p}"),
    |                                      ^^^^^ assignment requires that `'tcx` must outlive `'static`
    |
    = note: requirement occurs because of the type `rustc_middle::ty::TyCtxt<'_>`, which makes the generic argument `'_` invariant
    = note: the struct `rustc_middle::ty::TyCtxt<'tcx>` is invariant over the parameter `'tcx`
    = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance

error: implementation of `Lift` is not general enough
   --> compiler/rustc_infer/src/infer/region_constraints/mod.rs:672:38
    |
672 |             GenericKind::Placeholder(ref p) => write!(f, "{p}"),
    |                                      ^^^^^ implementation of `Lift` is not general enough
    |
    = note: `Lift<rustc_middle::ty::TyCtxt<'0>>` would have to be implemented for the type `rustc_type_ir::Placeholder<rustc_middle::ty::TyCtxt<'_>, BoundTy>`, for any lifetime `'0`...
    = note: ...but `Lift<rustc_middle::ty::TyCtxt<'1>>` is actually implemented for the type `rustc_type_ir::Placeholder<rustc_middle::ty::TyCtxt<'1>, BoundTy>`, for some specific lifetime `'1`

error: implementation of `Print` is not general enough
   --> compiler/rustc_infer/src/infer/region_constraints/mod.rs:672:38
    |
672 |             GenericKind::Placeholder(ref p) => write!(f, "{p}"),
    |                                      ^^^^^ implementation of `Print` is not general enough
```

</details>

<details>
<summary>Error 2</summary>

```
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
    --> compiler/rustc_middle/src/ty/print/pretty.rs:3060:38
     |
3057 | / macro_rules! forward_display_to_print {
3058 | |     ($($ty:ty),+) => {
3059 | |         // Some of the $ty arguments may not actually use 'tcx
3060 | |         $(#[allow(unused_lifetimes)] impl<'tcx> fmt::Display for $ty {
     | |                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...    |
3072 | |     };
3073 | | }
     | |_- in this expansion of `forward_display_to_print!`
...
3093 | / forward_display_to_print! {
3094 | |     ty::Region<'tcx>,
3095 | |     Ty<'tcx>,
3096 | |     &'tcx ty::List<ty::PolyExistentialPredicate<'tcx>>,
3097 | |     ty::Const<'tcx>,
3098 | |     &'tcx ty::PlaceholderType<'tcx>
     | |     ------------------------------- `rustc_type_ir::Placeholder` is not defined in the current crate
3099 | | }
     | |_- in this macro invocation
     |
     = note: impl doesn't have any local type before any uncovered type parameters
     = note: for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
     = note: define and implement a trait or new type instead

error: implementation of `Lift` is not general enough
    --> compiler/rustc_middle/src/ty/print/pretty.rs:3060:38
     |
3057 | / macro_rules! forward_display_to_print {
3058 | |     ($($ty:ty),+) => {
3059 | |         // Some of the $ty arguments may not actually use 'tcx
3060 | |         $(#[allow(unused_lifetimes)] impl<'tcx> fmt::Display for $ty {
     | |                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Lift` is not general enough
...    |
3072 | |     };
3073 | | }
     | |_- in this expansion of `forward_display_to_print!`
...
3093 | / forward_display_to_print! {
3094 | |     ty::Region<'tcx>,
3095 | |     Ty<'tcx>,
3096 | |     &'tcx ty::List<ty::PolyExistentialPredicate<'tcx>>,
3097 | |     ty::Const<'tcx>,
3098 | |     &'tcx ty::PlaceholderType<'tcx>
3099 | | }
     | |_- in this macro invocation
     |
     = note: `Lift<context::TyCtxt<'0>>` would have to be implemented for the type `rustc_type_ir::Placeholder<context::TyCtxt<'tcx>, BoundTy>`, for any lifetime `'0`...
     = note: ...but `Lift<context::TyCtxt<'1>>` is actually implemented for the type `rustc_type_ir::Placeholder<context::TyCtxt<'1>, BoundTy>`, for some specific lifetime `'1`

error: implementation of `print::Print` is not general enough
    --> compiler/rustc_middle/src/ty/print/pretty.rs:3060:38
     |
3057 | / macro_rules! forward_display_to_print {
3058 | |     ($($ty:ty),+) => {
3059 | |         // Some of the $ty arguments may not actually use 'tcx
3060 | |         $(#[allow(unused_lifetimes)] impl<'tcx> fmt::Display for $ty {
     | |                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `print::Print` is not general enough
...    |
3072 | |     };
3073 | | }
     | |_- in this expansion of `forward_display_to_print!`
...
3093 | / forward_display_to_print! {
3094 | |     ty::Region<'tcx>,
3095 | |     Ty<'tcx>,
3096 | |     &'tcx ty::List<ty::PolyExistentialPredicate<'tcx>>,
3097 | |     ty::Const<'tcx>,
3098 | |     &'tcx ty::PlaceholderType<'tcx>
3099 | | }
     | |_- in this macro invocation
     |
     = note: `print::Print<'0, print::pretty::FmtPrinter<'a, '0>>` would have to be implemented for the type `rustc_type_ir::Placeholder<context::TyCtxt<'tcx>, BoundTy>`, for any lifetime `'0`...
     = note: ...but `print::Print<'1, print::pretty::FmtPrinter<'a, 'tcx>>` is actually implemented for the type `rustc_type_ir::Placeholder<context::TyCtxt<'1>, BoundTy>`, for some specific lifetime `'1`

error: specializing impl repeats parameter `'tcx`
    --> compiler/rustc_middle/src/ty/print/pretty.rs:3060:38
     |
3057 | / macro_rules! forward_display_to_print {
3058 | |     ($($ty:ty),+) => {
3059 | |         // Some of the $ty arguments may not actually use 'tcx
3060 | |         $(#[allow(unused_lifetimes)] impl<'tcx> fmt::Display for $ty {
     | |                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...    |
3072 | |     };
3073 | | }
     | |_- in this expansion of `forward_display_to_print!`
...
3093 | / forward_display_to_print! {
3094 | |     ty::Region<'tcx>,
3095 | |     Ty<'tcx>,
3096 | |     &'tcx ty::List<ty::PolyExistentialPredicate<'tcx>>,
3097 | |     ty::Const<'tcx>,
3098 | |     &'tcx ty::PlaceholderType<'tcx>
3099 | | }
     | |_- in this macro invocation

error[E0277]: the trait bound `&Placeholder<TyCtxt<'tcx>, BoundTy>: Lift<...>` is not satisfied
    --> compiler/rustc_middle/src/ty/print/pretty.rs:3064:30
     |
3057 | / macro_rules! forward_display_to_print {
3058 | |     ($($ty:ty),+) => {
3059 | |         // Some of the $ty arguments may not actually use 'tcx
3060 | |         $(#[allow(unused_lifetimes)] impl<'tcx> fmt::Display for $ty {
...    |
3064 | |                     tcx.lift(*self)
     | |                         ---- ^^^^^ unsatisfied trait bound
     | |                         |
     | |                         required by a bound introduced by this call
...    |
3072 | |     };
3073 | | }
     | |_- in this expansion of `forward_display_to_print!`
...
3093 | / forward_display_to_print! {
3094 | |     ty::Region<'tcx>,
3095 | |     Ty<'tcx>,
3096 | |     &'tcx ty::List<ty::PolyExistentialPredicate<'tcx>>,
3097 | |     ty::Const<'tcx>,
3098 | |     &'tcx ty::PlaceholderType<'tcx>
3099 | | }
     | |_- in this macro invocation
     |
     = help: the trait `Lift<context::TyCtxt<'_>>` is not implemented for `&rustc_type_ir::Placeholder<context::TyCtxt<'tcx>, BoundTy>`
note: required by a bound in `context::TyCtxt::<'tcx>::lift`
    --> compiler/rustc_middle/src/ty/context.rs:1807:20
     |
1807 |     pub fn lift<T: Lift<TyCtxt<'tcx>>>(self, value: T) -> Option<T::Lifted> {
     |                    ^^^^^^^^^^^^^^^^^^ required by this bound in `TyCtxt::<'tcx>::lift`
     = note: the full name for the type has been written to '/home/jambar02/Documents/arm/rust/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/deps/rustc_middle-16e5c44041028d8b.long-type-3843651570422266958.txt'
     = note: consider using `--verbose` to print the full type name to the console
help: consider dereferencing here
     |
3064 |                     tcx.lift(**self)
     |                              +

error[E0282]: type annotations needed
    --> compiler/rustc_middle/src/ty/print/pretty.rs:3064:21
     |
3057 | /  macro_rules! forward_display_to_print {
3058 | |      ($($ty:ty),+) => {
3059 | |          // Some of the $ty arguments may not actually use 'tcx
3060 | |          $(#[allow(unused_lifetimes)] impl<'tcx> fmt::Display for $ty {
...    |
3064 | |/                     tcx.lift(*self)
3065 | ||                         .expect("could not lift for printing")
     | ||______________________________________________________________^ cannot infer type
...    |
3072 | |      };
3073 | |  }
     | |__- in this expansion of `forward_display_to_print!`
...
3093 |  / forward_display_to_print! {
3094 |  |     ty::Region<'tcx>,
3095 |  |     Ty<'tcx>,
3096 |  |     &'tcx ty::List<ty::PolyExistentialPredicate<'tcx>>,
3097 |  |     ty::Const<'tcx>,
3098 |  |     &'tcx ty::PlaceholderType<'tcx>
3099 |  | }
     |  |_- in this macro invocation
```

</details>
tree: 618993725f4c056036a21bab85d50fc77cde9c7f
  1. .cargo/
  2. .github/
  3. .vscode/
  4. assets/
  5. bench_data/
  6. crates/
  7. docs/
  8. editors/
  9. lib/
  10. xtask/
  11. .editorconfig
  12. .git-blame-ignore-revs
  13. .gitattributes
  14. .gitignore
  15. .typos.toml
  16. Cargo.lock
  17. Cargo.toml
  18. clippy.toml
  19. CONTRIBUTING.md
  20. josh-sync.toml
  21. LICENSE-APACHE
  22. LICENSE-MIT
  23. PRIVACY.md
  24. README.md
  25. rust-version
  26. rustfmt.toml
  27. triagebot.toml
README.md

rust-analyzer is a language server that provides IDE functionality for writing Rust programs. You can use it with any editor that supports the Language Server Protocol (VS Code, Vim, Emacs, Zed, etc).

rust-analyzer features include go-to-definition, find-all-references, refactorings and code completion. rust-analyzer also supports integrated formatting (with rustfmt) and integrated diagnostics (with rustc and clippy).

Internally, rust-analyzer is structured as a set of libraries for analyzing Rust code. See Architecture in the manual.

Quick Start

https://rust-analyzer.github.io/book/installation.html

Documentation

If you want to contribute to rust-analyzer check out the CONTRIBUTING.md or if you are just curious about how things work under the hood, see the Contributing section of the manual.

If you want to use rust-analyzer's language server with your editor of choice, check the manual. It also contains some tips & tricks to help you be more productive when using rust-analyzer.

Security and Privacy

See the security and privacy sections of the manual.

Communication

For usage and troubleshooting requests, please use “IDEs and Editors” category of the Rust forum:

https://users.rust-lang.org/c/ide/14

For questions about development and implementation, join rust-analyzer working group on Zulip:

https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Frust-analyzer

Quick Links

License

rust-analyzer is primarily distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See LICENSE-APACHE and LICENSE-MIT for details.