Parse field options: [deprecated=true, ref=true].
(self, field_name: str)
| 721 | ) |
| 722 | |
| 723 | def parse_field_options(self, field_name: str) -> dict: |
| 724 | """Parse field options: [deprecated=true, ref=true].""" |
| 725 | self.consume(TokenType.LBRACKET) |
| 726 | options = {} |
| 727 | |
| 728 | while True: |
| 729 | name_token = self.current() |
| 730 | if self.check(TokenType.IDENT): |
| 731 | self.advance() |
| 732 | option_name = name_token.value |
| 733 | elif self.check(TokenType.REF): |
| 734 | self.advance() |
| 735 | option_name = "ref" |
| 736 | elif self.check(TokenType.OPTIONAL): |
| 737 | self.advance() |
| 738 | option_name = "optional" |
| 739 | elif self.check(TokenType.REPEATED): |
| 740 | self.advance() |
| 741 | option_name = "repeated" |
| 742 | elif self.check(TokenType.LIST): |
| 743 | self.advance() |
| 744 | option_name = "list" |
| 745 | elif self.check(TokenType.WEAK): |
| 746 | self.advance() |
| 747 | option_name = "weak" |
| 748 | else: |
| 749 | raise self.error( |
| 750 | f"Expected option name, got {self.current().type.name}" |
| 751 | ) |
| 752 | |
| 753 | self.consume(TokenType.EQUALS, "Expected '=' after option name") |
| 754 | option_value = self.parse_option_value() |
| 755 | options[option_name] = option_value |
| 756 | |
| 757 | if option_name not in KNOWN_FIELD_OPTIONS: |
| 758 | warnings.warn( |
| 759 | f"Line {name_token.line}: ignoring unknown field option '{option_name}' on field '{field_name}'", |
| 760 | stacklevel=2, |
| 761 | ) |
| 762 | |
| 763 | if self.check(TokenType.COMMA): |
| 764 | self.advance() |
| 765 | elif self.check(TokenType.RBRACKET): |
| 766 | break |
| 767 | else: |
| 768 | raise self.error("Expected ',' or ']' in field options") |
| 769 | |
| 770 | self.consume(TokenType.RBRACKET, "Expected ']' after field options") |
| 771 | return options |
| 772 | |
| 773 | def parse_ref_options(self, name: str) -> dict: |
| 774 | """Parse ref keyword options such as ref(weak=true, thread_safe=false).""" |