summaryrefslogtreecommitdiff
path: root/src/macro_rules
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2019-01-21 08:15:58 +0800
committerJohn Hodge <tpg@ucc.asn.au>2019-01-21 08:15:58 +0800
commit048666d6415bf8dfff11ddbf287fc488833ab609 (patch)
tree43d68cb92b17d1398e068077733543363bd4af3b /src/macro_rules
parent86f47abeb42c98d450c9ff4c0418320077b3f0cd (diff)
downloadmrust-048666d6415bf8dfff11ddbf287fc488833ab609.tar.gz
macro_rules - :lifetime fragment
Diffstat (limited to 'src/macro_rules')
-rw-r--r--src/macro_rules/eval.cpp9
-rw-r--r--src/macro_rules/macro_rules.hpp1
-rw-r--r--src/macro_rules/mod.cpp2
-rw-r--r--src/macro_rules/parse.cpp14
4 files changed, 25 insertions, 1 deletions
diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp
index e864537c..fd0f5648 100644
--- a/src/macro_rules/eval.cpp
+++ b/src/macro_rules/eval.cpp
@@ -654,9 +654,11 @@ bool Macro_TryPatternCap(TokenStream& lex, MacroPatEnt::Type type)
case MacroPatEnt::PAT_META:
return LOOK_AHEAD(lex) == TOK_IDENT || LOOK_AHEAD(lex) == TOK_INTERPOLATED_META;
case MacroPatEnt::PAT_ITEM:
- return is_token_item( LOOK_AHEAD(lex) ) || LOOK_AHEAD(lex) == TOK_IDENT;
+ return is_token_item( LOOK_AHEAD(lex) ) || LOOK_AHEAD(lex) == TOK_IDENT; // Huh? Ident?
case MacroPatEnt::PAT_VIS:
return is_token_vis( LOOK_AHEAD(lex) );
+ case MacroPatEnt::PAT_LIFETIME:
+ return LOOK_AHEAD(lex) == TOK_LIFETIME;
}
BUG(lex.point_span(), "Fell through");
}
@@ -727,6 +729,9 @@ InterpolatedFragment Macro_HandlePatternCap(TokenStream& lex, MacroPatEnt::Type
return InterpolatedFragment( TokenTree(lex.getHygiene(), tok) );
case MacroPatEnt::PAT_VIS:
return InterpolatedFragment( Parse_Publicity(lex, /*allow_restricted=*/true) );
+ case MacroPatEnt::PAT_LIFETIME:
+ GET_CHECK_TOK(tok, lex, TOK_LIFETIME);
+ return InterpolatedFragment( TokenTree(lex.getHygiene(), tok) );
}
throw "";
}
@@ -1950,6 +1955,8 @@ namespace
return consume_item(lex);
case MacroPatEnt::PAT_VIS:
return consume_vis(lex);
+ case MacroPatEnt::PAT_LIFETIME:
+ return lex.consume_if(TOK_LIFETIME);
}
return true;
}
diff --git a/src/macro_rules/macro_rules.hpp b/src/macro_rules/macro_rules.hpp
index 9ec6a6bb..29c4f93d 100644
--- a/src/macro_rules/macro_rules.hpp
+++ b/src/macro_rules/macro_rules.hpp
@@ -61,6 +61,7 @@ struct MacroPatEnt
PAT_META,
PAT_ITEM, // :item
PAT_VIS,
+ PAT_LIFETIME,
} type;
MacroPatEnt():
diff --git a/src/macro_rules/mod.cpp b/src/macro_rules/mod.cpp
index 3297a139..04f1577a 100644
--- a/src/macro_rules/mod.cpp
+++ b/src/macro_rules/mod.cpp
@@ -200,6 +200,7 @@ MacroRulesPtr::~MacroRulesPtr()
case MacroPatEnt::PAT_META: os << "meta"; break;
case MacroPatEnt::PAT_ITEM: os << "item"; break;
case MacroPatEnt::PAT_VIS: os << "vis"; break;
+ case MacroPatEnt::PAT_LIFETIME: os << "lifetime"; break;
}
break;
}
@@ -222,6 +223,7 @@ MacroRulesPtr::~MacroRulesPtr()
case MacroPatEnt::PAT_META: os << "PAT_META"; break;
case MacroPatEnt::PAT_ITEM: os << "PAT_ITEM"; break;
case MacroPatEnt::PAT_VIS: os << "PAT_VIS"; break;
+ case MacroPatEnt::PAT_LIFETIME: os << "PAT_LIFETIME"; break;
}
return os;
}
diff --git a/src/macro_rules/parse.cpp b/src/macro_rules/parse.cpp
index e6d9d7ae..8af9bd07 100644
--- a/src/macro_rules/parse.cpp
+++ b/src/macro_rules/parse.cpp
@@ -84,6 +84,8 @@ public:
ret.push_back( MacroPatEnt(name, idx, MacroPatEnt::PAT_ITEM) );
else if( /*TARGETVER_1_29 && */ type == "vis" ) // TODO: Should this be selective?
ret.push_back( MacroPatEnt(name, idx, MacroPatEnt::PAT_VIS) );
+ else if( /*TARGETVER_1_29 && */ type == "lifetime" ) // TODO: Should this be selective?
+ ret.push_back( MacroPatEnt(name, idx, MacroPatEnt::PAT_LIFETIME) );
else
ERROR(lex.point_span(), E0000, "Unknown fragment type '" << type << "'");
break; }
@@ -443,6 +445,18 @@ bool patterns_are_same(const Span& sp, const MacroPatEnt& left, const MacroPatEn
default:
ERROR(sp, E0000, "Incompatible macro fragments " << right << " used with " << left);
}
+ case MacroPatEnt::PAT_LIFETIME:
+ switch(left.type)
+ {
+ case MacroPatEnt::PAT_TOKEN:
+ if( left.tok.type() == TOK_LIFETIME )
+ ERROR(sp, E0000, "Incompatible macro fragments");
+ return false;
+ case MacroPatEnt::PAT_LIFETIME:
+ return true;
+ default:
+ ERROR(sp, E0000, "Incompatible macro fragments " << right << " used with " << left);
+ }
}
throw "";
}