| ... | @@ -314,6 +314,18 @@ pub const Parser = struct { | ... | @@ -314,6 +314,18 @@ pub const Parser = struct { |
| 314 | try stack.append(State {.ExpectToken = Token.Id.LParen }); | 314 | try stack.append(State {.ExpectToken = Token.Id.LParen }); |
| 315 | continue; | 315 | continue; |
| 316 | }, | 316 | }, |
| | 317 | Token.Id.StringLiteral => { |
| | 318 | const node = try arena.create(ast.NodeStringLiteral); |
| | 319 | *node = ast.NodeStringLiteral { |
| | 320 | .base = ast.Node {.id = ast.Node.Id.StringLiteral}, |
| | 321 | .token = token, |
| | 322 | }; |
| | 323 | try stack.append(State { |
| | 324 | .Operand = &node.base |
| | 325 | }); |
| | 326 | try stack.append(State.AfterOperand); |
| | 327 | continue; |
| | 328 | }, |
| 317 | else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)), | 329 | else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)), |
| 318 | } | 330 | } |
| 319 | }, | 331 | }, |
| ... | @@ -1026,11 +1038,28 @@ pub const Parser = struct { | ... | @@ -1026,11 +1038,28 @@ pub const Parser = struct { |
| 1026 | const float_literal = @fieldParentPtr(ast.NodeFloatLiteral, "base", base); | 1038 | const float_literal = @fieldParentPtr(ast.NodeFloatLiteral, "base", base); |
| 1027 | try stream.print("{}", self.tokenizer.getTokenSlice(float_literal.token)); | 1039 | try stream.print("{}", self.tokenizer.getTokenSlice(float_literal.token)); |
| 1028 | }, | 1040 | }, |
| | 1041 | ast.Node.Id.StringLiteral => { |
| | 1042 | const string_literal = @fieldParentPtr(ast.NodeStringLiteral, "base", base); |
| | 1043 | try stream.print("{}", self.tokenizer.getTokenSlice(string_literal.token)); |
| | 1044 | }, |
| 1029 | ast.Node.Id.BuiltinCall => { | 1045 | ast.Node.Id.BuiltinCall => { |
| 1030 | const builtin_call = @fieldParentPtr(ast.NodeBuiltinCall, "base", base); | 1046 | const builtin_call = @fieldParentPtr(ast.NodeBuiltinCall, "base", base); |
| 1031 | try stream.print("{}()", self.tokenizer.getTokenSlice(builtin_call.builtin_token)); | 1047 | try stream.print("{}(", self.tokenizer.getTokenSlice(builtin_call.builtin_token)); |
| | 1048 | try stack.append(RenderState { .Text = ")"}); |
| | 1049 | var i = builtin_call.params.len; |
| | 1050 | while (i != 0) { |
| | 1051 | i -= 1; |
| | 1052 | const param_node = builtin_call.params.at(i); |
| | 1053 | try stack.append(RenderState { .Expression = param_node}); |
| | 1054 | if (i != 0) { |
| | 1055 | try stack.append(RenderState { .Text = ", " }); |
| | 1056 | } |
| | 1057 | } |
| 1032 | }, | 1058 | }, |
| 1033 | else => unreachable, | 1059 | ast.Node.Id.Root, |
| | 1060 | ast.Node.Id.VarDecl, |
| | 1061 | ast.Node.Id.FnProto, |
| | 1062 | ast.Node.Id.ParamDecl => unreachable, |
| 1034 | }, | 1063 | }, |
| 1035 | RenderState.FnProtoRParen => |fn_proto| { | 1064 | RenderState.FnProtoRParen => |fn_proto| { |
| 1036 | try stream.print(")"); | 1065 | try stream.print(")"); |
| ... | @@ -1141,6 +1170,7 @@ fn testCanonical(source: []const u8) !void { | ... | @@ -1141,6 +1170,7 @@ fn testCanonical(source: []const u8) !void { |
| 1141 | | 1170 | |
| 1142 | test "zig fmt" { | 1171 | test "zig fmt" { |
| 1143 | try testCanonical( | 1172 | try testCanonical( |
| | 1173 | \\const std = @import("std"); |
| 1144 | \\const std = @import(); | 1174 | \\const std = @import(); |
| 1145 | \\ | 1175 | \\ |
| 1146 | ); | 1176 | ); |