Skip to content

Commit 19f5f91

Browse files
committed
rustdoc: Make fold require Clone instead of Copy
1 parent b21e9d5 commit 19f5f91

File tree

10 files changed

+110
-41
lines changed

10 files changed

+110
-41
lines changed

src/librustdoc/astsrv.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ pub enum Srv = {
3939
ch: comm::Chan<Msg>
4040
};
4141

42+
impl Srv: Clone {
43+
fn clone(&self) -> Srv { copy *self }
44+
}
45+
4246
pub fn from_str<T>(source: ~str, owner: SrvOwner<T>) -> T {
4347
run(owner, source, parse::from_str_sess)
4448
}

src/librustdoc/config.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ pub type Config = {
6161
pandoc_cmd: Option<~str>
6262
};
6363

64+
impl Config: Clone {
65+
fn clone(&self) -> Config { copy *self }
66+
}
67+
6468
fn opt_output_dir() -> ~str { ~"output-dir" }
6569
fn opt_output_format() -> ~str { ~"output-format" }
6670
fn opt_output_style() -> ~str { ~"output-style" }

src/librustdoc/fold.rs

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
11
pub enum Fold<T> = Fold_<T>;
22

3+
impl<T: Clone> Fold<T>: Clone {
4+
fn clone(&self) -> Fold<T> {
5+
Fold({
6+
ctxt: self.ctxt.clone(),
7+
fold_doc: copy self.fold_doc,
8+
fold_crate: copy self.fold_crate,
9+
fold_item: copy self.fold_item,
10+
fold_mod: copy self.fold_mod,
11+
fold_nmod: copy self.fold_nmod,
12+
fold_fn: copy self.fold_fn,
13+
fold_const: copy self.fold_const,
14+
fold_enum: copy self.fold_enum,
15+
fold_trait: copy self.fold_trait,
16+
fold_impl: copy self.fold_impl,
17+
fold_type: copy self.fold_type,
18+
fold_struct: copy self.fold_struct
19+
})
20+
}
21+
}
22+
323
type FoldDoc<T> = fn~(fold: &Fold<T>, +doc: doc::Doc) -> doc::Doc;
424
type FoldCrate<T> = fn~(fold: &Fold<T>, +doc: doc::CrateDoc) -> doc::CrateDoc;
525
type FoldItem<T> = fn~(fold: &Fold<T>, +doc: doc::ItemDoc) -> doc::ItemDoc;
@@ -33,7 +53,7 @@ type Fold_<T> = {
3353

3454
// This exists because fn types don't infer correctly as record
3555
// initializers, but they do as function arguments
36-
fn mk_fold<T:Copy>(
56+
fn mk_fold<T:Clone>(
3757
+ctxt: T,
3858
+fold_doc: FoldDoc<T>,
3959
+fold_crate: FoldCrate<T>,
@@ -49,7 +69,7 @@ fn mk_fold<T:Copy>(
4969
+fold_struct: FoldStruct<T>
5070
) -> Fold<T> {
5171
Fold({
52-
ctxt: ctxt,
72+
ctxt: move ctxt,
5373
fold_doc: move fold_doc,
5474
fold_crate: move fold_crate,
5575
fold_item: move fold_item,
@@ -65,9 +85,9 @@ fn mk_fold<T:Copy>(
6585
})
6686
}
6787

68-
pub fn default_any_fold<T:Send Copy>(+ctxt: T) -> Fold<T> {
88+
pub fn default_any_fold<T:Send Clone>(+ctxt: T) -> Fold<T> {
6989
mk_fold(
70-
ctxt,
90+
move ctxt,
7191
|f, d| default_seq_fold_doc(f, d),
7292
|f, d| default_seq_fold_crate(f, d),
7393
|f, d| default_seq_fold_item(f, d),
@@ -83,9 +103,9 @@ pub fn default_any_fold<T:Send Copy>(+ctxt: T) -> Fold<T> {
83103
)
84104
}
85105

86-
pub fn default_seq_fold<T:Copy>(+ctxt: T) -> Fold<T> {
106+
pub fn default_seq_fold<T:Clone>(+ctxt: T) -> Fold<T> {
87107
mk_fold(
88-
ctxt,
108+
move ctxt,
89109
|f, d| default_seq_fold_doc(f, d),
90110
|f, d| default_seq_fold_crate(f, d),
91111
|f, d| default_seq_fold_item(f, d),
@@ -101,9 +121,9 @@ pub fn default_seq_fold<T:Copy>(+ctxt: T) -> Fold<T> {
101121
)
102122
}
103123

104-
pub fn default_par_fold<T:Send Copy>(+ctxt: T) -> Fold<T> {
124+
pub fn default_par_fold<T:Send Clone>(+ctxt: T) -> Fold<T> {
105125
mk_fold(
106-
ctxt,
126+
move ctxt,
107127
|f, d| default_seq_fold_doc(f, d),
108128
|f, d| default_seq_fold_crate(f, d),
109129
|f, d| default_seq_fold_item(f, d),
@@ -151,11 +171,11 @@ pub fn default_seq_fold_item<T>(
151171
doc
152172
}
153173

154-
pub fn default_any_fold_mod<T:Send Copy>(
174+
pub fn default_any_fold_mod<T:Send Clone>(
155175
fold: &Fold<T>,
156176
+doc: doc::ModDoc
157177
) -> doc::ModDoc {
158-
let fold_copy = copy *fold;
178+
let fold_copy = fold.clone();
159179
doc::ModDoc_({
160180
item: fold.fold_item(fold, doc.item),
161181
items: par::map(doc.items, |ItemTag, move fold_copy| {
@@ -178,11 +198,11 @@ pub fn default_seq_fold_mod<T>(
178198
})
179199
}
180200

181-
pub fn default_par_fold_mod<T:Send Copy>(
201+
pub fn default_par_fold_mod<T:Send Clone>(
182202
fold: &Fold<T>,
183203
+doc: doc::ModDoc
184204
) -> doc::ModDoc {
185-
let fold_copy = copy *fold;
205+
let fold_copy = fold.clone();
186206
doc::ModDoc_({
187207
item: fold.fold_item(fold, doc.item),
188208
items: par::map(doc.items, |ItemTag, move fold_copy| {
@@ -192,11 +212,11 @@ pub fn default_par_fold_mod<T:Send Copy>(
192212
})
193213
}
194214

195-
pub fn default_any_fold_nmod<T:Send Copy>(
215+
pub fn default_any_fold_nmod<T:Send Clone>(
196216
fold: &Fold<T>,
197217
+doc: doc::NmodDoc
198218
) -> doc::NmodDoc {
199-
let fold_copy = copy *fold;
219+
let fold_copy = fold.clone();
200220
{
201221
item: fold.fold_item(fold, doc.item),
202222
fns: par::map(doc.fns, |FnDoc, move fold_copy| {
@@ -219,11 +239,11 @@ pub fn default_seq_fold_nmod<T>(
219239
}
220240
}
221241

222-
pub fn default_par_fold_nmod<T:Send Copy>(
242+
pub fn default_par_fold_nmod<T:Send Clone>(
223243
fold: &Fold<T>,
224244
+doc: doc::NmodDoc
225245
) -> doc::NmodDoc {
226-
let fold_copy = copy *fold;
246+
let fold_copy = fold.clone();
227247
{
228248
item: fold.fold_item(fold, doc.item),
229249
fns: par::map(doc.fns, |FnDoc, move fold_copy| {

src/librustdoc/page_pass.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ individual modules, pages for the crate, indexes, etc.
77

88
use doc::{ItemUtils, PageUtils};
99
use syntax::ast;
10+
use util::NominalOp;
1011

1112
pub fn mk_pass(output_style: config::OutputStyle) -> Pass {
1213
{
@@ -39,6 +40,8 @@ fn run(
3940
type PagePort = comm::Port<Option<doc::Page>>;
4041
type PageChan = comm::Chan<Option<doc::Page>>;
4142

43+
type NominalPageChan = NominalOp<PageChan>;
44+
4245
fn make_doc_from_pages(page_port: PagePort) -> doc::Doc {
4346
let mut pages = ~[];
4447
loop {
@@ -59,15 +62,15 @@ fn find_pages(doc: doc::Doc, page_chan: PageChan) {
5962
fold_crate: fold_crate,
6063
fold_mod: fold_mod,
6164
fold_nmod: fold_nmod,
62-
.. *fold::default_any_fold(page_chan)
65+
.. *fold::default_any_fold(NominalOp { op: page_chan })
6366
});
6467
fold.fold_doc(&fold, doc);
6568

6669
comm::send(page_chan, None);
6770
}
6871

6972
fn fold_crate(
70-
fold: &fold::Fold<PageChan>,
73+
fold: &fold::Fold<NominalPageChan>,
7174
+doc: doc::CrateDoc
7275
) -> doc::CrateDoc {
7376

@@ -78,13 +81,13 @@ fn fold_crate(
7881
.. doc
7982
});
8083

81-
comm::send(fold.ctxt, Some(page));
84+
comm::send(fold.ctxt.op, Some(page));
8285

8386
doc
8487
}
8588

8689
fn fold_mod(
87-
fold: &fold::Fold<PageChan>,
90+
fold: &fold::Fold<NominalPageChan>,
8891
+doc: doc::ModDoc
8992
) -> doc::ModDoc {
9093

@@ -94,7 +97,7 @@ fn fold_mod(
9497

9598
let doc = strip_mod(doc);
9699
let page = doc::ItemPage(doc::ModTag(doc));
97-
comm::send(fold.ctxt, Some(page));
100+
comm::send(fold.ctxt.op, Some(page));
98101
}
99102

100103
doc
@@ -114,12 +117,12 @@ fn strip_mod(doc: doc::ModDoc) -> doc::ModDoc {
114117
}
115118

116119
fn fold_nmod(
117-
fold: &fold::Fold<PageChan>,
120+
fold: &fold::Fold<NominalPageChan>,
118121
+doc: doc::NmodDoc
119122
) -> doc::NmodDoc {
120123
let doc = fold::default_seq_fold_nmod(fold, doc);
121124
let page = doc::ItemPage(doc::NmodTag(doc));
122-
comm::send(fold.ctxt, Some(page));
125+
comm::send(fold.ctxt.op, Some(page));
123126
return doc;
124127
}
125128

src/librustdoc/path_pass.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@ pub fn mk_pass() -> Pass {
1010
}
1111
}
1212

13-
type Ctxt = {
13+
struct Ctxt {
1414
srv: astsrv::Srv,
1515
mut path: ~[~str]
16-
};
16+
}
17+
18+
impl Ctxt: Clone {
19+
fn clone(&self) -> Ctxt { copy *self }
20+
}
1721

1822
#[allow(non_implicitly_copyable_typarams)]
1923
fn run(srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
20-
let ctxt = {
24+
let ctxt = Ctxt {
2125
srv: srv,
2226
mut path: ~[]
2327
};

src/librustdoc/prune_private_pass.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ fn is_visible(srv: astsrv::Srv, doc: doc::ItemDoc) -> bool {
4444
ast_map::node_item(item, _) => {
4545
item.vis == ast::public
4646
}
47-
_ => util::unreachable()
47+
_ => core::util::unreachable()
4848
}
4949
}
5050
}

src/librustdoc/rustdoc.rc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,4 @@ mod page_pass;
5252
mod sectionalize_pass;
5353
mod escape_pass;
5454
mod prune_private_pass;
55+
mod util;

src/librustdoc/sort_pass.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22
33
use doc::ItemUtils;
44
use std::sort;
5+
use util::NominalOp;
56

6-
pub type ItemLtEq = pure fn~(v1: &doc::ItemTag, v2: &doc::ItemTag) -> bool;
7+
pub type ItemLtEqOp = pure fn~(v1: &doc::ItemTag, v2: &doc::ItemTag) -> bool;
78

8-
pub fn mk_pass(name: ~str, +lteq: ItemLtEq) -> Pass {
9+
type ItemLtEq = NominalOp<ItemLtEqOp>;
10+
11+
pub fn mk_pass(name: ~str, +lteq: ItemLtEqOp) -> Pass {
912
{
1013
name: name,
1114
f: fn~(move lteq, srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
12-
run(srv, doc, copy lteq)
15+
run(srv, doc, NominalOp { op: copy lteq })
1316
}
1417
}
1518
}
@@ -34,7 +37,7 @@ fn fold_mod(
3437
) -> doc::ModDoc {
3538
let doc = fold::default_any_fold_mod(fold, doc);
3639
doc::ModDoc_({
37-
items: sort::merge_sort(doc.items, fold.ctxt),
40+
items: sort::merge_sort(doc.items, fold.ctxt.op),
3841
.. *doc
3942
})
4043
}

src/librustdoc/text_pass.rs

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Generic pass for performing an operation on all descriptions
22
33
use doc::ItemUtils;
4+
use util::NominalOp;
45

56
pub fn mk_pass(name: ~str, +op: fn~(~str) -> ~str) -> Pass {
67
{
@@ -19,6 +20,9 @@ fn run(
1920
+doc: doc::Doc,
2021
+op: Op
2122
) -> doc::Doc {
23+
let op = NominalOp {
24+
op: move op
25+
};
2226
let fold = fold::Fold({
2327
fold_item: fold_item,
2428
fold_enum: fold_enum,
@@ -29,11 +33,14 @@ fn run(
2933
fold.fold_doc(&fold, doc)
3034
}
3135

32-
fn maybe_apply_op(op: Op, s: Option<~str>) -> Option<~str> {
33-
s.map(|s| op(*s) )
36+
fn maybe_apply_op(op: NominalOp<Op>, s: Option<~str>) -> Option<~str> {
37+
s.map(|s| op.op(*s) )
3438
}
3539

36-
fn fold_item(fold: &fold::Fold<Op>, +doc: doc::ItemDoc) -> doc::ItemDoc {
40+
fn fold_item(
41+
fold: &fold::Fold<NominalOp<Op>>,
42+
+doc: doc::ItemDoc
43+
) -> doc::ItemDoc {
3744
let doc = fold::default_seq_fold_item(fold, doc);
3845

3946
{
@@ -44,14 +51,19 @@ fn fold_item(fold: &fold::Fold<Op>, +doc: doc::ItemDoc) -> doc::ItemDoc {
4451
}
4552
}
4653

47-
fn apply_to_sections(op: Op, sections: ~[doc::Section]) -> ~[doc::Section] {
54+
fn apply_to_sections(
55+
op: NominalOp<Op>,
56+
sections: ~[doc::Section]
57+
) -> ~[doc::Section] {
4858
par::map(sections, |section, copy op| {
49-
header: op(section.header),
50-
body: op(section.body)
59+
header: op.op(section.header),
60+
body: op.op(section.body)
5161
})
5262
}
5363

54-
fn fold_enum(fold: &fold::Fold<Op>, +doc: doc::EnumDoc) -> doc::EnumDoc {
64+
fn fold_enum(
65+
fold: &fold::Fold<NominalOp<Op>>,
66+
+doc: doc::EnumDoc) -> doc::EnumDoc {
5567
let doc = fold::default_seq_fold_enum(fold, doc);
5668
let fold_copy = copy *fold;
5769

@@ -66,7 +78,10 @@ fn fold_enum(fold: &fold::Fold<Op>, +doc: doc::EnumDoc) -> doc::EnumDoc {
6678
}
6779
}
6880

69-
fn fold_trait(fold: &fold::Fold<Op>, +doc: doc::TraitDoc) -> doc::TraitDoc {
81+
fn fold_trait(
82+
fold: &fold::Fold<NominalOp<Op>>,
83+
+doc: doc::TraitDoc
84+
) -> doc::TraitDoc {
7085
let doc = fold::default_seq_fold_trait(fold, doc);
7186

7287
{
@@ -75,7 +90,10 @@ fn fold_trait(fold: &fold::Fold<Op>, +doc: doc::TraitDoc) -> doc::TraitDoc {
7590
}
7691
}
7792

78-
fn apply_to_methods(op: Op, docs: ~[doc::MethodDoc]) -> ~[doc::MethodDoc] {
93+
fn apply_to_methods(
94+
op: NominalOp<Op>,
95+
docs: ~[doc::MethodDoc]
96+
) -> ~[doc::MethodDoc] {
7997
do par::map(docs) |doc, copy op| {
8098
{
8199
brief: maybe_apply_op(op, doc.brief),
@@ -86,7 +104,10 @@ fn apply_to_methods(op: Op, docs: ~[doc::MethodDoc]) -> ~[doc::MethodDoc] {
86104
}
87105
}
88106

89-
fn fold_impl(fold: &fold::Fold<Op>, +doc: doc::ImplDoc) -> doc::ImplDoc {
107+
fn fold_impl(
108+
fold: &fold::Fold<NominalOp<Op>>,
109+
+doc: doc::ImplDoc
110+
) -> doc::ImplDoc {
90111
let doc = fold::default_seq_fold_impl(fold, doc);
91112

92113
{

0 commit comments

Comments
 (0)