diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2018-01-03 19:14:46 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2018-01-03 19:18:02 +0300 |
| commit | ef2b131144bc0d3d7814c9967e47a8d4e834caa5 (patch) | |
| tree | e57004184c9a3bc4df28c703058b190dab496fe6 /src/doc | |
| parent | 32db83b16e06cb5cca72d0e6a648a8008eda0fac (diff) | |
| download | rust-ef2b131144bc0d3d7814c9967e47a8d4e834caa5.tar.gz rust-ef2b131144bc0d3d7814c9967e47a8d4e834caa5.zip | |
Add docs for `crate_in_paths`, `extern_in_paths` and `extern_absolute_paths` into the unstable book
Diffstat (limited to 'src/doc')
3 files changed, 137 insertions, 0 deletions
diff --git a/src/doc/unstable-book/src/language-features/crate_in_paths.md b/src/doc/unstable-book/src/language-features/crate_in_paths.md new file mode 100644 index 00000000000..f1656993e87 --- /dev/null +++ b/src/doc/unstable-book/src/language-features/crate_in_paths.md @@ -0,0 +1,54 @@ +# `crate_in_paths` + +The tracking issue for this feature is: [#44660] + +[#44660]: https://github.com/rust-lang/rust/issues/44660 + +------------------------ + +The `crate_in_paths` feature allows to explicitly refer to the crate root in absolute paths +using keyword `crate`. + +`crate` can be used *only* in absolute paths, i.e. either in `::crate::a::b::c` form or in `use` +items where the starting `::` is added implicitly. +Paths like `crate::a::b::c` are not accepted currently. + +This feature is required in `feature(extern_absolute_paths)` mode to refer to any absolute path +in the local crate (absolute paths refer to extern crates by default in that mode), but can be +used without `feature(extern_absolute_paths)` as well. + +```rust +#![feature(crate_in_paths)] + +// Imports, `::` is added implicitly +use crate::m::f; +use crate as root; + +mod m { + pub fn f() -> u8 { 1 } + pub fn g() -> u8 { 2 } + pub fn h() -> u8 { 3 } + + // OK, visibilities implicitly add starting `::` as well, like imports + pub(in crate::m) struct S; +} + +mod n +{ + use crate::m::f; + use crate as root; + pub fn check() { + assert_eq!(f(), 1); + // `::` is required in non-import paths + assert_eq!(::crate::m::g(), 2); + assert_eq!(root::m::h(), 3); + } +} + +fn main() { + assert_eq!(f(), 1); + assert_eq!(::crate::m::g(), 2); + assert_eq!(root::m::h(), 3); + n::check(); +} +``` diff --git a/src/doc/unstable-book/src/language-features/extern_absolute_paths.md b/src/doc/unstable-book/src/language-features/extern_absolute_paths.md new file mode 100644 index 00000000000..f45c5053e8d --- /dev/null +++ b/src/doc/unstable-book/src/language-features/extern_absolute_paths.md @@ -0,0 +1,43 @@ +# `extern_absolute_paths` + +The tracking issue for this feature is: [#44660] + +[#44660]: https://github.com/rust-lang/rust/issues/44660 + +------------------------ + +The `extern_absolute_paths` feature enables mode allowing to refer to names from other crates +"inline", without introducing `extern crate` items, using absolute paths like `::my_crate::a::b`. + +`::my_crate::a::b` will resolve to path `a::b` in crate `my_crate`. + +`feature(crate_in_paths)` can be used in `feature(extern_absolute_paths)` mode for referring +to absolute paths in the local crate (`::crate::a::b`). + +`feature(extern_in_paths)` provides the same effect by using keyword `extern` to refer to +paths from other crates (`extern::my_crate::a::b`). + +```rust,ignore +#![feature(extern_absolute_paths)] + +// Suppose we have a dependency crate `xcrate` available through `Cargo.toml`, or `--extern` +// options, or standard Rust distribution, or some other means. + +use xcrate::Z; + +fn f() { + use xcrate; + use xcrate as ycrate; + let s = xcrate::S; + assert_eq!(format!("{:?}", s), "S"); + let z = ycrate::Z; + assert_eq!(format!("{:?}", z), "Z"); +} + +fn main() { + let s = ::xcrate::S; + assert_eq!(format!("{:?}", s), "S"); + let z = Z; + assert_eq!(format!("{:?}", z), "Z"); +} +``` diff --git a/src/doc/unstable-book/src/language-features/extern_in_paths.md b/src/doc/unstable-book/src/language-features/extern_in_paths.md new file mode 100644 index 00000000000..3ae6cc29df0 --- /dev/null +++ b/src/doc/unstable-book/src/language-features/extern_in_paths.md @@ -0,0 +1,40 @@ +# `extern_in_paths` + +The tracking issue for this feature is: [#44660] + +[#44660]: https://github.com/rust-lang/rust/issues/44660 + +------------------------ + +The `extern_in_paths` feature allows to refer to names from other crates "inline", without +introducing `extern crate` items, using keyword `extern`. + +For example, `extern::my_crat::a::b` will resolve to path `a::b` in crate `my_crate`. + +`feature(extern_absolute_paths)` mode provides the same effect by resolving absolute paths like +`::my_crate::a::b` to paths from extern crates by default. + +```rust,ignore +#![feature(extern_in_paths)] + +// Suppose we have a dependency crate `xcrate` available through `Cargo.toml`, or `--extern` +// options, or standard Rust distribution, or some other means. + +use extern::xcrate::Z; + +fn f() { + use extern::xcrate; + use extern::xcrate as ycrate; + let s = xcrate::S; + assert_eq!(format!("{:?}", s), "S"); + let z = ycrate::Z; + assert_eq!(format!("{:?}", z), "Z"); +} + +fn main() { + let s = extern::xcrate::S; + assert_eq!(format!("{:?}", s), "S"); + let z = Z; + assert_eq!(format!("{:?}", z), "Z"); +} +``` |
