]>
git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/rust/expand/rust-proc-macro-invoc-lexer.cc
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-proc-macro-invoc-lexer.h"
20 #include "rust-token.h"
25 ProcMacroInvocLexer::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
);
34 ProcMacroInvocLexer::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
, l_tok
);
47 token_stream
.insert (current_pos
, r_tok
);
51 ProcMacroInvocLexer::split_current_token (std::vector
<TokenPtr
> new_tokens
)
53 rust_assert (new_tokens
.size () > 0);
55 auto current_pos
= token_stream
.begin () + offs
;
57 token_stream
.erase (current_pos
);
59 for (size_t i
= 1; i
< new_tokens
.size (); i
++)
61 token_stream
.insert (current_pos
+ i
, new_tokens
[i
]);