-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of #80765 - petrochenkov:traitsinscope, r=matthewjasper
resolve: Simplify collection of traits in scope "Traits in scope" for a given location are collected by walking all scopes in type namespace, collecting traits in them and pruning traits that don't have an associated item with the given name and namespace. Previously we tried to prune traits using some kind of hygienic resolution for associated items, but that was complex and likely incorrect, e.g. in #80762 correction to visibilites of trait items caused some traits to not be in scope anymore. I previously had some comments and concerns about this in #65351. In this PR we are doing some much simpler pruning based on `Symbol` and `Namespace` comparisons, it should be enough to throw away 99.9% of unnecessary traits. It is not necessary for pruning to be precise because for trait aliases, for example, we don't do any pruning at all, and precise hygienic resolution for associated items needs to be done in typeck anyway. The somewhat unexpected effect is that trait imports introduced by macros 2.0 now bring traits into scope due to the removed hygienic check on associated item names. I'm not sure whether it is desirable or not, but I think it's acceptable for now. The old check was certainly incorrect because macros 2.0 did bring trait aliases into scope. If doing this is not desirable, then we should come up with some other way to avoid bringing traits from macros 2.0 into scope, that would accommodate for trait aliases as well. --- The PR also contains a couple of pure refactorings - Scope walk is done by using `visit_scopes` instead of a hand-rolled version. - Code is restructured to accomodate for rustdoc that also wants to query traits in scope, but doesn't want to filter them by associated items at all. r? ```@matthewjasper```
- Loading branch information
Showing
7 changed files
with
139 additions
and
161 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
// Macros with def-site hygiene still bring traits into scope. | ||
// It is not clear whether this is desirable behavior or not. | ||
// It is also not clear how to prevent it if it is not desirable. | ||
|
||
// check-pass | ||
|
||
#![feature(decl_macro)] | ||
#![feature(trait_alias)] | ||
|
||
mod traits { | ||
pub trait Trait1 { | ||
fn simple_import(&self) {} | ||
} | ||
pub trait Trait2 { | ||
fn renamed_import(&self) {} | ||
} | ||
pub trait Trait3 { | ||
fn underscore_import(&self) {} | ||
} | ||
pub trait Trait4 { | ||
fn trait_alias(&self) {} | ||
} | ||
|
||
impl Trait1 for () {} | ||
impl Trait2 for () {} | ||
impl Trait3 for () {} | ||
impl Trait4 for () {} | ||
} | ||
|
||
macro m1() { | ||
use traits::Trait1; | ||
} | ||
macro m2() { | ||
use traits::Trait2 as Alias; | ||
} | ||
macro m3() { | ||
use traits::Trait3 as _; | ||
} | ||
macro m4() { | ||
trait Alias = traits::Trait4; | ||
} | ||
|
||
fn main() { | ||
m1!(); | ||
m2!(); | ||
m3!(); | ||
m4!(); | ||
|
||
().simple_import(); | ||
().renamed_import(); | ||
().underscore_import(); | ||
().trait_alias(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.