1  // Copyright (C) 2020-2023 Free Software Foundation, Inc.
       2  
       3  // This file is part of GCC.
       4  
       5  // GCC is free software; you can redistribute it and/or modify it under
       6  // the terms of the GNU General Public License as published by the Free
       7  // Software Foundation; either version 3, or (at your option) any later
       8  // version.
       9  
      10  // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      11  // WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12  // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      13  // for more details.
      14  
      15  // You should have received a copy of the GNU General Public License
      16  // along with GCC; see the file COPYING3.  If not see
      17  // <http://www.gnu.org/licenses/>.
      18  
      19  #ifndef RUST_MACRO_INVOC_LEXER_H
      20  #define RUST_MACRO_INVOC_LEXER_H
      21  
      22  #include "rust-ast.h"
      23  
      24  namespace Rust {
      25  class MacroInvocLexer
      26  {
      27  public:
      28    MacroInvocLexer (std::vector<std::unique_ptr<AST::Token>> stream)
      29      : offs (0), token_stream (std::move (stream))
      30    {}
      31  
      32    // Returns token n tokens ahead of current position.
      33    const_TokenPtr peek_token (int n);
      34  
      35    // Peeks the current token.
      36    const_TokenPtr peek_token () { return peek_token (0); }
      37  
      38    // Advances current token to n + 1 tokens ahead of current position.
      39    void skip_token (int n);
      40  
      41    // Skips the current token.
      42    void skip_token () { skip_token (0); }
      43  
      44    // Splits the current token into two. Intended for use with nested generics
      45    // closes (i.e. T<U<X>> where >> is wrongly lexed as one token). Note that
      46    // this will only work with "simple" tokens like punctuation.
      47    void split_current_token (TokenId new_left, TokenId new_right);
      48  
      49    std::string get_filename () const
      50    {
      51      // FIXME
      52      gcc_unreachable ();
      53      return "FIXME";
      54    }
      55  
      56    size_t get_offs () const { return offs; }
      57  
      58    std::vector<std::unique_ptr<AST::Token>>
      59    get_token_slice (size_t start_idx, size_t end_idx) const;
      60  
      61  private:
      62    size_t offs;
      63    std::vector<std::unique_ptr<AST::Token>> token_stream;
      64  };
      65  } // namespace Rust
      66  
      67  #endif // RUST_MACRO_INVOC_LEXER_H