| ... | @@ -69,15 +69,15 @@ fn renderRoot(ais: *Ais, tree: ast.Tree) Error!void { | ... | @@ -69,15 +69,15 @@ fn renderRoot(ais: *Ais, tree: ast.Tree) Error!void { |
| 69 | if (root_decls.len == 0) return; | 69 | if (root_decls.len == 0) return; |
| 70 | | 70 | |
| 71 | for (root_decls) |decl| { | 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 { | 76 | fn renderExtraNewline(ais: *Ais, tree: ast.Tree, node: ast.Node.Index) Error!void { |
| 77 | return renderExtraNewlineToken(tree, ais, tree.firstToken(node)); | 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 | @panic("TODO implement renderExtraNewlineToken"); | 81 | @panic("TODO implement renderExtraNewlineToken"); |
| 82 | //var prev_token = first_token; | 82 | //var prev_token = first_token; |
| 83 | //if (prev_token == 0) return; | 83 | //if (prev_token == 0) return; |
| ... | @@ -96,14 +96,11 @@ fn renderExtraNewlineToken(tree: ast.Tree, ais: *Ais, first_token: ast.TokenInde | ... | @@ -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 | fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: Space) Error!void { | 99 | fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: Space) Error!void { |
| 104 | const token_tags = tree.tokens.items(.tag); | 100 | const token_tags = tree.tokens.items(.tag); |
| 105 | const main_tokens = tree.nodes.items(.main_token); | 101 | const main_tokens = tree.nodes.items(.main_token); |
| 106 | const datas = tree.nodes.items(.data); | 102 | const datas = tree.nodes.items(.data); |
| | 103 | try renderDocComments(ais, tree, tree.firstToken(decl)); |
| 107 | switch (tree.nodes.items(.tag)[decl]) { | 104 | switch (tree.nodes.items(.tag)[decl]) { |
| 108 | .UsingNamespace, | 105 | .UsingNamespace, |
| 109 | .FnProtoSimple, | 106 | .FnProtoSimple, |
| ... | @@ -111,10 +108,6 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S | ... | @@ -111,10 +108,6 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S |
| 111 | .FnProtoOne, | 108 | .FnProtoOne, |
| 112 | .FnProto, | 109 | .FnProto, |
| 113 | .FnDecl, | 110 | .FnDecl, |
| 114 | .GlobalVarDecl, | | |
| 115 | .LocalVarDecl, | | |
| 116 | .SimpleVarDecl, | | |
| 117 | .AlignedVarDecl, | | |
| 118 | .ContainerFieldInit, | 111 | .ContainerFieldInit, |
| 119 | .ContainerFieldAlign, | 112 | .ContainerFieldAlign, |
| 120 | .ContainerField, | 113 | .ContainerField, |
| ... | @@ -145,16 +138,13 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S | ... | @@ -145,16 +138,13 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S |
| 145 | // try renderToken(ais, tree, use_decl.semicolon_token, space); // ; | 138 | // try renderToken(ais, tree, use_decl.semicolon_token, space); // ; |
| 146 | // }, | 139 | // }, |
| 147 | | 140 | |
| 148 | // .VarDecl => { | 141 | .GlobalVarDecl => return renderVarDecl(ais, tree, tree.globalVarDecl(decl)), |
| 149 | // const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", decl); | 142 | .LocalVarDecl => return renderVarDecl(ais, tree, tree.localVarDecl(decl)), |
| 150 | | 143 | .SimpleVarDecl => return renderVarDecl(ais, tree, tree.simpleVarDecl(decl)), |
| 151 | // try renderDocComments(ais, tree, var_decl, var_decl.getDocComments()); | 144 | .AlignedVarDecl => return renderVarDecl(ais, tree, tree.alignedVarDecl(decl)), |
| 152 | // try renderVarDecl(allocator, ais, tree, var_decl); | | |
| 153 | // }, | | |
| 154 | | 145 | |
| 155 | .TestDecl => { | 146 | .TestDecl => { |
| 156 | const test_token = main_tokens[decl]; | 147 | const test_token = main_tokens[decl]; |
| 157 | try renderDocComments(ais, tree, test_token); | | |
| 158 | try renderToken(ais, tree, test_token, .Space); | 148 | try renderToken(ais, tree, test_token, .Space); |
| 159 | if (token_tags[test_token + 1] == .StringLiteral) { | 149 | if (token_tags[test_token + 1] == .StringLiteral) { |
| 160 | try renderToken(ais, tree, test_token + 1, .Space); | 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,21 +241,20 @@ fn renderContainerDecl(ais: *Ais, tree: ast.Tree, decl: ast.Node.Index, space: S |
| 251 | fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Space) Error!void { | 241 | fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Space) Error!void { |
| 252 | const token_tags = tree.tokens.items(.tag); | 242 | const token_tags = tree.tokens.items(.tag); |
| 253 | const main_tokens = tree.nodes.items(.main_token); | 243 | const main_tokens = tree.nodes.items(.main_token); |
| 254 | switch (tree.nodes.items(.tag)[node]) { | 244 | const node_tags = tree.nodes.items(.tag); |
| 255 | //.Identifier, | 245 | const datas = tree.nodes.items(.data); |
| 256 | //.IntegerLiteral, | 246 | switch (node_tags[node]) { |
| 257 | //.FloatLiteral, | 247 | .Identifier, |
| 258 | //.StringLiteral, | 248 | .IntegerLiteral, |
| 259 | //.CharLiteral, | 249 | .FloatLiteral, |
| 260 | //.BoolLiteral, | 250 | .StringLiteral, |
| 261 | //.NullLiteral, | 251 | .CharLiteral, |
| 262 | //.Unreachable, | 252 | .TrueLiteral, |
| 263 | //.ErrorType, | 253 | .FalseLiteral, |
| 264 | //.UndefinedLiteral, | 254 | .NullLiteral, |
| 265 | //=> { | 255 | .UnreachableLiteral, |
| 266 | // const casted_node = base.cast(ast.Node.OneToken).?; | 256 | .UndefinedLiteral, |
| 267 | // return renderToken(ais, tree, casted_node.token, space); | 257 | => return renderToken(ais, tree, main_tokens[node], space), |
| 268 | //}, | | |
| 269 | | 258 | |
| 270 | //.AnyType => { | 259 | //.AnyType => { |
| 271 | // const any_type = base.castTag(.AnyType).?; | 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,16 +288,37 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 299 | | 288 | |
| 300 | try renderToken(ais, tree, lbrace, .Newline); | 289 | try renderToken(ais, tree, lbrace, .Newline); |
| 301 | | 290 | |
| 302 | for (statements) |statement, i| { | 291 | for (statements) |stmt, i| { |
| 303 | try renderStatement(ais, tree, statement); | 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 | if (i + 1 < statements.len) { | 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 | ais.popIndent(); | 312 | ais.popIndent(); |
| 310 | const rbrace = tree.lastToken(statements[statements.len - 1]) + 1; | 313 | // The rbrace could be +1 or +2 from the last token of the last |
| 311 | return renderToken(ais, tree, rbrace, space); | 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,8 +332,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 322 | // return renderExpression(ais, tree, defer_node.expr, space); | 332 | // return renderExpression(ais, tree, defer_node.expr, space); |
| 323 | //}, | 333 | //}, |
| 324 | .Comptime => { | 334 | .Comptime => { |
| 325 | const comptime_token = tree.nodes.items(.main_token)[node]; | 335 | const comptime_token = main_tokens[node]; |
| 326 | const block = tree.nodes.items(.data)[node].lhs; | 336 | const block = datas[node].lhs; |
| 327 | try renderToken(ais, tree, comptime_token, .Space); | 337 | try renderToken(ais, tree, comptime_token, .Space); |
| 328 | return renderExpression(ais, tree, block, space); | 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,71 +379,78 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 369 | // ais.pushIndentOneShot(); | 379 | // ais.pushIndentOneShot(); |
| 370 | // return renderExpression(ais, tree, infix_op_node.rhs, space); | 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, | 389 | .ErrorUnion, |
| 374 | //.AddWrap, | 390 | .SwitchRange, |
| 375 | //.ArrayCat, | 391 | => { |
| 376 | //.ArrayMult, | 392 | const infix = datas[node]; |
| 377 | //.Assign, | 393 | try renderExpression(ais, tree, infix.lhs, .None); |
| 378 | //.AssignBitAnd, | 394 | try renderToken(ais, tree, main_tokens[node], .None); |
| 379 | //.AssignBitOr, | 395 | return renderExpression(ais, tree, infix.rhs, space); |
| 380 | //.AssignBitShiftLeft, | 396 | }, |
| 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 | // }; | | |
| 428 | | 397 | |
| 429 | // { | 398 | .Add, |
| 430 | // ais.pushIndent(); | 399 | .AddWrap, |
| 431 | // defer ais.popIndent(); | 400 | .ArrayCat, |
| 432 | // try renderToken(ais, tree, infix_op_node.op_token, after_op_space); | 401 | .ArrayMult, |
| 433 | // } | 402 | .Assign, |
| 434 | // ais.pushIndentOneShot(); | 403 | .AssignBitAnd, |
| 435 | // return renderExpression(ais, tree, infix_op_node.rhs, space); | 404 | .AssignBitOr, |
| 436 | //}, | 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 | //.BitNot, | 455 | //.BitNot, |
| 439 | //.BoolNot, | 456 | //.BoolNot, |
| ... | @@ -769,7 +786,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -769,7 +786,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 769 | | 786 | |
| 770 | // column_counter = 0; | 787 | // column_counter = 0; |
| 771 | // try renderToken(ais, tree, comma, Space.Newline); // , | 788 | // try renderToken(ais, tree, comma, Space.Newline); // , |
| 772 | // try renderExtraNewline(tree, ais, next_expr); | 789 | // try renderExtraNewline(ais, tree, next_expr); |
| 773 | // } else { | 790 | // } else { |
| 774 | // const maybe_comma = tree.nextToken(expr.*.lastToken()); | 791 | // const maybe_comma = tree.nextToken(expr.*.lastToken()); |
| 775 | // if (tree.token_tags[maybe_comma] == .Comma) { | 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,7 +949,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 932 | // const comma = tree.nextToken(field_init.lastToken()); | 949 | // const comma = tree.nextToken(field_init.lastToken()); |
| 933 | // try renderToken(ais, tree, comma, Space.Newline); | 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 | // } else { | 953 | // } else { |
| 937 | // try renderExpression(ais, tree, field_init, Space.Comma); | 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,74 +959,63 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 942 | // return renderToken(ais, tree, rtoken, space); | 959 | // return renderToken(ais, tree, rtoken, space); |
| 943 | //}, | 960 | //}, |
| 944 | | 961 | |
| 945 | //.Call => { | 962 | .Call => { |
| 946 | // const call = @fieldParentPtr(ast.Node.Call, "base", base); | 963 | const call = datas[node]; |
| 947 | // if (call.async_token) |async_token| { | 964 | const params_range = tree.extraData(call.rhs, ast.Node.SubRange); |
| 948 | // try renderToken(ais, tree, async_token, Space.Space); | 965 | const params = tree.extra_data[params_range.start..params_range.end]; |
| 949 | // } | 966 | const async_token = tree.firstToken(call.lhs) - 1; |
| 950 | | 967 | if (token_tags[async_token] == .Keyword_async) { |
| 951 | // try renderExpression(ais, tree, call.lhs, Space.None); | 968 | try renderToken(ais, tree, async_token, .Space); |
| 952 | | 969 | } |
| 953 | // const lparen = tree.nextToken(call.lhs.lastToken()); | 970 | try renderExpression(ais, tree, call.lhs, .None); |
| 954 | | 971 | |
| 955 | // if (call.params_len == 0) { | 972 | const lparen = main_tokens[node]; |
| 956 | // try renderToken(ais, tree, lparen, Space.None); | | |
| 957 | // return renderToken(ais, tree, call.rtoken, space); | | |
| 958 | // } | | |
| 959 | | 973 | |
| 960 | // const src_has_trailing_comma = blk: { | 974 | if (params.len == 0) { |
| 961 | // const maybe_comma = tree.prevToken(call.rtoken); | 975 | try renderToken(ais, tree, lparen, .None); |
| 962 | // break :blk tree.token_tags[maybe_comma] == .Comma; | 976 | return renderToken(ais, tree, lparen + 1, space); // ) |
| 963 | // }; | 977 | } |
| 964 | | 978 | |
| 965 | // if (src_has_trailing_comma) { | 979 | const last_param = params[params.len - 1]; |
| 966 | // { | 980 | const after_last_param_tok = tree.lastToken(last_param) + 1; |
| 967 | // ais.pushIndent(); | 981 | if (token_tags[after_last_param_tok] == .Comma) { |
| 968 | // defer ais.popIndent(); | 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); // ( | 988 | // Unindent the comma for multiline string literals |
| 971 | // const params = call.params(); | 989 | const is_multiline_string = node_tags[param_node] == .StringLiteral and |
| 972 | // for (params) |param_node, i| { | 990 | token_tags[main_tokens[param_node]] == .MultilineStringLiteralLine; |
| 973 | // if (i + 1 < params.len) { | 991 | if (is_multiline_string) ais.popIndent(); |
| 974 | // const next_node = params[i + 1]; | | |
| 975 | // try renderExpression(ais, tree, param_node, Space.None); | | |
| 976 | | 992 | |
| 977 | // // Unindent the comma for multiline string literals | 993 | const comma = tree.lastToken(param_node) + 1; |
| 978 | // const maybe_multiline_string = param_node.firstToken(); | 994 | try renderToken(ais, tree, comma, Space.Newline); // , |
| 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(); | | |
| 982 | | 995 | |
| 983 | // const comma = tree.nextToken(param_node.lastToken()); | 996 | if (is_multiline_string) ais.pushIndent(); |
| 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 | // } | | |
| 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(); | 1007 | try renderToken(ais, tree, lparen, Space.None); // ( |
| 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 | // } | | |
| 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) { | 1012 | if (i + 1 < params.len) { |
| 1007 | // const comma = tree.nextToken(param_node.lastToken()); | 1013 | const comma = tree.lastToken(param_node) + 1; |
| 1008 | // try renderToken(ais, tree, comma, Space.Space); | 1014 | try renderToken(ais, tree, comma, Space.Space); |
| 1009 | // } | 1015 | } |
| 1010 | // } | 1016 | } |
| 1011 | // return renderToken(ais, tree, call.rtoken, space); // ) | 1017 | return renderToken(ais, tree, after_last_param_tok, space); // ) |
| 1012 | //}, | 1018 | }, |
| 1013 | | 1019 | |
| 1014 | //.ArrayAccess => { | 1020 | //.ArrayAccess => { |
| 1015 | // const suffix_op = base.castTag(.ArrayAccess).?; | 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,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 | //.PointerPayload => { | 1127 | //.PointerPayload => { |
| 1130 | // const payload = @fieldParentPtr(ast.Node.PointerPayload, "base", base); | 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,7 +1262,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1264 | // try renderContainerDecl(allocator, ais, tree, decl, .Newline); | 1262 | // try renderContainerDecl(allocator, ais, tree, decl, .Newline); |
| 1265 | | 1263 | |
| 1266 | // if (i + 1 < fields_and_decls.len) { | 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 | // } else if (src_has_newline) { | 1268 | // } else if (src_has_newline) { |
| ... | @@ -1338,7 +1336,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -1338,7 +1336,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1338 | // try renderExpression(ais, tree, node, Space.None); | 1336 | // try renderExpression(ais, tree, node, Space.None); |
| 1339 | // try renderToken(ais, tree, tree.nextToken(node.lastToken()), Space.Newline); // , | 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 | // } else { | 1340 | // } else { |
| 1343 | // try renderExpression(ais, tree, node, Space.Comma); | 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,7 +1355,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1357 | // const comma_token = tree.nextToken(node.lastToken()); | 1355 | // const comma_token = tree.nextToken(node.lastToken()); |
| 1358 | // assert(tree.token_tags[comma_token] == .Comma); | 1356 | // assert(tree.token_tags[comma_token] == .Comma); |
| 1359 | // try renderToken(ais, tree, comma_token, Space.Space); // , | 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 | // } else { | 1359 | // } else { |
| 1362 | // try renderExpression(ais, tree, node, Space.Space); | 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,7 +1622,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1624 | // try renderExpression(ais, tree, node, Space.Comma); | 1622 | // try renderExpression(ais, tree, node, Space.Comma); |
| 1625 | | 1623 | |
| 1626 | // if (i + 1 < cases.len) { | 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,7 +1648,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1650 | | 1648 | |
| 1651 | // const comma_token = tree.nextToken(node.lastToken()); | 1649 | // const comma_token = tree.nextToken(node.lastToken()); |
| 1652 | // try renderToken(ais, tree, comma_token, Space.Space); // , | 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 | // } else { | 1652 | // } else { |
| 1655 | // try renderExpression(ais, tree, node, Space.Space); | 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,7 +1661,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1663 | | 1661 | |
| 1664 | // const comma_token = tree.nextToken(node.lastToken()); | 1662 | // const comma_token = tree.nextToken(node.lastToken()); |
| 1665 | // try renderToken(ais, tree, comma_token, Space.Newline); // , | 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 | // } else { | 1665 | // } else { |
| 1668 | // try renderExpression(ais, tree, node, Space.Comma); | 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,28 +1680,6 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1682 | // const switch_else = @fieldParentPtr(ast.Node.SwitchElse, "base", base); | 1680 | // const switch_else = @fieldParentPtr(ast.Node.SwitchElse, "base", base); |
| 1683 | // return renderToken(ais, tree, switch_else.token, space); | 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 | //.While => { | 1684 | //.While => { |
| 1709 | // const while_node = @fieldParentPtr(ast.Node.While, "base", base); | 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,111 +1800,8 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1824 | // } | 1800 | // } |
| 1825 | //}, | 1801 | //}, |
| 1826 | | 1802 | |
| 1827 | //.If => { | 1803 | .IfSimple => return renderIf(ais, tree, tree.ifSimple(node), space), |
| 1828 | // const if_node = @fieldParentPtr(ast.Node.If, "base", base); | 1804 | .If => return renderIf(ais, tree, tree.ifFull(node), space), |
| 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 | | | |
| 1932 | //.Asm => { | 1805 | //.Asm => { |
| 1933 | // const asm_node = @fieldParentPtr(ast.Node.Asm, "base", base); | 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,7 +1847,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 1974 | | 1847 | |
| 1975 | // const comma = tree.prevToken(next_asm_output.firstToken()); | 1848 | // const comma = tree.prevToken(next_asm_output.firstToken()); |
| 1976 | // try renderToken(ais, tree, comma, Space.Newline); // , | 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 | // } else if (asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) { | 1851 | // } else if (asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) { |
| 1979 | // try renderAsmOutput(allocator, ais, tree, asm_output, Space.Newline); | 1852 | // try renderAsmOutput(allocator, ais, tree, asm_output, Space.Newline); |
| 1980 | // break :asmblk; | 1853 | // break :asmblk; |
| ... | @@ -2004,7 +1877,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac | ... | @@ -2004,7 +1877,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac |
| 2004 | | 1877 | |
| 2005 | // const comma = tree.prevToken(next_asm_input.firstToken()); | 1878 | // const comma = tree.prevToken(next_asm_input.firstToken()); |
| 2006 | // try renderToken(ais, tree, comma, Space.Newline); // , | 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 | // } else if (asm_node.clobbers.len == 0) { | 1881 | // } else if (asm_node.clobbers.len == 0) { |
| 2009 | // try renderAsmInput(allocator, ais, tree, asm_input, Space.Newline); | 1882 | // try renderAsmInput(allocator, ais, tree, asm_input, Space.Newline); |
| 2010 | // break :asmblk; | 1883 | // break :asmblk; |
| ... | @@ -2140,89 +2013,225 @@ fn renderAsmInput( | ... | @@ -2140,89 +2013,225 @@ fn renderAsmInput( |
| 2140 | return renderToken(ais, tree, asm_input.lastToken(), space); // ) | 2013 | return renderToken(ais, tree, asm_input.lastToken(), space); // ) |
| 2141 | } | 2014 | } |
| 2142 | | 2015 | |
| 2143 | fn renderVarDecl( | 2016 | fn renderVarDecl(ais: *Ais, tree: ast.Tree, var_decl: ast.Full.VarDecl) Error!void { |
| 2144 | allocator: *mem.Allocator, | 2017 | if (var_decl.visib_token) |visib_token| { |
| 2145 | ais: *Ais, | | |
| 2146 | tree: ast.Tree, | | |
| 2147 | var_decl: ast.Node.Index.VarDecl, | | |
| 2148 | ) Error!void { | | |
| 2149 | if (var_decl.getVisibToken()) |visib_token| { | | |
| 2150 | try renderToken(ais, tree, visib_token, Space.Space); // pub | 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 | try renderToken(ais, tree, extern_export_token, Space.Space); // extern | 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 | try renderExpression(ais, tree, lib_name, Space.Space); // "lib" | 2025 | try renderExpression(ais, tree, lib_name, Space.Space); // "lib" |
| 2158 | } | 2026 | } |
| 2159 | } | 2027 | } |
| 2160 | | 2028 | |
| 2161 | if (var_decl.getComptimeToken()) |comptime_token| { | 2029 | if (var_decl.threadlocal_token) |thread_local_token| { |
| 2162 | try renderToken(ais, tree, comptime_token, Space.Space); // comptime | 2030 | try renderToken(ais, tree, thread_local_token, Space.Space); // threadlocal |
| 2163 | } | 2031 | } |
| 2164 | | 2032 | |
| 2165 | if (var_decl.getThreadLocalToken()) |thread_local_token| { | 2033 | if (var_decl.comptime_token) |comptime_token| { |
| 2166 | try renderToken(ais, tree, thread_local_token, Space.Space); // threadlocal | 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 | 2037 | try renderToken(ais, tree, var_decl.ast.mut_token, .Space); // var |
| 2171 | (var_decl.getAlignNode() != null or | 2038 | |
| 2172 | var_decl.getSectionNode() != null or | 2039 | const name_space = if (var_decl.ast.type_node == 0 and |
| 2173 | var_decl.getInitNode() != null)) | 2040 | (var_decl.ast.align_node != 0 or |
| | 2041 | var_decl.ast.section_node != 0 or |
| | 2042 | var_decl.ast.init_node != 0)) |
| 2174 | Space.Space | 2043 | Space.Space |
| 2175 | else | 2044 | else |
| 2176 | Space.None; | 2045 | Space.None; |
| 2177 | try renderToken(ais, tree, var_decl.name_token, name_space); | 2046 | try renderToken(ais, tree, var_decl.ast.mut_token + 1, name_space); // name |
| 2178 | | 2047 | |
| 2179 | if (var_decl.getTypeNode()) |type_node| { | 2048 | if (var_decl.ast.type_node != 0) { |
| 2180 | try renderToken(ais, tree, tree.nextToken(var_decl.name_token), Space.Space); | 2049 | try renderToken(ais, tree, var_decl.ast.mut_token + 2, Space.Space); // : |
| 2181 | const s = if (var_decl.getAlignNode() != null or | 2050 | if (var_decl.ast.align_node != 0 or var_decl.ast.section_node != 0 or |
| 2182 | var_decl.getSectionNode() != null or | 2051 | var_decl.ast.init_node != 0) |
| 2183 | var_decl.getInitNode() != null) Space.Space else Space.None; | 2052 | { |
| 2184 | try renderExpression(ais, tree, type_node, s); | 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| { | 2061 | if (var_decl.ast.align_node != 0) { |
| 2188 | const lparen = tree.prevToken(align_node.firstToken()); | 2062 | const lparen = tree.firstToken(var_decl.ast.align_node) - 1; |
| 2189 | const align_kw = tree.prevToken(lparen); | 2063 | const align_kw = lparen - 1; |
| 2190 | const rparen = tree.nextToken(align_node.lastToken()); | 2064 | const rparen = tree.lastToken(var_decl.ast.align_node) + 1; |
| 2191 | try renderToken(ais, tree, align_kw, Space.None); // align | 2065 | try renderToken(ais, tree, align_kw, Space.None); // align |
| 2192 | try renderToken(ais, tree, lparen, Space.None); // ( | 2066 | try renderToken(ais, tree, lparen, Space.None); // ( |
| 2193 | try renderExpression(ais, tree, align_node, Space.None); | 2067 | try renderExpression(ais, tree, var_decl.ast.align_node, Space.None); |
| 2194 | const s = if (var_decl.getSectionNode() != null or var_decl.getInitNode() != null) Space.Space else Space.None; | 2068 | if (var_decl.ast.section_node != 0 or var_decl.ast.init_node != 0) { |
| 2195 | try renderToken(ais, tree, rparen, s); // ) | 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| { | 2076 | if (var_decl.ast.section_node != 0) { |
| 2199 | const lparen = tree.prevToken(section_node.firstToken()); | 2077 | const lparen = tree.firstToken(var_decl.ast.section_node) - 1; |
| 2200 | const section_kw = tree.prevToken(lparen); | 2078 | const section_kw = lparen - 1; |
| 2201 | const rparen = tree.nextToken(section_node.lastToken()); | 2079 | const rparen = tree.lastToken(var_decl.ast.section_node) + 1; |
| 2202 | try renderToken(ais, tree, section_kw, Space.None); // linksection | 2080 | try renderToken(ais, tree, section_kw, Space.None); // linksection |
| 2203 | try renderToken(ais, tree, lparen, Space.None); // ( | 2081 | try renderToken(ais, tree, lparen, Space.None); // ( |
| 2204 | try renderExpression(ais, tree, section_node, Space.None); | 2082 | try renderExpression(ais, tree, var_decl.ast.section_node, Space.None); |
| 2205 | const s = if (var_decl.getInitNode() != null) Space.Space else Space.None; | 2083 | if (var_decl.ast.init_node != 0) { |
| 2206 | try renderToken(ais, tree, rparen, s); // ) | 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| { | 2091 | assert(var_decl.ast.init_node != 0); |
| 2210 | const eq_token = var_decl.getEqToken().?; | 2092 | const eq_token = tree.firstToken(var_decl.ast.init_node) - 1; |
| 2211 | const eq_space = blk: { | 2093 | const eq_space: Space = if (tree.tokensOnSameLine(eq_token, eq_token + 1)) .Space else .Newline; |
| 2212 | const loc = tree.tokenLocation(tree.token_locs[eq_token].end, tree.nextToken(eq_token)); | 2094 | { |
| 2213 | break :blk if (loc.line == 0) Space.Space else Space.Newline; | 2095 | ais.pushIndent(); |
| 2214 | }; | 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 | ais.pushIndent(); | 2164 | ais.pushIndent(); |
| 2218 | defer ais.popIndent(); | 2165 | try renderToken(ais, tree, rparen, .Newline); // ) |
| 2219 | try renderToken(ais, tree, eq_token, eq_space); // = | 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 | fn renderParamDecl( | 2237 | fn renderParamDecl( |
| ... | @@ -2249,27 +2258,6 @@ 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 | const Space = enum { | 2261 | const Space = enum { |
| 2274 | None, | 2262 | None, |
| 2275 | Newline, | 2263 | Newline, |
| ... | @@ -2367,13 +2355,15 @@ fn renderDocComments(ais: *Ais, tree: ast.Tree, end_token: ast.TokenIndex) Error | ... | @@ -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 { | 2358 | fn nodeIsBlock(tag: ast.Node.Tag) bool { |
| 2371 | return switch (base.tag) { | 2359 | return switch (tag) { |
| 2372 | .Block, | 2360 | .Block, |
| 2373 | .LabeledBlock, | | |
| 2374 | .If, | 2361 | .If, |
| | 2362 | .IfSimple, |
| 2375 | .For, | 2363 | .For, |
| | 2364 | .ForSimple, |
| 2376 | .While, | 2365 | .While, |
| | 2366 | .WhileSimple, |
| 2377 | .Switch, | 2367 | .Switch, |
| 2378 | => true, | 2368 | => true, |
| 2379 | else => false, | 2369 | else => false, |