From fd35ab1d9e31c744afd20b2c3f8101976d382172 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Mon, 15 May 2023 11:31:07 -0700 Subject: [PATCH] ensure raw functions are visible in template and at func definiton with extra underscore --- src/astgen.zig | 2 ++ src/lib.zig | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/astgen.zig b/src/astgen.zig index 884c3077a7b54c5d3db4ac55891da5c732c396f4..51eecb097244819dffb789f9b46d3f8ade6007ed 100644 --- a/src/astgen.zig +++ b/src/astgen.zig @@ -148,6 +148,8 @@ const Parser = struct { if (self.tryEatSymbol("#")) { const fraw = self.tryEatSymbol("#"); const w = self.eat(.word); + std.debug.assert(w.len > 0); + std.debug.assert(w[0] != '_'); if (std.meta.stringToEnum(Block.Type, w)) |name| { const args = self.doArgs(); var children: []const Value = &.{}; diff --git a/src/lib.zig b/src/lib.zig index 659cb8c56364cf776abbe64ce3e952763d9d296d..b0d54ce4997f4658a8a58b3690d7a3fb286d4c7c 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -166,7 +166,7 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp var arena = std.heap.ArenaAllocator.init(alloc); defer arena.deinit(); - if (@hasDecl(Ctx, "pek_" ++ v.name)) { + if (!v.raw and @hasDecl(Ctx, "pek_" ++ v.name)) { const func = @field(Ctx, "pek_" ++ v.name); var list = std.ArrayList(u8).init(arena.allocator()); errdefer list.deinit(); @@ -182,6 +182,22 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp try do(Ctx, alloc, writer, repvalue, try list.toOwnedSlice(), ctx, opts); return; } + if (v.raw and @hasDecl(Ctx, "pek__" ++ v.name)) { + const func = @field(Ctx, "pek__" ++ v.name); + var list = std.ArrayList(u8).init(arena.allocator()); + errdefer list.deinit(); + var args: std.meta.ArgsTuple(@TypeOf(func)) = undefined; + args.@"0" = alloc; + args.@"1" = list.writer(); + inline for (v.args, 0..) |arg, i| { + const field_name = comptime std.fmt.comptimePrint("{d}", .{i + 2}); + @field(args, field_name) = if (comptime std.mem.eql(u8, arg[0], "this")) search(arg[1..], data) else search(arg, ctx); + } + const repvalue = astgen.Value{ .replacement = .{ .arms = &.{"this"}, .raw = v.raw } }; + try @call(.auto, func, args); + try do(Ctx, alloc, writer, repvalue, try list.toOwnedSlice(), ctx, opts); + return; + } @compileError("pek: unknown custom function: " ++ v.name); }, else => unreachable, -- 2.54.0