| ... | @@ -28,7 +28,7 @@ const Ais = std.io.AutoIndentingStream(Writer); | ... | @@ -28,7 +28,7 @@ const Ais = std.io.AutoIndentingStream(Writer); |
| 28 | pub fn render(gpa: *mem.Allocator, writer: Writer, tree: ast.Tree) Error!void { | 28 | pub fn render(gpa: *mem.Allocator, writer: Writer, tree: ast.Tree) Error!void { |
| 29 | assert(tree.errors.len == 0); // cannot render an invalid tree | 29 | assert(tree.errors.len == 0); // cannot render an invalid tree |
| 30 | var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, writer); | 30 | var auto_indenting_stream = std.io.autoIndentingStream(indent_delta, writer); |
| 31 | try renderRoot(&auto_indenting_stream, tree); | 31 | return renderRoot(&auto_indenting_stream, tree); |
| 32 | } | 32 | } |
| 33 | | 33 | |
| 34 | /// Assumes there are no tokens in between start and end. | 34 | /// Assumes there are no tokens in between start and end. |
| ... | @@ -66,10 +66,9 @@ fn renderRoot(ais: *Ais, tree: ast.Tree) Error!void { | ... | @@ -66,10 +66,9 @@ fn renderRoot(ais: *Ais, tree: ast.Tree) Error!void { |
| 66 | // Root is always index 0. | 66 | // Root is always index 0. |
| 67 | const nodes_data = tree.nodes.items(.data); | 67 | const nodes_data = tree.nodes.items(.data); |
| 68 | const root_decls = tree.extra_data[nodes_data[0].lhs..nodes_data[0].rhs]; | 68 | const root_decls = tree.extra_data[nodes_data[0].lhs..nodes_data[0].rhs]; |
| 69 | if (root_decls.len == 0) return; | | |
| 70 | | 69 | |
| 71 | for (root_decls) |decl| { | 70 | for (root_decls) |decl| { |
| 72 | return renderContainerDecl(ais, tree, decl, .Newline); | 71 | try renderContainerDecl(ais, tree, decl, .Newline); |
| 73 | } | 72 | } |
| 74 | } | 73 | } |
| 75 | | 74 | |
| ... | @@ -102,17 +101,11 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S | ... | @@ -102,17 +101,11 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S |
| 102 | const datas = tree.nodes.items(.data); | 101 | const datas = tree.nodes.items(.data); |
| 103 | try renderDocComments(ais, tree, tree.firstToken(decl)); | 102 | try renderDocComments(ais, tree, tree.firstToken(decl)); |
| 104 | switch (tree.nodes.items(.tag)[decl]) { | 103 | switch (tree.nodes.items(.tag)[decl]) { |
| 105 | .UsingNamespace, | 104 | .FnProtoSimple => unreachable, // TODO |
| 106 | .FnProtoSimple, | 105 | .FnProtoSimpleMulti => unreachable, // TODO |
| 107 | .FnProtoSimpleMulti, | 106 | .FnProtoOne => unreachable, // TODO |
| 108 | .FnProtoOne, | 107 | .FnDecl => unreachable, // TODO |
| 109 | .FnProto, | 108 | .FnProto => unreachable, // TODO |
| 110 | .FnDecl, | | |
| 111 | .ContainerFieldInit, | | |
| 112 | .ContainerFieldAlign, | | |
| 113 | .ContainerField, | | |
| 114 | => @panic("TODO implement renderContainerDecl"), | | |
| 115 | | | |
| 116 | // .FnProto => { | 109 | // .FnProto => { |
| 117 | // const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", decl); | 110 | // const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", decl); |
| 118 | | 111 | |
| ... | @@ -127,6 +120,7 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S | ... | @@ -127,6 +120,7 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S |
| 127 | // } | 120 | // } |
| 128 | // }, | 121 | // }, |
| 129 | | 122 | |
| | 123 | .UsingNamespace => unreachable, // TODO |
| 130 | // .Use => { | 124 | // .Use => { |
| 131 | // const use_decl = @fieldParentPtr(ast.Node.Use, "base", decl); | 125 | // const use_decl = @fieldParentPtr(ast.Node.Use, "base", decl); |
| 132 | | 126 | |
| ... | @@ -152,88 +146,10 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S | ... | @@ -152,88 +146,10 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S |
| 152 | try renderExpression(ais, tree, datas[decl].rhs, space); | 146 | try renderExpression(ais, tree, datas[decl].rhs, space); |
| 153 | }, | 147 | }, |
| 154 | | 148 | |
| 155 | // .ContainerField => { | 149 | .ContainerFieldInit => return renderContainerField(ais, tree, tree.containerFieldInit(decl), space), |
| 156 | // const field = @fieldParentPtr(ast.Node.ContainerField, "base", decl); | 150 | .ContainerFieldAlign => return renderContainerField(ais, tree, tree.containerFieldAlign(decl), space), |
| 157 | | 151 | .ContainerField => return renderContainerField(ais, tree, tree.containerField(decl), space), |
| 158 | // try renderDocComments(ais, tree, field, field.doc_comments); | | |
| 159 | // if (field.comptime_token) |t| { | | |
| 160 | // try renderToken(ais, tree, t, .Space); // comptime | | |
| 161 | // } | | |
| 162 | | | |
| 163 | // const src_has_trailing_comma = blk: { | | |
| 164 | // const maybe_comma = tree.nextToken(field.lastToken()); | | |
| 165 | // break :blk tree.token_tags[maybe_comma] == .Comma; | | |
| 166 | // }; | | |
| 167 | | | |
| 168 | // // The trailing comma is emitted at the end, but if it's not present | | |
| 169 | // // we still have to respect the specified `space` parameter | | |
| 170 | // const last_token_space: Space = if (src_has_trailing_comma) .None else space; | | |
| 171 | | | |
| 172 | // if (field.type_expr == null and field.value_expr == null) { | | |
| 173 | // try renderToken(ais, tree, field.name_token, last_token_space); // name | | |
| 174 | // } else if (field.type_expr != null and field.value_expr == null) { | | |
| 175 | // try renderToken(ais, tree, field.name_token, .None); // name | | |
| 176 | // try renderToken(ais, tree, tree.nextToken(field.name_token), .Space); // : | | |
| 177 | | | |
| 178 | // if (field.align_expr) |align_value_expr| { | | |
| 179 | // try renderExpression(ais, tree, field.type_expr.?, .Space); // type | | |
| 180 | // const lparen_token = tree.prevToken(align_value_expr.firstToken()); | | |
| 181 | // const align_kw = tree.prevToken(lparen_token); | | |
| 182 | // const rparen_token = tree.nextToken(align_value_expr.lastToken()); | | |
| 183 | // try renderToken(ais, tree, align_kw, .None); // align | | |
| 184 | // try renderToken(ais, tree, lparen_token, .None); // ( | | |
| 185 | // try renderExpression(ais, tree, align_value_expr, .None); // alignment | | |
| 186 | // try renderToken(ais, tree, rparen_token, last_token_space); // ) | | |
| 187 | // } else { | | |
| 188 | // try renderExpression(ais, tree, field.type_expr.?, last_token_space); // type | | |
| 189 | // } | | |
| 190 | // } else if (field.type_expr == null and field.value_expr != null) { | | |
| 191 | // try renderToken(ais, tree, field.name_token, .Space); // name | | |
| 192 | // try renderToken(ais, tree, tree.nextToken(field.name_token), .Space); // = | | |
| 193 | // try renderExpression(ais, tree, field.value_expr.?, last_token_space); // value | | |
| 194 | // } else { | | |
| 195 | // try renderToken(ais, tree, field.name_token, .None); // name | | |
| 196 | // try renderToken(ais, tree, tree.nextToken(field.name_token), .Space); // : | | |
| 197 | | | |
| 198 | // if (field.align_expr) |align_value_expr| { | | |
| 199 | // try renderExpression(ais, tree, field.type_expr.?, .Space); // type | | |
| 200 | // const lparen_token = tree.prevToken(align_value_expr.firstToken()); | | |
| 201 | // const align_kw = tree.prevToken(lparen_token); | | |
| 202 | // const rparen_token = tree.nextToken(align_value_expr.lastToken()); | | |
| 203 | // try renderToken(ais, tree, align_kw, .None); // align | | |
| 204 | // try renderToken(ais, tree, lparen_token, .None); // ( | | |
| 205 | // try renderExpression(ais, tree, align_value_expr, .None); // alignment | | |
| 206 | // try renderToken(ais, tree, rparen_token, .Space); // ) | | |
| 207 | // } else { | | |
| 208 | // try renderExpression(ais, tree, field.type_expr.?, .Space); // type | | |
| 209 | // } | | |
| 210 | // try renderToken(ais, tree, tree.prevToken(field.value_expr.?.firstToken()), .Space); // = | | |
| 211 | // try renderExpression(ais, tree, field.value_expr.?, last_token_space); // value | | |
| 212 | // } | | |
| 213 | | | |
| 214 | // if (src_has_trailing_comma) { | | |
| 215 | // const comma = tree.nextToken(field.lastToken()); | | |
| 216 | // try renderToken(ais, tree, comma, space); | | |
| 217 | // } | | |
| 218 | // }, | | |
| 219 | .Comptime => return renderExpression(ais, tree, decl, space), | 152 | .Comptime => return renderExpression(ais, tree, decl, space), |
| 220 | | | |
| 221 | // .DocComment => { | | |
| 222 | // const comment = @fieldParentPtr(ast.Node.DocComment, "base", decl); | | |
| 223 | // const kind = tree.token_tags[comment.first_line]; | | |
| 224 | // try renderToken(ais, tree, comment.first_line, .Newline); | | |
| 225 | // var tok_i = comment.first_line + 1; | | |
| 226 | // while (true) : (tok_i += 1) { | | |
| 227 | // const tok_id = tree.token_tags[tok_i]; | | |
| 228 | // if (tok_id == kind) { | | |
| 229 | // try renderToken(ais, tree, tok_i, .Newline); | | |
| 230 | // } else if (tok_id == .LineComment) { | | |
| 231 | // continue; | | |
| 232 | // } else { | | |
| 233 | // break; | | |
| 234 | // } | | |
| 235 | // } | | |
| 236 | // }, | | |
| 237 | else => unreachable, | 153 | else => unreachable, |
| 238 | } | 154 | } |
| 239 | } | 155 | } |
| ... | @@ -254,8 +170,12 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -254,8 +170,12 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 254 | .NullLiteral, | 170 | .NullLiteral, |
| 255 | .UnreachableLiteral, | 171 | .UnreachableLiteral, |
| 256 | .UndefinedLiteral, | 172 | .UndefinedLiteral, |
| | 173 | .AnyFrameLiteral, |
| 257 | => return renderToken(ais, tree, main_tokens[node], space), | 174 | => return renderToken(ais, tree, main_tokens[node], space), |
| 258 | | 175 | |
| | 176 | .ErrorValue => unreachable, // TODO |
| | 177 | |
| | 178 | .AnyType => unreachable, // TODO |
| 259 | //.AnyType => { | 179 | //.AnyType => { |
| 260 | // const any_type = base.castTag(.AnyType).?; | 180 | // const any_type = base.castTag(.AnyType).?; |
| 261 | // if (mem.eql(u8, tree.tokenSlice(any_type.token), "var")) { | 181 | // if (mem.eql(u8, tree.tokenSlice(any_type.token), "var")) { |
| ... | @@ -322,6 +242,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -322,6 +242,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 322 | } | 242 | } |
| 323 | }, | 243 | }, |
| 324 | | 244 | |
| | 245 | .Defer => unreachable, // TODO |
| | 246 | .ErrDefer => unreachable, // TODO |
| 325 | //.Defer => { | 247 | //.Defer => { |
| 326 | // const defer_node = @fieldParentPtr(ast.Node.Defer, "base", base); | 248 | // const defer_node = @fieldParentPtr(ast.Node.Defer, "base", base); |
| 327 | | 249 | |
| ... | @@ -337,6 +259,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -337,6 +259,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 337 | try renderToken(ais, tree, comptime_token, .Space); | 259 | try renderToken(ais, tree, comptime_token, .Space); |
| 338 | return renderExpression(ais, tree, block, space); | 260 | return renderExpression(ais, tree, block, space); |
| 339 | }, | 261 | }, |
| | 262 | .Nosuspend => unreachable, // TODO |
| 340 | //.Nosuspend => { | 263 | //.Nosuspend => { |
| 341 | // const nosuspend_node = @fieldParentPtr(ast.Node.Nosuspend, "base", base); | 264 | // const nosuspend_node = @fieldParentPtr(ast.Node.Nosuspend, "base", base); |
| 342 | // if (mem.eql(u8, tree.tokenSlice(nosuspend_node.nosuspend_token), "noasync")) { | 265 | // if (mem.eql(u8, tree.tokenSlice(nosuspend_node.nosuspend_token), "noasync")) { |
| ... | @@ -348,6 +271,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -348,6 +271,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 348 | // return renderExpression(ais, tree, nosuspend_node.expr, space); | 271 | // return renderExpression(ais, tree, nosuspend_node.expr, space); |
| 349 | //}, | 272 | //}, |
| 350 | | 273 | |
| | 274 | .Suspend => unreachable, // TODO |
| 351 | //.Suspend => { | 275 | //.Suspend => { |
| 352 | // const suspend_node = @fieldParentPtr(ast.Node.Suspend, "base", base); | 276 | // const suspend_node = @fieldParentPtr(ast.Node.Suspend, "base", base); |
| 353 | | 277 | |
| ... | @@ -359,6 +283,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -359,6 +283,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 359 | // } | 283 | // } |
| 360 | //}, | 284 | //}, |
| 361 | | 285 | |
| | 286 | .Catch => unreachable, // TODO |
| 362 | //.Catch => { | 287 | //.Catch => { |
| 363 | // const infix_op_node = @fieldParentPtr(ast.Node.Catch, "base", base); | 288 | // const infix_op_node = @fieldParentPtr(ast.Node.Catch, "base", base); |
| 364 | | 289 | |
| ... | @@ -452,27 +377,26 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -452,27 +377,26 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 452 | return renderExpression(ais, tree, infix.rhs, space); | 377 | return renderExpression(ais, tree, infix.rhs, space); |
| 453 | }, | 378 | }, |
| 454 | | 379 | |
| 455 | //.BitNot, | 380 | .BitNot, |
| 456 | //.BoolNot, | 381 | .BoolNot, |
| 457 | //.Negation, | 382 | .Negation, |
| 458 | //.NegationWrap, | 383 | .NegationWrap, |
| 459 | //.OptionalType, | 384 | .OptionalType, |
| 460 | //.AddressOf, | 385 | .AddressOf, |
| 461 | //=> { | 386 | => { |
| 462 | // const casted_node = @fieldParentPtr(ast.Node.SimplePrefixOp, "base", base); | 387 | try renderToken(ais, tree, main_tokens[node], .None); |
| 463 | // try renderToken(ais, tree, casted_node.op_token, Space.None); | 388 | return renderExpression(ais, tree, datas[node].lhs, space); |
| 464 | // return renderExpression(ais, tree, casted_node.rhs, space); | 389 | }, |
| 465 | //}, | | |
| 466 | | 390 | |
| 467 | //.Try, | 391 | .Try, |
| 468 | //.Resume, | 392 | .Resume, |
| 469 | //.Await, | 393 | .Await, |
| 470 | //=> { | 394 | => { |
| 471 | // const casted_node = @fieldParentPtr(ast.Node.SimplePrefixOp, "base", base); | 395 | try renderToken(ais, tree, main_tokens[node], .Space); |
| 472 | // try renderToken(ais, tree, casted_node.op_token, Space.Space); | 396 | return renderExpression(ais, tree, datas[node].lhs, space); |
| 473 | // return renderExpression(ais, tree, casted_node.rhs, space); | 397 | }, |
| 474 | //}, | | |
| 475 | | 398 | |
| | 399 | .ArrayType => unreachable, // TODO |
| 476 | //.ArrayType => { | 400 | //.ArrayType => { |
| 477 | // const array_type = @fieldParentPtr(ast.Node.ArrayType, "base", base); | 401 | // const array_type = @fieldParentPtr(ast.Node.ArrayType, "base", base); |
| 478 | // return renderArrayType( | 402 | // return renderArrayType( |
| ... | @@ -486,6 +410,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -486,6 +410,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 486 | // space, | 410 | // space, |
| 487 | // ); | 411 | // ); |
| 488 | //}, | 412 | //}, |
| | 413 | .ArrayTypeSentinel => unreachable, // TODO |
| 489 | //.ArrayTypeSentinel => { | 414 | //.ArrayTypeSentinel => { |
| 490 | // const array_type = @fieldParentPtr(ast.Node.ArrayTypeSentinel, "base", base); | 415 | // const array_type = @fieldParentPtr(ast.Node.ArrayTypeSentinel, "base", base); |
| 491 | // return renderArrayType( | 416 | // return renderArrayType( |
| ... | @@ -500,6 +425,9 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -500,6 +425,9 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 500 | // ); | 425 | // ); |
| 501 | //}, | 426 | //}, |
| 502 | | 427 | |
| | 428 | .PtrType => unreachable, // TODO |
| | 429 | .PtrTypeAligned => unreachable, // TODO |
| | 430 | .PtrTypeSentinel => unreachable, // TODO |
| 503 | //.PtrType => { | 431 | //.PtrType => { |
| 504 | // const ptr_type = @fieldParentPtr(ast.Node.PtrType, "base", base); | 432 | // const ptr_type = @fieldParentPtr(ast.Node.PtrType, "base", base); |
| 505 | // const op_tok_id = tree.token_tags[ptr_type.op_token]; | 433 | // const op_tok_id = tree.token_tags[ptr_type.op_token]; |
| ... | @@ -562,6 +490,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -562,6 +490,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 562 | // return renderExpression(ais, tree, ptr_type.rhs, space); | 490 | // return renderExpression(ais, tree, ptr_type.rhs, space); |
| 563 | //}, | 491 | //}, |
| 564 | | 492 | |
| | 493 | .SliceType => unreachable, // TODO |
| 565 | //.SliceType => { | 494 | //.SliceType => { |
| 566 | // const slice_type = @fieldParentPtr(ast.Node.SliceType, "base", base); | 495 | // const slice_type = @fieldParentPtr(ast.Node.SliceType, "base", base); |
| 567 | // try renderToken(ais, tree, slice_type.op_token, Space.None); // [ | 496 | // try renderToken(ais, tree, slice_type.op_token, Space.None); // [ |
| ... | @@ -611,6 +540,10 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -611,6 +540,10 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 611 | // return renderExpression(ais, tree, slice_type.rhs, space); | 540 | // return renderExpression(ais, tree, slice_type.rhs, space); |
| 612 | //}, | 541 | //}, |
| 613 | | 542 | |
| | 543 | .ArrayInitOne => unreachable, // TODO |
| | 544 | .ArrayInitDotTwo => unreachable, // TODO |
| | 545 | .ArrayInitDot => unreachable, // TODO |
| | 546 | .ArrayInit => unreachable, // TODO |
| 614 | //.ArrayInitializer, .ArrayInitializerDot => { | 547 | //.ArrayInitializer, .ArrayInitializerDot => { |
| 615 | // var rtoken: ast.TokenIndex = undefined; | 548 | // var rtoken: ast.TokenIndex = undefined; |
| 616 | // var exprs: []ast.Node.Index = undefined; | 549 | // var exprs: []ast.Node.Index = undefined; |
| ... | @@ -823,6 +756,10 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -823,6 +756,10 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 823 | // return renderToken(ais, tree, rtoken, space); | 756 | // return renderToken(ais, tree, rtoken, space); |
| 824 | //}, | 757 | //}, |
| 825 | | 758 | |
| | 759 | .StructInitOne => unreachable, // TODO |
| | 760 | .StructInitDotTwo => unreachable, // TODO |
| | 761 | .StructInitDot => unreachable, // TODO |
| | 762 | .StructInit => unreachable, // TODO |
| 826 | //.StructInitializer, .StructInitializerDot => { | 763 | //.StructInitializer, .StructInitializerDot => { |
| 827 | // var rtoken: ast.TokenIndex = undefined; | 764 | // var rtoken: ast.TokenIndex = undefined; |
| 828 | // var field_inits: []ast.Node.Index = undefined; | 765 | // var field_inits: []ast.Node.Index = undefined; |
| ... | @@ -959,6 +896,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -959,6 +896,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 959 | // return renderToken(ais, tree, rtoken, space); | 896 | // return renderToken(ais, tree, rtoken, space); |
| 960 | //}, | 897 | //}, |
| 961 | | 898 | |
| | 899 | .CallOne => unreachable, // TODO |
| 962 | .Call => { | 900 | .Call => { |
| 963 | const call = datas[node]; | 901 | const call = datas[node]; |
| 964 | const params_range = tree.extraData(call.rhs, ast.Node.SubRange); | 902 | const params_range = tree.extraData(call.rhs, ast.Node.SubRange); |
| ... | @@ -1017,6 +955,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1017,6 +955,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1017 | return renderToken(ais, tree, after_last_param_tok, space); // ) | 955 | return renderToken(ais, tree, after_last_param_tok, space); // ) |
| 1018 | }, | 956 | }, |
| 1019 | | 957 | |
| | 958 | .ArrayAccess => unreachable, // TODO |
| 1020 | //.ArrayAccess => { | 959 | //.ArrayAccess => { |
| 1021 | // const suffix_op = base.castTag(.ArrayAccess).?; | 960 | // const suffix_op = base.castTag(.ArrayAccess).?; |
| 1022 | | 961 | |
| ... | @@ -1039,6 +978,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1039,6 +978,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1039 | // return renderToken(ais, tree, rbracket, space); // ] | 978 | // return renderToken(ais, tree, rbracket, space); // ] |
| 1040 | //}, | 979 | //}, |
| 1041 | | 980 | |
| | 981 | .Slice => unreachable, // TODO |
| | 982 | .SliceOpen => unreachable, // TODO |
| 1042 | //.Slice => { | 983 | //.Slice => { |
| 1043 | // const suffix_op = base.castTag(.Slice).?; | 984 | // const suffix_op = base.castTag(.Slice).?; |
| 1044 | // try renderExpression(ais, tree, suffix_op.lhs, Space.None); | 985 | // try renderExpression(ais, tree, suffix_op.lhs, Space.None); |
| ... | @@ -1066,12 +1007,14 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1066,12 +1007,14 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1066 | // return renderToken(ais, tree, suffix_op.rtoken, space); // ] | 1007 | // return renderToken(ais, tree, suffix_op.rtoken, space); // ] |
| 1067 | //}, | 1008 | //}, |
| 1068 | | 1009 | |
| | 1010 | .Deref => unreachable, // TODO |
| 1069 | //.Deref => { | 1011 | //.Deref => { |
| 1070 | // const suffix_op = base.castTag(.Deref).?; | 1012 | // const suffix_op = base.castTag(.Deref).?; |
| 1071 | | 1013 | |
| 1072 | // try renderExpression(ais, tree, suffix_op.lhs, Space.None); | 1014 | // try renderExpression(ais, tree, suffix_op.lhs, Space.None); |
| 1073 | // return renderToken(ais, tree, suffix_op.rtoken, space); // .* | 1015 | // return renderToken(ais, tree, suffix_op.rtoken, space); // .* |
| 1074 | //}, | 1016 | //}, |
| | 1017 | .UnwrapOptional => unreachable, // TODO |
| 1075 | //.UnwrapOptional => { | 1018 | //.UnwrapOptional => { |
| 1076 | // const suffix_op = base.castTag(.UnwrapOptional).?; | 1019 | // const suffix_op = base.castTag(.UnwrapOptional).?; |
| 1077 | | 1020 | |
| ... | @@ -1080,6 +1023,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1080,6 +1023,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1080 | // return renderToken(ais, tree, suffix_op.rtoken, space); // ? | 1023 | // return renderToken(ais, tree, suffix_op.rtoken, space); // ? |
| 1081 | //}, | 1024 | //}, |
| 1082 | | 1025 | |
| | 1026 | .Break => unreachable, // TODO |
| 1083 | //.Break => { | 1027 | //.Break => { |
| 1084 | // const flow_expr = base.castTag(.Break).?; | 1028 | // const flow_expr = base.castTag(.Break).?; |
| 1085 | // const maybe_rhs = flow_expr.getRHS(); | 1029 | // const maybe_rhs = flow_expr.getRHS(); |
| ... | @@ -1102,6 +1046,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1102,6 +1046,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1102 | // return renderExpression(ais, tree, maybe_rhs.?, space); | 1046 | // return renderExpression(ais, tree, maybe_rhs.?, space); |
| 1103 | //}, | 1047 | //}, |
| 1104 | | 1048 | |
| | 1049 | .Continue => unreachable, // TODO |
| 1105 | //.Continue => { | 1050 | //.Continue => { |
| 1106 | // const flow_expr = base.castTag(.Continue).?; | 1051 | // const flow_expr = base.castTag(.Continue).?; |
| 1107 | // if (flow_expr.getLabel()) |label| { | 1052 | // if (flow_expr.getLabel()) |label| { |
| ... | @@ -1114,6 +1059,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1114,6 +1059,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1114 | // } | 1059 | // } |
| 1115 | //}, | 1060 | //}, |
| 1116 | | 1061 | |
| | 1062 | .Return => unreachable, // TODO |
| 1117 | //.Return => { | 1063 | //.Return => { |
| 1118 | // const flow_expr = base.castTag(.Return).?; | 1064 | // const flow_expr = base.castTag(.Return).?; |
| 1119 | // if (flow_expr.getRHS()) |rhs| { | 1065 | // if (flow_expr.getRHS()) |rhs| { |
| ... | @@ -1124,36 +1070,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1124,36 +1070,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1124 | // } | 1070 | // } |
| 1125 | //}, | 1071 | //}, |
| 1126 | | 1072 | |
| 1127 | //.PointerPayload => { | 1073 | .GroupedExpression => unreachable, // TODO |
| 1128 | // const payload = @fieldParentPtr(ast.Node.PointerPayload, "base", base); | | |
| 1129 | | | |
| 1130 | // try renderToken(ais, tree, payload.lpipe, Space.None); | | |
| 1131 | // if (payload.ptr_token) |ptr_token| { | | |
| 1132 | // try renderToken(ais, tree, ptr_token, Space.None); | | |
| 1133 | // } | | |
| 1134 | // try renderExpression(ais, tree, payload.value_symbol, Space.None); | | |
| 1135 | // return renderToken(ais, tree, payload.rpipe, space); | | |
| 1136 | //}, | | |
| 1137 | | | |
| 1138 | //.PointerIndexPayload => { | | |
| 1139 | // const payload = @fieldParentPtr(ast.Node.PointerIndexPayload, "base", base); | | |
| 1140 | | | |
| 1141 | // try renderToken(ais, tree, payload.lpipe, Space.None); | | |
| 1142 | // if (payload.ptr_token) |ptr_token| { | | |
| 1143 | // try renderToken(ais, tree, ptr_token, Space.None); | | |
| 1144 | // } | | |
| 1145 | // try renderExpression(ais, tree, payload.value_symbol, Space.None); | | |
| 1146 | | | |
| 1147 | // if (payload.index_symbol) |index_symbol| { | | |
| 1148 | // const comma = tree.nextToken(payload.value_symbol.lastToken()); | | |
| 1149 | | | |
| 1150 | // try renderToken(ais, tree, comma, Space.Space); | | |
| 1151 | // try renderExpression(ais, tree, index_symbol, Space.None); | | |
| 1152 | // } | | |
| 1153 | | | |
| 1154 | // return renderToken(ais, tree, payload.rpipe, space); | | |
| 1155 | //}, | | |
| 1156 | | | |
| 1157 | //.GroupedExpression => { | 1074 | //.GroupedExpression => { |
| 1158 | // const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", base); | 1075 | // const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", base); |
| 1159 | | 1076 | |
| ... | @@ -1165,15 +1082,10 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1165,15 +1082,10 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1165 | // return renderToken(ais, tree, grouped_expr.rparen, space); | 1082 | // return renderToken(ais, tree, grouped_expr.rparen, space); |
| 1166 | //}, | 1083 | //}, |
| 1167 | | 1084 | |
| 1168 | //.FieldInitializer => { | 1085 | .ContainerDecl => unreachable, // TODO |
| 1169 | // const field_init = @fieldParentPtr(ast.Node.FieldInitializer, "base", base); | 1086 | .ContainerDeclArg => unreachable, // TODO |
| 1170 | | 1087 | .TaggedUnion => unreachable, // TODO |
| 1171 | // try renderToken(ais, tree, field_init.period_token, Space.None); // . | 1088 | .TaggedUnionEnumTag => unreachable, // TODO |
| 1172 | // try renderToken(ais, tree, field_init.name_token, Space.Space); // name | | |
| 1173 | // try renderToken(ais, tree, tree.nextToken(field_init.name_token), Space.Space); // = | | |
| 1174 | // return renderExpression(ais, tree, field_init.expr, space); | | |
| 1175 | //}, | | |
| 1176 | | | |
| 1177 | //.ContainerDecl => { | 1089 | //.ContainerDecl => { |
| 1178 | // const container_decl = @fieldParentPtr(ast.Node.ContainerDecl, "base", base); | 1090 | // const container_decl = @fieldParentPtr(ast.Node.ContainerDecl, "base", base); |
| 1179 | | 1091 | |
| ... | @@ -1289,6 +1201,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1289,6 +1201,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1289 | // return renderToken(ais, tree, container_decl.rbrace_token, space); // } | 1201 | // return renderToken(ais, tree, container_decl.rbrace_token, space); // } |
| 1290 | //}, | 1202 | //}, |
| 1291 | | 1203 | |
| | 1204 | .ErrorSetDecl => unreachable, // TODO |
| 1292 | //.ErrorSetDecl => { | 1205 | //.ErrorSetDecl => { |
| 1293 | // const err_set_decl = @fieldParentPtr(ast.Node.ErrorSetDecl, "base", base); | 1206 | // const err_set_decl = @fieldParentPtr(ast.Node.ErrorSetDecl, "base", base); |
| 1294 | | 1207 | |
| ... | @@ -1365,28 +1278,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1365,28 +1278,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1365 | // } | 1278 | // } |
| 1366 | //}, | 1279 | //}, |
| 1367 | | 1280 | |
| 1368 | //.ErrorTag => { | 1281 | .BuiltinCall => unreachable, // TODO |
| 1369 | // const tag = @fieldParentPtr(ast.Node.ErrorTag, "base", base); | 1282 | .BuiltinCallTwo => unreachable, // TODO |
| 1370 | | | |
| 1371 | // try renderDocComments(ais, tree, tag, tag.doc_comments); | | |
| 1372 | // return renderToken(ais, tree, tag.name_token, space); // name | | |
| 1373 | //}, | | |
| 1374 | | | |
| 1375 | //.MultilineStringLiteral => { | | |
| 1376 | // const multiline_str_literal = @fieldParentPtr(ast.Node.MultilineStringLiteral, "base", base); | | |
| 1377 | | | |
| 1378 | // { | | |
| 1379 | // const locked_indents = ais.lockOneShotIndent(); | | |
| 1380 | // defer { | | |
| 1381 | // var i: u8 = 0; | | |
| 1382 | // while (i < locked_indents) : (i += 1) ais.popIndent(); | | |
| 1383 | // } | | |
| 1384 | // try ais.maybeInsertNewline(); | | |
| 1385 | | | |
| 1386 | // for (multiline_str_literal.lines()) |t| try renderToken(ais, tree, t, Space.None); | | |
| 1387 | // } | | |
| 1388 | //}, | | |
| 1389 | | | |
| 1390 | //.BuiltinCall => { | 1283 | //.BuiltinCall => { |
| 1391 | // const builtin_call = @fieldParentPtr(ast.Node.BuiltinCall, "base", base); | 1284 | // const builtin_call = @fieldParentPtr(ast.Node.BuiltinCall, "base", base); |
| 1392 | | 1285 | |
| ... | @@ -1448,6 +1341,10 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1448,6 +1341,10 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1448 | // return renderToken(ais, tree, builtin_call.rparen_token, space); // ) | 1341 | // return renderToken(ais, tree, builtin_call.rparen_token, space); // ) |
| 1449 | //}, | 1342 | //}, |
| 1450 | | 1343 | |
| | 1344 | .FnProtoSimple => unreachable, // TODO |
| | 1345 | .FnProtoSimpleMulti => unreachable, // TODO |
| | 1346 | .FnProtoOne => unreachable, // TODO |
| | 1347 | .FnProto => unreachable, // TODO |
| 1451 | //.FnProto => { | 1348 | //.FnProto => { |
| 1452 | // const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", base); | 1349 | // const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", base); |
| 1453 | | 1350 | |
| ... | @@ -1579,6 +1476,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1579,6 +1476,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1579 | // } | 1476 | // } |
| 1580 | //}, | 1477 | //}, |
| 1581 | | 1478 | |
| | 1479 | .AnyFrameType => unreachable, // TODO |
| 1582 | //.AnyFrameType => { | 1480 | //.AnyFrameType => { |
| 1583 | // const anyframe_type = @fieldParentPtr(ast.Node.AnyFrameType, "base", base); | 1481 | // const anyframe_type = @fieldParentPtr(ast.Node.AnyFrameType, "base", base); |
| 1584 | | 1482 | |
| ... | @@ -1591,8 +1489,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1591,8 +1489,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1591 | // } | 1489 | // } |
| 1592 | //}, | 1490 | //}, |
| 1593 | | 1491 | |
| 1594 | //.DocComment => unreachable, // doc comments are attached to nodes | 1492 | .Switch => unreachable, // TODO |
| 1595 | | | |
| 1596 | //.Switch => { | 1493 | //.Switch => { |
| 1597 | // const switch_node = @fieldParentPtr(ast.Node.Switch, "base", base); | 1494 | // const switch_node = @fieldParentPtr(ast.Node.Switch, "base", base); |
| 1598 | | 1495 | |
| ... | @@ -1630,6 +1527,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1630,6 +1527,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1630 | // return renderToken(ais, tree, switch_node.rbrace, space); // } | 1527 | // return renderToken(ais, tree, switch_node.rbrace, space); // } |
| 1631 | //}, | 1528 | //}, |
| 1632 | | 1529 | |
| | 1530 | .SwitchCaseOne => unreachable, // TODO |
| | 1531 | .SwitchCaseMulti => unreachable, // TODO |
| 1633 | //.SwitchCase => { | 1532 | //.SwitchCase => { |
| 1634 | // const switch_case = @fieldParentPtr(ast.Node.SwitchCase, "base", base); | 1533 | // const switch_case = @fieldParentPtr(ast.Node.SwitchCase, "base", base); |
| 1635 | | 1534 | |
| ... | @@ -1676,11 +1575,10 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1676,11 +1575,10 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1676 | | 1575 | |
| 1677 | // return renderExpression(ais, tree, switch_case.expr, space); | 1576 | // return renderExpression(ais, tree, switch_case.expr, space); |
| 1678 | //}, | 1577 | //}, |
| 1679 | //.SwitchElse => { | | |
| 1680 | // const switch_else = @fieldParentPtr(ast.Node.SwitchElse, "base", base); | | |
| 1681 | // return renderToken(ais, tree, switch_else.token, space); | | |
| 1682 | //}, | | |
| 1683 | | 1578 | |
| | 1579 | .WhileSimple => unreachable, // TODO |
| | 1580 | .WhileCont => unreachable, // TODO |
| | 1581 | .While => unreachable, // TODO |
| 1684 | //.While => { | 1582 | //.While => { |
| 1685 | // const while_node = @fieldParentPtr(ast.Node.While, "base", base); | 1583 | // const while_node = @fieldParentPtr(ast.Node.While, "base", base); |
| 1686 | | 1584 | |
| ... | @@ -1749,6 +1647,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1749,6 +1647,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1749 | // } | 1647 | // } |
| 1750 | //}, | 1648 | //}, |
| 1751 | | 1649 | |
| | 1650 | .ForSimple => unreachable, // TODO |
| | 1651 | .For => unreachable, // TODO |
| 1752 | //.For => { | 1652 | //.For => { |
| 1753 | // const for_node = @fieldParentPtr(ast.Node.For, "base", base); | 1653 | // const for_node = @fieldParentPtr(ast.Node.For, "base", base); |
| 1754 | | 1654 | |
| ... | @@ -1802,6 +1702,11 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1802,6 +1702,11 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1802 | | 1702 | |
| 1803 | .IfSimple => return renderIf(ais, tree, tree.ifSimple(node), space), | 1703 | .IfSimple => return renderIf(ais, tree, tree.ifSimple(node), space), |
| 1804 | .If => return renderIf(ais, tree, tree.ifFull(node), space), | 1704 | .If => return renderIf(ais, tree, tree.ifFull(node), space), |
| | 1705 | |
| | 1706 | .Asm => unreachable, // TODO |
| | 1707 | .AsmSimple => unreachable, // TODO |
| | 1708 | .AsmOutput => unreachable, // TODO |
| | 1709 | .AsmInput => unreachable, // TODO |
| 1805 | //.Asm => { | 1710 | //.Asm => { |
| 1806 | // const asm_node = @fieldParentPtr(ast.Node.Asm, "base", base); | 1711 | // const asm_node = @fieldParentPtr(ast.Node.Asm, "base", base); |
| 1807 | | 1712 | |
| ... | @@ -1911,6 +1816,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1911,6 +1816,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1911 | // return renderToken(ais, tree, asm_node.rparen, space); | 1816 | // return renderToken(ais, tree, asm_node.rparen, space); |
| 1912 | //}, | 1817 | //}, |
| 1913 | | 1818 | |
| | 1819 | .EnumLiteral => unreachable, // TODO |
| 1914 | //.EnumLiteral => { | 1820 | //.EnumLiteral => { |
| 1915 | // const enum_literal = @fieldParentPtr(ast.Node.EnumLiteral, "base", base); | 1821 | // const enum_literal = @fieldParentPtr(ast.Node.EnumLiteral, "base", base); |
| 1916 | | 1822 | |
| ... | @@ -1918,13 +1824,17 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1918,13 +1824,17 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1918 | // return renderToken(ais, tree, enum_literal.name, space); // name | 1824 | // return renderToken(ais, tree, enum_literal.name, space); // name |
| 1919 | //}, | 1825 | //}, |
| 1920 | | 1826 | |
| 1921 | //.ContainerField, | 1827 | .FnDecl => unreachable, |
| 1922 | //.Root, | 1828 | .ContainerField => unreachable, |
| 1923 | //.VarDecl, | 1829 | .ContainerFieldInit => unreachable, |
| 1924 | //.Use, | 1830 | .ContainerFieldAlign => unreachable, |
| 1925 | //.TestDecl, | 1831 | .Root => unreachable, |
| 1926 | //=> unreachable, | 1832 | .GlobalVarDecl => unreachable, |
| 1927 | else => @panic("TODO implement more renderExpression"), | 1833 | .LocalVarDecl => unreachable, |
| | 1834 | .SimpleVarDecl => unreachable, |
| | 1835 | .AlignedVarDecl => unreachable, |
| | 1836 | .UsingNamespace => unreachable, |
| | 1837 | .TestDecl => unreachable, |
| 1928 | } | 1838 | } |
| 1929 | } | 1839 | } |
| 1930 | | 1840 | |
| ... | @@ -2234,6 +2144,59 @@ fn renderIf(ais: *Ais, tree: ast.Tree, if_node: ast.Full.If, space: Space) Error | ... | @@ -2234,6 +2144,59 @@ fn renderIf(ais: *Ais, tree: ast.Tree, if_node: ast.Full.If, space: Space) Error |
| 2234 | } | 2144 | } |
| 2235 | } | 2145 | } |
| 2236 | | 2146 | |
| | 2147 | fn renderContainerField( |
| | 2148 | ais: *Ais, |
| | 2149 | tree: ast.Tree, |
| | 2150 | field: ast.Full.ContainerField, |
| | 2151 | space: Space, |
| | 2152 | ) Error!void { |
| | 2153 | const main_tokens = tree.nodes.items(.main_token); |
| | 2154 | if (field.comptime_token) |t| { |
| | 2155 | try renderToken(ais, tree, t, .Space); // comptime |
| | 2156 | } |
| | 2157 | if (field.ast.type_expr == 0 and field.ast.value_expr == 0) { |
| | 2158 | return renderTokenComma(ais, tree, field.ast.name_token, space); // name |
| | 2159 | } |
| | 2160 | if (field.ast.type_expr != 0 and field.ast.value_expr == 0) { |
| | 2161 | try renderToken(ais, tree, field.ast.name_token, .None); // name |
| | 2162 | try renderToken(ais, tree, field.ast.name_token + 1, .Space); // : |
| | 2163 | |
| | 2164 | if (field.ast.align_expr != 0) { |
| | 2165 | try renderExpression(ais, tree, field.ast.type_expr, .Space); // type |
| | 2166 | const align_token = tree.firstToken(field.ast.align_expr) - 2; |
| | 2167 | try renderToken(ais, tree, align_token, .None); // align |
| | 2168 | try renderToken(ais, tree, align_token + 1, .None); // ( |
| | 2169 | try renderExpression(ais, tree, field.ast.align_expr, .None); // alignment |
| | 2170 | const rparen = tree.lastToken(field.ast.align_expr) + 1; |
| | 2171 | return renderTokenComma(ais, tree, rparen, space); // ) |
| | 2172 | } else { |
| | 2173 | return renderExpressionComma(ais, tree, field.ast.type_expr, space); // type |
| | 2174 | } |
| | 2175 | } |
| | 2176 | if (field.ast.type_expr == 0 and field.ast.value_expr != 0) { |
| | 2177 | try renderToken(ais, tree, field.ast.name_token, .Space); // name |
| | 2178 | try renderToken(ais, tree, field.ast.name_token + 1, .Space); // = |
| | 2179 | return renderExpressionComma(ais, tree, field.ast.value_expr, space); // value |
| | 2180 | } |
| | 2181 | |
| | 2182 | try renderToken(ais, tree, field.ast.name_token, .None); // name |
| | 2183 | try renderToken(ais, tree, field.ast.name_token + 1, .Space); // : |
| | 2184 | try renderExpression(ais, tree, field.ast.type_expr, .Space); // type |
| | 2185 | |
| | 2186 | if (field.ast.align_expr != 0) { |
| | 2187 | const lparen_token = tree.firstToken(field.ast.align_expr) - 1; |
| | 2188 | const align_kw = lparen_token - 1; |
| | 2189 | const rparen_token = tree.lastToken(field.ast.align_expr) + 1; |
| | 2190 | try renderToken(ais, tree, align_kw, .None); // align |
| | 2191 | try renderToken(ais, tree, lparen_token, .None); // ( |
| | 2192 | try renderExpression(ais, tree, field.ast.align_expr, .None); // alignment |
| | 2193 | try renderToken(ais, tree, rparen_token, .Space); // ) |
| | 2194 | } |
| | 2195 | const eq_token = tree.firstToken(field.ast.value_expr) - 1; |
| | 2196 | try renderToken(ais, tree, eq_token, .Space); // = |
| | 2197 | return renderExpressionComma(ais, tree, field.ast.value_expr, space); // value |
| | 2198 | } |
| | 2199 | |
| 2237 | fn renderParamDecl( | 2200 | fn renderParamDecl( |
| 2238 | allocator: *mem.Allocator, | 2201 | allocator: *mem.Allocator, |
| 2239 | ais: *Ais, | 2202 | ais: *Ais, |
| ... | @@ -2258,6 +2221,29 @@ fn renderParamDecl( | ... | @@ -2258,6 +2221,29 @@ fn renderParamDecl( |
| 2258 | } | 2221 | } |
| 2259 | } | 2222 | } |
| 2260 | | 2223 | |
| | 2224 | /// Render an expression, and the comma that follows it, if it is present in the source. |
| | 2225 | fn renderExpressionComma(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Space) Error!void { |
| | 2226 | const token_tags = tree.tokens.items(.tag); |
| | 2227 | const maybe_comma = tree.lastToken(node) + 1; |
| | 2228 | if (token_tags[maybe_comma] == .Comma) { |
| | 2229 | try renderExpression(ais, tree, node, .None); |
| | 2230 | return renderToken(ais, tree, maybe_comma, space); |
| | 2231 | } else { |
| | 2232 | return renderExpression(ais, tree, node, space); |
| | 2233 | } |
| | 2234 | } |
| | 2235 | |
| | 2236 | fn renderTokenComma(ais: *Ais, tree: ast.Tree, token: ast.TokenIndex, space: Space) Error!void { |
| | 2237 | const token_tags = tree.tokens.items(.tag); |
| | 2238 | const maybe_comma = token + 1; |
| | 2239 | if (token_tags[maybe_comma] == .Comma) { |
| | 2240 | try renderToken(ais, tree, token, .None); |
| | 2241 | return renderToken(ais, tree, maybe_comma, space); |
| | 2242 | } else { |
| | 2243 | return renderToken(ais, tree, token, space); |
| | 2244 | } |
| | 2245 | } |
| | 2246 | |
| 2261 | const Space = enum { | 2247 | const Space = enum { |
| 2262 | None, | 2248 | None, |
| 2263 | Newline, | 2249 | Newline, |