diff options
| author | bors <bors@rust-lang.org> | 2015-07-28 21:14:28 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-07-28 21:14:28 +0000 |
| commit | 55ede7ed8e4f3752c371f7d04da4695ba9aa1c26 (patch) | |
| tree | cde06ced567bd6cc6ad6abb68fa37818158fec33 /src/libsyntax/parse | |
| parent | ba9224f35451e5d5ef7647bd2b40e5da80ce2735 (diff) | |
| parent | 00a5e66f818ad9d79cc4425f5564c7b07e3213a6 (diff) | |
| download | rust-55ede7ed8e4f3752c371f7d04da4695ba9aa1c26.tar.gz rust-55ede7ed8e4f3752c371f7d04da4695ba9aa1c26.zip | |
Auto merge of #27234 - oli-obk:move_get_name_get_ident_to_impl, r=eddyb
this has quite some fallout. but also made lots of stuff more readable imo [breaking-change] for plugin authors
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/mod.rs | 39 | ||||
| -rw-r--r-- | src/libsyntax/parse/obsolete.rs | 6 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 38 | ||||
| -rw-r--r-- | src/libsyntax/parse/token.rs | 26 |
4 files changed, 51 insertions, 58 deletions
diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index 34a63fc92fe..70da512e898 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -15,6 +15,7 @@ use codemap::{self, Span, CodeMap, FileMap}; use diagnostic::{SpanHandler, Handler, Auto, FatalError}; use parse::attr::ParserAttr; use parse::parser::Parser; +use parse::token::InternedString; use ptr::P; use str::char_at; @@ -439,7 +440,7 @@ fn looks_like_width_suffix(first_chars: &[char], s: &str) -> bool { fn filtered_float_lit(data: token::InternedString, suffix: Option<&str>, sd: &SpanHandler, sp: Span) -> ast::Lit_ { debug!("filtered_float_lit: {}, {:?}", data, suffix); - match suffix { + match suffix.as_ref().map(|s| &**s) { Some("f32") => ast::LitFloat(data, ast::TyF32), Some("f64") => ast::LitFloat(data, ast::TyF64), Some(suf) => { @@ -457,12 +458,13 @@ fn filtered_float_lit(data: token::InternedString, suffix: Option<&str>, None => ast::LitFloatUnsuffixed(data) } } -pub fn float_lit(s: &str, suffix: Option<&str>, sd: &SpanHandler, sp: Span) -> ast::Lit_ { +pub fn float_lit(s: &str, suffix: Option<InternedString>, + sd: &SpanHandler, sp: Span) -> ast::Lit_ { debug!("float_lit: {:?}, {:?}", s, suffix); // FIXME #2252: bounds checking float literals is deferred until trans let s = s.chars().filter(|&c| c != '_').collect::<String>(); - let data = token::intern_and_get_ident(&*s); - filtered_float_lit(data, suffix, sd, sp) + let data = token::intern_and_get_ident(&s); + filtered_float_lit(data, suffix.as_ref().map(|s| &**s), sd, sp) } /// Parse a string representing a byte literal into its final form. Similar to `char_lit` @@ -557,7 +559,11 @@ pub fn binary_lit(lit: &str) -> Rc<Vec<u8>> { Rc::new(res) } -pub fn integer_lit(s: &str, suffix: Option<&str>, sd: &SpanHandler, sp: Span) -> ast::Lit_ { +pub fn integer_lit(s: &str, + suffix: Option<InternedString>, + sd: &SpanHandler, + sp: Span) + -> ast::Lit_ { // s can only be ascii, byte indexing is fine let s2 = s.chars().filter(|&c| c != '_').collect::<String>(); @@ -579,8 +585,8 @@ pub fn integer_lit(s: &str, suffix: Option<&str>, sd: &SpanHandler, sp: Span) -> } // 1f64 and 2f32 etc. are valid float literals. - match suffix { - Some(suf) if looks_like_width_suffix(&['f'], suf) => { + if let Some(ref suf) = suffix { + if looks_like_width_suffix(&['f'], suf) { match base { 16 => sd.span_err(sp, "hexadecimal float literal is not supported"), 8 => sd.span_err(sp, "octal float literal is not supported"), @@ -588,18 +594,17 @@ pub fn integer_lit(s: &str, suffix: Option<&str>, sd: &SpanHandler, sp: Span) -> _ => () } let ident = token::intern_and_get_ident(&*s); - return filtered_float_lit(ident, suffix, sd, sp) + return filtered_float_lit(ident, Some(&**suf), sd, sp) } - _ => {} } if base != 10 { s = &s[2..]; } - if let Some(suf) = suffix { + if let Some(ref suf) = suffix { if suf.is_empty() { sd.span_bug(sp, "found empty literal suffix in Some")} - ty = match suf { + ty = match &**suf { "isize" => ast::SignedIntLit(ast::TyIs, ast::Plus), "i8" => ast::SignedIntLit(ast::TyI8, ast::Plus), "i16" => ast::SignedIntLit(ast::TyI16, ast::Plus), @@ -739,8 +744,8 @@ mod tests { Some(&ast::TtToken(_, token::Ident(name_zip, token::Plain))), Some(&ast::TtDelimited(_, ref macro_delimed)), ) - if name_macro_rules.as_str() == "macro_rules" - && name_zip.as_str() == "zip" => { + if name_macro_rules.name == "macro_rules" + && name_zip.name == "zip" => { let tts = ¯o_delimed.tts[..]; match (tts.len(), tts.get(0), tts.get(1), tts.get(2)) { ( @@ -755,10 +760,10 @@ mod tests { ( 2, Some(&ast::TtToken(_, token::Dollar)), - Some(&ast::TtToken(_, token::Ident(name, token::Plain))), + Some(&ast::TtToken(_, token::Ident(ident, token::Plain))), ) if first_delimed.delim == token::Paren - && name.as_str() == "a" => {}, + && ident.name == "a" => {}, _ => panic!("value 3: {:?}", **first_delimed), } let tts = &second_delimed.tts[..]; @@ -766,10 +771,10 @@ mod tests { ( 2, Some(&ast::TtToken(_, token::Dollar)), - Some(&ast::TtToken(_, token::Ident(name, token::Plain))), + Some(&ast::TtToken(_, token::Ident(ident, token::Plain))), ) if second_delimed.delim == token::Paren - && name.as_str() == "a" => {}, + && ident.name == "a" => {}, _ => panic!("value 4: {:?}", **second_delimed), } }, diff --git a/src/libsyntax/parse/obsolete.rs b/src/libsyntax/parse/obsolete.rs index 00d9b7f4ea6..5a72477d4ac 100644 --- a/src/libsyntax/parse/obsolete.rs +++ b/src/libsyntax/parse/obsolete.rs @@ -92,10 +92,8 @@ impl<'a> ParserObsoleteMethods for parser::Parser<'a> { fn is_obsolete_ident(&mut self, ident: &str) -> bool { match self.token { - token::Ident(sid, _) => { - token::get_ident(sid) == ident - } - _ => false + token::Ident(sid, _) => sid.name == ident, + _ => false, } } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 80a10b2463f..2cae6a4be65 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -288,7 +288,7 @@ impl TokenType { match *self { TokenType::Token(ref t) => format!("`{}`", Parser::token_to_string(t)), TokenType::Operator => "an operator".to_string(), - TokenType::Keyword(kw) => format!("`{}`", token::get_name(kw.to_name())), + TokenType::Keyword(kw) => format!("`{}`", kw.to_name()), } } } @@ -1023,7 +1023,7 @@ impl<'a> Parser<'a> { } pub fn id_to_interned_str(&mut self, id: Ident) -> InternedString { - token::get_ident(id) + id.name.as_str() } /// Is the current token one of the keywords that signals a bare function @@ -1498,20 +1498,20 @@ impl<'a> Parser<'a> { } token::Literal(lit, suf) => { let (suffix_illegal, out) = match lit { - token::Byte(i) => (true, LitByte(parse::byte_lit(i.as_str()).0)), - token::Char(i) => (true, LitChar(parse::char_lit(i.as_str()).0)), + token::Byte(i) => (true, LitByte(parse::byte_lit(&i.as_str()).0)), + token::Char(i) => (true, LitChar(parse::char_lit(&i.as_str()).0)), // there are some valid suffixes for integer and // float literals, so all the handling is done // internally. token::Integer(s) => { - (false, parse::integer_lit(s.as_str(), + (false, parse::integer_lit(&s.as_str(), suf.as_ref().map(|s| s.as_str()), &self.sess.span_diagnostic, self.last_span)) } token::Float(s) => { - (false, parse::float_lit(s.as_str(), + (false, parse::float_lit(&s.as_str(), suf.as_ref().map(|s| s.as_str()), &self.sess.span_diagnostic, self.last_span)) @@ -1519,20 +1519,20 @@ impl<'a> Parser<'a> { token::Str_(s) => { (true, - LitStr(token::intern_and_get_ident(&parse::str_lit(s.as_str())), + LitStr(token::intern_and_get_ident(&parse::str_lit(&s.as_str())), ast::CookedStr)) } token::StrRaw(s, n) => { (true, LitStr( - token::intern_and_get_ident(&parse::raw_str_lit(s.as_str())), + token::intern_and_get_ident(&parse::raw_str_lit(&s.as_str())), ast::RawStr(n))) } token::Binary(i) => - (true, LitBinary(parse::binary_lit(i.as_str()))), + (true, LitBinary(parse::binary_lit(&i.as_str()))), token::BinaryRaw(i, _) => (true, - LitBinary(Rc::new(i.as_str().as_bytes().iter().cloned().collect()))), + LitBinary(Rc::new(i.to_string().into_bytes()))), }; if suffix_illegal { @@ -2448,7 +2448,7 @@ impl<'a> Parser<'a> { match self.token { token::SubstNt(name, _) => return Err(self.fatal(&format!("unknown macro variable `{}`", - token::get_ident(name)))), + name))), _ => {} } } @@ -4736,7 +4736,7 @@ impl<'a> Parser<'a> { if fields.is_empty() { return Err(self.fatal(&format!("unit-like struct definition should be \ written as `struct {};`", - token::get_ident(class_name.clone())))); + class_name))); } try!(self.bump()); @@ -4775,7 +4775,7 @@ impl<'a> Parser<'a> { if fields.is_empty() { return Err(self.fatal(&format!("unit-like struct definition should be \ written as `struct {};`", - token::get_ident(class_name.clone())))); + class_name))); } generics.where_clause = try!(self.parse_where_clause()); @@ -4920,8 +4920,7 @@ impl<'a> Parser<'a> { /// Returns either a path to a module, or . pub fn default_submod_path(id: ast::Ident, dir_path: &Path, codemap: &CodeMap) -> ModulePath { - let mod_string = token::get_ident(id); - let mod_name = mod_string.to_string(); + let mod_name = id.to_string(); let default_path_str = format!("{}.rs", mod_name); let secondary_path_str = format!("{}/mod.rs", mod_name); let default_path = dir_path.join(&default_path_str); @@ -5009,7 +5008,7 @@ impl<'a> Parser<'a> { self.eval_src_mod_from_path(path, owns_directory, - token::get_ident(id).to_string(), + id.to_string(), id_sp) } @@ -5213,7 +5212,7 @@ impl<'a> Parser<'a> { self.span_err(start_span, &format!("unit-like struct variant should be written \ without braces, as `{},`", - token::get_ident(ident))); + ident)); } kind = StructVariantKind(struct_def); } else if self.check(&token::OpenDelim(token::Paren)) { @@ -5281,8 +5280,7 @@ impl<'a> Parser<'a> { let sp = self.span; self.expect_no_suffix(sp, "ABI spec", suf); try!(self.bump()); - let the_string = s.as_str(); - match abi::lookup(the_string) { + match abi::lookup(&s.as_str()) { Some(abi) => Ok(Some(abi)), None => { let last_span = self.last_span; @@ -5291,7 +5289,7 @@ impl<'a> Parser<'a> { &format!("illegal ABI: expected one of [{}], \ found `{}`", abi::all_names().join(", "), - the_string)); + s)); Ok(None) } } diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 832fec40199..bd479255438 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -647,6 +647,12 @@ impl InternedString { string: string, } } + + #[inline] + pub fn new_from_name(name: ast::Name) -> InternedString { + let interner = get_ident_interner(); + InternedString::new_from_rc_str(interner.get(name)) + } } impl Deref for InternedString { @@ -678,7 +684,7 @@ impl<'a> PartialEq<&'a str> for InternedString { } } -impl<'a> PartialEq<InternedString > for &'a str { +impl<'a> PartialEq<InternedString> for &'a str { #[inline(always)] fn eq(&self, other: &InternedString) -> bool { PartialEq::eq(*self, &other.string[..]) @@ -691,7 +697,7 @@ impl<'a> PartialEq<InternedString > for &'a str { impl Decodable for InternedString { fn decode<D: Decoder>(d: &mut D) -> Result<InternedString, D::Error> { - Ok(get_name(get_ident_interner().intern(&try!(d.read_str())[..]))) + Ok(intern(try!(d.read_str()).as_ref()).as_str()) } } @@ -701,25 +707,11 @@ impl Encodable for InternedString { } } -/// Returns the string contents of a name, using the thread-local interner. -#[inline] -pub fn get_name(name: ast::Name) -> InternedString { - let interner = get_ident_interner(); - InternedString::new_from_rc_str(interner.get(name)) -} - -/// Returns the string contents of an identifier, using the thread-local -/// interner. -#[inline] -pub fn get_ident(ident: ast::Ident) -> InternedString { - get_name(ident.name) -} - /// Interns and returns the string contents of an identifier, using the /// thread-local interner. #[inline] pub fn intern_and_get_ident(s: &str) -> InternedString { - get_name(intern(s)) + intern(s).as_str() } /// Maps a string to its interned representation. |
