Skip to content

Commit 3b7e214

Browse files
committed
---
yaml --- r: 7338 b: refs/heads/master c: 5457b4d h: refs/heads/master v: v3
1 parent 9556283 commit 3b7e214

File tree

3 files changed

+109
-2
lines changed

3 files changed

+109
-2
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: e77b8db7077bc6eca5955149820f331618977df9
2+
refs/heads/master: 5457b4d3fbdcedef80176eeb44d2acd575bf5d3f

trunk/src/rustdoc/fold.rs

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
export fold;
2+
export fold_crate, fold_mod, fold_fn, fold_modlist, fold_fnlist;
3+
export default_seq_fold;
4+
5+
tag fold = t;
6+
7+
type fold_crate = fn~(fold: fold, doc: doc::cratedoc) -> doc::cratedoc;
8+
type fold_mod = fn~(fold: fold, doc: doc::moddoc) -> doc::moddoc;
9+
type fold_fn = fn~(fold: fold, doc: doc::fndoc) -> doc::fndoc;
10+
type fold_modlist = fn~(fold: fold, list: doc::modlist) -> doc::modlist;
11+
type fold_fnlist = fn~(fold: fold, list: doc::fnlist) -> doc::fnlist;
12+
13+
type t = {
14+
fold_crate: fold_crate,
15+
fold_mod: fold_mod,
16+
fold_fn: fold_fn,
17+
fold_modlist: fold_modlist,
18+
fold_fnlist: fold_fnlist
19+
};
20+
21+
22+
// This exists because fn types don't infer correctly as record
23+
// initializers, but they do as function arguments
24+
fn mk_fold(
25+
fold_crate: fold_crate,
26+
fold_mod: fold_mod,
27+
fold_fn: fold_fn,
28+
fold_modlist: fold_modlist,
29+
fold_fnlist: fold_fnlist
30+
) -> fold {
31+
fold({
32+
fold_crate: fold_crate,
33+
fold_mod: fold_mod,
34+
fold_fn: fold_fn,
35+
fold_modlist: fold_modlist,
36+
fold_fnlist: fold_fnlist
37+
})
38+
}
39+
40+
fn default_seq_fold() -> fold {
41+
mk_fold(
42+
default_seq_fold_crate,
43+
default_seq_fold_mod,
44+
default_seq_fold_fn,
45+
default_seq_fold_modlist,
46+
default_seq_fold_fnlist
47+
)
48+
}
49+
50+
fn default_seq_fold_crate(
51+
fold: fold,
52+
doc: doc::cratedoc
53+
) -> doc::cratedoc {
54+
~{
55+
topmod: fold.fold_mod(fold, doc.topmod)
56+
}
57+
}
58+
59+
fn default_seq_fold_mod(
60+
fold: fold,
61+
doc: doc::moddoc
62+
) -> doc::moddoc {
63+
~{
64+
name: doc.name,
65+
mods: fold.fold_modlist(fold, doc.mods),
66+
fns: fold.fold_fnlist(fold, doc.fns)
67+
}
68+
}
69+
70+
fn default_seq_fold_fn(
71+
_fold: fold,
72+
doc: doc::fndoc
73+
) -> doc::fndoc {
74+
doc
75+
}
76+
77+
fn default_seq_fold_modlist(
78+
fold: fold,
79+
list: doc::modlist
80+
) -> doc::modlist {
81+
doc::modlist(vec::map(*list) {|doc|
82+
fold.fold_mod(fold, doc)
83+
})
84+
}
85+
86+
fn default_seq_fold_fnlist(
87+
fold: fold,
88+
list: doc::fnlist
89+
) -> doc::fnlist {
90+
doc::fnlist(vec::map(*list) {|doc|
91+
fold.fold_fn(fold, doc)
92+
})
93+
}
94+
95+
#[cfg(test)]
96+
mod tests {
97+
#[test]
98+
fn default_fold_should_produce_same_doc() {
99+
let source = "mod a { fn b() { } mod c { fn d() { } } }";
100+
let ast = parse::from_str(source);
101+
let doc = extract::extract(ast, "");
102+
let fld = default_seq_fold();
103+
let folded = fld.fold_crate(fld, doc);
104+
assert doc == folded;
105+
}
106+
}

trunk/src/rustdoc/rustdoc.rc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ mod parse;
1111
mod extract;
1212
mod attr_parser;
1313
mod doc;
14-
mod gen;
14+
mod gen;
15+
mod fold;

0 commit comments

Comments
 (0)