|
22 | 22 | AutoSpecifier, |
23 | 23 | BaseClass, |
24 | 24 | ClassDecl, |
| 25 | + Concept, |
25 | 26 | DecltypeSpecifier, |
26 | 27 | DecoratedType, |
27 | 28 | EnumDecl, |
@@ -537,7 +538,7 @@ def _on_block_end(self, tok: LexToken, doxygen: typing.Optional[str]) -> None: |
537 | 538 | self._finish_class_decl(old_state) |
538 | 539 |
|
539 | 540 | # |
540 | | - # Template parsing |
| 541 | + # Template and concept parsing |
541 | 542 | # |
542 | 543 |
|
543 | 544 | def _parse_template_type_parameter( |
@@ -640,6 +641,8 @@ def _parse_template(self, tok: LexToken, doxygen: typing.Optional[str]) -> None: |
640 | 641 | self._parse_using(tok, doxygen, template) |
641 | 642 | elif tok.type == "friend": |
642 | 643 | self._parse_friend_decl(tok, doxygen, template) |
| 644 | + elif tok.type == "concept": |
| 645 | + self._parse_concept(tok, doxygen, template) |
643 | 646 | else: |
644 | 647 | self._parse_declarations(tok, doxygen, template) |
645 | 648 |
|
@@ -750,6 +753,32 @@ def _parse_template_instantiation( |
750 | 753 | self.state, TemplateInst(typename, extern, doxygen) |
751 | 754 | ) |
752 | 755 |
|
| 756 | + def _parse_concept( |
| 757 | + self, |
| 758 | + tok: LexToken, |
| 759 | + doxygen: typing.Optional[str], |
| 760 | + template: TemplateDecl, |
| 761 | + ) -> None: |
| 762 | + name = self._next_token_must_be("NAME") |
| 763 | + self._next_token_must_be("=") |
| 764 | + |
| 765 | + # not trying to understand this for now |
| 766 | + raw_constraint = self._create_value(self._consume_value_until([], ",", ";")) |
| 767 | + |
| 768 | + state = self.state |
| 769 | + if isinstance(state, ClassBlockState): |
| 770 | + raise CxxParseError("concept cannot be defined in a class") |
| 771 | + |
| 772 | + self.visitor.on_concept( |
| 773 | + state, |
| 774 | + Concept( |
| 775 | + template=template, |
| 776 | + name=name.value, |
| 777 | + raw_constraint=raw_constraint, |
| 778 | + doxygen=doxygen, |
| 779 | + ), |
| 780 | + ) |
| 781 | + |
753 | 782 | # |
754 | 783 | # Attributes |
755 | 784 | # |
|
0 commit comments