| ... | ... | @@ -28,7 +28,7 @@ const Ais = std.io.AutoIndentingStream(Writer); |
| 28 | 28 | pub fn render(gpa: *mem.Allocator, writer: Writer, tree: ast.Tree) Error!void { |
| 29 | 29 | assert(tree.errors.len == 0); // cannot render an invalid tree |
| 30 | 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 | 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 | 66 | // Root is always index 0. |
| 67 | 67 | const nodes_data = tree.nodes.items(.data); |
| 68 | 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 | 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 | 101 | const datas = tree.nodes.items(.data); |
| 103 | 102 | try renderDocComments(ais, tree, tree.firstToken(decl)); |
| 104 | 103 | switch (tree.nodes.items(.tag)[decl]) { |
| 105 | | .UsingNamespace, |
| 106 | | .FnProtoSimple, |
| 107 | | .FnProtoSimpleMulti, |
| 108 | | .FnProtoOne, |
| 109 | | .FnProto, |
| 110 | | .FnDecl, |
| 111 | | .ContainerFieldInit, |
| 112 | | .ContainerFieldAlign, |
| 113 | | .ContainerField, |
| 114 | | => @panic("TODO implement renderContainerDecl"), |
| 115 | | |
| 104 | .FnProtoSimple => unreachable, // TODO |
| 105 | .FnProtoSimpleMulti => unreachable, // TODO |
| 106 | .FnProtoOne => unreachable, // TODO |
| 107 | .FnDecl => unreachable, // TODO |
| 108 | .FnProto => unreachable, // TODO |
| 116 | 109 | // .FnProto => { |
| 117 | 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 | 120 | // } |
| 128 | 121 | // }, |
| 129 | 122 | |
| 123 | .UsingNamespace => unreachable, // TODO |
| 130 | 124 | // .Use => { |
| 131 | 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 | 146 | try renderExpression(ais, tree, datas[decl].rhs, space); |
| 153 | 147 | }, |
| 154 | 148 | |
| 155 | | // .ContainerField => { |
| 156 | | // const field = @fieldParentPtr(ast.Node.ContainerField, "base", decl); |
| 157 | | |
| 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 | | // }, |
| 149 | .ContainerFieldInit => return renderContainerField(ais, tree, tree.containerFieldInit(decl), space), |
| 150 | .ContainerFieldAlign => return renderContainerField(ais, tree, tree.containerFieldAlign(decl), space), |
| 151 | .ContainerField => return renderContainerField(ais, tree, tree.containerField(decl), space), |
| 219 | 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 | 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 | 170 | .NullLiteral, |
| 255 | 171 | .UnreachableLiteral, |
| 256 | 172 | .UndefinedLiteral, |
| 173 | .AnyFrameLiteral, |
| 257 | 174 | => return renderToken(ais, tree, main_tokens[node], space), |
| 258 | 175 | |
| 176 | .ErrorValue => unreachable, // TODO |
| 177 | |
| 178 | .AnyType => unreachable, // TODO |
| 259 | 179 | //.AnyType => { |
| 260 | 180 | // const any_type = base.castTag(.AnyType).?; |
| 261 | 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 | 242 | } |
| 323 | 243 | }, |
| 324 | 244 | |
| 245 | .Defer => unreachable, // TODO |
| 246 | .ErrDefer => unreachable, // TODO |
| 325 | 247 | //.Defer => { |
| 326 | 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 | 259 | try renderToken(ais, tree, comptime_token, .Space); |
| 338 | 260 | return renderExpression(ais, tree, block, space); |
| 339 | 261 | }, |
| 262 | .Nosuspend => unreachable, // TODO |
| 340 | 263 | //.Nosuspend => { |
| 341 | 264 | // const nosuspend_node = @fieldParentPtr(ast.Node.Nosuspend, "base", base); |
| 342 | 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 | 271 | // return renderExpression(ais, tree, nosuspend_node.expr, space); |
| 349 | 272 | //}, |
| 350 | 273 | |
| 274 | .Suspend => unreachable, // TODO |
| 351 | 275 | //.Suspend => { |
| 352 | 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 | 283 | // } |
| 360 | 284 | //}, |
| 361 | 285 | |
| 286 | .Catch => unreachable, // TODO |
| 362 | 287 | //.Catch => { |
| 363 | 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 | 377 | return renderExpression(ais, tree, infix.rhs, space); |
| 453 | 378 | }, |
| 454 | 379 | |
| 455 | | //.BitNot, |
| 456 | | //.BoolNot, |
| 457 | | //.Negation, |
| 458 | | //.NegationWrap, |
| 459 | | //.OptionalType, |
| 460 | | //.AddressOf, |
| 461 | | //=> { |
| 462 | | // const casted_node = @fieldParentPtr(ast.Node.SimplePrefixOp, "base", base); |
| 463 | | // try renderToken(ais, tree, casted_node.op_token, Space.None); |
| 464 | | // return renderExpression(ais, tree, casted_node.rhs, space); |
| 465 | | //}, |
| 380 | .BitNot, |
| 381 | .BoolNot, |
| 382 | .Negation, |
| 383 | .NegationWrap, |
| 384 | .OptionalType, |
| 385 | .AddressOf, |
| 386 | => { |
| 387 | try renderToken(ais, tree, main_tokens[node], .None); |
| 388 | return renderExpression(ais, tree, datas[node].lhs, space); |
| 389 | }, |
| 466 | 390 | |
| 467 | | //.Try, |
| 468 | | //.Resume, |
| 469 | | //.Await, |
| 470 | | //=> { |
| 471 | | // const casted_node = @fieldParentPtr(ast.Node.SimplePrefixOp, "base", base); |
| 472 | | // try renderToken(ais, tree, casted_node.op_token, Space.Space); |
| 473 | | // return renderExpression(ais, tree, casted_node.rhs, space); |
| 474 | | //}, |
| 391 | .Try, |
| 392 | .Resume, |
| 393 | .Await, |
| 394 | => { |
| 395 | try renderToken(ais, tree, main_tokens[node], .Space); |
| 396 | return renderExpression(ais, tree, datas[node].lhs, space); |
| 397 | }, |
| 475 | 398 | |
| 399 | .ArrayType => unreachable, // TODO |
| 476 | 400 | //.ArrayType => { |
| 477 | 401 | // const array_type = @fieldParentPtr(ast.Node.ArrayType, "base", base); |
| 478 | 402 | // return renderArrayType( |
| ... | ... | @@ -486,6 +410,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 486 | 410 | // space, |
| 487 | 411 | // ); |
| 488 | 412 | //}, |
| 413 | .ArrayTypeSentinel => unreachable, // TODO |
| 489 | 414 | //.ArrayTypeSentinel => { |
| 490 | 415 | // const array_type = @fieldParentPtr(ast.Node.ArrayTypeSentinel, "base", base); |
| 491 | 416 | // return renderArrayType( |
| ... | ... | @@ -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 | 431 | //.PtrType => { |
| 504 | 432 | // const ptr_type = @fieldParentPtr(ast.Node.PtrType, "base", base); |
| 505 | 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 | 490 | // return renderExpression(ais, tree, ptr_type.rhs, space); |
| 563 | 491 | //}, |
| 564 | 492 | |
| 493 | .SliceType => unreachable, // TODO |
| 565 | 494 | //.SliceType => { |
| 566 | 495 | // const slice_type = @fieldParentPtr(ast.Node.SliceType, "base", base); |
| 567 | 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 | 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 | 547 | //.ArrayInitializer, .ArrayInitializerDot => { |
| 615 | 548 | // var rtoken: ast.TokenIndex = undefined; |
| 616 | 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 | 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 | 763 | //.StructInitializer, .StructInitializerDot => { |
| 827 | 764 | // var rtoken: ast.TokenIndex = undefined; |
| 828 | 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 | 896 | // return renderToken(ais, tree, rtoken, space); |
| 960 | 897 | //}, |
| 961 | 898 | |
| 899 | .CallOne => unreachable, // TODO |
| 962 | 900 | .Call => { |
| 963 | 901 | const call = datas[node]; |
| 964 | 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 | 955 | return renderToken(ais, tree, after_last_param_tok, space); // ) |
| 1018 | 956 | }, |
| 1019 | 957 | |
| 958 | .ArrayAccess => unreachable, // TODO |
| 1020 | 959 | //.ArrayAccess => { |
| 1021 | 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 | 978 | // return renderToken(ais, tree, rbracket, space); // ] |
| 1040 | 979 | //}, |
| 1041 | 980 | |
| 981 | .Slice => unreachable, // TODO |
| 982 | .SliceOpen => unreachable, // TODO |
| 1042 | 983 | //.Slice => { |
| 1043 | 984 | // const suffix_op = base.castTag(.Slice).?; |
| 1044 | 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 | 1007 | // return renderToken(ais, tree, suffix_op.rtoken, space); // ] |
| 1067 | 1008 | //}, |
| 1068 | 1009 | |
| 1010 | .Deref => unreachable, // TODO |
| 1069 | 1011 | //.Deref => { |
| 1070 | 1012 | // const suffix_op = base.castTag(.Deref).?; |
| 1071 | 1013 | |
| 1072 | 1014 | // try renderExpression(ais, tree, suffix_op.lhs, Space.None); |
| 1073 | 1015 | // return renderToken(ais, tree, suffix_op.rtoken, space); // .* |
| 1074 | 1016 | //}, |
| 1017 | .UnwrapOptional => unreachable, // TODO |
| 1075 | 1018 | //.UnwrapOptional => { |
| 1076 | 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 | 1023 | // return renderToken(ais, tree, suffix_op.rtoken, space); // ? |
| 1081 | 1024 | //}, |
| 1082 | 1025 | |
| 1026 | .Break => unreachable, // TODO |
| 1083 | 1027 | //.Break => { |
| 1084 | 1028 | // const flow_expr = base.castTag(.Break).?; |
| 1085 | 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 | 1046 | // return renderExpression(ais, tree, maybe_rhs.?, space); |
| 1103 | 1047 | //}, |
| 1104 | 1048 | |
| 1049 | .Continue => unreachable, // TODO |
| 1105 | 1050 | //.Continue => { |
| 1106 | 1051 | // const flow_expr = base.castTag(.Continue).?; |
| 1107 | 1052 | // if (flow_expr.getLabel()) |label| { |
| ... | ... | @@ -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 | 1063 | //.Return => { |
| 1118 | 1064 | // const flow_expr = base.castTag(.Return).?; |
| 1119 | 1065 | // if (flow_expr.getRHS()) |rhs| { |
| ... | ... | @@ -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 => { |
| 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 | | |
| 1073 | .GroupedExpression => unreachable, // TODO |
| 1157 | 1074 | //.GroupedExpression => { |
| 1158 | 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 | 1082 | // return renderToken(ais, tree, grouped_expr.rparen, space); |
| 1166 | 1083 | //}, |
| 1167 | 1084 | |
| 1168 | | //.FieldInitializer => { |
| 1169 | | // const field_init = @fieldParentPtr(ast.Node.FieldInitializer, "base", base); |
| 1170 | | |
| 1171 | | // try renderToken(ais, tree, field_init.period_token, Space.None); // . |
| 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 | | |
| 1085 | .ContainerDecl => unreachable, // TODO |
| 1086 | .ContainerDeclArg => unreachable, // TODO |
| 1087 | .TaggedUnion => unreachable, // TODO |
| 1088 | .TaggedUnionEnumTag => unreachable, // TODO |
| 1177 | 1089 | //.ContainerDecl => { |
| 1178 | 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 | 1201 | // return renderToken(ais, tree, container_decl.rbrace_token, space); // } |
| 1290 | 1202 | //}, |
| 1291 | 1203 | |
| 1204 | .ErrorSetDecl => unreachable, // TODO |
| 1292 | 1205 | //.ErrorSetDecl => { |
| 1293 | 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 | 1278 | // } |
| 1366 | 1279 | //}, |
| 1367 | 1280 | |
| 1368 | | //.ErrorTag => { |
| 1369 | | // const tag = @fieldParentPtr(ast.Node.ErrorTag, "base", base); |
| 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 | | |
| 1281 | .BuiltinCall => unreachable, // TODO |
| 1282 | .BuiltinCallTwo => unreachable, // TODO |
| 1390 | 1283 | //.BuiltinCall => { |
| 1391 | 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 | 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 | 1348 | //.FnProto => { |
| 1452 | 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 | 1476 | // } |
| 1580 | 1477 | //}, |
| 1581 | 1478 | |
| 1479 | .AnyFrameType => unreachable, // TODO |
| 1582 | 1480 | //.AnyFrameType => { |
| 1583 | 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 | 1489 | // } |
| 1592 | 1490 | //}, |
| 1593 | 1491 | |
| 1594 | | //.DocComment => unreachable, // doc comments are attached to nodes |
| 1595 | | |
| 1492 | .Switch => unreachable, // TODO |
| 1596 | 1493 | //.Switch => { |
| 1597 | 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 | 1527 | // return renderToken(ais, tree, switch_node.rbrace, space); // } |
| 1631 | 1528 | //}, |
| 1632 | 1529 | |
| 1530 | .SwitchCaseOne => unreachable, // TODO |
| 1531 | .SwitchCaseMulti => unreachable, // TODO |
| 1633 | 1532 | //.SwitchCase => { |
| 1634 | 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 | 1575 | |
| 1677 | 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 | 1582 | //.While => { |
| 1685 | 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 | 1647 | // } |
| 1750 | 1648 | //}, |
| 1751 | 1649 | |
| 1650 | .ForSimple => unreachable, // TODO |
| 1651 | .For => unreachable, // TODO |
| 1752 | 1652 | //.For => { |
| 1753 | 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 | 1702 | |
| 1803 | 1703 | .IfSimple => return renderIf(ais, tree, tree.ifSimple(node), space), |
| 1804 | 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 | 1710 | //.Asm => { |
| 1806 | 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 | 1816 | // return renderToken(ais, tree, asm_node.rparen, space); |
| 1912 | 1817 | //}, |
| 1913 | 1818 | |
| 1819 | .EnumLiteral => unreachable, // TODO |
| 1914 | 1820 | //.EnumLiteral => { |
| 1915 | 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 | 1824 | // return renderToken(ais, tree, enum_literal.name, space); // name |
| 1919 | 1825 | //}, |
| 1920 | 1826 | |
| 1921 | | //.ContainerField, |
| 1922 | | //.Root, |
| 1923 | | //.VarDecl, |
| 1924 | | //.Use, |
| 1925 | | //.TestDecl, |
| 1926 | | //=> unreachable, |
| 1927 | | else => @panic("TODO implement more renderExpression"), |
| 1827 | .FnDecl => unreachable, |
| 1828 | .ContainerField => unreachable, |
| 1829 | .ContainerFieldInit => unreachable, |
| 1830 | .ContainerFieldAlign => unreachable, |
| 1831 | .Root => unreachable, |
| 1832 | .GlobalVarDecl => unreachable, |
| 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 | 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 | 2200 | fn renderParamDecl( |
| 2238 | 2201 | allocator: *mem.Allocator, |
| 2239 | 2202 | ais: *Ais, |
| ... | ... | @@ -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 | 2247 | const Space = enum { |
| 2262 | 2248 | None, |
| 2263 | 2249 | Newline, |