|
60 | 60 | case kRETURN: \ |
61 | 61 | /* nop */ |
62 | 62 |
|
| 63 | +#define PARAM_NAME_CASES \ |
| 64 | +case kBOOL:\ |
| 65 | +case kBOT: \ |
| 66 | +case kCLASS: \ |
| 67 | +case kFALSE: \ |
| 68 | +case kINSTANCE: \ |
| 69 | +case kINTERFACE: \ |
| 70 | +case kNIL: \ |
| 71 | +case kSELF: \ |
| 72 | +case kSINGLETON: \ |
| 73 | +case kTOP: \ |
| 74 | +case kTRUE: \ |
| 75 | +case kVOID: \ |
| 76 | +case kTYPE: \ |
| 77 | +case kUNCHECKED: \ |
| 78 | +case kIN: \ |
| 79 | +case kOUT: \ |
| 80 | +case kEND: \ |
| 81 | +case kDEF: \ |
| 82 | +case kINCLUDE: \ |
| 83 | +case kEXTEND: \ |
| 84 | +case kPREPEND: \ |
| 85 | +case kALIAS: \ |
| 86 | +case kMODULE: \ |
| 87 | +case kATTRREADER: \ |
| 88 | +case kATTRWRITER: \ |
| 89 | +case kATTRACCESSOR: \ |
| 90 | +case kPUBLIC: \ |
| 91 | +case kPRIVATE: \ |
| 92 | +case kUNTYPED: \ |
| 93 | +case kUSE: \ |
| 94 | +case kAS: \ |
| 95 | +case k__TODO__: \ |
| 96 | +/* nop */ |
| 97 | + |
63 | 98 | #define CHECK_PARSE(call) \ |
64 | 99 | if (!call) { \ |
65 | 100 | return false; \ |
@@ -3632,6 +3667,46 @@ static bool parse_inline_comment(rbs_parser_t *parser, rbs_location_range *comme |
3632 | 3667 | return true; |
3633 | 3668 | } |
3634 | 3669 |
|
| 3670 | +NODISCARD |
| 3671 | +static bool parse_inline_param_type_annotation(rbs_parser_t *parser, rbs_ast_ruby_annotations_t **annotation, rbs_range_t rbs_range) { |
| 3672 | + rbs_parser_advance(parser); |
| 3673 | + |
| 3674 | + rbs_location_range name_loc = rbs_location_range_current_token(parser); |
| 3675 | + |
| 3676 | + ADVANCE_ASSERT(parser, pCOLON); |
| 3677 | + |
| 3678 | + rbs_location_range colon_loc = rbs_location_range_current_token(parser); |
| 3679 | + |
| 3680 | + rbs_node_t *param_type = NULL; |
| 3681 | + if (!rbs_parse_type(parser, ¶m_type, false, true, true)) { |
| 3682 | + return false; |
| 3683 | + } |
| 3684 | + |
| 3685 | + rbs_location_range comment_loc = RBS_LOCATION_NULL_RANGE; |
| 3686 | + if (!parse_inline_comment(parser, &comment_loc)) { |
| 3687 | + return false; |
| 3688 | + } |
| 3689 | + |
| 3690 | + rbs_location_range full_loc = { |
| 3691 | + .start_char = rbs_range.start.char_pos, |
| 3692 | + .start_byte = rbs_range.start.byte_pos, |
| 3693 | + .end_char = parser->current_token.range.end.char_pos, |
| 3694 | + .end_byte = parser->current_token.range.end.byte_pos, |
| 3695 | + }; |
| 3696 | + |
| 3697 | + *annotation = (rbs_ast_ruby_annotations_t *) rbs_ast_ruby_annotations_param_type_annotation_new( |
| 3698 | + ALLOCATOR(), |
| 3699 | + full_loc, |
| 3700 | + RBS_RANGE_LEX2AST(rbs_range), |
| 3701 | + name_loc, |
| 3702 | + colon_loc, |
| 3703 | + param_type, |
| 3704 | + comment_loc |
| 3705 | + ); |
| 3706 | + |
| 3707 | + return true; |
| 3708 | +} |
| 3709 | + |
3635 | 3710 | NODISCARD |
3636 | 3711 | static bool parse_inline_leading_annotation(rbs_parser_t *parser, rbs_ast_ruby_annotations_t **annotation) { |
3637 | 3712 | switch (parser->next_token.type) { |
@@ -3721,30 +3796,34 @@ static bool parse_inline_leading_annotation(rbs_parser_t *parser, rbs_ast_ruby_a |
3721 | 3796 | return true; |
3722 | 3797 | } |
3723 | 3798 | case kSKIP: { |
3724 | | - rbs_parser_advance(parser); |
| 3799 | + if (parser->next_token2.type == pCOLON) { |
| 3800 | + return parse_inline_param_type_annotation(parser, annotation, rbs_range); |
| 3801 | + } else { |
| 3802 | + rbs_parser_advance(parser); |
3725 | 3803 |
|
3726 | | - rbs_range_t skip_range = parser->current_token.range; |
| 3804 | + rbs_range_t skip_range = parser->current_token.range; |
3727 | 3805 |
|
3728 | | - rbs_location_range comment_loc = RBS_LOCATION_NULL_RANGE; |
3729 | | - if (!parse_inline_comment(parser, &comment_loc)) { |
3730 | | - return false; |
3731 | | - } |
| 3806 | + rbs_location_range comment_loc = RBS_LOCATION_NULL_RANGE; |
| 3807 | + if (!parse_inline_comment(parser, &comment_loc)) { |
| 3808 | + return false; |
| 3809 | + } |
3732 | 3810 |
|
3733 | | - rbs_range_t full_range = { |
3734 | | - .start = rbs_range.start, |
3735 | | - .end = parser->current_token.range.end |
3736 | | - }; |
| 3811 | + rbs_range_t full_range = { |
| 3812 | + .start = rbs_range.start, |
| 3813 | + .end = parser->current_token.range.end |
| 3814 | + }; |
3737 | 3815 |
|
3738 | | - rbs_location_range full_loc = RBS_RANGE_LEX2AST(full_range); |
| 3816 | + rbs_location_range full_loc = RBS_RANGE_LEX2AST(full_range); |
3739 | 3817 |
|
3740 | | - *annotation = (rbs_ast_ruby_annotations_t *) rbs_ast_ruby_annotations_skip_annotation_new( |
3741 | | - ALLOCATOR(), |
3742 | | - full_loc, |
3743 | | - RBS_RANGE_LEX2AST(rbs_range), |
3744 | | - RBS_RANGE_LEX2AST(skip_range), |
3745 | | - comment_loc |
3746 | | - ); |
3747 | | - return true; |
| 3818 | + *annotation = (rbs_ast_ruby_annotations_t *) rbs_ast_ruby_annotations_skip_annotation_new( |
| 3819 | + ALLOCATOR(), |
| 3820 | + full_loc, |
| 3821 | + RBS_RANGE_LEX2AST(rbs_range), |
| 3822 | + RBS_RANGE_LEX2AST(skip_range), |
| 3823 | + comment_loc |
| 3824 | + ); |
| 3825 | + return true; |
| 3826 | + } |
3748 | 3827 | } |
3749 | 3828 | case kRETURN: { |
3750 | 3829 | rbs_parser_advance(parser); |
@@ -3828,6 +3907,11 @@ static bool parse_inline_leading_annotation(rbs_parser_t *parser, rbs_ast_ruby_a |
3828 | 3907 | ); |
3829 | 3908 | return true; |
3830 | 3909 | } |
| 3910 | + case tLIDENT: |
| 3911 | + PARAM_NAME_CASES |
| 3912 | + { |
| 3913 | + return parse_inline_param_type_annotation(parser, annotation, rbs_range); |
| 3914 | + } |
3831 | 3915 | default: { |
3832 | 3916 | rbs_parser_set_error(parser, parser->next_token, true, "unexpected token for @rbs annotation"); |
3833 | 3917 | return false; |
|
0 commit comments