Skip to content

Commit ee0b22e

Browse files
committed
Make AttributeParser rely more on Parser
gcc/rust/ChangeLog: * ast/rust-ast.cc (AttributeParser::parse_meta_item_inner): Handle removal of AttributeParser-specific functions. (AttributeParser::parse_path_meta_item): Likewise. (AttributeParser::parse_meta_item_seq): Likewise. (AttributeParser::parse_meta_item_lit): Likewise. (AttributeParser::parse_literal): Remove function. (AttributeParser::parse_simple_path): Likewise. (AttributeParser::parse_simple_path_segment): Likewise. (AttributeParser::peek_token): Likewise. (AttributeParser::skip_token): Likewise. * ast/rust-macro.h (AttributeParser::parse_simple_path): Likewise. (AttributeParser::parse_simple_path_segment): Likewise. (AttributeParser::parse_literal): Likewise. (AttributeParser::peek_token): Likewise. (AttributeParser::skip_token): Likewise. * parse/rust-parse.h (Parser): Make AttributeParser a friend class. Signed-off-by: Owen Avery <[email protected]>
1 parent b77dfdb commit ee0b22e

File tree

3 files changed

+48
-176
lines changed

3 files changed

+48
-176
lines changed

gcc/rust/ast/rust-ast.cc

Lines changed: 44 additions & 165 deletions
Original file line numberDiff line numberDiff line change
@@ -3531,9 +3531,9 @@ std::unique_ptr<MetaItemInner>
35313531
AttributeParser::parse_meta_item_inner ()
35323532
{
35333533
// if first tok not identifier, not a "special" case one
3534-
if (peek_token ()->get_id () != IDENTIFIER)
3534+
if (lexer->peek_token ()->get_id () != IDENTIFIER)
35353535
{
3536-
switch (peek_token ()->get_id ())
3536+
switch (lexer->peek_token ()->get_id ())
35373537
{
35383538
case CHAR_LITERAL:
35393539
case STRING_LITERAL:
@@ -3554,42 +3554,43 @@ AttributeParser::parse_meta_item_inner ()
35543554
return parse_path_meta_item ();
35553555

35563556
default:
3557-
rust_error_at (peek_token ()->get_locus (),
3557+
rust_error_at (lexer->peek_token ()->get_locus (),
35583558
"unrecognised token '%s' in meta item",
3559-
get_token_description (peek_token ()->get_id ()));
3559+
get_token_description (
3560+
lexer->peek_token ()->get_id ()));
35603561
return nullptr;
35613562
}
35623563
}
35633564

35643565
// else, check for path
3565-
if (peek_token (1)->get_id () == SCOPE_RESOLUTION)
3566+
if (lexer->peek_token (1)->get_id () == SCOPE_RESOLUTION)
35663567
{
35673568
// path
35683569
return parse_path_meta_item ();
35693570
}
35703571

3571-
auto ident = peek_token ()->get_str ();
3572-
auto ident_locus = peek_token ()->get_locus ();
3572+
auto ident = lexer->peek_token ()->get_str ();
3573+
auto ident_locus = lexer->peek_token ()->get_locus ();
35733574

3574-
if (is_end_meta_item_tok (peek_token (1)->get_id ()))
3575+
if (is_end_meta_item_tok (lexer->peek_token (1)->get_id ()))
35753576
{
35763577
// meta word syntax
3577-
skip_token ();
3578+
lexer->skip_token ();
35783579
return std::unique_ptr<MetaWord> (new MetaWord (ident, ident_locus));
35793580
}
35803581

3581-
if (peek_token (1)->get_id () == EQUAL)
3582+
if (lexer->peek_token (1)->get_id () == EQUAL)
35823583
{
35833584
// maybe meta name value str syntax - check next 2 tokens
3584-
if (peek_token (2)->get_id () == STRING_LITERAL
3585-
&& is_end_meta_item_tok (peek_token (3)->get_id ()))
3585+
if (lexer->peek_token (2)->get_id () == STRING_LITERAL
3586+
&& is_end_meta_item_tok (lexer->peek_token (3)->get_id ()))
35863587
{
35873588
// meta name value str syntax
3588-
const_TokenPtr value_tok = peek_token (2);
3589+
const_TokenPtr value_tok = lexer->peek_token (2);
35893590
auto value = value_tok->get_str ();
35903591
auto locus = value_tok->get_locus ();
35913592

3592-
skip_token (2);
3593+
lexer->skip_token (2);
35933594

35943595
return std::unique_ptr<MetaNameValueStr> (
35953596
new MetaNameValueStr (ident, ident_locus, std::move (value),
@@ -3602,16 +3603,16 @@ AttributeParser::parse_meta_item_inner ()
36023603
}
36033604
}
36043605

3605-
if (peek_token (1)->get_id () != LEFT_PAREN)
3606+
if (lexer->peek_token (1)->get_id () != LEFT_PAREN)
36063607
{
3607-
rust_error_at (peek_token (1)->get_locus (),
3608+
rust_error_at (lexer->peek_token (1)->get_locus (),
36083609
"unexpected token '%s' after identifier in attribute",
3609-
get_token_description (peek_token (1)->get_id ()));
3610+
get_token_description (lexer->peek_token (1)->get_id ()));
36103611
return nullptr;
36113612
}
36123613

36133614
// is it one of those special cases like not?
3614-
if (peek_token ()->get_id () == IDENTIFIER)
3615+
if (lexer->peek_token ()->get_id () == IDENTIFIER)
36153616
{
36163617
return parse_path_meta_item ();
36173618
}
@@ -3690,15 +3691,15 @@ AttributeParser::is_end_meta_item_tok (TokenId id) const
36903691
std::unique_ptr<MetaItem>
36913692
AttributeParser::parse_path_meta_item ()
36923693
{
3693-
SimplePath path = parse_simple_path ();
3694+
SimplePath path = parser->parse_simple_path ();
36943695
if (path.is_empty ())
36953696
{
3696-
rust_error_at (peek_token ()->get_locus (),
3697+
rust_error_at (lexer->peek_token ()->get_locus (),
36973698
"failed to parse simple path in attribute");
36983699
return nullptr;
36993700
}
37003701

3701-
switch (peek_token ()->get_id ())
3702+
switch (lexer->peek_token ()->get_id ())
37023703
{
37033704
case LEFT_PAREN:
37043705
{
@@ -3710,7 +3711,7 @@ AttributeParser::parse_path_meta_item ()
37103711
}
37113712
case EQUAL:
37123713
{
3713-
skip_token ();
3714+
lexer->skip_token ();
37143715

37153716
std::unique_ptr<Expr> expr = parser->parse_expr ();
37163717
// stream_pos++;
@@ -3724,9 +3725,9 @@ AttributeParser::parse_path_meta_item ()
37243725
return std::unique_ptr<MetaItemPath> (
37253726
new MetaItemPath (std::move (path)));
37263727
default:
3727-
rust_error_at (peek_token ()->get_locus (),
3728+
rust_error_at (lexer->peek_token ()->get_locus (),
37283729
"unrecognised token '%s' in meta item",
3729-
get_token_description (peek_token ()->get_id ()));
3730+
get_token_description (lexer->peek_token ()->get_id ()));
37303731
return nullptr;
37313732
}
37323733
}
@@ -3738,39 +3739,39 @@ AttributeParser::parse_meta_item_seq ()
37383739
{
37393740
std::vector<std::unique_ptr<MetaItemInner>> meta_items;
37403741

3741-
if (peek_token ()->get_id () != LEFT_PAREN)
3742+
if (lexer->peek_token ()->get_id () != LEFT_PAREN)
37423743
{
3743-
rust_error_at (peek_token ()->get_locus (),
3744+
rust_error_at (lexer->peek_token ()->get_locus (),
37443745
"missing left paren in delim token tree");
37453746
return {};
37463747
}
3747-
skip_token ();
3748+
lexer->skip_token ();
37483749

3749-
while (peek_token ()->get_id () != END_OF_FILE
3750-
&& peek_token ()->get_id () != RIGHT_PAREN)
3750+
while (lexer->peek_token ()->get_id () != END_OF_FILE
3751+
&& lexer->peek_token ()->get_id () != RIGHT_PAREN)
37513752
{
37523753
std::unique_ptr<MetaItemInner> inner = parse_meta_item_inner ();
37533754
if (inner == nullptr)
37543755
{
3755-
rust_error_at (peek_token ()->get_locus (),
3756+
rust_error_at (lexer->peek_token ()->get_locus (),
37563757
"failed to parse inner meta item in attribute");
37573758
return {};
37583759
}
37593760
meta_items.push_back (std::move (inner));
37603761

3761-
if (peek_token ()->get_id () != COMMA)
3762+
if (lexer->peek_token ()->get_id () != COMMA)
37623763
break;
37633764

3764-
skip_token ();
3765+
lexer->skip_token ();
37653766
}
37663767

3767-
if (peek_token ()->get_id () != RIGHT_PAREN)
3768+
if (lexer->peek_token ()->get_id () != RIGHT_PAREN)
37683769
{
3769-
rust_error_at (peek_token ()->get_locus (),
3770+
rust_error_at (lexer->peek_token ()->get_locus (),
37703771
"missing right paren in delim token tree");
37713772
return {};
37723773
}
3773-
skip_token ();
3774+
lexer->skip_token ();
37743775

37753776
return meta_items;
37763777
}
@@ -3793,141 +3794,19 @@ DelimTokenTree::to_token_stream () const
37933794
return tokens;
37943795
}
37953796

3796-
Literal
3797-
AttributeParser::parse_literal ()
3798-
{
3799-
const_TokenPtr tok = peek_token ();
3800-
switch (tok->get_id ())
3801-
{
3802-
case CHAR_LITERAL:
3803-
skip_token ();
3804-
return Literal (tok->get_str (), Literal::CHAR, tok->get_type_hint ());
3805-
case STRING_LITERAL:
3806-
skip_token ();
3807-
return Literal (tok->get_str (), Literal::STRING, tok->get_type_hint ());
3808-
case BYTE_CHAR_LITERAL:
3809-
skip_token ();
3810-
return Literal (tok->get_str (), Literal::BYTE, tok->get_type_hint ());
3811-
case BYTE_STRING_LITERAL:
3812-
skip_token ();
3813-
return Literal (tok->get_str (), Literal::BYTE_STRING,
3814-
tok->get_type_hint ());
3815-
case RAW_STRING_LITERAL:
3816-
skip_token ();
3817-
return Literal (tok->get_str (), Literal::RAW_STRING,
3818-
tok->get_type_hint ());
3819-
case INT_LITERAL:
3820-
skip_token ();
3821-
return Literal (tok->get_str (), Literal::INT, tok->get_type_hint ());
3822-
case FLOAT_LITERAL:
3823-
skip_token ();
3824-
return Literal (tok->get_str (), Literal::FLOAT, tok->get_type_hint ());
3825-
case TRUE_LITERAL:
3826-
skip_token ();
3827-
return Literal ("true", Literal::BOOL, tok->get_type_hint ());
3828-
case FALSE_LITERAL:
3829-
skip_token ();
3830-
return Literal ("false", Literal::BOOL, tok->get_type_hint ());
3831-
default:
3832-
rust_error_at (tok->get_locus (), "expected literal - found '%s'",
3833-
get_token_description (tok->get_id ()));
3834-
return Literal::create_error ();
3835-
}
3836-
}
3837-
3838-
SimplePath
3839-
AttributeParser::parse_simple_path ()
3840-
{
3841-
bool has_opening_scope_res = false;
3842-
if (peek_token ()->get_id () == SCOPE_RESOLUTION)
3843-
{
3844-
has_opening_scope_res = true;
3845-
skip_token ();
3846-
}
3847-
3848-
std::vector<SimplePathSegment> segments;
3849-
3850-
SimplePathSegment segment = parse_simple_path_segment ();
3851-
if (segment.is_error ())
3852-
{
3853-
rust_error_at (
3854-
peek_token ()->get_locus (),
3855-
"failed to parse simple path segment in attribute simple path");
3856-
return SimplePath::create_empty ();
3857-
}
3858-
segments.push_back (std::move (segment));
3859-
3860-
while (peek_token ()->get_id () == SCOPE_RESOLUTION)
3861-
{
3862-
skip_token ();
3863-
3864-
SimplePathSegment segment = parse_simple_path_segment ();
3865-
if (segment.is_error ())
3866-
{
3867-
rust_error_at (
3868-
peek_token ()->get_locus (),
3869-
"failed to parse simple path segment in attribute simple path");
3870-
return SimplePath::create_empty ();
3871-
}
3872-
segments.push_back (std::move (segment));
3873-
}
3874-
segments.shrink_to_fit ();
3875-
3876-
return SimplePath (std::move (segments), has_opening_scope_res);
3877-
}
3878-
3879-
SimplePathSegment
3880-
AttributeParser::parse_simple_path_segment ()
3881-
{
3882-
const_TokenPtr tok = peek_token ();
3883-
switch (tok->get_id ())
3884-
{
3885-
case IDENTIFIER:
3886-
skip_token ();
3887-
return SimplePathSegment (tok->get_str (), tok->get_locus ());
3888-
case SUPER:
3889-
skip_token ();
3890-
return SimplePathSegment ("super", tok->get_locus ());
3891-
case SELF:
3892-
skip_token ();
3893-
return SimplePathSegment ("self", tok->get_locus ());
3894-
case CRATE:
3895-
skip_token ();
3896-
return SimplePathSegment ("crate", tok->get_locus ());
3897-
case DOLLAR_SIGN:
3898-
if (peek_token (1)->get_id () == CRATE)
3899-
{
3900-
skip_token (1);
3901-
return SimplePathSegment ("$crate", tok->get_locus ());
3902-
}
3903-
gcc_fallthrough ();
3904-
default:
3905-
rust_error_at (tok->get_locus (),
3906-
"unexpected token '%s' in simple path segment",
3907-
get_token_description (tok->get_id ()));
3908-
return SimplePathSegment::create_error ();
3909-
}
3910-
}
3911-
39123797
std::unique_ptr<MetaItemLitExpr>
39133798
AttributeParser::parse_meta_item_lit ()
39143799
{
3915-
location_t locus = peek_token ()->get_locus ();
3916-
LiteralExpr lit_expr (parse_literal (), {}, locus);
3917-
return std::unique_ptr<MetaItemLitExpr> (
3918-
new MetaItemLitExpr (std::move (lit_expr)));
3919-
}
3800+
std::unique_ptr<LiteralExpr> lit_expr = parser->parse_literal_expr ({});
39203801

3921-
const_TokenPtr
3922-
AttributeParser::peek_token (int i)
3923-
{
3924-
return lexer->peek_token (i);
3925-
}
3802+
// TODO: return nullptr instead?
3803+
if (!lit_expr)
3804+
lit_expr = std::unique_ptr<LiteralExpr> (
3805+
new LiteralExpr (Literal::create_error (), {},
3806+
lexer->peek_token ()->get_locus ()));
39263807

3927-
void
3928-
AttributeParser::skip_token (int i)
3929-
{
3930-
lexer->skip_token (i);
3808+
return std::unique_ptr<MetaItemLitExpr> (
3809+
new MetaItemLitExpr (std::move (*lit_expr)));
39313810
}
39323811

39333812
bool

gcc/rust/ast/rust-macro.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,21 +1137,10 @@ struct AttributeParser
11371137
std::unique_ptr<MetaItemInner> parse_meta_item_inner ();
11381138
// Returns whether token can end a meta item.
11391139
bool is_end_meta_item_tok (TokenId id) const;
1140-
// Parses a simple path.
1141-
SimplePath parse_simple_path ();
1142-
// Parses a segment of a simple path (but not scope resolution operator).
1143-
SimplePathSegment parse_simple_path_segment ();
11441140
// Parses a MetaItemLitExpr.
11451141
std::unique_ptr<MetaItemLitExpr> parse_meta_item_lit ();
1146-
// Parses a literal.
1147-
Literal parse_literal ();
11481142
// Parses a meta item that begins with a simple path.
11491143
std::unique_ptr<MetaItem> parse_path_meta_item ();
1150-
1151-
// TODO: should this be const?
1152-
const_TokenPtr peek_token (int i = 0);
1153-
1154-
void skip_token (int i = 0);
11551144
};
11561145
} // namespace AST
11571146
} // namespace Rust

gcc/rust/parse/rust-parse.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,10 @@ template <typename ManagedTokenSource> class Parser
779779
}
780780
~InlineModuleStackScope () { parser.inline_module_stack.pop_back (); }
781781
};
782+
783+
// don't want to make things *only* AttributeParser uses public
784+
// TODO: fold more of AttributeParser into Parser?
785+
friend class ::Rust::AST::AttributeParser;
782786
};
783787

784788
std::string extract_module_path (const AST::AttrVec &inner_attrs,

0 commit comments

Comments
 (0)