diff options
Diffstat (limited to 'gcc/rust')
-rw-r--r-- | gcc/rust/ast/rust-macro.cc | 3 | ||||
-rw-r--r-- | gcc/rust/ast/rust-macro.h | 1 | ||||
-rw-r--r-- | gcc/rust/expand/rust-macro-builtins.cc | 33 | ||||
-rw-r--r-- | gcc/rust/expand/rust-macro-builtins.h | 3 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.cc | 1 |
5 files changed, 41 insertions, 0 deletions
diff --git a/gcc/rust/ast/rust-macro.cc b/gcc/rust/ast/rust-macro.cc index 0b21d42..b558969 100644 --- a/gcc/rust/ast/rust-macro.cc +++ b/gcc/rust/ast/rust-macro.cc @@ -42,6 +42,9 @@ builtin_macro_from_string (const std::string &identifier) if (identifier == "include_str") return BuiltinMacro::IncludeStr; + if (identifier == "stringify") + return BuiltinMacro::Stringify; + if (identifier == "compile_error") return BuiltinMacro::CompileError; diff --git a/gcc/rust/ast/rust-macro.h b/gcc/rust/ast/rust-macro.h index 0e6b8e3..2ea42e4 100644 --- a/gcc/rust/ast/rust-macro.h +++ b/gcc/rust/ast/rust-macro.h @@ -589,6 +589,7 @@ enum class BuiltinMacro Column, IncludeBytes, IncludeStr, + Stringify, CompileError, Concat, Env, diff --git a/gcc/rust/expand/rust-macro-builtins.cc b/gcc/rust/expand/rust-macro-builtins.cc index 2bd8120..2c6856a 100644 --- a/gcc/rust/expand/rust-macro-builtins.cc +++ b/gcc/rust/expand/rust-macro-builtins.cc @@ -58,6 +58,9 @@ make_macro_path_str (AST::BuiltinMacro kind) case AST::BuiltinMacro::IncludeStr: path_str = "include_str"; break; + case AST::BuiltinMacro::Stringify: + path_str = "stringify"; + break; case AST::BuiltinMacro::CompileError: path_str = "compile_error"; break; @@ -845,4 +848,34 @@ MacroBuiltin::line_handler (Location invoc_locus, AST::MacroInvocData &) return AST::Fragment ({line_no}, std::move (tok)); } +AST::Fragment +MacroBuiltin::stringify_handler (Location invoc_locus, + AST::MacroInvocData &invoc) +{ + std::string content; + auto invoc_token_tree = invoc.get_delim_tok_tree (); + auto tokens = invoc_token_tree.to_token_stream (); + + // Tokens stream includes the first and last delimiter + // which we need to skip. + for (auto token = tokens.cbegin () + 1; token < tokens.cend () - 1; token++) + { + // Rust stringify format has no garantees but the reference compiler + // removes spaces before some tokens depending on the lexer's behavior, + // let's mimick some of those behaviors. + auto token_id = (*token)->get_id (); + if (token_id != RIGHT_PAREN && token_id != EXCLAM + && token != tokens.cbegin () + 1) + { + content.push_back (' '); + } + content += (*token)->as_string (); + } + + auto node = AST::SingleASTNode (make_string (invoc_locus, content)); + auto token + = make_token (Token::make_string (invoc_locus, std::move (content))); + return AST::Fragment ({node}, std::move (token)); +} // namespace Rust + } // namespace Rust diff --git a/gcc/rust/expand/rust-macro-builtins.h b/gcc/rust/expand/rust-macro-builtins.h index 0cab9b1..bd4f1f9 100644 --- a/gcc/rust/expand/rust-macro-builtins.h +++ b/gcc/rust/expand/rust-macro-builtins.h @@ -79,6 +79,9 @@ public: static AST::Fragment include_str_handler (Location invoc_locus, AST::MacroInvocData &invoc); + static AST::Fragment stringify_handler (Location invoc_locus, + AST::MacroInvocData &invoc); + static AST::Fragment compile_error_handler (Location invoc_locus, AST::MacroInvocData &invoc); diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index f78ef93..535731b 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -856,6 +856,7 @@ Mappings::insert_macro_def (AST::MacroRulesDefinition *macro) {"column", MacroBuiltin::column_handler}, {"include_bytes", MacroBuiltin::include_bytes_handler}, {"include_str", MacroBuiltin::include_str_handler}, + {"stringify", MacroBuiltin::stringify_handler}, {"compile_error", MacroBuiltin::compile_error_handler}, {"concat", MacroBuiltin::concat_handler}, {"env", MacroBuiltin::env_handler}, |