qualifier_attr 0.2.2

Procedural macro attributes for adding "qualifiers" (pub, async, unsafe, const, extern "C", ...) to various items.
Documentation
//! A test for every supported item.
//! This test requires the nightly toolchain to compile.

#![allow(dead_code, unused_imports, unused_macros)]
#![feature(extern_types, specialization, trait_alias)]

#[macro_use]
extern crate qualifier_attr;

#[qualifiers(pub)]
mod outer {
    // testing "common" items first...

    // const
    #[qualifiers(pub)]
    const ITEM_CONST: &str = "item const!";

    trait TraitItemConst {
        const IMPL_ITEM_CONST: &'static str;
    }

    struct ImplItemConst;

    impl TraitItemConst for ImplItemConst {
        #[qualifiers(default)]
        const IMPL_ITEM_CONST: &'static str = "impl item const!";
    }

    // fn
    #[qualifiers(pub, const, unsafe, extern "C")]
    fn item_fn_const() {}

    #[qualifiers(pub, async, unsafe, extern "C")]
    fn item_fn_async() {}

    extern "C" {
        #[qualifiers(pub)]
        fn foreign_item_fn();
    }

    trait TraitItemFn {
        #[qualifiers(unsafe, extern "C")]
        fn impl_item_fn();
    }

    struct ImplItemFn;

    impl TraitItemFn for ImplItemFn {
        #[qualifiers(default, unsafe, extern "C")]
        fn impl_item_fn() {}
    }

    // static
    #[qualifiers(pub)]
    static ITEM_STATIC: &str = "item static!";

    extern "C" {
        #[qualifiers(pub)]
        static FOREIGN_ITEM_STATIC: *const u8;
    }

    // type
    #[qualifiers(pub)]
    type ItemType<T> = [T; 2];

    extern "C" {
        #[qualifiers(pub)]
        type ForeignItemType;
    }

    trait TraitItemType {
        type ImplItemType<T: 'static>: 'static
        where
            T: TraitItemFn;
    }

    struct ImplItemType;

    impl TraitItemType for ImplItemType {
        #[qualifiers(default)]
        type ImplItemType<T: 'static> = ImplItemFn where T: TraitItemFn;
    }

    // other items...

    // enum
    #[qualifiers(pub)]
    enum ItemEnum {
        A,
        B,
        C,
    }

    // extern crate
    #[qualifiers(pub)]
    extern crate qualifier_attr as item_extern_crate;

    // (foreign mod supports unsafe syntactically but it does not compile)
    extern "C" {}

    // impl
    unsafe trait ItemImpl {}

    #[qualifiers(default, unsafe)]
    impl<T> ItemImpl for T {}

    // (macros have no support)
    macro_rules! item_macro {
        () => {};
    }

    // mod (supports unsafe syntactically but it does not compile)
    #[qualifiers(pub)]
    mod item_mod {}

    // struct
    #[qualifiers(pub)]
    struct ItemStruct {
        pub x: i32,
        pub y: i32,
    }

    // trait
    #[qualifiers(pub, unsafe)]
    trait ItemTrait {}

    unsafe impl ItemTrait for () {}

    // trait alias
    #[qualifiers(pub)]
    trait ItemTraitAlias = ItemTrait;

    // union
    #[qualifiers(pub)]
    union ItemUnion {
        pub x: i32,
        pub y: i32,
    }
}

mod export {
    #[qualifiers(pub)]
    use super::outer::{
        foreign_item_fn, item_extern_crate, item_fn_async, item_fn_const, item_mod,
        ForeignItemType, ItemEnum, ItemStruct, ItemTrait, ItemTraitAlias, ItemType, ItemUnion,
        FOREIGN_ITEM_STATIC, ITEM_CONST, ITEM_STATIC,
    };
}

use export::{
    foreign_item_fn, item_extern_crate, item_fn_async, item_fn_const, item_mod, ForeignItemType,
    ItemEnum, ItemStruct, ItemTrait, ItemTraitAlias, ItemType, ItemUnion, FOREIGN_ITEM_STATIC,
    ITEM_CONST, ITEM_STATIC,
};