Skip to content

Commit 79836c6

Browse files
committed
fix(parse): add pretty_print_visualize for _requires-expression_
1 parent 92f2996 commit 79836c6

File tree

5 files changed

+157
-13
lines changed

5 files changed

+157
-13
lines changed

regression-tests/pure2-print.cpp2

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,19 @@ outer: @print type = {
8484
is 43 = "forty-and-three";
8585
is _ = "default case";
8686
} << "\n";
87+
88+
_ =
89+
requires { std::vector<int>; }
90+
+ requires { _ = 0; }
91+
+ requires {
92+
requires true;
93+
!requires std::vector<int>;
94+
!requires _ = 0;
95+
{ 0 };
96+
{ 0 } !throws;
97+
{ 0 } is std::regular;
98+
{ 0 } !throws, is std::regular;
99+
};
87100
}
88101

89102
x: <Ts...: type> type = {

regression-tests/test-results/pure2-print.cpp

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,31 +57,31 @@ CPP2_REQUIRES_ ((std::is_convertible_v<CPP2_TYPEOF(x), int> && ...))
5757
public: static auto test() -> void;
5858

5959

60-
#line 89 "pure2-print.cpp2"
60+
#line 102 "pure2-print.cpp2"
6161
public: template<typename ...Ts> class x {
6262
private: std::tuple<Ts...> tup {};
6363
public: x() = default;
6464
public: x(x const&) = delete; /* No 'that' constructor, suppress copy */
6565
public: auto operator=(x const&) -> void = delete;
6666

67-
#line 91 "pure2-print.cpp2"
67+
#line 104 "pure2-print.cpp2"
6868
};
6969

7070
public: template<typename ...Args> static auto print(std::ostream& out, Args const& ...args) -> void
7171
CPP2_REQUIRES_ (cpp2::cmp_greater_eq(sizeof(Args)...,0))
72-
#line 93 "pure2-print.cpp2"
72+
#line 106 "pure2-print.cpp2"
7373
;
7474

7575

76-
#line 97 "pure2-print.cpp2"
76+
#line 110 "pure2-print.cpp2"
7777
public: template<typename ...Args> [[nodiscard]] static auto all(Args const& ...args) -> bool;
7878

7979
public: outer() = default;
8080
public: outer(outer const&) = delete; /* No 'that' constructor, suppress copy */
8181
public: auto operator=(outer const&) -> void = delete;
8282

8383

84-
#line 100 "pure2-print.cpp2"
84+
#line 113 "pure2-print.cpp2"
8585
};
8686

8787
auto main() -> int;
@@ -186,20 +186,33 @@ requires ((std::is_convertible_v<CPP2_TYPEOF(x), int> && ...))
186186
if (cpp2::is(_expr, 43)) { if constexpr( requires{"forty-and-three";} ) if constexpr( std::is_convertible_v<CPP2_TYPEOF(("forty-and-three")),namespace_alias::string> ) return "forty-and-three"; else return namespace_alias::string{}; else return namespace_alias::string{}; }
187187
else return "default case"; }
188188
() << "\n";
189+
190+
static_cast<void>(
191+
requires {typename std::vector<int>;
192+
} + requires {0;
193+
} + requires {
194+
requires true;
195+
requires !requires { typename std::vector<int>; };
196+
requires !requires { 0; };
197+
{ 0 };
198+
{ 0 } noexcept;
199+
{ 0 } -> std::regular;
200+
{ 0 } noexcept -> std::regular;
201+
});
189202
}
190203

191-
#line 93 "pure2-print.cpp2"
204+
#line 106 "pure2-print.cpp2"
192205
template<typename ...Args> auto outer::print(std::ostream& out, Args const& ...args) -> void
193206
requires (cpp2::cmp_greater_eq(sizeof(Args)...,0))
194-
#line 93 "pure2-print.cpp2"
207+
#line 106 "pure2-print.cpp2"
195208
{
196209
(out << ... << args);
197210
}
198211

199212
template<typename ...Args> [[nodiscard]] auto outer::all(Args const& ...args) -> bool {
200213
return (... && args); }
201214

202-
#line 102 "pure2-print.cpp2"
215+
#line 115 "pure2-print.cpp2"
203216
auto main() -> int{
204217
outer::test();
205218
}

regression-tests/test-results/pure2-print.cpp2.output

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,15 @@ outer: type =
130130
is 43 = "forty-and-three";
131131
is _ = "default case";
132132
} << "\n";
133+
_ = requires { std::vector<int>; } + requires { _ = 0; } + requires {
134+
requires true;
135+
!requires std::vector<int>;
136+
!requires _ = 0;
137+
{ 0 };
138+
{ 0 } !throws;
139+
{ 0 } is std::regular;
140+
{ 0 } !throws, is std::regular;
141+
};
133142
}
134143
x: <Ts...: type> type =
135144
{

source/cppfront.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2061,11 +2061,6 @@ class cppfront
20612061

20622062
//-----------------------------------------------------------------------
20632063
//
2064-
struct type_requirement_tag {};
2065-
struct simple_requirement_tag {};
2066-
struct nested_requirement_tag {};
2067-
struct negative_requirement_tag {};
2068-
20692064
auto emit(
20702065
type_id_node const& n,
20712066
type_requirement_tag

source/parse.h

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4112,6 +4112,11 @@ struct translation_unit_node
41124112
};
41134113

41144114

4115+
struct type_requirement_tag {};
4116+
struct simple_requirement_tag {};
4117+
struct nested_requirement_tag {};
4118+
struct negative_requirement_tag {};
4119+
41154120
//-----------------------------------------------------------------------
41164121
//
41174122
// pretty_print_visualize: pretty-prints Cpp2 ASTs
@@ -4162,6 +4167,20 @@ auto pretty_print_visualize(alternative_node const& n, int indent)
41624167
-> std::string;
41634168
auto pretty_print_visualize(inspect_expression_node const& n, int indent)
41644169
-> 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;
41654184
auto pretty_print_visualize(contract_node const& n, int indent)
41664185
-> std::string;
41674186
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)
42414260
ret += try_pretty_print_visualize<primary_expression_node::id_expression >(n.expr, indent);
42424261
ret += try_pretty_print_visualize<primary_expression_node::declaration >(n.expr, indent);
42434262
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);
42444264
ret += try_pretty_print_visualize<primary_expression_node::literal >(n.expr, indent);
42454265

42464266
return ret;
@@ -4629,6 +4649,100 @@ auto pretty_print_visualize(inspect_expression_node const& n, int indent)
46294649
}
46304650

46314651

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+
46324746
auto pretty_print_visualize(contract_node const& n, int indent)
46334747
-> std::string
46344748
{

0 commit comments

Comments
 (0)