rust-lang-nursery / lazy-static.rs

A small macro for defining lazy evaluated static variables in Rust.
Apache License 2.0
1.91k stars 111 forks source link

Use local_inner_macros to resolve all helper macros within $crate #107

Closed dtolnay closed 6 years ago

dtolnay commented 6 years ago

This fixes the following error when using Rust 2018 style macro imports.

extern crate lazy_static;
use lazy_static::lazy_static;
error: cannot find macro `__lazy_static_internal!` in this scope
  --> src/main.rs:8:1
   |
8  | / lazy_static! {
9  | |     static ref M: HashMap<String, String> = HashMap::new();
10 | | }
   | |_^
   |

The local_inner_macros modifier resolves all macro invocations made from within that macro as helpers in the same crate. So if lazy_static! expands to an invocation of __lazy_static_internal! then this would be resolved as $crate::__lazy_static_internal! rather than requiring the caller to have __lazy_static_internal in scope.

The attribute is ignored by pre-2018 compilers so lazy_static will continue to work as normal with #[macro_use].

In the future when dropping compatibility with pre-2018 compilers we can remove the local_inner_macros modifier and use our own explicit $crate:: prefixes on invocations of helper macros.