summaryrefslogtreecommitdiff
path: root/src/macro_rules
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2019-05-19 22:15:02 +0800
committerJohn Hodge <tpg@ucc.asn.au>2019-05-19 22:15:02 +0800
commitb48167dec0c1c05b463991a8db5a8db70a5ae604 (patch)
treeeadc95ab546a617d298fb3a16fb080e1bc4355e8 /src/macro_rules
parentdab5cf5462d8fce6d6fcaa1343df8f5f3b763b8a (diff)
downloadmrust-b48167dec0c1c05b463991a8db5a8db70a5ae604.tar.gz
All - Switch to using interned (de-duplicated) RcString-s instead of std::string for paths/identifiers
Diffstat (limited to 'src/macro_rules')
-rw-r--r--src/macro_rules/eval.cpp14
-rw-r--r--src/macro_rules/macro_rules.hpp12
-rw-r--r--src/macro_rules/parse.cpp14
3 files changed, 20 insertions, 20 deletions
diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp
index c40eb810..2d1b6bb1 100644
--- a/src/macro_rules/eval.cpp
+++ b/src/macro_rules/eval.cpp
@@ -405,7 +405,7 @@ class MacroExpander:
{
const RcString m_macro_filename;
- const ::std::string m_crate_name;
+ const RcString m_crate_name;
::std::shared_ptr<Span> m_invocation_span;
ParameterMappings m_mappings;
@@ -418,7 +418,7 @@ class MacroExpander:
public:
MacroExpander(const MacroExpander& x) = delete;
- MacroExpander(const ::std::string& macro_name, const Span& sp, const Ident::Hygiene& parent_hygiene, const ::std::vector<MacroExpansionEnt>& contents, ParameterMappings mappings, ::std::string crate_name):
+ MacroExpander(const ::std::string& macro_name, const Span& sp, const Ident::Hygiene& parent_hygiene, const ::std::vector<MacroExpansionEnt>& contents, ParameterMappings mappings, RcString crate_name):
m_macro_filename( FMT("Macro:" << macro_name) ),
m_crate_name( mv$(crate_name) ),
m_invocation_span( new Span(sp) ),
@@ -841,7 +841,7 @@ namespace
case TOK_SQUARE_OPEN:
return consume_tt(lex);
case TOK_IDENT:
- if( TARGETVER_1_29 && lex.next_tok().str() == "dyn" )
+ if( TARGETVER_1_29 && lex.next_tok().istr() == "dyn" )
lex.consume();
case TOK_RWORD_SUPER:
case TOK_RWORD_SELF:
@@ -1345,7 +1345,7 @@ namespace
return true;
// Macro invocation
// TODO: What about `union!` as a macro? Needs to be handled below
- if( (lex.next() == TOK_IDENT && lex.next_tok().str() != "union")
+ if( (lex.next() == TOK_IDENT && lex.next_tok().istr() != "union")
|| lex.next() == TOK_RWORD_SELF
|| lex.next() == TOK_RWORD_SUPER
|| lex.next() == TOK_DOUBLE_COLON
@@ -1481,7 +1481,7 @@ namespace
return false;
return consume_tt(lex);
case TOK_IDENT:
- if( lex.next_tok().str() == "union" )
+ if( lex.next_tok().istr() == "union" )
{
lex.consume();
if( lex.next() == TOK_EXCLAM )
@@ -1506,7 +1506,7 @@ namespace
return consume_tt(lex);
}
}
- else if( lex.next_tok().str() == "auto" )
+ else if( lex.next_tok().istr() == "auto" )
{
lex.consume();
if( lex.consume_if(TOK_RWORD_TRAIT) )
@@ -1960,7 +1960,7 @@ Token MacroExpander::realGetToken()
DEBUG("Crate name hack");
if( m_crate_name != "" )
{
- m_next_token = Token(TOK_STRING, m_crate_name);
+ m_next_token = Token(TOK_STRING, ::std::string(m_crate_name.c_str()));
return Token(TOK_DOUBLE_COLON);
}
break;
diff --git a/src/macro_rules/macro_rules.hpp b/src/macro_rules/macro_rules.hpp
index 9e408fd5..05b1e065 100644
--- a/src/macro_rules/macro_rules.hpp
+++ b/src/macro_rules/macro_rules.hpp
@@ -41,7 +41,7 @@ extern ::std::ostream& operator<<(::std::ostream& os, const MacroExpansionEnt& x
/// Matching pattern entry
struct MacroPatEnt
{
- ::std::string name;
+ RcString name;
unsigned int name_index = 0;
// TODO: Include a point span for the token?
Token tok;
@@ -77,7 +77,7 @@ struct MacroPatEnt
{
}
- MacroPatEnt(::std::string name, unsigned int name_index, Type type):
+ MacroPatEnt(RcString name, unsigned int name_index, Type type):
name( mv$(name) ),
name_index( name_index ),
tok(),
@@ -134,7 +134,7 @@ extern::std::ostream& operator<<(::std::ostream& os, const SimplePatEnt& x);
struct MacroRulesArm
{
/// Names for the parameters
- ::std::vector< ::std::string> m_param_names;
+ ::std::vector<RcString> m_param_names;
/// Patterns
::std::vector<SimplePatEnt> m_pattern;
@@ -164,7 +164,7 @@ public:
/// Crate that defined this macro
/// - Populated on deserialise if not already set
- ::std::string m_source_crate;
+ RcString m_source_crate;
Ident::Hygiene m_hygiene;
@@ -181,8 +181,8 @@ public:
extern ::std::unique_ptr<TokenStream> Macro_InvokeRules(const char *name, const MacroRules& rules, const Span& sp, TokenTree input, AST::Module& mod);
extern MacroRulesPtr Parse_MacroRules(TokenStream& lex);
-extern ::std::vector<MacroPatEnt> Parse_MacroRules_Pat(TokenStream& lex, enum eTokenType open, enum eTokenType close, ::std::vector< ::std::string>& names);
-extern ::std::vector<MacroExpansionEnt> Parse_MacroRules_Cont(TokenStream& lex, enum eTokenType open, enum eTokenType close, const ::std::vector< ::std::string>& var_names, ::std::map<unsigned int,bool>* var_set_ptr=nullptr);
+extern ::std::vector<MacroPatEnt> Parse_MacroRules_Pat(TokenStream& lex, enum eTokenType open, enum eTokenType close, ::std::vector<RcString>& names);
+extern ::std::vector<MacroExpansionEnt> Parse_MacroRules_Cont(TokenStream& lex, enum eTokenType open, enum eTokenType close, const ::std::vector<RcString>& var_names, ::std::map<unsigned int,bool>* var_set_ptr=nullptr);
extern MacroRulesArm Parse_MacroRules_MakeArm(Span pat_sp, ::std::vector<MacroPatEnt> pattern, ::std::vector<MacroExpansionEnt> contents);
#endif // MACROS_HPP_INCLUDED
diff --git a/src/macro_rules/parse.cpp b/src/macro_rules/parse.cpp
index 4bd8a577..97e1f8f9 100644
--- a/src/macro_rules/parse.cpp
+++ b/src/macro_rules/parse.cpp
@@ -30,7 +30,7 @@ public:
};
/// Parse the pattern of a macro_rules! arm
-::std::vector<MacroPatEnt> Parse_MacroRules_Pat(TokenStream& lex, enum eTokenType open, enum eTokenType close, ::std::vector< ::std::string>& names)
+::std::vector<MacroPatEnt> Parse_MacroRules_Pat(TokenStream& lex, enum eTokenType open, enum eTokenType close, ::std::vector<RcString>& names)
{
TRACE_FUNCTION;
Token tok;
@@ -60,10 +60,10 @@ public:
// TODO: Allow any reserved word
case TOK_RWORD_PUB ... TOK_RWORD_UNSIZED:
case TOK_IDENT: {
- ::std::string name = tok.type() == TOK_IDENT ? mv$(tok.str()) : FMT(tok);
+ auto name = tok.type() == TOK_IDENT ? tok.istr() : RcString::new_interned(FMT(tok));
GET_CHECK_TOK(tok, lex, TOK_COLON);
GET_CHECK_TOK(tok, lex, TOK_IDENT);
- ::std::string type = mv$(tok.str());
+ RcString type = tok.istr();
unsigned int idx = ::std::find( names.begin(), names.end(), name ) - names.begin();
if( idx == names.size() )
@@ -142,7 +142,7 @@ public:
::std::vector<MacroExpansionEnt> Parse_MacroRules_Cont(
TokenStream& lex,
enum eTokenType open, enum eTokenType close,
- const ::std::vector< ::std::string>& var_names,
+ const ::std::vector<RcString>& var_names,
::std::map<unsigned int,bool>* var_set_ptr/*=nullptr*/
)
{
@@ -221,7 +221,7 @@ public:
else if( tok.type() == TOK_IDENT || tok.type() >= TOK_RWORD_PUB )
{
// Look up the named parameter in the list of param names for this arm
- auto name = tok.type() == TOK_IDENT ? tok.str() : FMT(tok);
+ auto name = tok.type() == TOK_IDENT ? tok.istr() : RcString::new_interned(FMT(tok));
unsigned int idx = ::std::find(var_names.begin(), var_names.end(), name) - var_names.begin();
if( idx == var_names.size() ) {
// TODO: `error-chain`'s quick_error macro has an arm which refers to an undefined metavar.
@@ -269,7 +269,7 @@ MacroRule Parse_MacroRules_Var(TokenStream& lex)
throw ParseError::Unexpected(lex, tok);
}
// - Pattern entries
- ::std::vector< ::std::string> names;
+ ::std::vector<RcString> names;
{
auto ps = lex.start_span();
rule.m_pattern = Parse_MacroRules_Pat(lex, tok.type(), close, names);
@@ -294,7 +294,7 @@ MacroRule Parse_MacroRules_Var(TokenStream& lex)
}
// TODO: Also count the number of times each variable is used?
-void enumerate_names(const ::std::vector<MacroPatEnt>& pats, ::std::vector< ::std::string>& names)
+void enumerate_names(const ::std::vector<MacroPatEnt>& pats, ::std::vector<RcString>& names)
{
for( const auto& pat : pats )
{