Skip to content

Commit bce5edb

Browse files
powerboat9P-E-P
authored andcommitted
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 2aa4911 commit bce5edb

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

@@ -3727,9 +3728,9 @@ AttributeParser::parse_path_meta_item ()
37273728
return std::unique_ptr<MetaItemPath> (
37283729
new MetaItemPath (std::move (path)));
37293730
default:
3730-
rust_error_at (peek_token ()->get_locus (),
3731+
rust_error_at (lexer->peek_token ()->get_locus (),
37313732
"unrecognised token '%s' in meta item",
3732-
get_token_description (peek_token ()->get_id ()));
3733+
get_token_description (lexer->peek_token ()->get_id ()));
37333734
return nullptr;
37343735
}
37353736
}
@@ -3741,39 +3742,39 @@ AttributeParser::parse_meta_item_seq ()
37413742
{
37423743
std::vector<std::unique_ptr<MetaItemInner>> meta_items;
37433744

3744-
if (peek_token ()->get_id () != LEFT_PAREN)
3745+
if (lexer->peek_token ()->get_id () != LEFT_PAREN)
37453746
{
3746-
rust_error_at (peek_token ()->get_locus (),
3747+
rust_error_at (lexer->peek_token ()->get_locus (),
37473748
"missing left paren in delim token tree");
37483749
return {};
37493750
}
3750-
skip_token ();
3751+
lexer->skip_token ();
37513752

3752-
while (peek_token ()->get_id () != END_OF_FILE
3753-
&& peek_token ()->get_id () != RIGHT_PAREN)
3753+
while (lexer->peek_token ()->get_id () != END_OF_FILE
3754+
&& lexer->peek_token ()->get_id () != RIGHT_PAREN)
37543755
{
37553756
std::unique_ptr<MetaItemInner> inner = parse_meta_item_inner ();
37563757
if (inner == nullptr)
37573758
{
3758-
rust_error_at (peek_token ()->get_locus (),
3759+
rust_error_at (lexer->peek_token ()->get_locus (),
37593760
"failed to parse inner meta item in attribute");
37603761
return {};
37613762
}
37623763
meta_items.push_back (std::move (inner));
37633764

3764-
if (peek_token ()->get_id () != COMMA)
3765+
if (lexer->peek_token ()->get_id () != COMMA)
37653766
break;
37663767

3767-
skip_token ();
3768+
lexer->skip_token ();
37683769
}
37693770

3770-
if (peek_token ()->get_id () != RIGHT_PAREN)
3771+
if (lexer->peek_token ()->get_id () != RIGHT_PAREN)
37713772
{
3772-
rust_error_at (peek_token ()->get_locus (),
3773+
rust_error_at (lexer->peek_token ()->get_locus (),
37733774
"missing right paren in delim token tree");
37743775
return {};
37753776
}
3776-
skip_token ();
3777+
lexer->skip_token ();
37773778

37783779
return meta_items;
37793780
}
@@ -3796,141 +3797,19 @@ DelimTokenTree::to_token_stream () const
37963797
return tokens;
37973798
}
37983799

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

3924-
const_TokenPtr
3925-
AttributeParser::peek_token (int i)
3926-
{
3927-
return lexer->peek_token (i);
3928-
}
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 ()));
39293810

3930-
void
3931-
AttributeParser::skip_token (int i)
3932-
{
3933-
lexer->skip_token (i);
3811+
return std::unique_ptr<MetaItemLitExpr> (
3812+
new MetaItemLitExpr (std::move (*lit_expr)));
39343813
}
39353814

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