diff options
| author | John Hodge <tpg@ucc.asn.au> | 2019-01-21 08:15:58 +0800 | 
|---|---|---|
| committer | John Hodge <tpg@ucc.asn.au> | 2019-01-21 08:15:58 +0800 | 
| commit | 048666d6415bf8dfff11ddbf287fc488833ab609 (patch) | |
| tree | 43d68cb92b17d1398e068077733543363bd4af3b | |
| parent | 86f47abeb42c98d450c9ff4c0418320077b3f0cd (diff) | |
| download | mrust-048666d6415bf8dfff11ddbf287fc488833ab609.tar.gz | |
macro_rules - :lifetime fragment
| -rw-r--r-- | src/macro_rules/eval.cpp | 9 | ||||
| -rw-r--r-- | src/macro_rules/macro_rules.hpp | 1 | ||||
| -rw-r--r-- | src/macro_rules/mod.cpp | 2 | ||||
| -rw-r--r-- | src/macro_rules/parse.cpp | 14 | 
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 "";  } | 
