Skip to content

Commit e530b45

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 9dc4151 commit e530b45

File tree

3 files changed

+56
-189
lines changed

3 files changed

+56
-189
lines changed

gcc/rust/ast/rust-ast.cc

Lines changed: 52 additions & 178 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,31 +3711,26 @@ AttributeParser::parse_path_meta_item ()
37103711
}
37113712
case EQUAL:
37123713
{
3713-
skip_token ();
3714+
lexer->skip_token ();
3715+
3716+
std::unique_ptr<LiteralExpr> expr = parser->parse_literal_expr ({});
3717+
3718+
// handle error
3719+
// parse_literal_expr should already emit an error and return nullptr
3720+
if (!expr)
3721+
return nullptr;
37143722

3715-
location_t locus = peek_token ()->get_locus ();
3716-
Literal lit = parse_literal ();
3717-
if (lit.is_error ())
3718-
{
3719-
rust_error_at (peek_token ()->get_locus (),
3720-
"failed to parse literal in attribute");
3721-
return nullptr;
3722-
}
3723-
LiteralExpr expr (std::move (lit), {}, locus);
3724-
// stream_pos++;
3725-
/* shouldn't be required anymore due to parsing literal actually
3726-
* skipping the token */
37273723
return std::unique_ptr<MetaItemPathLit> (
3728-
new MetaItemPathLit (std::move (path), std::move (expr)));
3724+
new MetaItemPathLit (std::move (path), std::move (*expr)));
37293725
}
37303726
case COMMA:
37313727
// just simple path
37323728
return std::unique_ptr<MetaItemPath> (
37333729
new MetaItemPath (std::move (path)));
37343730
default:
3735-
rust_error_at (peek_token ()->get_locus (),
3731+
rust_error_at (lexer->peek_token ()->get_locus (),
37363732
"unrecognised token '%s' in meta item",
3737-
get_token_description (peek_token ()->get_id ()));
3733+
get_token_description (lexer->peek_token ()->get_id ()));
37383734
return nullptr;
37393735
}
37403736
}
@@ -3746,39 +3742,39 @@ AttributeParser::parse_meta_item_seq ()
37463742
{
37473743
std::vector<std::unique_ptr<MetaItemInner>> meta_items;
37483744

3749-
if (peek_token ()->get_id () != LEFT_PAREN)
3745+
if (lexer->peek_token ()->get_id () != LEFT_PAREN)
37503746
{
3751-
rust_error_at (peek_token ()->get_locus (),
3747+
rust_error_at (lexer->peek_token ()->get_locus (),
37523748
"missing left paren in delim token tree");
37533749
return {};
37543750
}
3755-
skip_token ();
3751+
lexer->skip_token ();
37563752

3757-
while (peek_token ()->get_id () != END_OF_FILE
3758-
&& peek_token ()->get_id () != RIGHT_PAREN)
3753+
while (lexer->peek_token ()->get_id () != END_OF_FILE
3754+
&& lexer->peek_token ()->get_id () != RIGHT_PAREN)
37593755
{
37603756
std::unique_ptr<MetaItemInner> inner = parse_meta_item_inner ();
37613757
if (inner == nullptr)
37623758
{
3763-
rust_error_at (peek_token ()->get_locus (),
3759+
rust_error_at (lexer->peek_token ()->get_locus (),
37643760
"failed to parse inner meta item in attribute");
37653761
return {};
37663762
}
37673763
meta_items.push_back (std::move (inner));
37683764

3769-
if (peek_token ()->get_id () != COMMA)
3765+
if (lexer->peek_token ()->get_id () != COMMA)
37703766
break;
37713767

3772-
skip_token ();
3768+
lexer->skip_token ();
37733769
}
37743770

3775-
if (peek_token ()->get_id () != RIGHT_PAREN)
3771+
if (lexer->peek_token ()->get_id () != RIGHT_PAREN)
37763772
{
3777-
rust_error_at (peek_token ()->get_locus (),
3773+
rust_error_at (lexer->peek_token ()->get_locus (),
37783774
"missing right paren in delim token tree");
37793775
return {};
37803776
}
3781-
skip_token ();
3777+
lexer->skip_token ();
37823778

37833779
return meta_items;
37843780
}
@@ -3801,141 +3797,19 @@ DelimTokenTree::to_token_stream () const
38013797
return tokens;
38023798
}
38033799

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

3929-
const_TokenPtr
3930-
AttributeParser::peek_token (int i)
3931-
{
3932-
return lexer->peek_token (i);
3933-
}
3805+
// TODO: return nullptr instead?
3806+
if (!lit_expr)
3807+
lit_expr = std::unique_ptr<LiteralExpr> (
3808+
new LiteralExpr (Literal::create_error (), {},
3809+
lexer->peek_token ()->get_locus ()));
39343810

3935-
void
3936-
AttributeParser::skip_token (int i)
3937-
{
3938-
lexer->skip_token (i);
3811+
return std::unique_ptr<MetaItemLitExpr> (
3812+
new MetaItemLitExpr (std::move (*lit_expr)));
39393813
}
39403814

39413815
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)