Skip to content

Commit 6679336

Browse files
committed
add some files
1 parent 76a8f1d commit 6679336

File tree

2 files changed

+99
-0
lines changed
  • compiler
    • rustc_attr_parsing/src/attributes
    • rustc_builtin_macros/src

2 files changed

+99
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use rustc_ast::LitKind;
2+
use rustc_attr_data_structures::AttributeKind;
3+
use rustc_feature::{AttributeTemplate, template};
4+
use rustc_middle::bug;
5+
use rustc_span::sym;
6+
7+
use super::{AcceptContext, AttributeOrder, OnDuplicate};
8+
use crate::attributes::SingleAttributeParser;
9+
use crate::context::Stage;
10+
use crate::parser::ArgParser;
11+
12+
pub(crate) struct EiiParser;
13+
14+
impl<S: Stage> SingleAttributeParser<S> for EiiParser {
15+
const PATH: &'static [rustc_span::Symbol] = &[sym::eii];
16+
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepLast;
17+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
18+
const TEMPLATE: AttributeTemplate = template!(Word);
19+
20+
fn convert(cx: &AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
21+
Some(AttributeKind::Eii(cx.attr_span))
22+
}
23+
}
24+
25+
// pub(crate) struct EiiImplParser;
26+
//
27+
// impl<S: Stage> SingleAttributeParser<S> for EiiImplParser {
28+
// const PATH: &'static [rustc_span::Symbol] = &[sym::eii_impl];
29+
// const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepLast;
30+
// const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
31+
// const TEMPLATE: AttributeTemplate = template!(List: "<eii_id>, /*opt*/ default");
32+
//
33+
// fn convert(cx: &AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
34+
// let Some(l) = args.list() else {
35+
// cx.expected_list(cx.attr_span);
36+
// return None;
37+
// };
38+
//
39+
// let mut args = l.mixed();
40+
//
41+
// let id = args.next().unwrap();
42+
// let is_default = args.next();
43+
// assert!(args.next().is_none());
44+
//
45+
// let Some(id) = id.lit().and_then(|i| if let LitKind::Int(i, _) = i.kind {
46+
// Some(i)
47+
// } else {
48+
// None
49+
// }) else {
50+
// bug!("expected integer");
51+
// };
52+
//
53+
// let Ok(id) = u32::try_from(id.get()) else {
54+
// bug!("too large");
55+
// };
56+
// let id = EiiId::from(id);
57+
//
58+
// // AttributeKind::EiiImpl { eii: (), is_default: () }
59+
// todo!()
60+
// }
61+
// }
62+
//
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use rustc_ast::{DUMMY_NODE_ID, ItemKind, ast};
2+
use rustc_expand::base::{Annotatable, ExtCtxt};
3+
use rustc_span::Span;
4+
5+
pub(crate) fn eii_macro_for(
6+
ecx: &mut ExtCtxt<'_>,
7+
_span: Span,
8+
meta_item: &ast::MetaItem,
9+
mut item: Annotatable,
10+
) -> Vec<Annotatable> {
11+
let Annotatable::Item(i) = &mut item else { panic!("expected item") };
12+
let ItemKind::MacroDef(d) = &mut i.kind else { panic!("expected macro def") };
13+
14+
let Some(list) = meta_item.meta_item_list() else { panic!("expected list") };
15+
16+
d.eii_macro_for = Some(list[0].meta_item().unwrap().path.clone());
17+
18+
// Return the original item and the new methods.
19+
vec![item]
20+
}
21+
22+
pub(crate) fn eii_macro(
23+
ecx: &mut ExtCtxt<'_>,
24+
span: Span,
25+
meta_item: &ast::MetaItem,
26+
mut item: Annotatable,
27+
) -> Vec<Annotatable> {
28+
let Annotatable::Item(i) = &mut item else { panic!("expected item") };
29+
30+
let ItemKind::Fn(f) = &mut i.kind else { panic!("expected function") };
31+
32+
assert!(meta_item.is_word());
33+
34+
f.eii_impl.push((DUMMY_NODE_ID, meta_item.clone()));
35+
36+
vec![item]
37+
}

0 commit comments

Comments
 (0)