Skip to content

repair macro docs #15751

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/librustc/metadata/encoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1612,8 +1612,8 @@ fn encode_macro_defs(ecx: &EncodeContext,
krate: &Crate,
ebml_w: &mut Encoder) {
ebml_w.start_tag(tag_exported_macros);
for span in krate.exported_macros.iter() {
encode_macro_def(ecx, ebml_w, span);
for item in krate.exported_macros.iter() {
encode_macro_def(ecx, ebml_w, &item.span);
}
ebml_w.end_tag();
}
Expand Down
32 changes: 24 additions & 8 deletions src/librustdoc/visit_ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ use std::gc::{Gc, GC};
use core;
use doctree::*;

// looks to me like the first two of these are actually
// output parameters, maybe only mutated once; perhaps
// better simply to have the visit method return a tuple
// containing them?

// also, is there some reason that this doesn't use the 'visit'
// framework from syntax?

pub struct RustdocVisitor<'a> {
pub module: Module,
pub attrs: Vec<ast::Attribute>,
Expand Down Expand Up @@ -64,6 +72,9 @@ impl<'a> RustdocVisitor<'a> {
ast::CRATE_NODE_ID,
&krate.module,
None);
// attach the crate's exported macros to the top-level module:
self.module.macros = krate.exported_macros.iter()
.map(|it| self.visit_macro(&**it)).collect();
self.module.is_crate = true;
}

Expand Down Expand Up @@ -323,15 +334,20 @@ impl<'a> RustdocVisitor<'a> {
ast::ItemForeignMod(ref fm) => {
om.foreigns.push(fm.clone());
}
ast::ItemMac(ref _m) => {
om.macros.push(Macro {
id: item.id,
attrs: item.attrs.iter().map(|x| *x).collect(),
name: item.ident,
where: item.span,
stab: self.stability(item.id),
})
ast::ItemMac(_) => {
fail!("rustdoc: macros should be gone, after expansion");
}
}
}

// convert each exported_macro into a doc item
fn visit_macro(&self, item: &ast::Item) -> Macro {
Macro {
id: item.id,
attrs: item.attrs.iter().map(|x| *x).collect(),
name: item.ident,
where: item.span,
stab: self.stability(item.id),
}
}
}
2 changes: 1 addition & 1 deletion src/libsyntax/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ pub struct Crate {
pub attrs: Vec<Attribute>,
pub config: CrateConfig,
pub span: Span,
pub exported_macros: Vec<Span>
pub exported_macros: Vec<Gc<Item>>
}

pub type MetaItem = Spanned<MetaItem_>;
Expand Down
11 changes: 4 additions & 7 deletions src/libsyntax/ext/base.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@ pub type IdentMacroExpanderFn =
/// just into the compiler's internal macro table, for `make_def`).
pub trait MacResult {
/// Define a new macro.
// this should go away; the idea that a macro might expand into
// either a macro definition or an expression, depending on what
// the context wants, is kind of silly.
// this particular flavor should go away; the idea that a macro might
// expand into either a macro definition or an expression, depending
// on what the context wants, is kind of silly.
fn make_def(&self) -> Option<MacroDef> {
None
}
Expand Down Expand Up @@ -431,7 +431,7 @@ pub struct ExtCtxt<'a> {

pub mod_path: Vec<ast::Ident> ,
pub trace_mac: bool,
pub exported_macros: Vec<codemap::Span>
pub exported_macros: Vec<Gc<ast::Item>>
}

impl<'a> ExtCtxt<'a> {
Expand Down Expand Up @@ -562,9 +562,6 @@ impl<'a> ExtCtxt<'a> {
pub fn name_of(&self, st: &str) -> ast::Name {
token::intern(st)
}
pub fn push_exported_macro(&mut self, span: codemap::Span) {
self.exported_macros.push(span);
}
}

/// Extract a string literal from the macro expanded version of `expr`,
Expand Down
6 changes: 3 additions & 3 deletions src/libsyntax/ext/expand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,7 @@ fn expand_item_mac(it: Gc<ast::Item>, fld: &mut MacroExpander)
// create issue to recommend refactoring here?
fld.extsbox.insert(intern(name.as_slice()), ext);
if attr::contains_name(it.attrs.as_slice(), "macro_export") {
fld.cx.push_exported_macro(it.span);
fld.cx.exported_macros.push(it);
}
SmallVector::zero()
}
Expand Down Expand Up @@ -1031,7 +1031,7 @@ pub struct ExportedMacros {
pub fn expand_crate(parse_sess: &parse::ParseSess,
cfg: ExpansionConfig,
// these are the macros being imported to this crate:
macros: Vec<ExportedMacros>,
imported_macros: Vec<ExportedMacros>,
user_exts: Vec<NamedSyntaxExtension>,
c: Crate) -> Crate {
let mut cx = ExtCtxt::new(parse_sess, c.config.clone(), cfg);
Expand All @@ -1040,7 +1040,7 @@ pub fn expand_crate(parse_sess: &parse::ParseSess,
cx: &mut cx,
};

for ExportedMacros { crate_name, macros } in macros.move_iter() {
for ExportedMacros { crate_name, macros } in imported_macros.move_iter() {
let name = format!("<{} macros>", token::get_ident(crate_name))
.into_string();

Expand Down
2 changes: 1 addition & 1 deletion src/libsyntax/fold.rs
Original file line number Diff line number Diff line change
Expand Up @@ -751,7 +751,7 @@ pub fn noop_fold_crate<T: Folder>(c: Crate, folder: &mut T) -> Crate {
attrs: c.attrs.iter().map(|x| folder.fold_attribute(*x)).collect(),
config: c.config.iter().map(|x| fold_meta_item_(*x, folder)).collect(),
span: folder.new_span(c.span),
exported_macros: c.exported_macros.iter().map(|sp| folder.new_span(*sp)).collect(),
exported_macros: c.exported_macros
}
}

Expand Down