| ... | ... | @@ -69,15 +69,15 @@ fn renderRoot(ais: *Ais, tree: ast.Tree) Error!void { |
| 69 | 69 | if (root_decls.len == 0) return; |
| 70 | 70 | |
| 71 | 71 | for (root_decls) |decl| { |
| 72 | | try renderTopLevelDecl(ais, tree, decl); |
| 72 | return renderContainerDecl(ais, tree, decl, .Newline); |
| 73 | 73 | } |
| 74 | 74 | } |
| 75 | 75 | |
| 76 | | fn renderExtraNewline(tree: ast.Tree, ais: *Ais, node: ast.Node.Index) Error!void { |
| 77 | | return renderExtraNewlineToken(tree, ais, tree.firstToken(node)); |
| 76 | fn renderExtraNewline(ais: *Ais, tree: ast.Tree, node: ast.Node.Index) Error!void { |
| 77 | return renderExtraNewlineToken(ais, tree, tree.firstToken(node)); |
| 78 | 78 | } |
| 79 | 79 | |
| 80 | | fn renderExtraNewlineToken(tree: ast.Tree, ais: *Ais, first_token: ast.TokenIndex) Error!void { |
| 80 | fn renderExtraNewlineToken(ais: *Ais, tree: ast.Tree, first_token: ast.TokenIndex) Error!void { |
| 81 | 81 | @panic("TODO implement renderExtraNewlineToken"); |
| 82 | 82 | //var prev_token = first_token; |
| 83 | 83 | //if (prev_token == 0) return; |
| ... | ... | @@ -96,14 +96,11 @@ fn renderExtraNewlineToken(tree: ast.Tree, ais: *Ais, first_token: ast.TokenInde |
| 96 | 96 | //} |
| 97 | 97 | } |
| 98 | 98 | |
| 99 | | fn renderTopLevelDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index) Error!void { |
| 100 | | return renderContainerDecl(ais, tree, decl, .Newline); |
| 101 | | } |
| 102 | | |
| 103 | 99 | fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: Space) Error!void { |
| 104 | 100 | const token_tags = tree.tokens.items(.tag); |
| 105 | 101 | const main_tokens = tree.nodes.items(.main_token); |
| 106 | 102 | const datas = tree.nodes.items(.data); |
| 103 | try renderDocComments(ais, tree, tree.firstToken(decl)); |
| 107 | 104 | switch (tree.nodes.items(.tag)[decl]) { |
| 108 | 105 | .UsingNamespace, |
| 109 | 106 | .FnProtoSimple, |
| ... | ... | @@ -111,10 +108,6 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S |
| 111 | 108 | .FnProtoOne, |
| 112 | 109 | .FnProto, |
| 113 | 110 | .FnDecl, |
| 114 | | .GlobalVarDecl, |
| 115 | | .LocalVarDecl, |
| 116 | | .SimpleVarDecl, |
| 117 | | .AlignedVarDecl, |
| 118 | 111 | .ContainerFieldInit, |
| 119 | 112 | .ContainerFieldAlign, |
| 120 | 113 | .ContainerField, |
| ... | ... | @@ -145,16 +138,13 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S |
| 145 | 138 | // try renderToken(ais, tree, use_decl.semicolon_token, space); // ; |
| 146 | 139 | // }, |
| 147 | 140 | |
| 148 | | // .VarDecl => { |
| 149 | | // const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", decl); |
| 150 | | |
| 151 | | // try renderDocComments(ais, tree, var_decl, var_decl.getDocComments()); |
| 152 | | // try renderVarDecl(allocator, ais, tree, var_decl); |
| 153 | | // }, |
| 141 | .GlobalVarDecl => return renderVarDecl(ais, tree, tree.globalVarDecl(decl)), |
| 142 | .LocalVarDecl => return renderVarDecl(ais, tree, tree.localVarDecl(decl)), |
| 143 | .SimpleVarDecl => return renderVarDecl(ais, tree, tree.simpleVarDecl(decl)), |
| 144 | .AlignedVarDecl => return renderVarDecl(ais, tree, tree.alignedVarDecl(decl)), |
| 154 | 145 | |
| 155 | 146 | .TestDecl => { |
| 156 | 147 | const test_token = main_tokens[decl]; |
| 157 | | try renderDocComments(ais, tree, test_token); |
| 158 | 148 | try renderToken(ais, tree, test_token, .Space); |
| 159 | 149 | if (token_tags[test_token + 1] == .StringLiteral) { |
| 160 | 150 | try renderToken(ais, tree, test_token + 1, .Space); |
| ... | ... | @@ -251,21 +241,20 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S |
| 251 | 241 | fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Space) Error!void { |
| 252 | 242 | const token_tags = tree.tokens.items(.tag); |
| 253 | 243 | const main_tokens = tree.nodes.items(.main_token); |
| 254 | | switch (tree.nodes.items(.tag)[node]) { |
| 255 | | //.Identifier, |
| 256 | | //.IntegerLiteral, |
| 257 | | //.FloatLiteral, |
| 258 | | //.StringLiteral, |
| 259 | | //.CharLiteral, |
| 260 | | //.BoolLiteral, |
| 261 | | //.NullLiteral, |
| 262 | | //.Unreachable, |
| 263 | | //.ErrorType, |
| 264 | | //.UndefinedLiteral, |
| 265 | | //=> { |
| 266 | | // const casted_node = base.cast(ast.Node.OneToken).?; |
| 267 | | // return renderToken(ais, tree, casted_node.token, space); |
| 268 | | //}, |
| 244 | const node_tags = tree.nodes.items(.tag); |
| 245 | const datas = tree.nodes.items(.data); |
| 246 | switch (node_tags[node]) { |
| 247 | .Identifier, |
| 248 | .IntegerLiteral, |
| 249 | .FloatLiteral, |
| 250 | .StringLiteral, |
| 251 | .CharLiteral, |
| 252 | .TrueLiteral, |
| 253 | .FalseLiteral, |
| 254 | .NullLiteral, |
| 255 | .UnreachableLiteral, |
| 256 | .UndefinedLiteral, |
| 257 | => return renderToken(ais, tree, main_tokens[node], space), |
| 269 | 258 | |
| 270 | 259 | //.AnyType => { |
| 271 | 260 | // const any_type = base.castTag(.AnyType).?; |
| ... | ... | @@ -299,16 +288,37 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 299 | 288 | |
| 300 | 289 | try renderToken(ais, tree, lbrace, .Newline); |
| 301 | 290 | |
| 302 | | for (statements) |statement, i| { |
| 303 | | try renderStatement(ais, tree, statement); |
| 291 | for (statements) |stmt, i| { |
| 292 | switch (node_tags[stmt]) { |
| 293 | .GlobalVarDecl => try renderVarDecl(ais, tree, tree.globalVarDecl(stmt)), |
| 294 | .LocalVarDecl => try renderVarDecl(ais, tree, tree.localVarDecl(stmt)), |
| 295 | .SimpleVarDecl => try renderVarDecl(ais, tree, tree.simpleVarDecl(stmt)), |
| 296 | .AlignedVarDecl => try renderVarDecl(ais, tree, tree.alignedVarDecl(stmt)), |
| 297 | else => { |
| 298 | const semicolon = tree.lastToken(stmt) + 1; |
| 299 | if (token_tags[semicolon] == .Semicolon) { |
| 300 | try renderExpression(ais, tree, stmt, .None); |
| 301 | try renderToken(ais, tree, semicolon, .Newline); |
| 302 | } else { |
| 303 | try renderExpression(ais, tree, stmt, .Newline); |
| 304 | } |
| 305 | }, |
| 306 | } |
| 304 | 307 | |
| 305 | 308 | if (i + 1 < statements.len) { |
| 306 | | try renderExtraNewline(tree, ais, statements[i + 1]); |
| 309 | try renderExtraNewline(ais, tree, statements[i + 1]); |
| 307 | 310 | } |
| 308 | 311 | } |
| 309 | 312 | ais.popIndent(); |
| 310 | | const rbrace = tree.lastToken(statements[statements.len - 1]) + 1; |
| 311 | | return renderToken(ais, tree, rbrace, space); |
| 313 | // The rbrace could be +1 or +2 from the last token of the last |
| 314 | // statement in the block because lastToken() does not count semicolons. |
| 315 | const maybe_rbrace = tree.lastToken(statements[statements.len - 1]) + 1; |
| 316 | if (token_tags[maybe_rbrace] == .RBrace) { |
| 317 | return renderToken(ais, tree, maybe_rbrace, space); |
| 318 | } else { |
| 319 | assert(token_tags[maybe_rbrace + 1] == .RBrace); |
| 320 | return renderToken(ais, tree, maybe_rbrace + 1, space); |
| 321 | } |
| 312 | 322 | } |
| 313 | 323 | }, |
| 314 | 324 | |
| ... | ... | @@ -322,8 +332,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 322 | 332 | // return renderExpression(ais, tree, defer_node.expr, space); |
| 323 | 333 | //}, |
| 324 | 334 | .Comptime => { |
| 325 | | const comptime_token = tree.nodes.items(.main_token)[node]; |
| 326 | | const block = tree.nodes.items(.data)[node].lhs; |
| 335 | const comptime_token = main_tokens[node]; |
| 336 | const block = datas[node].lhs; |
| 327 | 337 | try renderToken(ais, tree, comptime_token, .Space); |
| 328 | 338 | return renderExpression(ais, tree, block, space); |
| 329 | 339 | }, |
| ... | ... | @@ -369,71 +379,78 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 369 | 379 | // ais.pushIndentOneShot(); |
| 370 | 380 | // return renderExpression(ais, tree, infix_op_node.rhs, space); |
| 371 | 381 | //}, |
| 382 | .FieldAccess => { |
| 383 | const field_access = datas[node]; |
| 384 | try renderExpression(ais, tree, field_access.lhs, .None); |
| 385 | try renderToken(ais, tree, main_tokens[node], .None); |
| 386 | return renderToken(ais, tree, field_access.rhs, .None); |
| 387 | }, |
| 372 | 388 | |
| 373 | | //.Add, |
| 374 | | //.AddWrap, |
| 375 | | //.ArrayCat, |
| 376 | | //.ArrayMult, |
| 377 | | //.Assign, |
| 378 | | //.AssignBitAnd, |
| 379 | | //.AssignBitOr, |
| 380 | | //.AssignBitShiftLeft, |
| 381 | | //.AssignBitShiftRight, |
| 382 | | //.AssignBitXor, |
| 383 | | //.AssignDiv, |
| 384 | | //.AssignSub, |
| 385 | | //.AssignSubWrap, |
| 386 | | //.AssignMod, |
| 387 | | //.AssignAdd, |
| 388 | | //.AssignAddWrap, |
| 389 | | //.AssignMul, |
| 390 | | //.AssignMulWrap, |
| 391 | | //.BangEqual, |
| 392 | | //.BitAnd, |
| 393 | | //.BitOr, |
| 394 | | //.BitShiftLeft, |
| 395 | | //.BitShiftRight, |
| 396 | | //.BitXor, |
| 397 | | //.BoolAnd, |
| 398 | | //.BoolOr, |
| 399 | | //.Div, |
| 400 | | //.EqualEqual, |
| 401 | | //.ErrorUnion, |
| 402 | | //.GreaterOrEqual, |
| 403 | | //.GreaterThan, |
| 404 | | //.LessOrEqual, |
| 405 | | //.LessThan, |
| 406 | | //.MergeErrorSets, |
| 407 | | //.Mod, |
| 408 | | //.Mul, |
| 409 | | //.MulWrap, |
| 410 | | //.Period, |
| 411 | | //.Range, |
| 412 | | //.Sub, |
| 413 | | //.SubWrap, |
| 414 | | //.OrElse, |
| 415 | | //=> { |
| 416 | | // const infix_op_node = @fieldParentPtr(ast.Node.SimpleInfixOp, "base", base); |
| 417 | | |
| 418 | | // const op_space = switch (base.tag) { |
| 419 | | // .Period, .ErrorUnion, .Range => Space.None, |
| 420 | | // else => Space.Space, |
| 421 | | // }; |
| 422 | | // try renderExpression(ais, tree, infix_op_node.lhs, op_space); |
| 423 | | |
| 424 | | // const after_op_space = blk: { |
| 425 | | // const loc = tree.tokenLocation(tree.token_locs[infix_op_node.op_token].end, tree.nextToken(infix_op_node.op_token)); |
| 426 | | // break :blk if (loc.line == 0) op_space else Space.Newline; |
| 427 | | // }; |
| 389 | .ErrorUnion, |
| 390 | .SwitchRange, |
| 391 | => { |
| 392 | const infix = datas[node]; |
| 393 | try renderExpression(ais, tree, infix.lhs, .None); |
| 394 | try renderToken(ais, tree, main_tokens[node], .None); |
| 395 | return renderExpression(ais, tree, infix.rhs, space); |
| 396 | }, |
| 428 | 397 | |
| 429 | | // { |
| 430 | | // ais.pushIndent(); |
| 431 | | // defer ais.popIndent(); |
| 432 | | // try renderToken(ais, tree, infix_op_node.op_token, after_op_space); |
| 433 | | // } |
| 434 | | // ais.pushIndentOneShot(); |
| 435 | | // return renderExpression(ais, tree, infix_op_node.rhs, space); |
| 436 | | //}, |
| 398 | .Add, |
| 399 | .AddWrap, |
| 400 | .ArrayCat, |
| 401 | .ArrayMult, |
| 402 | .Assign, |
| 403 | .AssignBitAnd, |
| 404 | .AssignBitOr, |
| 405 | .AssignBitShiftLeft, |
| 406 | .AssignBitShiftRight, |
| 407 | .AssignBitXor, |
| 408 | .AssignDiv, |
| 409 | .AssignSub, |
| 410 | .AssignSubWrap, |
| 411 | .AssignMod, |
| 412 | .AssignAdd, |
| 413 | .AssignAddWrap, |
| 414 | .AssignMul, |
| 415 | .AssignMulWrap, |
| 416 | .BangEqual, |
| 417 | .BitAnd, |
| 418 | .BitOr, |
| 419 | .BitShiftLeft, |
| 420 | .BitShiftRight, |
| 421 | .BitXor, |
| 422 | .BoolAnd, |
| 423 | .BoolOr, |
| 424 | .Div, |
| 425 | .EqualEqual, |
| 426 | .GreaterOrEqual, |
| 427 | .GreaterThan, |
| 428 | .LessOrEqual, |
| 429 | .LessThan, |
| 430 | .MergeErrorSets, |
| 431 | .Mod, |
| 432 | .Mul, |
| 433 | .MulWrap, |
| 434 | .Sub, |
| 435 | .SubWrap, |
| 436 | .OrElse, |
| 437 | => { |
| 438 | const infix = datas[node]; |
| 439 | try renderExpression(ais, tree, infix.lhs, .Space); |
| 440 | |
| 441 | const op_token = main_tokens[node]; |
| 442 | const after_op_space: Space = if (tree.tokensOnSameLine(op_token, op_token + 1)) |
| 443 | .Space |
| 444 | else |
| 445 | .Newline; |
| 446 | { |
| 447 | ais.pushIndent(); |
| 448 | try renderToken(ais, tree, op_token, after_op_space); |
| 449 | ais.popIndent(); |
| 450 | } |
| 451 | ais.pushIndentOneShot(); |
| 452 | return renderExpression(ais, tree, infix.rhs, space); |
| 453 | }, |
| 437 | 454 | |
| 438 | 455 | //.BitNot, |
| 439 | 456 | //.BoolNot, |
| ... | ... | @@ -769,7 +786,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 769 | 786 | |
| 770 | 787 | // column_counter = 0; |
| 771 | 788 | // try renderToken(ais, tree, comma, Space.Newline); // , |
| 772 | | // try renderExtraNewline(tree, ais, next_expr); |
| 789 | // try renderExtraNewline(ais, tree, next_expr); |
| 773 | 790 | // } else { |
| 774 | 791 | // const maybe_comma = tree.nextToken(expr.*.lastToken()); |
| 775 | 792 | // if (tree.token_tags[maybe_comma] == .Comma) { |
| ... | ... | @@ -932,7 +949,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 932 | 949 | // const comma = tree.nextToken(field_init.lastToken()); |
| 933 | 950 | // try renderToken(ais, tree, comma, Space.Newline); |
| 934 | 951 | |
| 935 | | // try renderExtraNewline(tree, ais, next_field_init); |
| 952 | // try renderExtraNewline(ais, tree, next_field_init); |
| 936 | 953 | // } else { |
| 937 | 954 | // try renderExpression(ais, tree, field_init, Space.Comma); |
| 938 | 955 | // } |
| ... | ... | @@ -942,74 +959,63 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 942 | 959 | // return renderToken(ais, tree, rtoken, space); |
| 943 | 960 | //}, |
| 944 | 961 | |
| 945 | | //.Call => { |
| 946 | | // const call = @fieldParentPtr(ast.Node.Call, "base", base); |
| 947 | | // if (call.async_token) |async_token| { |
| 948 | | // try renderToken(ais, tree, async_token, Space.Space); |
| 949 | | // } |
| 950 | | |
| 951 | | // try renderExpression(ais, tree, call.lhs, Space.None); |
| 952 | | |
| 953 | | // const lparen = tree.nextToken(call.lhs.lastToken()); |
| 962 | .Call => { |
| 963 | const call = datas[node]; |
| 964 | const params_range = tree.extraData(call.rhs, ast.Node.SubRange); |
| 965 | const params = tree.extra_data[params_range.start..params_range.end]; |
| 966 | const async_token = tree.firstToken(call.lhs) - 1; |
| 967 | if (token_tags[async_token] == .Keyword_async) { |
| 968 | try renderToken(ais, tree, async_token, .Space); |
| 969 | } |
| 970 | try renderExpression(ais, tree, call.lhs, .None); |
| 954 | 971 | |
| 955 | | // if (call.params_len == 0) { |
| 956 | | // try renderToken(ais, tree, lparen, Space.None); |
| 957 | | // return renderToken(ais, tree, call.rtoken, space); |
| 958 | | // } |
| 972 | const lparen = main_tokens[node]; |
| 959 | 973 | |
| 960 | | // const src_has_trailing_comma = blk: { |
| 961 | | // const maybe_comma = tree.prevToken(call.rtoken); |
| 962 | | // break :blk tree.token_tags[maybe_comma] == .Comma; |
| 963 | | // }; |
| 974 | if (params.len == 0) { |
| 975 | try renderToken(ais, tree, lparen, .None); |
| 976 | return renderToken(ais, tree, lparen + 1, space); // ) |
| 977 | } |
| 964 | 978 | |
| 965 | | // if (src_has_trailing_comma) { |
| 966 | | // { |
| 967 | | // ais.pushIndent(); |
| 968 | | // defer ais.popIndent(); |
| 979 | const last_param = params[params.len - 1]; |
| 980 | const after_last_param_tok = tree.lastToken(last_param) + 1; |
| 981 | if (token_tags[after_last_param_tok] == .Comma) { |
| 982 | ais.pushIndent(); |
| 983 | try renderToken(ais, tree, lparen, Space.Newline); // ( |
| 984 | for (params) |param_node, i| { |
| 985 | if (i + 1 < params.len) { |
| 986 | try renderExpression(ais, tree, param_node, Space.None); |
| 969 | 987 | |
| 970 | | // try renderToken(ais, tree, lparen, Space.Newline); // ( |
| 971 | | // const params = call.params(); |
| 972 | | // for (params) |param_node, i| { |
| 973 | | // if (i + 1 < params.len) { |
| 974 | | // const next_node = params[i + 1]; |
| 975 | | // try renderExpression(ais, tree, param_node, Space.None); |
| 988 | // Unindent the comma for multiline string literals |
| 989 | const is_multiline_string = node_tags[param_node] == .StringLiteral and |
| 990 | token_tags[main_tokens[param_node]] == .MultilineStringLiteralLine; |
| 991 | if (is_multiline_string) ais.popIndent(); |
| 976 | 992 | |
| 977 | | // // Unindent the comma for multiline string literals |
| 978 | | // const maybe_multiline_string = param_node.firstToken(); |
| 979 | | // const is_multiline_string = tree.token_tags[maybe_multiline_string] == .MultilineStringLiteralLine; |
| 980 | | // if (is_multiline_string) ais.popIndent(); |
| 981 | | // defer if (is_multiline_string) ais.pushIndent(); |
| 993 | const comma = tree.lastToken(param_node) + 1; |
| 994 | try renderToken(ais, tree, comma, Space.Newline); // , |
| 982 | 995 | |
| 983 | | // const comma = tree.nextToken(param_node.lastToken()); |
| 984 | | // try renderToken(ais, tree, comma, Space.Newline); // , |
| 985 | | // try renderExtraNewline(tree, ais, next_node); |
| 986 | | // } else { |
| 987 | | // try renderExpression(ais, tree, param_node, Space.Comma); |
| 988 | | // } |
| 989 | | // } |
| 990 | | // } |
| 991 | | // return renderToken(ais, tree, call.rtoken, space); |
| 992 | | // } |
| 996 | if (is_multiline_string) ais.pushIndent(); |
| 993 | 997 | |
| 994 | | // try renderToken(ais, tree, lparen, Space.None); // ( |
| 998 | try renderExtraNewline(ais, tree, params[i + 1]); |
| 999 | } else { |
| 1000 | try renderExpression(ais, tree, param_node, Space.Comma); |
| 1001 | } |
| 1002 | } |
| 1003 | ais.popIndent(); |
| 1004 | return renderToken(ais, tree, after_last_param_tok + 1, space); // ) |
| 1005 | } |
| 995 | 1006 | |
| 996 | | // const params = call.params(); |
| 997 | | // for (params) |param_node, i| { |
| 998 | | // const maybe_comment = param_node.firstToken() - 1; |
| 999 | | // const maybe_multiline_string = param_node.firstToken(); |
| 1000 | | // if (tree.token_tags[maybe_multiline_string] == .MultilineStringLiteralLine or tree.token_tags[maybe_comment] == .LineComment) { |
| 1001 | | // ais.pushIndentOneShot(); |
| 1002 | | // } |
| 1007 | try renderToken(ais, tree, lparen, Space.None); // ( |
| 1003 | 1008 | |
| 1004 | | // try renderExpression(ais, tree, param_node, Space.None); |
| 1009 | for (params) |param_node, i| { |
| 1010 | try renderExpression(ais, tree, param_node, Space.None); |
| 1005 | 1011 | |
| 1006 | | // if (i + 1 < params.len) { |
| 1007 | | // const comma = tree.nextToken(param_node.lastToken()); |
| 1008 | | // try renderToken(ais, tree, comma, Space.Space); |
| 1009 | | // } |
| 1010 | | // } |
| 1011 | | // return renderToken(ais, tree, call.rtoken, space); // ) |
| 1012 | | //}, |
| 1012 | if (i + 1 < params.len) { |
| 1013 | const comma = tree.lastToken(param_node) + 1; |
| 1014 | try renderToken(ais, tree, comma, Space.Space); |
| 1015 | } |
| 1016 | } |
| 1017 | return renderToken(ais, tree, after_last_param_tok, space); // ) |
| 1018 | }, |
| 1013 | 1019 | |
| 1014 | 1020 | //.ArrayAccess => { |
| 1015 | 1021 | // const suffix_op = base.castTag(.ArrayAccess).?; |
| ... | ... | @@ -1118,14 +1124,6 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1118 | 1124 | // } |
| 1119 | 1125 | //}, |
| 1120 | 1126 | |
| 1121 | | //.Payload => { |
| 1122 | | // const payload = @fieldParentPtr(ast.Node.Payload, "base", base); |
| 1123 | | |
| 1124 | | // try renderToken(ais, tree, payload.lpipe, Space.None); |
| 1125 | | // try renderExpression(ais, tree, payload.error_symbol, Space.None); |
| 1126 | | // return renderToken(ais, tree, payload.rpipe, space); |
| 1127 | | //}, |
| 1128 | | |
| 1129 | 1127 | //.PointerPayload => { |
| 1130 | 1128 | // const payload = @fieldParentPtr(ast.Node.PointerPayload, "base", base); |
| 1131 | 1129 | |
| ... | ... | @@ -1264,7 +1262,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1264 | 1262 | // try renderContainerDecl(allocator, ais, tree, decl, .Newline); |
| 1265 | 1263 | |
| 1266 | 1264 | // if (i + 1 < fields_and_decls.len) { |
| 1267 | | // try renderExtraNewline(tree, ais, fields_and_decls[i + 1]); |
| 1265 | // try renderExtraNewline(ais, tree, fields_and_decls[i + 1]); |
| 1268 | 1266 | // } |
| 1269 | 1267 | // } |
| 1270 | 1268 | // } else if (src_has_newline) { |
| ... | ... | @@ -1338,7 +1336,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1338 | 1336 | // try renderExpression(ais, tree, node, Space.None); |
| 1339 | 1337 | // try renderToken(ais, tree, tree.nextToken(node.lastToken()), Space.Newline); // , |
| 1340 | 1338 | |
| 1341 | | // try renderExtraNewline(tree, ais, decls[i + 1]); |
| 1339 | // try renderExtraNewline(ais, tree, decls[i + 1]); |
| 1342 | 1340 | // } else { |
| 1343 | 1341 | // try renderExpression(ais, tree, node, Space.Comma); |
| 1344 | 1342 | // } |
| ... | ... | @@ -1357,7 +1355,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1357 | 1355 | // const comma_token = tree.nextToken(node.lastToken()); |
| 1358 | 1356 | // assert(tree.token_tags[comma_token] == .Comma); |
| 1359 | 1357 | // try renderToken(ais, tree, comma_token, Space.Space); // , |
| 1360 | | // try renderExtraNewline(tree, ais, decls[i + 1]); |
| 1358 | // try renderExtraNewline(ais, tree, decls[i + 1]); |
| 1361 | 1359 | // } else { |
| 1362 | 1360 | // try renderExpression(ais, tree, node, Space.Space); |
| 1363 | 1361 | // } |
| ... | ... | @@ -1624,7 +1622,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1624 | 1622 | // try renderExpression(ais, tree, node, Space.Comma); |
| 1625 | 1623 | |
| 1626 | 1624 | // if (i + 1 < cases.len) { |
| 1627 | | // try renderExtraNewline(tree, ais, cases[i + 1]); |
| 1625 | // try renderExtraNewline(ais, tree, cases[i + 1]); |
| 1628 | 1626 | // } |
| 1629 | 1627 | // } |
| 1630 | 1628 | // } |
| ... | ... | @@ -1650,7 +1648,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1650 | 1648 | |
| 1651 | 1649 | // const comma_token = tree.nextToken(node.lastToken()); |
| 1652 | 1650 | // try renderToken(ais, tree, comma_token, Space.Space); // , |
| 1653 | | // try renderExtraNewline(tree, ais, items[i + 1]); |
| 1651 | // try renderExtraNewline(ais, tree, items[i + 1]); |
| 1654 | 1652 | // } else { |
| 1655 | 1653 | // try renderExpression(ais, tree, node, Space.Space); |
| 1656 | 1654 | // } |
| ... | ... | @@ -1663,7 +1661,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1663 | 1661 | |
| 1664 | 1662 | // const comma_token = tree.nextToken(node.lastToken()); |
| 1665 | 1663 | // try renderToken(ais, tree, comma_token, Space.Newline); // , |
| 1666 | | // try renderExtraNewline(tree, ais, items[i + 1]); |
| 1664 | // try renderExtraNewline(ais, tree, items[i + 1]); |
| 1667 | 1665 | // } else { |
| 1668 | 1666 | // try renderExpression(ais, tree, node, Space.Comma); |
| 1669 | 1667 | // } |
| ... | ... | @@ -1682,28 +1680,6 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1682 | 1680 | // const switch_else = @fieldParentPtr(ast.Node.SwitchElse, "base", base); |
| 1683 | 1681 | // return renderToken(ais, tree, switch_else.token, space); |
| 1684 | 1682 | //}, |
| 1685 | | //.Else => { |
| 1686 | | // const else_node = @fieldParentPtr(ast.Node.Else, "base", base); |
| 1687 | | |
| 1688 | | // const body_is_block = nodeIsBlock(else_node.body); |
| 1689 | | // const same_line = body_is_block or tree.tokensOnSameLine(else_node.else_token, else_node.body.lastToken()); |
| 1690 | | |
| 1691 | | // const after_else_space = if (same_line or else_node.payload != null) Space.Space else Space.Newline; |
| 1692 | | // try renderToken(ais, tree, else_node.else_token, after_else_space); |
| 1693 | | |
| 1694 | | // if (else_node.payload) |payload| { |
| 1695 | | // const payload_space = if (same_line) Space.Space else Space.Newline; |
| 1696 | | // try renderExpression(ais, tree, payload, payload_space); |
| 1697 | | // } |
| 1698 | | |
| 1699 | | // if (same_line) { |
| 1700 | | // return renderExpression(ais, tree, else_node.body, space); |
| 1701 | | // } else { |
| 1702 | | // ais.pushIndent(); |
| 1703 | | // defer ais.popIndent(); |
| 1704 | | // return renderExpression(ais, tree, else_node.body, space); |
| 1705 | | // } |
| 1706 | | //}, |
| 1707 | 1683 | |
| 1708 | 1684 | //.While => { |
| 1709 | 1685 | // const while_node = @fieldParentPtr(ast.Node.While, "base", base); |
| ... | ... | @@ -1824,111 +1800,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1824 | 1800 | // } |
| 1825 | 1801 | //}, |
| 1826 | 1802 | |
| 1827 | | //.If => { |
| 1828 | | // const if_node = @fieldParentPtr(ast.Node.If, "base", base); |
| 1829 | | |
| 1830 | | // const lparen = tree.nextToken(if_node.if_token); |
| 1831 | | // const rparen = tree.nextToken(if_node.condition.lastToken()); |
| 1832 | | |
| 1833 | | // try renderToken(ais, tree, if_node.if_token, Space.Space); // if |
| 1834 | | // try renderToken(ais, tree, lparen, Space.None); // ( |
| 1835 | | |
| 1836 | | // try renderExpression(ais, tree, if_node.condition, Space.None); // condition |
| 1837 | | |
| 1838 | | // const body_is_if_block = if_node.body.tag == .If; |
| 1839 | | // const body_is_block = nodeIsBlock(if_node.body); |
| 1840 | | |
| 1841 | | // if (body_is_if_block) { |
| 1842 | | // try renderExtraNewline(tree, ais, if_node.body); |
| 1843 | | // } else if (body_is_block) { |
| 1844 | | // const after_rparen_space = if (if_node.payload == null) Space.BlockStart else Space.Space; |
| 1845 | | // try renderToken(ais, tree, rparen, after_rparen_space); // ) |
| 1846 | | |
| 1847 | | // if (if_node.payload) |payload| { |
| 1848 | | // try renderExpression(ais, tree, payload, Space.BlockStart); // |x| |
| 1849 | | // } |
| 1850 | | |
| 1851 | | // if (if_node.@"else") |@"else"| { |
| 1852 | | // try renderExpression(ais, tree, if_node.body, Space.SpaceOrOutdent); |
| 1853 | | // return renderExpression(ais, tree, &@"else".base, space); |
| 1854 | | // } else { |
| 1855 | | // return renderExpression(ais, tree, if_node.body, space); |
| 1856 | | // } |
| 1857 | | // } |
| 1858 | | |
| 1859 | | // const src_has_newline = !tree.tokensOnSameLine(rparen, if_node.body.lastToken()); |
| 1860 | | |
| 1861 | | // if (src_has_newline) { |
| 1862 | | // const after_rparen_space = if (if_node.payload == null) Space.Newline else Space.Space; |
| 1863 | | |
| 1864 | | // { |
| 1865 | | // ais.pushIndent(); |
| 1866 | | // defer ais.popIndent(); |
| 1867 | | // try renderToken(ais, tree, rparen, after_rparen_space); // ) |
| 1868 | | // } |
| 1869 | | |
| 1870 | | // if (if_node.payload) |payload| { |
| 1871 | | // try renderExpression(ais, tree, payload, Space.Newline); |
| 1872 | | // } |
| 1873 | | |
| 1874 | | // if (if_node.@"else") |@"else"| { |
| 1875 | | // const else_is_block = nodeIsBlock(@"else".body); |
| 1876 | | |
| 1877 | | // { |
| 1878 | | // ais.pushIndent(); |
| 1879 | | // defer ais.popIndent(); |
| 1880 | | // try renderExpression(ais, tree, if_node.body, Space.Newline); |
| 1881 | | // } |
| 1882 | | |
| 1883 | | // if (else_is_block) { |
| 1884 | | // try renderToken(ais, tree, @"else".else_token, Space.Space); // else |
| 1885 | | |
| 1886 | | // if (@"else".payload) |payload| { |
| 1887 | | // try renderExpression(ais, tree, payload, Space.Space); |
| 1888 | | // } |
| 1889 | | |
| 1890 | | // return renderExpression(ais, tree, @"else".body, space); |
| 1891 | | // } else { |
| 1892 | | // const after_else_space = if (@"else".payload == null) Space.Newline else Space.Space; |
| 1893 | | // try renderToken(ais, tree, @"else".else_token, after_else_space); // else |
| 1894 | | |
| 1895 | | // if (@"else".payload) |payload| { |
| 1896 | | // try renderExpression(ais, tree, payload, Space.Newline); |
| 1897 | | // } |
| 1898 | | |
| 1899 | | // ais.pushIndent(); |
| 1900 | | // defer ais.popIndent(); |
| 1901 | | // return renderExpression(ais, tree, @"else".body, space); |
| 1902 | | // } |
| 1903 | | // } else { |
| 1904 | | // ais.pushIndent(); |
| 1905 | | // defer ais.popIndent(); |
| 1906 | | // return renderExpression(ais, tree, if_node.body, space); |
| 1907 | | // } |
| 1908 | | // } |
| 1909 | | |
| 1910 | | // // Single line if statement |
| 1911 | | |
| 1912 | | // try renderToken(ais, tree, rparen, Space.Space); // ) |
| 1913 | | |
| 1914 | | // if (if_node.payload) |payload| { |
| 1915 | | // try renderExpression(ais, tree, payload, Space.Space); |
| 1916 | | // } |
| 1917 | | |
| 1918 | | // if (if_node.@"else") |@"else"| { |
| 1919 | | // try renderExpression(ais, tree, if_node.body, Space.Space); |
| 1920 | | // try renderToken(ais, tree, @"else".else_token, Space.Space); |
| 1921 | | |
| 1922 | | // if (@"else".payload) |payload| { |
| 1923 | | // try renderExpression(ais, tree, payload, Space.Space); |
| 1924 | | // } |
| 1925 | | |
| 1926 | | // return renderExpression(ais, tree, @"else".body, space); |
| 1927 | | // } else { |
| 1928 | | // return renderExpression(ais, tree, if_node.body, space); |
| 1929 | | // } |
| 1930 | | //}, |
| 1931 | | |
| 1803 | .IfSimple => return renderIf(ais, tree, tree.ifSimple(node), space), |
| 1804 | .If => return renderIf(ais, tree, tree.ifFull(node), space), |
| 1932 | 1805 | //.Asm => { |
| 1933 | 1806 | // const asm_node = @fieldParentPtr(ast.Node.Asm, "base", base); |
| 1934 | 1807 | |
| ... | ... | @@ -1974,7 +1847,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1974 | 1847 | |
| 1975 | 1848 | // const comma = tree.prevToken(next_asm_output.firstToken()); |
| 1976 | 1849 | // try renderToken(ais, tree, comma, Space.Newline); // , |
| 1977 | | // try renderExtraNewlineToken(tree, ais, next_asm_output.firstToken()); |
| 1850 | // try renderExtraNewlineToken(ais, tree, next_asm_output.firstToken()); |
| 1978 | 1851 | // } else if (asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) { |
| 1979 | 1852 | // try renderAsmOutput(allocator, ais, tree, asm_output, Space.Newline); |
| 1980 | 1853 | // break :asmblk; |
| ... | ... | @@ -2004,7 +1877,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 2004 | 1877 | |
| 2005 | 1878 | // const comma = tree.prevToken(next_asm_input.firstToken()); |
| 2006 | 1879 | // try renderToken(ais, tree, comma, Space.Newline); // , |
| 2007 | | // try renderExtraNewlineToken(tree, ais, next_asm_input.firstToken()); |
| 1880 | // try renderExtraNewlineToken(ais, tree, next_asm_input.firstToken()); |
| 2008 | 1881 | // } else if (asm_node.clobbers.len == 0) { |
| 2009 | 1882 | // try renderAsmInput(allocator, ais, tree, asm_input, Space.Newline); |
| 2010 | 1883 | // break :asmblk; |
| ... | ... | @@ -2140,89 +2013,225 @@ fn renderAsmInput( |
| 2140 | 2013 | return renderToken(ais, tree, asm_input.lastToken(), space); // ) |
| 2141 | 2014 | } |
| 2142 | 2015 | |
| 2143 | | fn renderVarDecl( |
| 2144 | | allocator: *mem.Allocator, |
| 2145 | | ais: *Ais, |
| 2146 | | tree: ast.Tree, |
| 2147 | | var_decl: ast.Node.Index.VarDecl, |
| 2148 | | ) Error!void { |
| 2149 | | if (var_decl.getVisibToken()) |visib_token| { |
| 2016 | fn renderVarDecl(ais: *Ais, tree: ast.Tree, var_decl: ast.Full.VarDecl) Error!void { |
| 2017 | if (var_decl.visib_token) |visib_token| { |
| 2150 | 2018 | try renderToken(ais, tree, visib_token, Space.Space); // pub |
| 2151 | 2019 | } |
| 2152 | 2020 | |
| 2153 | | if (var_decl.getExternExportToken()) |extern_export_token| { |
| 2021 | if (var_decl.extern_export_token) |extern_export_token| { |
| 2154 | 2022 | try renderToken(ais, tree, extern_export_token, Space.Space); // extern |
| 2155 | 2023 | |
| 2156 | | if (var_decl.getLibName()) |lib_name| { |
| 2024 | if (var_decl.lib_name) |lib_name| { |
| 2157 | 2025 | try renderExpression(ais, tree, lib_name, Space.Space); // "lib" |
| 2158 | 2026 | } |
| 2159 | 2027 | } |
| 2160 | 2028 | |
| 2161 | | if (var_decl.getComptimeToken()) |comptime_token| { |
| 2162 | | try renderToken(ais, tree, comptime_token, Space.Space); // comptime |
| 2029 | if (var_decl.threadlocal_token) |thread_local_token| { |
| 2030 | try renderToken(ais, tree, thread_local_token, Space.Space); // threadlocal |
| 2163 | 2031 | } |
| 2164 | 2032 | |
| 2165 | | if (var_decl.getThreadLocalToken()) |thread_local_token| { |
| 2166 | | try renderToken(ais, tree, thread_local_token, Space.Space); // threadlocal |
| 2033 | if (var_decl.comptime_token) |comptime_token| { |
| 2034 | try renderToken(ais, tree, comptime_token, Space.Space); // comptime |
| 2167 | 2035 | } |
| 2168 | | try renderToken(ais, tree, var_decl.mut_token, Space.Space); // var |
| 2169 | 2036 | |
| 2170 | | const name_space = if (var_decl.getTypeNode() == null and |
| 2171 | | (var_decl.getAlignNode() != null or |
| 2172 | | var_decl.getSectionNode() != null or |
| 2173 | | var_decl.getInitNode() != null)) |
| 2037 | try renderToken(ais, tree, var_decl.ast.mut_token, .Space); // var |
| 2038 | |
| 2039 | const name_space = if (var_decl.ast.type_node == 0 and |
| 2040 | (var_decl.ast.align_node != 0 or |
| 2041 | var_decl.ast.section_node != 0 or |
| 2042 | var_decl.ast.init_node != 0)) |
| 2174 | 2043 | Space.Space |
| 2175 | 2044 | else |
| 2176 | 2045 | Space.None; |
| 2177 | | try renderToken(ais, tree, var_decl.name_token, name_space); |
| 2178 | | |
| 2179 | | if (var_decl.getTypeNode()) |type_node| { |
| 2180 | | try renderToken(ais, tree, tree.nextToken(var_decl.name_token), Space.Space); |
| 2181 | | const s = if (var_decl.getAlignNode() != null or |
| 2182 | | var_decl.getSectionNode() != null or |
| 2183 | | var_decl.getInitNode() != null) Space.Space else Space.None; |
| 2184 | | try renderExpression(ais, tree, type_node, s); |
| 2046 | try renderToken(ais, tree, var_decl.ast.mut_token + 1, name_space); // name |
| 2047 | |
| 2048 | if (var_decl.ast.type_node != 0) { |
| 2049 | try renderToken(ais, tree, var_decl.ast.mut_token + 2, Space.Space); // : |
| 2050 | if (var_decl.ast.align_node != 0 or var_decl.ast.section_node != 0 or |
| 2051 | var_decl.ast.init_node != 0) |
| 2052 | { |
| 2053 | try renderExpression(ais, tree, var_decl.ast.type_node, .Space); |
| 2054 | } else { |
| 2055 | try renderExpression(ais, tree, var_decl.ast.type_node, .None); |
| 2056 | const semicolon = tree.lastToken(var_decl.ast.type_node) + 1; |
| 2057 | return renderToken(ais, tree, semicolon, Space.Newline); // ; |
| 2058 | } |
| 2185 | 2059 | } |
| 2186 | 2060 | |
| 2187 | | if (var_decl.getAlignNode()) |align_node| { |
| 2188 | | const lparen = tree.prevToken(align_node.firstToken()); |
| 2189 | | const align_kw = tree.prevToken(lparen); |
| 2190 | | const rparen = tree.nextToken(align_node.lastToken()); |
| 2061 | if (var_decl.ast.align_node != 0) { |
| 2062 | const lparen = tree.firstToken(var_decl.ast.align_node) - 1; |
| 2063 | const align_kw = lparen - 1; |
| 2064 | const rparen = tree.lastToken(var_decl.ast.align_node) + 1; |
| 2191 | 2065 | try renderToken(ais, tree, align_kw, Space.None); // align |
| 2192 | 2066 | try renderToken(ais, tree, lparen, Space.None); // ( |
| 2193 | | try renderExpression(ais, tree, align_node, Space.None); |
| 2194 | | const s = if (var_decl.getSectionNode() != null or var_decl.getInitNode() != null) Space.Space else Space.None; |
| 2195 | | try renderToken(ais, tree, rparen, s); // ) |
| 2067 | try renderExpression(ais, tree, var_decl.ast.align_node, Space.None); |
| 2068 | if (var_decl.ast.section_node != 0 or var_decl.ast.init_node != 0) { |
| 2069 | try renderToken(ais, tree, rparen, .Space); // ) |
| 2070 | } else { |
| 2071 | try renderToken(ais, tree, rparen, .None); // ) |
| 2072 | return renderToken(ais, tree, rparen + 1, Space.Newline); // ; |
| 2073 | } |
| 2196 | 2074 | } |
| 2197 | 2075 | |
| 2198 | | if (var_decl.getSectionNode()) |section_node| { |
| 2199 | | const lparen = tree.prevToken(section_node.firstToken()); |
| 2200 | | const section_kw = tree.prevToken(lparen); |
| 2201 | | const rparen = tree.nextToken(section_node.lastToken()); |
| 2076 | if (var_decl.ast.section_node != 0) { |
| 2077 | const lparen = tree.firstToken(var_decl.ast.section_node) - 1; |
| 2078 | const section_kw = lparen - 1; |
| 2079 | const rparen = tree.lastToken(var_decl.ast.section_node) + 1; |
| 2202 | 2080 | try renderToken(ais, tree, section_kw, Space.None); // linksection |
| 2203 | 2081 | try renderToken(ais, tree, lparen, Space.None); // ( |
| 2204 | | try renderExpression(ais, tree, section_node, Space.None); |
| 2205 | | const s = if (var_decl.getInitNode() != null) Space.Space else Space.None; |
| 2206 | | try renderToken(ais, tree, rparen, s); // ) |
| 2082 | try renderExpression(ais, tree, var_decl.ast.section_node, Space.None); |
| 2083 | if (var_decl.ast.init_node != 0) { |
| 2084 | try renderToken(ais, tree, rparen, .Space); // ) |
| 2085 | } else { |
| 2086 | try renderToken(ais, tree, rparen, .None); // ) |
| 2087 | return renderToken(ais, tree, rparen + 1, Space.Newline); // ; |
| 2088 | } |
| 2207 | 2089 | } |
| 2208 | 2090 | |
| 2209 | | if (var_decl.getInitNode()) |init_node| { |
| 2210 | | const eq_token = var_decl.getEqToken().?; |
| 2211 | | const eq_space = blk: { |
| 2212 | | const loc = tree.tokenLocation(tree.token_locs[eq_token].end, tree.nextToken(eq_token)); |
| 2213 | | break :blk if (loc.line == 0) Space.Space else Space.Newline; |
| 2214 | | }; |
| 2091 | assert(var_decl.ast.init_node != 0); |
| 2092 | const eq_token = tree.firstToken(var_decl.ast.init_node) - 1; |
| 2093 | const eq_space: Space = if (tree.tokensOnSameLine(eq_token, eq_token + 1)) .Space else .Newline; |
| 2094 | { |
| 2095 | ais.pushIndent(); |
| 2096 | try renderToken(ais, tree, eq_token, eq_space); // = |
| 2097 | ais.popIndent(); |
| 2098 | } |
| 2099 | ais.pushIndentOneShot(); |
| 2100 | try renderExpression(ais, tree, var_decl.ast.init_node, Space.None); |
| 2215 | 2101 | |
| 2216 | | { |
| 2102 | const semicolon = tree.lastToken(var_decl.ast.init_node) + 1; |
| 2103 | return renderToken(ais, tree, semicolon, Space.Newline); |
| 2104 | } |
| 2105 | |
| 2106 | fn renderIf(ais: *Ais, tree: ast.Tree, if_node: ast.Full.If, space: Space) Error!void { |
| 2107 | const node_tags = tree.nodes.items(.tag); |
| 2108 | const token_tags = tree.tokens.items(.tag); |
| 2109 | |
| 2110 | try renderToken(ais, tree, if_node.ast.if_token, .Space); // if |
| 2111 | |
| 2112 | const lparen = if_node.ast.if_token + 1; |
| 2113 | |
| 2114 | try renderToken(ais, tree, lparen, .None); // ( |
| 2115 | try renderExpression(ais, tree, if_node.ast.cond_expr, .None); // condition |
| 2116 | |
| 2117 | switch (node_tags[if_node.ast.then_expr]) { |
| 2118 | .If, .IfSimple => { |
| 2119 | try renderExtraNewline(ais, tree, if_node.ast.then_expr); |
| 2120 | }, |
| 2121 | .Block, .For, .ForSimple, .While, .WhileSimple, .Switch => { |
| 2122 | if (if_node.payload_token) |payload_token| { |
| 2123 | try renderToken(ais, tree, payload_token - 2, .Space); // ) |
| 2124 | try renderToken(ais, tree, payload_token - 1, .None); // | |
| 2125 | if (token_tags[payload_token] == .Asterisk) { |
| 2126 | try renderToken(ais, tree, payload_token, .None); // * |
| 2127 | try renderToken(ais, tree, payload_token + 1, .None); // identifier |
| 2128 | try renderToken(ais, tree, payload_token + 2, .BlockStart); // | |
| 2129 | } else { |
| 2130 | try renderToken(ais, tree, payload_token, .None); // identifier |
| 2131 | try renderToken(ais, tree, payload_token + 1, .BlockStart); // | |
| 2132 | } |
| 2133 | } else { |
| 2134 | const rparen = tree.lastToken(if_node.ast.cond_expr) + 1; |
| 2135 | try renderToken(ais, tree, rparen, .BlockStart); // ) |
| 2136 | } |
| 2137 | if (if_node.ast.else_expr != 0) { |
| 2138 | try renderExpression(ais, tree, if_node.ast.then_expr, Space.SpaceOrOutdent); |
| 2139 | try renderToken(ais, tree, if_node.else_token, .Space); // else |
| 2140 | if (if_node.error_token) |error_token| { |
| 2141 | try renderToken(ais, tree, error_token - 1, .None); // | |
| 2142 | try renderToken(ais, tree, error_token, .None); // identifier |
| 2143 | try renderToken(ais, tree, error_token + 1, .Space); // | |
| 2144 | } |
| 2145 | return renderExpression(ais, tree, if_node.ast.else_expr, space); |
| 2146 | } else { |
| 2147 | return renderExpression(ais, tree, if_node.ast.then_expr, space); |
| 2148 | } |
| 2149 | }, |
| 2150 | else => {}, |
| 2151 | } |
| 2152 | |
| 2153 | const rparen = tree.lastToken(if_node.ast.cond_expr) + 1; |
| 2154 | const last_then_token = tree.lastToken(if_node.ast.then_expr); |
| 2155 | const src_has_newline = !tree.tokensOnSameLine(rparen, last_then_token); |
| 2156 | |
| 2157 | if (src_has_newline) { |
| 2158 | if (if_node.payload_token) |payload_token| { |
| 2159 | try renderToken(ais, tree, payload_token - 2, .Space); // ) |
| 2160 | try renderToken(ais, tree, payload_token - 1, .None); // | |
| 2161 | try renderToken(ais, tree, payload_token, .None); // identifier |
| 2162 | try renderToken(ais, tree, payload_token + 1, .Newline); // | |
| 2163 | } else { |
| 2217 | 2164 | ais.pushIndent(); |
| 2218 | | defer ais.popIndent(); |
| 2219 | | try renderToken(ais, tree, eq_token, eq_space); // = |
| 2165 | try renderToken(ais, tree, rparen, .Newline); // ) |
| 2166 | ais.popIndent(); |
| 2167 | } |
| 2168 | if (if_node.ast.else_expr != 0) { |
| 2169 | ais.pushIndent(); |
| 2170 | try renderExpression(ais, tree, if_node.ast.then_expr, Space.Newline); |
| 2171 | ais.popIndent(); |
| 2172 | const else_is_block = nodeIsBlock(node_tags[if_node.ast.else_expr]); |
| 2173 | if (else_is_block) { |
| 2174 | try renderToken(ais, tree, if_node.else_token, .Space); // else |
| 2175 | if (if_node.error_token) |error_token| { |
| 2176 | try renderToken(ais, tree, error_token - 1, .None); // | |
| 2177 | try renderToken(ais, tree, error_token, .None); // identifier |
| 2178 | try renderToken(ais, tree, error_token + 1, .Space); // | |
| 2179 | } |
| 2180 | return renderExpression(ais, tree, if_node.ast.else_expr, space); |
| 2181 | } else { |
| 2182 | if (if_node.error_token) |error_token| { |
| 2183 | try renderToken(ais, tree, if_node.else_token, .Space); // else |
| 2184 | try renderToken(ais, tree, error_token - 1, .None); // | |
| 2185 | try renderToken(ais, tree, error_token, .None); // identifier |
| 2186 | try renderToken(ais, tree, error_token + 1, .Space); // | |
| 2187 | } else { |
| 2188 | try renderToken(ais, tree, if_node.else_token, .Newline); // else |
| 2189 | } |
| 2190 | ais.pushIndent(); |
| 2191 | try renderExpression(ais, tree, if_node.ast.else_expr, space); |
| 2192 | ais.popIndent(); |
| 2193 | return; |
| 2194 | } |
| 2195 | } else { |
| 2196 | ais.pushIndent(); |
| 2197 | try renderExpression(ais, tree, if_node.ast.then_expr, space); |
| 2198 | ais.popIndent(); |
| 2199 | return; |
| 2220 | 2200 | } |
| 2221 | | ais.pushIndentOneShot(); |
| 2222 | | try renderExpression(ais, tree, init_node, Space.None); |
| 2223 | 2201 | } |
| 2224 | 2202 | |
| 2225 | | try renderToken(ais, tree, var_decl.semicolon_token, Space.Newline); |
| 2203 | // Single line if statement. |
| 2204 | |
| 2205 | if (if_node.payload_token) |payload_token| { |
| 2206 | assert(payload_token - 2 == rparen); |
| 2207 | try renderToken(ais, tree, payload_token - 2, .Space); // ) |
| 2208 | try renderToken(ais, tree, payload_token - 1, .None); // | |
| 2209 | if (token_tags[payload_token] == .Asterisk) { |
| 2210 | try renderToken(ais, tree, payload_token, .None); // * |
| 2211 | try renderToken(ais, tree, payload_token + 1, .None); // identifier |
| 2212 | try renderToken(ais, tree, payload_token + 2, .Space); // | |
| 2213 | } else { |
| 2214 | try renderToken(ais, tree, payload_token, .None); // identifier |
| 2215 | try renderToken(ais, tree, payload_token + 1, .Space); // | |
| 2216 | } |
| 2217 | } else { |
| 2218 | try renderToken(ais, tree, rparen, .Space); // ) |
| 2219 | } |
| 2220 | |
| 2221 | if (if_node.ast.else_expr != 0) { |
| 2222 | try renderExpression(ais, tree, if_node.ast.then_expr, .Space); |
| 2223 | try renderToken(ais, tree, if_node.else_token, .Space); // else |
| 2224 | |
| 2225 | if (if_node.error_token) |error_token| { |
| 2226 | try renderToken(ais, tree, error_token - 1, .None); // | |
| 2227 | try renderToken(ais, tree, error_token, .None); // identifier |
| 2228 | try renderToken(ais, tree, error_token + 1, .Space); // | |
| 2229 | } |
| 2230 | |
| 2231 | return renderExpression(ais, tree, if_node.ast.else_expr, space); |
| 2232 | } else { |
| 2233 | return renderExpression(ais, tree, if_node.ast.then_expr, space); |
| 2234 | } |
| 2226 | 2235 | } |
| 2227 | 2236 | |
| 2228 | 2237 | fn renderParamDecl( |
| ... | ... | @@ -2249,27 +2258,6 @@ fn renderParamDecl( |
| 2249 | 2258 | } |
| 2250 | 2259 | } |
| 2251 | 2260 | |
| 2252 | | fn renderStatement(ais: *Ais, tree: ast.Tree, base: ast.Node.Index) Error!void { |
| 2253 | | @panic("TODO render statement"); |
| 2254 | | //switch (base.tag) { |
| 2255 | | // .VarDecl => { |
| 2256 | | // const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", base); |
| 2257 | | // try renderVarDecl(allocator, ais, tree, var_decl); |
| 2258 | | // }, |
| 2259 | | // else => { |
| 2260 | | // if (base.requireSemiColon()) { |
| 2261 | | // try renderExpression(ais, tree, base, Space.None); |
| 2262 | | |
| 2263 | | // const semicolon_index = tree.nextToken(base.lastToken()); |
| 2264 | | // assert(tree.token_tags[semicolon_index] == .Semicolon); |
| 2265 | | // try renderToken(ais, tree, semicolon_index, Space.Newline); |
| 2266 | | // } else { |
| 2267 | | // try renderExpression(ais, tree, base, Space.Newline); |
| 2268 | | // } |
| 2269 | | // }, |
| 2270 | | //} |
| 2271 | | } |
| 2272 | | |
| 2273 | 2261 | const Space = enum { |
| 2274 | 2262 | None, |
| 2275 | 2263 | Newline, |
| ... | ... | @@ -2367,13 +2355,15 @@ fn renderDocComments(ais: *Ais, tree: ast.Tree, end_token: ast.TokenIndex) Error |
| 2367 | 2355 | } |
| 2368 | 2356 | } |
| 2369 | 2357 | |
| 2370 | | fn nodeIsBlock(base: *const ast.Node) bool { |
| 2371 | | return switch (base.tag) { |
| 2358 | fn nodeIsBlock(tag: ast.Node.Tag) bool { |
| 2359 | return switch (tag) { |
| 2372 | 2360 | .Block, |
| 2373 | | .LabeledBlock, |
| 2374 | 2361 | .If, |
| 2362 | .IfSimple, |
| 2375 | 2363 | .For, |
| 2364 | .ForSimple, |
| 2376 | 2365 | .While, |
| 2366 | .WhileSimple, |
| 2377 | 2367 | .Switch, |
| 2378 | 2368 | => true, |
| 2379 | 2369 | else => false, |