@@ -2,9 +2,10 @@ use rustc_abi::ExternAbi;
22use rustc_ast:: ptr:: P ;
33use rustc_ast:: visit:: AssocCtxt ;
44use rustc_ast:: * ;
5+ use rustc_attr_parsing:: AttributeKind ;
56use rustc_errors:: ErrorGuaranteed ;
67use rustc_hir:: def:: { DefKind , Res } ;
7- use rustc_hir:: def_id:: { CRATE_DEF_ID , LocalDefId } ;
8+ use rustc_hir:: def_id:: { CRATE_DEF_ID , DefId , LocalDefId } ;
89use rustc_hir:: { self as hir, HirId , IsAnonInPath , PredicateOrigin } ;
910use rustc_index:: { IndexSlice , IndexVec } ;
1011use rustc_middle:: ty:: { ResolverAstLowering , TyCtxt } ;
@@ -93,7 +94,7 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
9394 self . with_lctx ( CRATE_NODE_ID , |lctx| {
9495 let module = lctx. lower_mod ( & c. items , & c. spans ) ;
9596 // FIXME(jdonszelman): is dummy span ever a problem here?
96- lctx. lower_attrs ( hir:: CRATE_HIR_ID , & c. attrs , DUMMY_SP ) ;
97+ lctx. lower_attrs ( hir:: CRATE_HIR_ID , & c. attrs , DUMMY_SP , & [ ] ) ;
9798 hir:: OwnerNode :: Crate ( module)
9899 } )
99100 }
@@ -150,7 +151,16 @@ impl<'hir> LoweringContext<'_, 'hir> {
150151 fn lower_item ( & mut self , i : & Item ) -> & ' hir hir:: Item < ' hir > {
151152 let vis_span = self . lower_span ( i. vis . span ) ;
152153 let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
153- let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
154+
155+ let mut extra_hir_attributes = Vec :: new ( ) ;
156+ if let ItemKind :: Fn ( f) = & i. kind {
157+ extra_hir_attributes. extend ( f. eii_impl . iter ( ) . map ( |( id, mi) | {
158+ let did = self . lower_path_simple_eii ( * id, & mi. path ) ;
159+ hir:: Attribute :: Parsed ( AttributeKind :: EiiImpl { eii_macro : did } )
160+ } ) ) ;
161+ }
162+
163+ let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span , & extra_hir_attributes) ;
154164 let kind = self . lower_item_kind ( i. span , i. id , hir_id, attrs, vis_span, & i. kind ) ;
155165 let item = hir:: Item {
156166 owner_id : hir_id. expect_owner ( ) ,
@@ -222,6 +232,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
222232 body,
223233 contract,
224234 define_opaque,
235+ eii_impl,
225236 ..
226237 } ) => {
227238 self . with_new_scopes ( * fn_sig_span, |this| {
@@ -485,23 +496,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
485496 name : ident,
486497 ast_macro_def,
487498 kind : macro_kind,
488- eii_macro_for : eii_macro_for. as_ref ( ) . map ( |path| {
489- let lowered = self . lower_qpath (
490- id,
491- & None ,
492- path,
493- ParamMode :: Explicit ,
494- crate :: AllowReturnTypeNotation :: No ,
495- ImplTraitContext :: Disallowed ( ImplTraitPosition :: Path ) ,
496- None ,
497- ) ;
498-
499- let QPath :: Resolved ( None , path) = lowered else {
500- panic ! ( "{lowered:?}" ) ;
501- } ;
502-
503- path. res . def_id ( )
504- } ) ,
499+ eii_macro_for : eii_macro_for
500+ . as_ref ( )
501+ . map ( |path| self . lower_path_simple_eii ( id, path) ) ,
505502 }
506503 }
507504 ItemKind :: Delegation ( box delegation) => {
@@ -520,6 +517,25 @@ impl<'hir> LoweringContext<'_, 'hir> {
520517 }
521518 }
522519
520+ fn lower_path_simple_eii ( & mut self , id : NodeId , path : & Path ) -> DefId {
521+ let lowered = self . lower_qpath (
522+ id,
523+ & None ,
524+ path,
525+ ParamMode :: Explicit ,
526+ crate :: AllowReturnTypeNotation :: No ,
527+ ImplTraitContext :: Disallowed ( ImplTraitPosition :: Path ) ,
528+ None ,
529+ ) ;
530+
531+ let QPath :: Resolved ( None , path) = lowered else {
532+ // TODO
533+ panic ! ( "{lowered:?}" ) ;
534+ } ;
535+
536+ path. res . def_id ( )
537+ }
538+
523539 fn lower_const_item (
524540 & mut self ,
525541 ty : & Ty ,
@@ -663,7 +679,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
663679 fn lower_foreign_item ( & mut self , i : & ForeignItem ) -> & ' hir hir:: ForeignItem < ' hir > {
664680 let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
665681 let owner_id = hir_id. expect_owner ( ) ;
666- let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
682+ let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span , & [ ] ) ;
667683 let ( ident, kind) = match & i. kind {
668684 ForeignItemKind :: Fn ( box Fn { sig, ident, generics, define_opaque, .. } ) => {
669685 let fdec = & sig. decl ;
@@ -672,11 +688,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
672688 self . lower_generics ( generics, i. id , itctx, |this| {
673689 (
674690 // Disallow `impl Trait` in foreign items.
675- this. lower_fn_decl ( fdec, i. id , sig. span , FnDeclKind :: ExternFn , None ) ,
676691 this. lower_fn_params_to_idents ( fdec) ,
677692 )
678693 } ) ;
679694
695+
680696 // Unmarked safety in unsafe block defaults to unsafe.
681697 let header = self . lower_fn_header ( sig. header , hir:: Safety :: Unsafe , attrs) ;
682698
@@ -737,7 +753,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
737753
738754 fn lower_variant ( & mut self , v : & Variant ) -> hir:: Variant < ' hir > {
739755 let hir_id = self . lower_node_id ( v. id ) ;
740- self . lower_attrs ( hir_id, & v. attrs , v. span ) ;
756+ self . lower_attrs ( hir_id, & v. attrs , v. span , & [ ] ) ;
741757 hir:: Variant {
742758 hir_id,
743759 def_id : self . local_def_id ( v. id ) ,
@@ -799,7 +815,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
799815 ) -> hir:: FieldDef < ' hir > {
800816 let ty = self . lower_ty ( & f. ty , ImplTraitContext :: Disallowed ( ImplTraitPosition :: FieldTy ) ) ;
801817 let hir_id = self . lower_node_id ( f. id ) ;
802- self . lower_attrs ( hir_id, & f. attrs , f. span ) ;
818+ self . lower_attrs ( hir_id, & f. attrs , f. span , & [ ] ) ;
803819 hir:: FieldDef {
804820 span : self . lower_span ( f. span ) ,
805821 hir_id,
@@ -818,7 +834,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
818834
819835 fn lower_trait_item ( & mut self , i : & AssocItem ) -> & ' hir hir:: TraitItem < ' hir > {
820836 let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
821- let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
837+ let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span , & [ ] ) ;
822838 let trait_item_def_id = hir_id. expect_owner ( ) ;
823839
824840 let ( ident, generics, kind, has_default) = match & i. kind {
@@ -1011,7 +1027,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
10111027 let has_value = true ;
10121028 let ( defaultness, _) = self . lower_defaultness ( i. kind . defaultness ( ) , has_value) ;
10131029 let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
1014- let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
1030+ let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span , & [ ] ) ;
10151031
10161032 let ( ident, ( generics, kind) ) = match & i. kind {
10171033 AssocItemKind :: Const ( box ConstItem {
@@ -1204,7 +1220,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
12041220
12051221 fn lower_param ( & mut self , param : & Param ) -> hir:: Param < ' hir > {
12061222 let hir_id = self . lower_node_id ( param. id ) ;
1207- self . lower_attrs ( hir_id, & param. attrs , param. span ) ;
1223+ self . lower_attrs ( hir_id, & param. attrs , param. span , & [ ] ) ;
12081224 hir:: Param {
12091225 hir_id,
12101226 pat : self . lower_pat ( & param. pat ) ,
@@ -1910,7 +1926,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
19101926 fn lower_where_predicate ( & mut self , pred : & WherePredicate ) -> hir:: WherePredicate < ' hir > {
19111927 let hir_id = self . lower_node_id ( pred. id ) ;
19121928 let span = self . lower_span ( pred. span ) ;
1913- self . lower_attrs ( hir_id, & pred. attrs , span) ;
1929+ self . lower_attrs ( hir_id, & pred. attrs , span, & [ ] ) ;
19141930 let kind = self . arena . alloc ( match & pred. kind {
19151931 WherePredicateKind :: BoundPredicate ( WhereBoundPredicate {
19161932 bound_generic_params,
0 commit comments