@@ -4112,6 +4112,11 @@ struct translation_unit_node
4112
4112
};
4113
4113
4114
4114
4115
+ struct type_requirement_tag {};
4116
+ struct simple_requirement_tag {};
4117
+ struct nested_requirement_tag {};
4118
+ struct negative_requirement_tag {};
4119
+
4115
4120
// -----------------------------------------------------------------------
4116
4121
//
4117
4122
// pretty_print_visualize: pretty-prints Cpp2 ASTs
@@ -4162,6 +4167,20 @@ auto pretty_print_visualize(alternative_node const& n, int indent)
4162
4167
-> std::string;
4163
4168
auto pretty_print_visualize (inspect_expression_node const & n, int indent)
4164
4169
-> std::string;
4170
+ auto pretty_print_visualize (type_id_node const & n, type_requirement_tag, int indent)
4171
+ -> std::string;
4172
+ auto pretty_print_visualize (expression_node const & n, simple_requirement_tag, int indent)
4173
+ -> std::string;
4174
+ auto pretty_print_visualize (requires_expression_node::compound_requirement_node const & n, int indent)
4175
+ -> std::string;
4176
+ auto pretty_print_visualize (logical_or_expression_node const & n, nested_requirement_tag, int indent)
4177
+ -> std::string;
4178
+ auto pretty_print_visualize (requires_expression_node::requirement_node const & n, negative_requirement_tag, int indent)
4179
+ -> std::string;
4180
+ auto pretty_print_visualize (requires_expression_node::requirement_node const & n, int indent)
4181
+ -> std::string;
4182
+ auto pretty_print_visualize (requires_expression_node const & n, int indent)
4183
+ -> std::string;
4165
4184
auto pretty_print_visualize (contract_node const & n, int indent)
4166
4185
-> std::string;
4167
4186
auto pretty_print_visualize (jump_statement_node const & n, int indent)
@@ -4241,6 +4260,7 @@ auto pretty_print_visualize(primary_expression_node const& n, int indent)
4241
4260
ret += try_pretty_print_visualize<primary_expression_node::id_expression >(n.expr , indent);
4242
4261
ret += try_pretty_print_visualize<primary_expression_node::declaration >(n.expr , indent);
4243
4262
ret += try_pretty_print_visualize<primary_expression_node::inspect >(n.expr , indent);
4263
+ ret += try_pretty_print_visualize<primary_expression_node::requires_ >(n.expr , indent);
4244
4264
ret += try_pretty_print_visualize<primary_expression_node::literal >(n.expr , indent);
4245
4265
4246
4266
return ret;
@@ -4629,6 +4649,100 @@ auto pretty_print_visualize(inspect_expression_node const& n, int indent)
4629
4649
}
4630
4650
4631
4651
4652
+ auto pretty_print_visualize (type_id_node const & n, type_requirement_tag, int indent)
4653
+ -> std::string
4654
+ {
4655
+ return pretty_print_visualize (n, indent) + " ;" ;
4656
+ }
4657
+
4658
+ auto pretty_print_visualize (expression_node const & n, simple_requirement_tag, int indent)
4659
+ -> std::string
4660
+ {
4661
+ return " _ = " + pretty_print_visualize (n, indent) + ' ;' ;
4662
+ }
4663
+
4664
+ auto pretty_print_visualize (requires_expression_node::compound_requirement_node const & n, int indent)
4665
+ -> std::string
4666
+ {
4667
+ auto ret = " { " + pretty_print_visualize (*n.expression , indent) + " }" ;
4668
+
4669
+ if (!n.throws ) {
4670
+ ret += " !throws" ;
4671
+ if (n.type_constraint ) {
4672
+ ret += " ," ;
4673
+ }
4674
+ }
4675
+
4676
+ if (n.type_constraint ) {
4677
+ ret += " is " + pretty_print_visualize (*n.type_constraint , indent);
4678
+ }
4679
+
4680
+ ret += ' ;' ;
4681
+
4682
+ return ret;
4683
+ }
4684
+
4685
+
4686
+ auto pretty_print_visualize (logical_or_expression_node const & n, nested_requirement_tag, int indent)
4687
+ -> std::string
4688
+ {
4689
+ return " requires " + pretty_print_visualize (n, indent) + ' ;' ;
4690
+ }
4691
+
4692
+ auto pretty_print_visualize (requires_expression_node::requirement_node const & n, negative_requirement_tag, int indent)
4693
+ -> std::string
4694
+ {
4695
+ return " !requires " + pretty_print_visualize (n, indent);
4696
+ }
4697
+
4698
+ auto pretty_print_visualize (requires_expression_node::requirement_node const & n, int indent)
4699
+ -> std::string
4700
+ {
4701
+ auto ret = std::string{};
4702
+
4703
+ ret += try_pretty_print_visualize<requires_expression_node::requirement_node::type >(n.requirement , type_requirement_tag{}, indent);
4704
+ ret += try_pretty_print_visualize<requires_expression_node::requirement_node::expression>(n.requirement , simple_requirement_tag{}, indent);
4705
+ ret += try_pretty_print_visualize<requires_expression_node::requirement_node::compound >(n.requirement , indent);
4706
+ ret += try_pretty_print_visualize<requires_expression_node::requirement_node::nested >(n.requirement , nested_requirement_tag{}, indent);
4707
+ ret += try_pretty_print_visualize<requires_expression_node::requirement_node::negative >(n.requirement , negative_requirement_tag{}, indent);
4708
+
4709
+ return ret;
4710
+ }
4711
+
4712
+ auto pretty_print_visualize (requires_expression_node const & n, int indent)
4713
+ -> std::string
4714
+ {
4715
+ assert (n.identifier );
4716
+
4717
+ auto ret = std::string{" requires" };
4718
+
4719
+ if (n.parameters ) {
4720
+ ret += pretty_print_visualize (*n.parameters , indent+1 );
4721
+ }
4722
+
4723
+ ret += " {" ;
4724
+
4725
+ auto requirement_indent = pre (indent + 1 );
4726
+ char separator = ' \n ' ;
4727
+ if (n.requirements .size () <= 1 ) {
4728
+ requirement_indent = {};
4729
+ separator = ' ' ;
4730
+ }
4731
+
4732
+ ret += separator;
4733
+
4734
+ for (auto & req: n.requirements ) {
4735
+ assert (req);
4736
+ ret += requirement_indent + pretty_print_visualize (*req, indent+2 ) + separator;
4737
+ }
4738
+
4739
+ ret += requirement_indent;
4740
+ ret += ' }' ;
4741
+
4742
+ return ret;
4743
+ }
4744
+
4745
+
4632
4746
auto pretty_print_visualize (contract_node const & n, int indent)
4633
4747
-> std::string
4634
4748
{
0 commit comments