auto merge of #9504 : brson/rust/continue, r=alexcrichton

This commit is contained in:
bors 2013-09-26 18:46:10 -07:00
commit a94158ce64
10 changed files with 58 additions and 40 deletions

View File

@ -127,6 +127,7 @@
(defconst rust-mode-keywords
'("as"
"break"
"continue"
"do"
"else" "enum" "extern"
"false" "fn" "for"

View File

@ -39,6 +39,7 @@
<keyword>assert</keyword>
<keyword>break</keyword>
<keyword>const</keyword>
<keyword>continue</keyword>
<keyword>do</keyword>
<keyword>drop</keyword>
<keyword>else</keyword>

View File

@ -18,6 +18,7 @@
<list name="keywords">
<item> as </item>
<item> break </item>
<item> continue </item>
<item> do </item>
<item> drop </item>
<item> else </item>

View File

@ -18,7 +18,7 @@ syn keyword rustOperator as
syn match rustAssert "\<assert\(\w\)*!" contained
syn match rustFail "\<fail\(\w\)*!" contained
syn keyword rustKeyword break do extern
syn keyword rustKeyword break continue do extern
syn keyword rustKeyword in if impl let log
syn keyword rustKeyword for impl let log
syn keyword rustKeyword loop mod once priv pub

View File

@ -564,7 +564,7 @@ impl<'self> EachItemContext<'self> {
}
}
let mut continue = (self.callback)(*self.path_builder, def_like, vis);
let mut continue_ = (self.callback)(*self.path_builder, def_like, vis);
let family = item_family(doc);
if family == ForeignMod {
@ -572,11 +572,11 @@ impl<'self> EachItemContext<'self> {
self.pop_name(old_len)
}
if continue {
if continue_ {
// Recurse if necessary.
match family {
Mod | ForeignMod | Trait | Impl => {
continue = self.each_item_of_module(def_id);
continue_ = self.each_item_of_module(def_id);
}
ImmStatic | MutStatic | Struct | UnsafeFn | Fn | ForeignFn |
UnsafeStaticMethod | StaticMethod | Type | ForeignType |
@ -589,7 +589,7 @@ impl<'self> EachItemContext<'self> {
self.pop_name(old_len)
}
continue
continue_
}
fn each_item_of_module(&mut self, def_id: ast::DefId) -> bool {
@ -612,7 +612,7 @@ impl<'self> EachItemContext<'self> {
}
fn each_child_of_module_or_crate(&mut self, item_doc: ebml::Doc) -> bool {
let mut continue = true;
let mut continue_ = true;
// Iterate over all children.
do reader::tagged_docs(item_doc, tag_mod_child) |child_info_doc| {
@ -654,16 +654,16 @@ impl<'self> EachItemContext<'self> {
// Process this item.
let vis = item_visibility(child_item_doc);
continue = self.process_item_and_pop_name(child_item_doc,
continue_ = self.process_item_and_pop_name(child_item_doc,
child_def_id,
old_len,
vis);
}
}
continue
continue_
};
if !continue {
if !continue_ {
return false
}
@ -705,7 +705,7 @@ impl<'self> EachItemContext<'self> {
match maybe_find_item(def_id.node, other_crates_items) {
None => { self.pop_name(old_len); }
Some(reexported_item_doc) => {
continue = self.process_item_and_pop_name(
continue_ = self.process_item_and_pop_name(
reexported_item_doc,
def_id,
old_len,
@ -713,10 +713,10 @@ impl<'self> EachItemContext<'self> {
}
}
continue
continue_
};
continue
continue_
}
}

View File

@ -521,12 +521,12 @@ fn encode_reexported_static_methods(ecx: &EncodeContext,
/// * For newtype structs, iterates through the node ID of the constructor.
fn each_auxiliary_node_id(item: @item, callback: &fn(NodeId) -> bool)
-> bool {
let mut continue = true;
let mut continue_ = true;
match item.node {
item_enum(ref enum_def, _) => {
for variant in enum_def.variants.iter() {
continue = callback(variant.node.id);
if !continue {
continue_ = callback(variant.node.id);
if !continue_ {
break
}
}
@ -537,7 +537,7 @@ fn each_auxiliary_node_id(item: @item, callback: &fn(NodeId) -> bool)
Some(ctor_id) if struct_def.fields.len() > 0 &&
struct_def.fields[0].node.kind ==
ast::unnamed_field => {
continue = callback(ctor_id);
continue_ = callback(ctor_id);
}
_ => {}
}
@ -545,7 +545,7 @@ fn each_auxiliary_node_id(item: @item, callback: &fn(NodeId) -> bool)
_ => {}
}
continue
continue_
}
fn encode_reexports(ecx: &EncodeContext,

View File

@ -54,8 +54,8 @@ pub fn expand_asm(cx: @ExtCtxt, sp: Span, tts: &[ast::token_tree])
let mut state = Asm;
// Not using labeled break to get us through one round of bootstrapping.
let mut continue = true;
while continue {
let mut continue_ = true;
while continue_ {
match state {
Asm => {
asm = expr_to_str(cx, p.parse_expr(),
@ -142,7 +142,7 @@ pub fn expand_asm(cx: @ExtCtxt, sp: Span, tts: &[ast::token_tree])
match next_state(state) {
Some(x) => x,
None => {
continue = false;
continue_ = false;
break
}
}
@ -151,19 +151,19 @@ pub fn expand_asm(cx: @ExtCtxt, sp: Span, tts: &[ast::token_tree])
let s = match next_state(state) {
Some(x) => x,
None => {
continue = false;
continue_ = false;
break
}
};
match next_state(s) {
Some(x) => x,
None => {
continue = false;
continue_ = false;
break
}
}
} else if *p.token == token::EOF {
continue = false;
continue_ = false;
break;
} else {
state

View File

@ -1786,6 +1786,17 @@ impl Parser {
}
} else if self.eat_keyword(keywords::Loop) {
return self.parse_loop_expr(None);
} else if self.eat_keyword(keywords::Continue) {
let lo = self.span.lo;
let ex = if self.token_is_lifetime(&*self.token) {
let lifetime = self.get_lifetime(&*self.token);
self.bump();
ExprAgain(Some(lifetime.name))
} else {
ExprAgain(None)
};
let hi = self.span.hi;
return self.mk_expr(lo, hi, ex);
} else if self.eat_keyword(keywords::Match) {
return self.parse_match_expr();
} else if self.eat_keyword(keywords::Unsafe) {
@ -2578,6 +2589,7 @@ impl Parser {
return self.mk_expr(lo, hi, ExprLoop(body, opt_ident));
} else {
// This is a 'continue' expression
// FIXME #9467 rm support for 'loop' here after snapshot
if opt_ident.is_some() {
self.span_err(*self.last_span,
"a label may not be used with a `loop` expression");

View File

@ -477,14 +477,15 @@ fn mk_fresh_ident_interner() -> @ident_interner {
"use", // 61
"while", // 62
"in", // 63
"continue", // 64
"be", // 64
"pure", // 65
"yield", // 66
"typeof", // 67
"alignof", // 68
"offsetof", // 69
"sizeof", // 70
"be", // 65
"pure", // 66
"yield", // 67
"typeof", // 68
"alignof", // 69
"offsetof", // 70
"sizeof", // 71
];
@interner::StrInterner::prefill(init_vec)
@ -628,6 +629,7 @@ pub mod keywords {
Unsafe,
Use,
While,
Continue,
// Reserved keywords
Alignof,
@ -676,14 +678,15 @@ pub mod keywords {
Unsafe => Ident { name: 60, ctxt: 0 },
Use => Ident { name: 61, ctxt: 0 },
While => Ident { name: 62, ctxt: 0 },
Continue => Ident { name: 64, ctxt: 0 },
Alignof => Ident { name: 68, ctxt: 0 },
Be => Ident { name: 64, ctxt: 0 },
Offsetof => Ident { name: 69, ctxt: 0 },
Pure => Ident { name: 65, ctxt: 0 },
Sizeof => Ident { name: 70, ctxt: 0 },
Typeof => Ident { name: 67, ctxt: 0 },
Yield => Ident { name: 66, ctxt: 0 },
Alignof => Ident { name: 69, ctxt: 0 },
Be => Ident { name: 65, ctxt: 0 },
Offsetof => Ident { name: 70, ctxt: 0 },
Pure => Ident { name: 66, ctxt: 0 },
Sizeof => Ident { name: 71, ctxt: 0 },
Typeof => Ident { name: 68, ctxt: 0 },
Yield => Ident { name: 67, ctxt: 0 },
}
}
}
@ -709,7 +712,7 @@ pub fn is_any_keyword(tok: &Token) -> bool {
pub fn is_strict_keyword(tok: &Token) -> bool {
match *tok {
token::IDENT(sid, false) => match sid.name {
8 | 27 | 32 .. 63 => true,
8 | 27 | 32 .. 64 => true,
_ => false,
},
_ => false,
@ -719,7 +722,7 @@ pub fn is_strict_keyword(tok: &Token) -> bool {
pub fn is_reserved_keyword(tok: &Token) -> bool {
match *tok {
token::IDENT(sid, false) => match sid.name {
64 .. 70 => true,
65 .. 71 => true,
_ => false,
},
_ => false,

View File

@ -15,6 +15,6 @@ pub fn main() {
assert!((i > 0));
info!(i);
i -= 1;
loop;
continue;
}
}