Rollup merge of #49369 - petrochenkov:rprint, r=oli-obk

Fix pretty-printing for raw identifiers
This commit is contained in:
kennytm
2018-03-27 10:47:49 +02:00
committed by GitHub
7 changed files with 19 additions and 12 deletions

View File

@@ -142,6 +142,13 @@ pub fn is_path_segment_keyword(id: ast::Ident) -> bool {
id.name == keywords::DollarCrate.name()
}
// We see this identifier in a normal identifier position, like variable name or a type.
// How was it written originally? Did it use the raw form? Let's try to guess.
pub fn is_raw_guess(ident: ast::Ident) -> bool {
ident.name != keywords::Invalid.name() &&
is_reserved_ident(ident) && !is_path_segment_keyword(ident)
}
// Returns true for reserved identifiers used internally for elided lifetimes,
// unnamed method parameters, crate root module, error recovery etc.
pub fn is_special_ident(id: ast::Ident) -> bool {
@@ -236,7 +243,7 @@ impl Token {
/// Recovers a `Token` from an `ast::Ident`. This creates a raw identifier if necessary.
pub fn from_ast_ident(ident: ast::Ident) -> Token {
Ident(ident, is_reserved_ident(ident) && !is_path_segment_keyword(ident))
Ident(ident, is_raw_guess(ident))
}
/// Returns `true` if the token starts with '>'.

View File

@@ -2373,7 +2373,11 @@ impl<'a> State<'a> {
}
pub fn print_ident(&mut self, ident: ast::Ident) -> io::Result<()> {
self.s.word(&ident.name.as_str())?;
if token::is_raw_guess(ident) {
self.s.word(&format!("r#{}", ident))?;
} else {
self.s.word(&ident.name.as_str())?;
}
self.ann.post(self, NodeIdent(&ident))
}