authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2021-08-08 20:54:58 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2021-08-08 20:54:58 -07:00
logdf816f1c1d19a232094507b97e7359f7ab5754ea
tree5f1514ee78abc34a1c76ff94b5564c9c2f9f5219
parent879a613b8a75275355d463883586bb5255ab1d8e

add shortcut for printing block bodies


2 files changed, 12 insertions(+), 25 deletions(-)

src/astgen.zig+1
......@@ -12,6 +12,7 @@ pub const Value = union(enum) {
1212 string: string,
1313 replacement: []const string,
1414 block: Block,
15 body: []const Value,
1516 function: Fn,
1617};
1718
src/lib.zig+11-25
......@@ -73,56 +73,42 @@ fn do(writer: anytype, comptime value: astgen.Value, data: anytype, ctx: anytype
7373 @compileError("pek: compile: unsupported type: " ++ @typeName(TO));
7474 },
7575 .block => |v| {
76 const body = astgen.Value{ .body = v.body };
7677 switch (v.name) {
7778 .each => {
7879 comptime assertEqual(v.args.len, 1);
7980 const x = search(v.args[0], data);
80 inline for (x) |item| {
81 inline for (v.body) |val| {
82 try do(writer, val, item, ctx, indent, flag1);
83 }
84 }
81 inline for (x) |item| try do(writer, body, item, ctx, indent, flag1);
8582 },
8683 .@"if" => {
8784 comptime assertEqual(v.args.len, 1);
8885 const x = search(v.args[0], data);
89 if (x) {
90 inline for (v.body) |val| {
91 try do(writer, val, data, ctx, indent, flag1);
92 }
93 }
86 if (x) try do(writer, body, data, ctx, indent, flag1);
9487 },
9588 .ifnot => {
9689 comptime assertEqual(v.args.len, 1);
9790 const x = search(v.args[0], data);
98 if (!x) {
99 inline for (v.body) |val| {
100 try do(writer, val, data, ctx, indent, flag1);
101 }
102 }
91 if (!x) try do(writer, body, data, ctx, indent, flag1);
10392 },
10493 .ifequal => {
10594 comptime assertEqual(v.args.len, 2);
10695 const x = search(v.args[0], data);
10796 const y = search(v.args[1], data);
108 if (x == y) {
109 inline for (v.body) |val| {
110 try do(writer, val, data, ctx, indent, flag1);
111 }
112 }
97 if (x == y) try do(writer, body, data, ctx, indent, flag1);
11398 },
11499 .ifnotequal => {
115100 comptime assertEqual(v.args.len, 2);
116101 const x = search(v.args[0], data);
117102 const y = search(v.args[1], data);
118 if (x != y) {
119 inline for (v.body) |val| {
120 try do(writer, val, data, ctx, indent, flag1);
121 }
122 }
103 if (x != y) try do(writer, body, data, ctx, indent, flag1);
123104 },
124105 }
125106 },
107 .body => |v| {
108 inline for (v) |val| {
109 try do(writer, val, data, ctx, indent, flag1);
110 }
111 },
126112 else => unreachable,
127113 }
128114}