diff --git a/gcc/rust/util/rust-token-converter.cc b/gcc/rust/util/rust-token-converter.cc index 67c1459769a..e0794f38eef 100644 --- a/gcc/rust/util/rust-token-converter.cc +++ b/gcc/rust/util/rust-token-converter.cc @@ -63,16 +63,41 @@ convert (ProcMacro::Span span) return span.start; } -static void -handle_suffix (ProcMacro::TokenStream &ts, const const_TokenPtr &token, - ProcMacro::LitKind kind) +static ProcMacro::Literal +handle_suffix (const const_TokenPtr &token, ProcMacro::LitKind kind) { auto str = token->as_string (); auto lookup = suffixes.lookup (token->get_type_hint ()); auto suffix = suffixes.is_iter_ok (lookup) ? lookup->second : ""; - ts.push (ProcMacro::TokenTree::make_tokentree ( - ProcMacro::Literal::make_literal (kind, convert (token->get_locus ()), str, - suffix))); + return ProcMacro::Literal::make_literal (kind, convert (token->get_locus ()), + str, suffix); +} + +ProcMacro::Literal +convert_literal (const_TokenPtr lit) +{ + auto loc = convert (lit->get_locus ()); + switch (lit->get_id ()) + { + case FLOAT_LITERAL: + return handle_suffix (lit, ProcMacro::LitKind::make_float ()); + case INT_LITERAL: + return handle_suffix (lit, ProcMacro::LitKind::make_integer ()); + case CHAR_LITERAL: + return ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_char (), + loc, lit->as_string ()); + case STRING_LITERAL: + return ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_str (), + loc, lit->as_string ()); + case BYTE_CHAR_LITERAL: + return ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_byte (), + loc, lit->as_string ()); + case BYTE_STRING_LITERAL: + return ProcMacro::Literal::make_literal ( + ProcMacro::LitKind::make_byte_str (), loc, lit->as_string ()); + default: + rust_unreachable (); + } } ProcMacro::TokenStream @@ -87,32 +112,13 @@ convert (const std::vector &tokens) { // Literals case FLOAT_LITERAL: - handle_suffix (trees.back (), token, - ProcMacro::LitKind::make_float ()); - break; case INT_LITERAL: - handle_suffix (trees.back (), token, - ProcMacro::LitKind::make_integer ()); - break; case CHAR_LITERAL: - trees.back ().push (ProcMacro::TokenTree::make_tokentree ( - ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_char (), - loc, token->as_string ()))); - break; case STRING_LITERAL: - trees.back ().push (ProcMacro::TokenTree::make_tokentree ( - ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_str (), - loc, token->as_string ()))); - break; case BYTE_CHAR_LITERAL: - trees.back ().push (ProcMacro::TokenTree::make_tokentree ( - ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_byte (), - loc, token->as_string ()))); - break; case BYTE_STRING_LITERAL: - trees.back ().push (ProcMacro::TokenTree::make_tokentree ( - ProcMacro::Literal::make_literal ( - ProcMacro::LitKind::make_byte_str (), loc, token->as_string ()))); + trees.back ().push ( + ProcMacro::TokenTree::make_tokentree (convert_literal (token))); break; // Ident case IDENTIFIER: diff --git a/gcc/rust/util/rust-token-converter.h b/gcc/rust/util/rust-token-converter.h index 75b3b38f372..3e9feebd058 100644 --- a/gcc/rust/util/rust-token-converter.h +++ b/gcc/rust/util/rust-token-converter.h @@ -29,6 +29,9 @@ convert (const std::vector &tokens); std::vector convert (const ProcMacro::TokenStream &ts); +ProcMacro::Literal +convert_literal (const_TokenPtr lit); + } // namespace Rust #endif /* ! RUST_TOKEN_CONVERTER_H */