Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

use_group_as RFC #1219

Merged
merged 2 commits into from
Aug 7, 2015
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions text/0000-use-group-as.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
- Feature Name: use_group_as
- Start Date: 2015-02-15
- RFC PR: (leave this empty)
- Rust Issue: (leave this empty)

# Summary

Allow renaming imports when importing a group of symbols from a module.

```rust
use std::io::{
Error as IoError,
Result as IoResult,
Read,
Write
}
```

# Motivation

THe current design requires the above example to be written like this:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/THe/The/ (unless it's intentional for some strange reason which I'm guessing it isn't)


```rust
use std::io::Error as IoError;
use std::io::Result as IoResult;
use std::io::{Read, Write};
```

It's unfortunate to duplicate `use std::io::` on the 3 lines, and the proposed
example feels logical, and something you reach for in this instance, without
knowing for sure if it worked.

# Detailed design

The current grammar for use statements is something like:

```
use_decl : "pub" ? "use" [ path "as" ident
| path_glob ] ;

path_glob : ident [ "::" [ path_glob
| '*' ] ] ?
| '{' path_item [ ',' path_item ] * '}' ;

path_item : ident | "self" ;
```

This RFC proposes changing the grammar to something like:

```
use_decl : "pub" ? "use" [ path [ "as" ident ] ?
| path_glob ] ;

path_glob : ident [ "::" [ path_glob
| '*' ] ] ?
| '{' path_item [ ',' path_item ] * '}' ;

path_item : ident [ "as" ident] ?
| "self" [ "as" ident];
```

The `"as" ident` part is optional in each location, and if omitted, it is expanded
to alias to the same name, e.g. `use foo::{bar}` expands to `use foo::{bar as bar}`.

This includes being able to rename `self`, such as `use std::io::{self
as stdio, Result as IoResult};`.

# Drawbacks

# Alternatives

# Unresolved Questions