From fd7533f6dad7cb1f6d390d3485a3d0ab832dc5d3 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Mon, 23 Aug 2021 00:22:29 -0700 Subject: [PATCH] allow string literals to be passed as function arguments --- src/astgen.zig | 13 +++++++++++-- src/lib.zig | 2 ++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/astgen.zig b/src/astgen.zig index 9303b42622b8781443cbe30ec511166e83807958..8bf65b40dc6e94924f17c4235c08c7f4914be1c5 100644 --- a/src/astgen.zig +++ b/src/astgen.zig @@ -185,10 +185,15 @@ const Parser = struct { temp = temp ++ &[_]string{self.eat(.word)}; } else { ret = ret ++ &[_][]const string{temp}; - temp = &.{self.eat(.word)}; + temp = &.{}; + if (comptime self.nextIs(.string)) { + ret = ret ++ &[_][]const string{&.{self.eat(.string)}}; + } else { + temp = &.{self.eat(.word)}; + } } } - ret = ret ++ &[_][]const string{temp}; + if (temp.len > 0) ret = ret ++ &[_][]const string{temp}; return ret; } @@ -211,4 +216,8 @@ const Parser = struct { } return @field(tok.data, @tagName(typ)); } + + fn nextIs(comptime self: *Parser, comptime typ: std.meta.Tag(Token.Data)) bool { + return self.tokens[self.index].data == typ; + } }; diff --git a/src/lib.zig b/src/lib.zig index c4bcbb026e8afba8fbbba06d32e86a91cc5c40a4..defec7907fc940f90f13e2bcb35a49f55ed055d1 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -160,12 +160,14 @@ fn do(alloc: *std.mem.Allocator, writer: anytype, comptime value: astgen.Value, fn search(comptime args: []const []const u8, ctx: anytype) FieldSearch(@TypeOf(ctx), args) { if (args.len == 0) return ctx; + if (args[0][0] == '"') return std.mem.trim(u8, args[0], "\""); const f = @field(ctx, args[0]); if (args.len == 1) return f; return search(args[1..], f); } fn FieldSearch(comptime T: type, comptime args: []const []const u8) type { + if (args.len > 0 and args[0][0] == '"') return []const u8; return if (args.len == 0) T else if (args.len == 1) Field(T, args[0]) else FieldSearch(Field(T, args[0]), args[1..]); } -- 2.54.0