diff options
| author | John Hodge <tpg@ucc.asn.au> | 2017-10-29 12:44:01 +0800 | 
|---|---|---|
| committer | John Hodge <tpg@ucc.asn.au> | 2017-10-29 12:44:01 +0800 | 
| commit | 94ad750f1727a977b5e5e2b094527e6c449df41d (patch) | |
| tree | 53dfa784a3beb7dc2d60b13aa6678dfe6b9c82e8 | |
| parent | 69311c5199292cd4b00b5c82fe8096d93b7e6465 (diff) | |
| download | mrust-94ad750f1727a977b5e5e2b094527e6c449df41d.tar.gz | |
Expand - Add parent spans to TTStream[O]
| -rw-r--r-- | src/expand/asm.cpp | 6 | ||||
| -rw-r--r-- | src/expand/cfg.cpp | 6 | ||||
| -rw-r--r-- | src/expand/concat.cpp | 4 | ||||
| -rw-r--r-- | src/expand/env.cpp | 8 | ||||
| -rw-r--r-- | src/expand/file_line.cpp | 8 | ||||
| -rw-r--r-- | src/expand/format_args.cpp | 4 | ||||
| -rw-r--r-- | src/expand/include.cpp | 10 | ||||
| -rw-r--r-- | src/expand/macro_rules.cpp | 4 | ||||
| -rw-r--r-- | src/expand/rustc_diagnostics.cpp | 8 | ||||
| -rw-r--r-- | src/expand/stringify.cpp | 4 | ||||
| -rw-r--r-- | src/macro_rules/eval.cpp | 17 | ||||
| -rw-r--r-- | src/parse/ttstream.cpp | 9 | ||||
| -rw-r--r-- | src/parse/ttstream.hpp | 8 | 
13 files changed, 51 insertions, 45 deletions
| diff --git a/src/expand/asm.cpp b/src/expand/asm.cpp index 336321f7..51412f99 100644 --- a/src/expand/asm.cpp +++ b/src/expand/asm.cpp @@ -38,7 +38,7 @@ class CAsmExpander:      ::std::unique_ptr<TokenStream> expand(const Span& sp, const ::AST::Crate& crate, const ::std::string& ident, const TokenTree& tt, AST::Module& mod) override      {          Token   tok; -        auto lex = TTStream(tt); +        auto lex = TTStream(sp, tt);          if( ident != "" )              ERROR(sp, E0000, "format_args! doesn't take an ident"); @@ -160,9 +160,9 @@ class CAsmExpander:              ERROR(sp, E0000, "Unexpected token in asm! - " << lex.getToken());          } +        // Convert this into an AST node and insert as an intepolated expression          ::AST::ExprNodeP rv = ::AST::ExprNodeP( new ::AST::ExprNode_Asm { mv$(template_text), mv$(outputs), mv$(inputs), mv$(clobbers), mv$(flags) } ); -        // TODO: Convert this into an AST node -        return box$( TTStreamO(TokenTree(Token( InterpolatedFragment(InterpolatedFragment::EXPR, rv.release()) )))); +        return box$( TTStreamO(sp, TokenTree(Token( InterpolatedFragment(InterpolatedFragment::EXPR, rv.release()) ))));      }  }; diff --git a/src/expand/cfg.cpp b/src/expand/cfg.cpp index 8572b2e5..a2fca312 100644 --- a/src/expand/cfg.cpp +++ b/src/expand/cfg.cpp @@ -97,15 +97,15 @@ class CCfgExpander:              ERROR(sp, E0000, "cfg! doesn't take an identifier");          } -        auto lex = TTStream(tt); +        auto lex = TTStream(sp, tt);          auto attrs = Parse_MetaItem(lex);          DEBUG("cfg!() - " << attrs);          if( check_cfg(sp, attrs) ) { -            return box$( TTStreamO(TokenTree({},TOK_RWORD_TRUE )) ); +            return box$( TTStreamO(sp, TokenTree({},TOK_RWORD_TRUE )) );          }          else { -            return box$( TTStreamO(TokenTree({},TOK_RWORD_FALSE)) ); +            return box$( TTStreamO(sp, TokenTree({},TOK_RWORD_FALSE)) );          }      }  }; diff --git a/src/expand/concat.cpp b/src/expand/concat.cpp index a08e9168..29a066df 100644 --- a/src/expand/concat.cpp +++ b/src/expand/concat.cpp @@ -20,7 +20,7 @@ class CConcatExpander:      {          Token   tok; -        auto lex = TTStream(tt); +        auto lex = TTStream(sp, tt);          if( ident != "" )              ERROR(sp, E0000, "format_args! doesn't take an ident"); @@ -64,7 +64,7 @@ class CConcatExpander:          if( tok.type() != TOK_EOF )              throw ParseError::Unexpected(lex, tok, {TOK_COMMA, TOK_EOF}); -        return box$( TTStreamO(TokenTree(Token(TOK_STRING, mv$(rv)))) ); +        return box$( TTStreamO(sp, TokenTree(Token(TOK_STRING, mv$(rv)))) );      }  }; diff --git a/src/expand/env.cpp b/src/expand/env.cpp index cad2fa7c..f4577ef1 100644 --- a/src/expand/env.cpp +++ b/src/expand/env.cpp @@ -14,7 +14,7 @@  namespace {      // Read a string out of the input stream      ::std::string get_string(const Span& sp, const AST::Crate& crate, AST::Module& mod, const TokenTree& tt) { -        auto lex = TTStream(tt); +        auto lex = TTStream(sp, tt);          auto n = Parse_ExprVal(lex);          ASSERT_BUG(sp, n, "No expression returned"); @@ -44,7 +44,7 @@ class CExpanderEnv:          if( !var_val_cstr ) {              ERROR(sp, E0000, "Environment variable '" << varname << "' not defined");          } -        return box$( TTStreamO(TokenTree(Token(TOK_STRING, var_val_cstr))) ); +        return box$( TTStreamO(sp, TokenTree(Token(TOK_STRING, var_val_cstr))) );      }  }; @@ -68,7 +68,7 @@ class CExpanderOptionEnv:              rv.push_back( Token(TOK_LIFETIME, "static") );              rv.push_back( Token(TOK_IDENT, "str") );              rv.push_back( Token(TOK_GT) ); -            return box$( TTStreamO(TokenTree( {}, mv$(rv) )) ); +            return box$( TTStreamO(sp, TokenTree( {}, mv$(rv) )) );          }          else {              ::std::vector< TokenTree>   rv; @@ -77,7 +77,7 @@ class CExpanderOptionEnv:              rv.push_back( Token(TOK_PAREN_OPEN) );              rv.push_back( Token(TOK_STRING, var_val_cstr) );              rv.push_back( Token(TOK_PAREN_CLOSE) ); -            return box$( TTStreamO(TokenTree( {}, mv$(rv) )) ); +            return box$( TTStreamO(sp, TokenTree( {}, mv$(rv) )) );          }      }  }; diff --git a/src/expand/file_line.cpp b/src/expand/file_line.cpp index 7e117993..7a827ccf 100644 --- a/src/expand/file_line.cpp +++ b/src/expand/file_line.cpp @@ -25,7 +25,7 @@ class CExpanderFile:  {      ::std::unique_ptr<TokenStream> expand(const Span& sp, const AST::Crate& crate, const ::std::string& ident, const TokenTree& tt, AST::Module& mod) override      { -        return box$( TTStreamO(TokenTree(Token(TOK_STRING, get_top_span(sp).filename.c_str()))) ); +        return box$( TTStreamO(sp, TokenTree(Token(TOK_STRING, get_top_span(sp).filename.c_str()))) );      }  }; @@ -34,7 +34,7 @@ class CExpanderLine:  {      ::std::unique_ptr<TokenStream> expand(const Span& sp, const AST::Crate& crate, const ::std::string& ident, const TokenTree& tt, AST::Module& mod) override      { -        return box$( TTStreamO(TokenTree(Token((uint64_t)get_top_span(sp).start_line, CORETYPE_U32))) ); +        return box$( TTStreamO(sp, TokenTree(Token((uint64_t)get_top_span(sp).start_line, CORETYPE_U32))) );      }  }; @@ -43,7 +43,7 @@ class CExpanderColumn:  {      ::std::unique_ptr<TokenStream> expand(const Span& sp, const AST::Crate& crate, const ::std::string& ident, const TokenTree& tt, AST::Module& mod) override      { -        return box$( TTStreamO(TokenTree(Token((uint64_t)get_top_span(sp).start_ofs, CORETYPE_U32))) ); +        return box$( TTStreamO(sp, TokenTree(Token((uint64_t)get_top_span(sp).start_ofs, CORETYPE_U32))) );      }  }; @@ -58,7 +58,7 @@ class CExpanderModulePath:                  path_str += "::";              path_str += comp.name();          } -        return box$( TTStreamO(TokenTree( Token(TOK_STRING, mv$(path_str)) )) ); +        return box$( TTStreamO(sp, TokenTree( Token(TOK_STRING, mv$(path_str)) )) );      }  }; diff --git a/src/expand/format_args.cpp b/src/expand/format_args.cpp index e4c02b8b..dfad2397 100644 --- a/src/expand/format_args.cpp +++ b/src/expand/format_args.cpp @@ -440,7 +440,7 @@ class CFormatArgsExpander:      {          Token   tok; -        auto lex = TTStream(tt); +        auto lex = TTStream(sp, tt);          if( ident != "" )              ERROR(sp, E0000, "format_args! doesn't take an ident"); @@ -716,7 +716,7 @@ class CFormatArgsExpander:          toks.push_back( TokenTree(TOK_BRACE_CLOSE) );          toks.push_back( TokenTree(TOK_BRACE_CLOSE) ); -        return box$( TTStreamO(TokenTree(Ident::Hygiene::new_scope(), mv$(toks))) ); +        return box$( TTStreamO(sp, TokenTree(Ident::Hygiene::new_scope(), mv$(toks))) );      }  }; diff --git a/src/expand/include.cpp b/src/expand/include.cpp index e66e07ce..59f33d47 100644 --- a/src/expand/include.cpp +++ b/src/expand/include.cpp @@ -69,7 +69,7 @@ class CIncludeExpander:              ERROR(sp, E0000, "include! doesn't take an ident");          Token   tok; -        auto lex = TTStream(tt); +        auto lex = TTStream(sp, tt);          auto path = get_string(sp, lex, crate, mod);          GET_CHECK_TOK(tok, lex, TOK_EOF); @@ -95,7 +95,7 @@ class CIncludeBytesExpander:              ERROR(sp, E0000, "include_bytes! doesn't take an ident");          Token   tok; -        auto lex = TTStream(tt); +        auto lex = TTStream(sp, tt);          auto path = get_string(sp, lex, crate, mod);          GET_CHECK_TOK(tok, lex, TOK_EOF); @@ -111,7 +111,7 @@ class CIncludeBytesExpander:          ::std::vector<TokenTree>    toks;          toks.push_back(Token(TOK_BYTESTRING, mv$(ss.str()))); -        return box$( TTStreamO(TokenTree(Ident::Hygiene::new_scope(), mv$(toks))) ); +        return box$( TTStreamO(sp, TokenTree(Ident::Hygiene::new_scope(), mv$(toks))) );      }  }; @@ -124,7 +124,7 @@ class CIncludeStrExpander:              ERROR(sp, E0000, "include_str! doesn't take an ident");          Token   tok; -        auto lex = TTStream(tt); +        auto lex = TTStream(sp, tt);          auto path = get_string(sp, lex, crate, mod);          GET_CHECK_TOK(tok, lex, TOK_EOF); @@ -140,7 +140,7 @@ class CIncludeStrExpander:          ::std::vector<TokenTree>    toks;          toks.push_back(Token(TOK_STRING, mv$(ss.str()))); -        return box$( TTStreamO(TokenTree(Ident::Hygiene::new_scope(), mv$(toks))) ); +        return box$( TTStreamO(sp, TokenTree(Ident::Hygiene::new_scope(), mv$(toks))) );      }  }; diff --git a/src/expand/macro_rules.cpp b/src/expand/macro_rules.cpp index 0375f430..7faa8223 100644 --- a/src/expand/macro_rules.cpp +++ b/src/expand/macro_rules.cpp @@ -28,11 +28,11 @@ class CMacroRulesExpander:              ERROR(sp, E0000, "macro_rules! requires an identifier" );          DEBUG("Parsing macro_rules! " << ident); -        TTStream    lex(tt); +        TTStream    lex(sp, tt);          auto mac = Parse_MacroRules(lex);          mod.add_macro( false, ident, mv$(mac) ); -        return ::std::unique_ptr<TokenStream>( new TTStreamO(TokenTree()) ); +        return ::std::unique_ptr<TokenStream>( new TTStreamO(sp, TokenTree()) );      }  }; diff --git a/src/expand/rustc_diagnostics.cpp b/src/expand/rustc_diagnostics.cpp index f2e436c4..0e95bb7c 100644 --- a/src/expand/rustc_diagnostics.cpp +++ b/src/expand/rustc_diagnostics.cpp @@ -15,7 +15,7 @@ class CExpanderRegisterDiagnostic:  {      ::std::unique_ptr<TokenStream> expand(const Span& sp, const AST::Crate& crate, const ::std::string& ident, const TokenTree& tt, AST::Module& mod) override      { -        return box$( TTStreamO(TokenTree()) ); +        return box$( TTStreamO(sp, TokenTree()) );      }  };  class CExpanderDiagnosticUsed: @@ -23,7 +23,7 @@ class CExpanderDiagnosticUsed:  {      ::std::unique_ptr<TokenStream> expand(const Span& sp, const AST::Crate& crate, const ::std::string& ident, const TokenTree& tt, AST::Module& mod) override      { -        return box$( TTStreamO(TokenTree()) ); +        return box$( TTStreamO(sp, TokenTree()) );      }  };  class CExpanderBuildDiagnosticArray: @@ -33,7 +33,7 @@ class CExpanderBuildDiagnosticArray:      {          if( ident != "" )              ERROR(sp, E0000, "__build_diagnostic_array! doesn't take an ident"); -        auto lex = TTStream(tt); +        auto lex = TTStream(sp, tt);          Token   tok; @@ -64,7 +64,7 @@ class CExpanderBuildDiagnosticArray:          toks.push_back( TOK_SQUARE_CLOSE );          toks.push_back( TOK_SEMICOLON ); -        return box$( TTStreamO(TokenTree( lex.getHygiene(), mv$(toks) )) ); +        return box$( TTStreamO(sp, TokenTree( lex.getHygiene(), mv$(toks) )) );      }  }; diff --git a/src/expand/stringify.cpp b/src/expand/stringify.cpp index cbb5c65c..06c65c02 100644 --- a/src/expand/stringify.cpp +++ b/src/expand/stringify.cpp @@ -17,7 +17,7 @@ class CExpander:          Token   tok;          ::std::string rv; -        auto lex = TTStream(tt); +        auto lex = TTStream(sp, tt);          while( GET_TOK(tok, lex) != TOK_EOF )          {              if(!rv.empty()) @@ -25,7 +25,7 @@ class CExpander:              rv += tok.to_str();          } -        return box$( TTStreamO(TokenTree(Token(TOK_STRING, mv$(rv)))) ); +        return box$( TTStreamO(sp, TokenTree(Token(TOK_STRING, mv$(rv)))) );      }  }; diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp index ebee2019..5b041717 100644 --- a/src/macro_rules/eval.cpp +++ b/src/macro_rules/eval.cpp @@ -169,7 +169,7 @@ private:  };  // === Prototypes === -unsigned int Macro_InvokeRules_MatchPattern(const MacroRules& rules, TokenTree input, AST::Module& mod,  ParameterMappings& bound_tts); +unsigned int Macro_InvokeRules_MatchPattern(const Span& sp, const MacroRules& rules, TokenTree input, AST::Module& mod,  ParameterMappings& bound_tts);  void Macro_InvokeRules_CountSubstUses(ParameterMappings& bound_tts, const ::std::vector<MacroExpansionEnt>& contents);  // ------------------------------------ @@ -730,7 +730,7 @@ InterpolatedFragment Macro_HandlePatternCap(TokenStream& lex, MacroPatEnt::Type      TRACE_FUNCTION_F("'" << name << "', " << input);      ParameterMappings   bound_tts; -    unsigned int    rule_index = Macro_InvokeRules_MatchPattern(rules, mv$(input), mod,  bound_tts); +    unsigned int    rule_index = Macro_InvokeRules_MatchPattern(sp, rules, mv$(input), mod,  bound_tts);      const auto& rule = rules.m_rules.at(rule_index); @@ -1759,10 +1759,9 @@ namespace      }  } -unsigned int Macro_InvokeRules_MatchPattern(const MacroRules& rules, TokenTree input, AST::Module& mod,  ParameterMappings& bound_tts) +unsigned int Macro_InvokeRules_MatchPattern(const Span& sp, const MacroRules& rules, TokenTree input, AST::Module& mod,  ParameterMappings& bound_tts)  {      TRACE_FUNCTION; -    static Span sp;      struct ActiveArm {          unsigned int    index; @@ -1857,7 +1856,7 @@ unsigned int Macro_InvokeRules_MatchPattern(const MacroRules& rules, TokenTree i          // NOTE: There can be multiple arms active, take the first.          auto i = matches[0]; -        auto lex = TTStreamO(mv$(input)); +        auto lex = TTStreamO(sp, mv$(input));          SET_MODULE(lex, mod);          auto arm_stream = MacroPatternStream(rules.m_rules[i].m_pattern); @@ -1930,7 +1929,7 @@ unsigned int Macro_InvokeRules_MatchPattern(const MacroRules& rules, TokenTree i      }  }  #else -unsigned int Macro_InvokeRules_MatchPattern(const MacroRules& rules, TokenTree input, AST::Module& mod,  ParameterMappings& bound_tts) +unsigned int Macro_InvokeRules_MatchPattern(const Span& sp, const MacroRules& rules, TokenTree input, AST::Module& mod,  ParameterMappings& bound_tts)  {      TRACE_FUNCTION;      Span    sp;// = input.span(); @@ -1956,7 +1955,7 @@ unsigned int Macro_InvokeRules_MatchPattern(const MacroRules& rules, TokenTree i      // - List of captured values      ::std::vector<InterpolatedFragment> captures; -    TTStreamO   lex( mv$(input) ); +    TTStreamO   lex(sp, mv$(input) );      SET_MODULE(lex, mod);      while(true)      { @@ -2321,11 +2320,11 @@ Token MacroExpander::realGetToken()                  {                      if( can_steal )                      { -                        m_ttstream.reset( new TTStreamO( mv$(frag->as_tt()) ) ); +                        m_ttstream.reset( new TTStreamO(*this->outerSpan(), mv$(frag->as_tt()) ) );                      }                      else                      { -                        m_ttstream.reset( new TTStreamO( frag->as_tt().clone() ) ); +                        m_ttstream.reset( new TTStreamO(*this->outerSpan(), frag->as_tt().clone() ) );                      }                      return m_ttstream->getToken();                  } diff --git a/src/parse/ttstream.cpp b/src/parse/ttstream.cpp index 4ba4a6f5..32c9a90a 100644 --- a/src/parse/ttstream.cpp +++ b/src/parse/ttstream.cpp @@ -8,7 +8,8 @@  #include "ttstream.hpp"  #include <common.hpp> -TTStream::TTStream(const TokenTree& input_tt) +TTStream::TTStream(Span parent, const TokenTree& input_tt): +    m_parent_span( new Span(mv$(parent)) )  {      DEBUG("input_tt = [" << input_tt << "]");      m_stack.push_back( ::std::make_pair(0, &input_tt) ); @@ -52,6 +53,7 @@ Token TTStream::realGetToken()  }  Position TTStream::getPosition() const  { +    // TODO: Position associated with the previous/next token?      return Position("TTStream", 0,0);  }  Ident::Hygiene TTStream::realGetHygiene() const @@ -63,8 +65,9 @@ Ident::Hygiene TTStream::realGetHygiene() const  } -TTStreamO::TTStreamO(TokenTree input_tt): -    m_input_tt( mv$(input_tt) ) +TTStreamO::TTStreamO(Span parent, TokenTree input_tt): +    m_input_tt( mv$(input_tt) ), +    m_parent_span( new Span(mv$(parent)) )  {      m_stack.push_back( ::std::make_pair(0, nullptr) );  } diff --git a/src/parse/ttstream.hpp b/src/parse/ttstream.hpp index 946cca5f..530a177b 100644 --- a/src/parse/ttstream.hpp +++ b/src/parse/ttstream.hpp @@ -15,14 +15,16 @@ class TTStream:      public TokenStream  {      ::std::vector< ::std::pair<unsigned int, const TokenTree*> > m_stack; +    ::std::shared_ptr<Span> m_parent_span;      const Ident::Hygiene*   m_hygiene_ptr = nullptr;  public: -    TTStream(const TokenTree& input_tt); +    TTStream(Span parent, const TokenTree& input_tt);      ~TTStream();      TTStream& operator=(const TTStream& x) { m_stack = x.m_stack; return *this; }      Position getPosition() const override; +    ::std::shared_ptr<Span> outerSpan() const override { return m_parent_span; }  protected:      Ident::Hygiene realGetHygiene() const override; @@ -38,7 +40,8 @@ class TTStreamO:      ::std::vector< ::std::pair<unsigned int, TokenTree*> > m_stack;      const Ident::Hygiene*   m_hygiene_ptr = nullptr;  public: -    TTStreamO(TokenTree input_tt); +    ::std::shared_ptr<Span> m_parent_span; +    TTStreamO(Span parent, TokenTree input_tt);      TTStreamO(TTStreamO&& x) = default;      ~TTStreamO(); @@ -46,6 +49,7 @@ public:      TTStreamO& operator=(TTStreamO&& x) = default;      Position getPosition() const override; +    ::std::shared_ptr<Span> outerSpan() const override { return m_parent_span; }  protected:      Ident::Hygiene realGetHygiene() const override; | 
