1 // Copyright (C) 2020-2024 Free Software Foundation, Inc.
3 // This file is part of GCC.
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
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
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/>.
19 #include "rust-macro-invoc-lexer.h"
20 #include "rust-token.h"
25 MacroInvocLexer::peek_token (int n
)
27 if ((offs
+ n
) >= token_stream
.size ())
28 return Token::make (END_OF_FILE
, UNDEF_LOCATION
);
30 return token_stream
.at (offs
+ n
)->get_tok_ptr ();
34 MacroInvocLexer::split_current_token (TokenId new_left
, TokenId new_right
)
36 auto ¤t_token
= token_stream
.at (offs
);
37 auto current_pos
= token_stream
.begin () + offs
;
39 auto l_tok
= Token::make (new_left
, current_token
->get_locus ());
40 auto r_tok
= Token::make (new_right
, current_token
->get_locus ());
42 token_stream
.erase (current_pos
);
44 // `insert` inserts before the specified position, so we insert the right one
46 token_stream
.insert (current_pos
,
47 std::unique_ptr
<AST::Token
> (new AST::Token (r_tok
)));
48 token_stream
.insert (current_pos
,
49 std::unique_ptr
<AST::Token
> (new AST::Token (l_tok
)));
53 MacroInvocLexer::split_current_token (std::vector
<TokenPtr
> new_tokens
)
55 rust_assert (new_tokens
.size () > 0);
57 auto current_pos
= token_stream
.begin () + offs
;
59 token_stream
.erase (current_pos
);
61 for (size_t i
= 1; i
< new_tokens
.size (); i
++)
63 token_stream
.insert (current_pos
+ i
, std::unique_ptr
<AST::Token
> (
64 new AST::Token (new_tokens
[i
])));
68 std::vector
<std::unique_ptr
<AST::Token
>>
69 MacroInvocLexer::get_token_slice (size_t start_idx
, size_t end_idx
) const
71 std::vector
<std::unique_ptr
<AST::Token
>> slice
;
73 rust_assert (end_idx
< token_stream
.size ());
75 for (size_t i
= start_idx
; i
< end_idx
; i
++)
76 slice
.emplace_back (token_stream
[i
]->clone_token ());