authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2023-05-15 11:31:07 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2023-05-15 11:31:22 -07:00
logfd35ab1d9e31c744afd20b2c3f8101976d382172
treec15de771804887d7b824be144a627743f24c113b
parent7bcf9a17e412c0a50776b6e3c7a9f05ada377078

ensure raw functions are visible in template and at func definiton with extra underscore


2 files changed, 19 insertions(+), 1 deletions(-)

src/astgen.zig+2
...@@ -148,6 +148,8 @@ const Parser = struct {...@@ -148,6 +148,8 @@ const Parser = struct {
148 if (self.tryEatSymbol("#")) {148 if (self.tryEatSymbol("#")) {
149 const fraw = self.tryEatSymbol("#");149 const fraw = self.tryEatSymbol("#");
150 const w = self.eat(.word);150 const w = self.eat(.word);
151 std.debug.assert(w.len > 0);
152 std.debug.assert(w[0] != '_');
151 if (std.meta.stringToEnum(Block.Type, w)) |name| {153 if (std.meta.stringToEnum(Block.Type, w)) |name| {
152 const args = self.doArgs();154 const args = self.doArgs();
153 var children: []const Value = &.{};155 var children: []const Value = &.{};
src/lib.zig+17-1
...@@ -166,7 +166,7 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp...@@ -166,7 +166,7 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp
166 var arena = std.heap.ArenaAllocator.init(alloc);166 var arena = std.heap.ArenaAllocator.init(alloc);
167 defer arena.deinit();167 defer arena.deinit();
168168
169 if (@hasDecl(Ctx, "pek_" ++ v.name)) {169 if (!v.raw and @hasDecl(Ctx, "pek_" ++ v.name)) {
170 const func = @field(Ctx, "pek_" ++ v.name);170 const func = @field(Ctx, "pek_" ++ v.name);
171 var list = std.ArrayList(u8).init(arena.allocator());171 var list = std.ArrayList(u8).init(arena.allocator());
172 errdefer list.deinit();172 errdefer list.deinit();
...@@ -182,6 +182,22 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp...@@ -182,6 +182,22 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp
182 try do(Ctx, alloc, writer, repvalue, try list.toOwnedSlice(), ctx, opts);182 try do(Ctx, alloc, writer, repvalue, try list.toOwnedSlice(), ctx, opts);
183 return;183 return;
184 }184 }
185 if (v.raw and @hasDecl(Ctx, "pek__" ++ v.name)) {
186 const func = @field(Ctx, "pek__" ++ v.name);
187 var list = std.ArrayList(u8).init(arena.allocator());
188 errdefer list.deinit();
189 var args: std.meta.ArgsTuple(@TypeOf(func)) = undefined;
190 args.@"0" = alloc;
191 args.@"1" = list.writer();
192 inline for (v.args, 0..) |arg, i| {
193 const field_name = comptime std.fmt.comptimePrint("{d}", .{i + 2});
194 @field(args, field_name) = if (comptime std.mem.eql(u8, arg[0], "this")) search(arg[1..], data) else search(arg, ctx);
195 }
196 const repvalue = astgen.Value{ .replacement = .{ .arms = &.{"this"}, .raw = v.raw } };
197 try @call(.auto, func, args);
198 try do(Ctx, alloc, writer, repvalue, try list.toOwnedSlice(), ctx, opts);
199 return;
200 }
185 @compileError("pek: unknown custom function: " ++ v.name);201 @compileError("pek: unknown custom function: " ++ v.name);
186 },202 },
187 else => unreachable,203 else => unreachable,