Skip to content

Commit a671c41

Browse files
powerboat9CohenArthur
authored andcommitted
Use MacroInvocLexer in AttributeParser
This should make it easier for us to handle attribute meta items of the form <SimplePath> '=' <Expression> where the expression isn't a literal. Some low hanging fruit remains here, but I think I should keep this patch small as I had some trouble debugging it as-is (see: Rust::Token::as_string vs Rust::Token::get_str vs Rust::AST::Token::as_string). gcc/rust/ChangeLog: * ast/rust-ast.cc: Include "rust-macro-invoc-lexer.h". (AttributeParser::~AttributeParser): Move function definition here. (AttributeParser::AttributeParser): Likewise and adjust member initialization. (AttributeParser::parse_meta_item_inner): Handle changes to peek_token. (AttributeParser::parse_literal): Likewise. (AttributeParser::parse_simple_path_segment): Likewise. (AttributeParser::parse_meta_item_seq): Handle changes to AttributeParser fields. (AttributeParser::peek_token): Move function definition here and wrap MacroInvocLexer. (AttributeParser::skip_token): Likewise. * ast/rust-macro.h (class MacroInvocLexer): Forward declare. (class Parser): Likewise. (AttributeParser::token_stream): Remove field. (AttributeParser::stream_pos): Likewise. (AttributeParser::lexer): New field. (AttributeParser::parser): Likewise. (AttributeParser::AttributeParser): Move definition to "rust-ast.cc". (AttributeParser::~AttributeParser): Likewise. (AttributeParser::peek_token): Likewise. (AttributeParser::skip_token): Likewise. Signed-off-by: Owen Avery <[email protected]>
1 parent 6f1f7c7 commit a671c41

File tree

2 files changed

+51
-31
lines changed

2 files changed

+51
-31
lines changed

gcc/rust/ast/rust-ast.cc

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see
3333
#include "rust-operators.h"
3434
#include "rust-dir-owner.h"
3535
#include "rust-attribute-values.h"
36+
#include "rust-macro-invoc-lexer.h"
3637

3738
/* Compilation unit used for various AST-related functions that would make
3839
* the headers too long if they were defined inline and don't receive any
@@ -3508,6 +3509,17 @@ DelimTokenTree::parse_to_meta_item () const
35083509
return new AttrInputMetaItemContainer (std::move (meta_items));
35093510
}
35103511

3512+
AttributeParser::AttributeParser (
3513+
std::vector<std::unique_ptr<Token>> token_stream, int stream_start_pos)
3514+
: lexer (new MacroInvocLexer (std::move (token_stream))),
3515+
parser (new Parser<MacroInvocLexer> (*lexer))
3516+
{
3517+
if (stream_start_pos)
3518+
lexer->skip_token (stream_start_pos - 1);
3519+
}
3520+
3521+
AttributeParser::~AttributeParser () {}
3522+
35113523
std::unique_ptr<MetaItemInner>
35123524
AttributeParser::parse_meta_item_inner ()
35133525
{
@@ -3549,7 +3561,7 @@ AttributeParser::parse_meta_item_inner ()
35493561
return parse_path_meta_item ();
35503562
}
35513563

3552-
auto ident = peek_token ()->as_string ();
3564+
auto ident = peek_token ()->get_str ();
35533565
auto ident_locus = peek_token ()->get_locus ();
35543566

35553567
if (is_end_meta_item_tok (peek_token (1)->get_id ()))
@@ -3566,17 +3578,14 @@ AttributeParser::parse_meta_item_inner ()
35663578
&& is_end_meta_item_tok (peek_token (3)->get_id ()))
35673579
{
35683580
// meta name value str syntax
3569-
auto &value_tok = peek_token (2);
3570-
auto value = value_tok->as_string ();
3581+
const_TokenPtr value_tok = peek_token (2);
3582+
auto value = value_tok->get_str ();
35713583
auto locus = value_tok->get_locus ();
35723584

35733585
skip_token (2);
35743586

3575-
// remove the quotes from the string value
3576-
std::string raw_value = unquote_string (std::move (value));
3577-
35783587
return std::unique_ptr<MetaNameValueStr> (
3579-
new MetaNameValueStr (ident, ident_locus, std::move (raw_value),
3588+
new MetaNameValueStr (ident, ident_locus, std::move (value),
35803589
locus));
35813590
}
35823591
else
@@ -3728,7 +3737,6 @@ AttributeParser::parse_path_meta_item ()
37283737
std::vector<std::unique_ptr<MetaItemInner>>
37293738
AttributeParser::parse_meta_item_seq ()
37303739
{
3731-
int vec_length = token_stream.size ();
37323740
std::vector<std::unique_ptr<MetaItemInner>> meta_items;
37333741

37343742
if (peek_token ()->get_id () != LEFT_PAREN)
@@ -3739,7 +3747,8 @@ AttributeParser::parse_meta_item_seq ()
37393747
}
37403748
skip_token ();
37413749

3742-
while (stream_pos < vec_length && peek_token ()->get_id () != RIGHT_PAREN)
3750+
while (peek_token ()->get_id () != END_OF_FILE
3751+
&& peek_token ()->get_id () != RIGHT_PAREN)
37433752
{
37443753
std::unique_ptr<MetaItemInner> inner = parse_meta_item_inner ();
37453754
if (inner == nullptr)
@@ -3788,33 +3797,32 @@ DelimTokenTree::to_token_stream () const
37883797
Literal
37893798
AttributeParser::parse_literal ()
37903799
{
3791-
const std::unique_ptr<Token> &tok = peek_token ();
3800+
const_TokenPtr tok = peek_token ();
37923801
switch (tok->get_id ())
37933802
{
37943803
case CHAR_LITERAL:
37953804
skip_token ();
3796-
return Literal (tok->as_string (), Literal::CHAR, tok->get_type_hint ());
3805+
return Literal (tok->get_str (), Literal::CHAR, tok->get_type_hint ());
37973806
case STRING_LITERAL:
37983807
skip_token ();
3799-
return Literal (tok->as_string (), Literal::STRING,
3800-
tok->get_type_hint ());
3808+
return Literal (tok->get_str (), Literal::STRING, tok->get_type_hint ());
38013809
case BYTE_CHAR_LITERAL:
38023810
skip_token ();
3803-
return Literal (tok->as_string (), Literal::BYTE, tok->get_type_hint ());
3811+
return Literal (tok->get_str (), Literal::BYTE, tok->get_type_hint ());
38043812
case BYTE_STRING_LITERAL:
38053813
skip_token ();
3806-
return Literal (tok->as_string (), Literal::BYTE_STRING,
3814+
return Literal (tok->get_str (), Literal::BYTE_STRING,
38073815
tok->get_type_hint ());
38083816
case RAW_STRING_LITERAL:
38093817
skip_token ();
3810-
return Literal (tok->as_string (), Literal::RAW_STRING,
3818+
return Literal (tok->get_str (), Literal::RAW_STRING,
38113819
tok->get_type_hint ());
38123820
case INT_LITERAL:
38133821
skip_token ();
3814-
return Literal (tok->as_string (), Literal::INT, tok->get_type_hint ());
3822+
return Literal (tok->get_str (), Literal::INT, tok->get_type_hint ());
38153823
case FLOAT_LITERAL:
38163824
skip_token ();
3817-
return Literal (tok->as_string (), Literal::FLOAT, tok->get_type_hint ());
3825+
return Literal (tok->get_str (), Literal::FLOAT, tok->get_type_hint ());
38183826
case TRUE_LITERAL:
38193827
skip_token ();
38203828
return Literal ("true", Literal::BOOL, tok->get_type_hint ());
@@ -3872,12 +3880,12 @@ AttributeParser::parse_simple_path ()
38723880
SimplePathSegment
38733881
AttributeParser::parse_simple_path_segment ()
38743882
{
3875-
const std::unique_ptr<Token> &tok = peek_token ();
3883+
const_TokenPtr tok = peek_token ();
38763884
switch (tok->get_id ())
38773885
{
38783886
case IDENTIFIER:
38793887
skip_token ();
3880-
return SimplePathSegment (tok->as_string (), tok->get_locus ());
3888+
return SimplePathSegment (tok->get_str (), tok->get_locus ());
38813889
case SUPER:
38823890
skip_token ();
38833891
return SimplePathSegment ("super", tok->get_locus ());
@@ -3911,6 +3919,18 @@ AttributeParser::parse_meta_item_lit ()
39113919
new MetaItemLitExpr (std::move (lit_expr)));
39123920
}
39133921

3922+
const_TokenPtr
3923+
AttributeParser::peek_token (int i)
3924+
{
3925+
return lexer->peek_token (i);
3926+
}
3927+
3928+
void
3929+
AttributeParser::skip_token (int i)
3930+
{
3931+
lexer->skip_token (i);
3932+
}
3933+
39143934
bool
39153935
AttrInputMetaItemContainer::check_cfg_predicate (const Session &session) const
39163936
{

gcc/rust/ast/rust-macro.h

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
#include "rust-macro-builtins.h"
2828

2929
namespace Rust {
30+
31+
// forward declarations for AttributeParser
32+
class MacroInvocLexer;
33+
template <typename ManagedTokenSource> class Parser;
34+
3035
namespace AST {
3136

3237
class MacroFragSpec
@@ -1116,16 +1121,14 @@ struct AttributeParser
11161121
{
11171122
private:
11181123
// TODO: might as well rewrite to use lexer tokens
1119-
std::vector<std::unique_ptr<Token>> token_stream;
1120-
int stream_pos;
1124+
std::unique_ptr<MacroInvocLexer> lexer;
1125+
std::unique_ptr<Parser<MacroInvocLexer>> parser;
11211126

11221127
public:
11231128
AttributeParser (std::vector<std::unique_ptr<Token>> token_stream,
1124-
int stream_start_pos = 0)
1125-
: token_stream (std::move (token_stream)), stream_pos (stream_start_pos)
1126-
{}
1129+
int stream_start_pos = 0);
11271130

1128-
~AttributeParser () = default;
1131+
~AttributeParser ();
11291132

11301133
std::vector<std::unique_ptr<MetaItemInner>> parse_meta_item_seq ();
11311134

@@ -1146,12 +1149,9 @@ struct AttributeParser
11461149
std::unique_ptr<MetaItem> parse_path_meta_item ();
11471150

11481151
// TODO: should this be const?
1149-
std::unique_ptr<Token> &peek_token (int i = 0)
1150-
{
1151-
return token_stream[stream_pos + i];
1152-
}
1152+
const_TokenPtr peek_token (int i = 0);
11531153

1154-
void skip_token (int i = 0) { stream_pos += 1 + i; }
1154+
void skip_token (int i = 0);
11551155
};
11561156
} // namespace AST
11571157
} // namespace Rust

0 commit comments

Comments
 (0)