@@ -3531,9 +3531,9 @@ std::unique_ptr<MetaItemInner>
3531
3531
AttributeParser::parse_meta_item_inner ()
3532
3532
{
3533
3533
// 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)
3535
3535
{
3536
- switch (peek_token ()->get_id ())
3536
+ switch (lexer-> peek_token ()->get_id ())
3537
3537
{
3538
3538
case CHAR_LITERAL:
3539
3539
case STRING_LITERAL:
@@ -3554,42 +3554,43 @@ AttributeParser::parse_meta_item_inner ()
3554
3554
return parse_path_meta_item ();
3555
3555
3556
3556
default :
3557
- rust_error_at (peek_token ()->get_locus (),
3557
+ rust_error_at (lexer-> peek_token ()->get_locus (),
3558
3558
" unrecognised token '%s' in meta item" ,
3559
- get_token_description (peek_token ()->get_id ()));
3559
+ get_token_description (
3560
+ lexer->peek_token ()->get_id ()));
3560
3561
return nullptr ;
3561
3562
}
3562
3563
}
3563
3564
3564
3565
// else, check for path
3565
- if (peek_token (1 )->get_id () == SCOPE_RESOLUTION)
3566
+ if (lexer-> peek_token (1 )->get_id () == SCOPE_RESOLUTION)
3566
3567
{
3567
3568
// path
3568
3569
return parse_path_meta_item ();
3569
3570
}
3570
3571
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 ();
3573
3574
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 ()))
3575
3576
{
3576
3577
// meta word syntax
3577
- skip_token ();
3578
+ lexer-> skip_token ();
3578
3579
return std::unique_ptr<MetaWord> (new MetaWord (ident, ident_locus));
3579
3580
}
3580
3581
3581
- if (peek_token (1 )->get_id () == EQUAL)
3582
+ if (lexer-> peek_token (1 )->get_id () == EQUAL)
3582
3583
{
3583
3584
// 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 ()))
3586
3587
{
3587
3588
// meta name value str syntax
3588
- const_TokenPtr value_tok = peek_token (2 );
3589
+ const_TokenPtr value_tok = lexer-> peek_token (2 );
3589
3590
auto value = value_tok->get_str ();
3590
3591
auto locus = value_tok->get_locus ();
3591
3592
3592
- skip_token (2 );
3593
+ lexer-> skip_token (2 );
3593
3594
3594
3595
return std::unique_ptr<MetaNameValueStr> (
3595
3596
new MetaNameValueStr (ident, ident_locus, std::move (value),
@@ -3602,16 +3603,16 @@ AttributeParser::parse_meta_item_inner ()
3602
3603
}
3603
3604
}
3604
3605
3605
- if (peek_token (1 )->get_id () != LEFT_PAREN)
3606
+ if (lexer-> peek_token (1 )->get_id () != LEFT_PAREN)
3606
3607
{
3607
- rust_error_at (peek_token (1 )->get_locus (),
3608
+ rust_error_at (lexer-> peek_token (1 )->get_locus (),
3608
3609
" 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 ()));
3610
3611
return nullptr ;
3611
3612
}
3612
3613
3613
3614
// is it one of those special cases like not?
3614
- if (peek_token ()->get_id () == IDENTIFIER)
3615
+ if (lexer-> peek_token ()->get_id () == IDENTIFIER)
3615
3616
{
3616
3617
return parse_path_meta_item ();
3617
3618
}
@@ -3690,15 +3691,15 @@ AttributeParser::is_end_meta_item_tok (TokenId id) const
3690
3691
std::unique_ptr<MetaItem>
3691
3692
AttributeParser::parse_path_meta_item ()
3692
3693
{
3693
- SimplePath path = parse_simple_path ();
3694
+ SimplePath path = parser-> parse_simple_path ();
3694
3695
if (path.is_empty ())
3695
3696
{
3696
- rust_error_at (peek_token ()->get_locus (),
3697
+ rust_error_at (lexer-> peek_token ()->get_locus (),
3697
3698
" failed to parse simple path in attribute" );
3698
3699
return nullptr ;
3699
3700
}
3700
3701
3701
- switch (peek_token ()->get_id ())
3702
+ switch (lexer-> peek_token ()->get_id ())
3702
3703
{
3703
3704
case LEFT_PAREN:
3704
3705
{
@@ -3710,7 +3711,7 @@ AttributeParser::parse_path_meta_item ()
3710
3711
}
3711
3712
case EQUAL:
3712
3713
{
3713
- skip_token ();
3714
+ lexer-> skip_token ();
3714
3715
3715
3716
std::unique_ptr<Expr> expr = parser->parse_expr ();
3716
3717
@@ -3727,9 +3728,9 @@ AttributeParser::parse_path_meta_item ()
3727
3728
return std::unique_ptr<MetaItemPath> (
3728
3729
new MetaItemPath (std::move (path)));
3729
3730
default :
3730
- rust_error_at (peek_token ()->get_locus (),
3731
+ rust_error_at (lexer-> peek_token ()->get_locus (),
3731
3732
" unrecognised token '%s' in meta item" ,
3732
- get_token_description (peek_token ()->get_id ()));
3733
+ get_token_description (lexer-> peek_token ()->get_id ()));
3733
3734
return nullptr ;
3734
3735
}
3735
3736
}
@@ -3741,39 +3742,39 @@ AttributeParser::parse_meta_item_seq ()
3741
3742
{
3742
3743
std::vector<std::unique_ptr<MetaItemInner>> meta_items;
3743
3744
3744
- if (peek_token ()->get_id () != LEFT_PAREN)
3745
+ if (lexer-> peek_token ()->get_id () != LEFT_PAREN)
3745
3746
{
3746
- rust_error_at (peek_token ()->get_locus (),
3747
+ rust_error_at (lexer-> peek_token ()->get_locus (),
3747
3748
" missing left paren in delim token tree" );
3748
3749
return {};
3749
3750
}
3750
- skip_token ();
3751
+ lexer-> skip_token ();
3751
3752
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)
3754
3755
{
3755
3756
std::unique_ptr<MetaItemInner> inner = parse_meta_item_inner ();
3756
3757
if (inner == nullptr )
3757
3758
{
3758
- rust_error_at (peek_token ()->get_locus (),
3759
+ rust_error_at (lexer-> peek_token ()->get_locus (),
3759
3760
" failed to parse inner meta item in attribute" );
3760
3761
return {};
3761
3762
}
3762
3763
meta_items.push_back (std::move (inner));
3763
3764
3764
- if (peek_token ()->get_id () != COMMA)
3765
+ if (lexer-> peek_token ()->get_id () != COMMA)
3765
3766
break ;
3766
3767
3767
- skip_token ();
3768
+ lexer-> skip_token ();
3768
3769
}
3769
3770
3770
- if (peek_token ()->get_id () != RIGHT_PAREN)
3771
+ if (lexer-> peek_token ()->get_id () != RIGHT_PAREN)
3771
3772
{
3772
- rust_error_at (peek_token ()->get_locus (),
3773
+ rust_error_at (lexer-> peek_token ()->get_locus (),
3773
3774
" missing right paren in delim token tree" );
3774
3775
return {};
3775
3776
}
3776
- skip_token ();
3777
+ lexer-> skip_token ();
3777
3778
3778
3779
return meta_items;
3779
3780
}
@@ -3796,141 +3797,19 @@ DelimTokenTree::to_token_stream () const
3796
3797
return tokens;
3797
3798
}
3798
3799
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
-
3915
3800
std::unique_ptr<MetaItemLitExpr>
3916
3801
AttributeParser::parse_meta_item_lit ()
3917
3802
{
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 ({});
3923
3804
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 ()));
3929
3810
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)));
3934
3813
}
3935
3814
3936
3815
bool
0 commit comments