Refactoring, annotating FIXMEs in remainder of metadata code

This commit is contained in:
Tim Chevalier 2012-05-17 22:15:07 -07:00
parent c97b29afd1
commit cdcce3ed5d
4 changed files with 41 additions and 47 deletions

View file

@ -503,7 +503,7 @@ type constr_arg = spanned<fn_constr_arg>;
#[auto_serialize]
type constr_general_<ARG, ID> =
{path: @path, args: [@spanned<constr_arg_general_<ARG>>], id: ID};
{path: @path, args: [@sp_constr_arg<ARG>], id: ID};
// In the front end, constraints have a node ID attached.
// Typeck turns this to a def_id, using the output of resolve.

View file

@ -125,7 +125,7 @@ fn crate_name_from_metas(metas: [@ast::meta_item]) -> str {
alt attr::get_meta_item_value_str(i) {
some(n) { n }
// FIXME: Probably want a warning here since the user
// is using the wrong type of meta item
// is using the wrong type of meta item (#2406)
_ { fail }
}
}

View file

@ -63,35 +63,29 @@ fn parse_ret_ty(st: @pstate, conv: conv_did) -> (ast::ret_style, ty::t) {
}
}
fn parse_constrs(st: @pstate, conv: conv_did) -> [@ty::constr] {
let mut rslt: [@ty::constr] = [];
fn parse_constrs_gen<T: copy>(st: @pstate, conv: conv_did,
pser: fn(@pstate)
-> ast::constr_arg_general_<T>) -> [@ty::constr_general<T>] {
let mut rslt: [@ty::constr_general<T>] = [];
alt peek(st) {
':' {
loop {
next(st);
rslt += [parse_constr(st, conv, parse_constr_arg)];
if peek(st) != ';' { break; }
next(st);
rslt += [parse_constr(st, conv, pser)];
if peek(st) != ';' { break; }
}
}
_ { }
_ {}
}
ret rslt;
rslt
}
fn parse_constrs(st: @pstate, conv: conv_did) -> [@ty::constr] {
parse_constrs_gen(st, conv, parse_constr_arg)
}
// FIXME less copy-and-paste
fn parse_ty_constrs(st: @pstate, conv: conv_did) -> [@ty::type_constr] {
let mut rslt: [@ty::type_constr] = [];
alt peek(st) {
':' {
loop {
next(st);
rslt += [parse_constr(st, conv, parse_ty_constr_arg)];
if peek(st) != ';' { break; }
}
}
_ { }
}
ret rslt;
parse_constrs_gen(st, conv, parse_ty_constr_arg)
}
fn parse_path(st: @pstate) -> @ast::path {
@ -121,11 +115,11 @@ fn parse_constr_arg(st: @pstate) -> ast::fn_constr_arg {
an arg index and a lit argument? */
if c >= '0' && c <= '9' {
next(st);
// FIXME
// FIXME #877
ret ast::carg_ident((c as uint) - 48u);
} else {
#error("Lit args are unimplemented");
fail; // FIXME
fail; // FIXME #877
}
/*
else {
@ -147,7 +141,8 @@ fn parse_ty_constr_arg(st: @pstate) -> ast::constr_arg_general_<@path> {
fn parse_constr<T: copy>(st: @pstate, conv: conv_did,
pser: fn(@pstate) -> ast::constr_arg_general_<T>)
-> @ty::constr_general<T> {
let sp = ast_util::dummy_sp(); // FIXME: use a real span
// FIXME: use real spans and not a bogus one (#2407)
let sp = ast_util::dummy_sp();
let mut args: [@sp_constr_arg<T>] = [];
let pth = parse_path(st);
let mut ignore: char = next(st);
@ -156,7 +151,6 @@ fn parse_constr<T: copy>(st: @pstate, conv: conv_did,
let mut an_arg: constr_arg_general_<T>;
loop {
an_arg = pser(st);
// FIXME use a real span
args += [@respan(sp, an_arg)];
ignore = next(st);
if ignore != ';' { break; }

View file

@ -352,8 +352,9 @@ fn enc_ty_fn(w: io::writer, cx: @ctxt, ft: ty::fn_ty) {
}
}
// FIXME less copy-and-paste
fn enc_constr(w: io::writer, cx: @ctxt, c: @ty::constr) {
fn enc_constr_gen<T>(w: io::writer, cx: @ctxt,
c: @ty::constr_general<T>,
write_arg: fn(@sp_constr_arg<T>)) {
w.write_str(path_to_str(c.node.path));
w.write_char('(');
w.write_str(cx.ds(c.node.id));
@ -361,30 +362,29 @@ fn enc_constr(w: io::writer, cx: @ctxt, c: @ty::constr) {
let mut semi = false;
for c.node.args.each {|a|
if semi { w.write_char(';'); } else { semi = true; }
alt a.node {
carg_base { w.write_char('*'); }
carg_ident(i) { w.write_uint(i); }
carg_lit(l) { w.write_str(lit_to_str(l)); }
}
write_arg(a);
}
w.write_char(')');
}
fn enc_constr(w: io::writer, cx: @ctxt, c: @ty::constr) {
enc_constr_gen(w, cx, c, {|a|
alt a.node {
carg_base { w.write_char('*'); }
carg_ident(i) { w.write_uint(i); }
carg_lit(l) { w.write_str(lit_to_str(l)); }
}
});
}
fn enc_ty_constr(w: io::writer, cx: @ctxt, c: @ty::type_constr) {
w.write_str(path_to_str(c.node.path));
w.write_char('(');
w.write_str(cx.ds(c.node.id));
w.write_char('|');
let mut semi = false;
for c.node.args.each {|a|
if semi { w.write_char(';'); } else { semi = true; }
alt a.node {
carg_base { w.write_char('*'); }
carg_ident(p) { w.write_str(path_to_str(p)); }
carg_lit(l) { w.write_str(lit_to_str(l)); }
}
}
w.write_char(')');
enc_constr_gen(w, cx, c, {|a|
alt a.node {
carg_base { w.write_char('*'); }
carg_ident(p) { w.write_str(path_to_str(p)); }
carg_lit(l) { w.write_str(lit_to_str(l)); }
}
});
}
fn enc_bounds(w: io::writer, cx: @ctxt, bs: @[ty::param_bound]) {