| ... | @@ -1315,49 +1315,109 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind | ... | @@ -1315,49 +1315,109 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 1315 | ast.Node.Id.If => { | 1315 | ast.Node.Id.If => { |
| 1316 | const if_node = @fieldParentPtr(ast.Node.If, "base", base); | 1316 | const if_node = @fieldParentPtr(ast.Node.If, "base", base); |
| 1317 | | 1317 | |
| 1318 | try renderToken(tree, stream, if_node.if_token, indent, Space.Space); | 1318 | const lparen = tree.prevToken(if_node.condition.firstToken()); |
| 1319 | try renderToken(tree, stream, tree.prevToken(if_node.condition.firstToken()), indent, Space.None); | 1319 | const rparen = tree.nextToken(if_node.condition.lastToken()); |
| 1320 | | 1320 | |
| 1321 | try renderExpression(allocator, stream, tree, indent, if_node.condition, Space.None); | 1321 | try renderToken(tree, stream, if_node.if_token, indent, Space.Space); // if |
| 1322 | try renderToken(tree, stream, tree.nextToken(if_node.condition.lastToken()), indent, Space.Space); | 1322 | try renderToken(tree, stream, lparen, indent, Space.None); // ( |
| 1323 | | 1323 | |
| 1324 | if (if_node.payload) |payload| { | 1324 | try renderExpression(allocator, stream, tree, indent, if_node.condition, Space.None); // condition |
| 1325 | try renderExpression(allocator, stream, tree, indent, payload, Space.Space); | | |
| 1326 | } | | |
| 1327 | | 1325 | |
| 1328 | switch (if_node.body.id) { | 1326 | const body_is_block = switch (if_node.body.id) { |
| 1329 | ast.Node.Id.Block, | 1327 | ast.Node.Id.Block, |
| 1330 | ast.Node.Id.If, | 1328 | ast.Node.Id.If, |
| 1331 | ast.Node.Id.For, | 1329 | ast.Node.Id.For, |
| 1332 | ast.Node.Id.While, | 1330 | ast.Node.Id.While, |
| 1333 | ast.Node.Id.Switch => { | 1331 | ast.Node.Id.Switch, |
| 1334 | if (if_node.@"else") |@"else"| { | 1332 | => true, |
| 1335 | if (if_node.body.id == ast.Node.Id.Block) { | 1333 | else => false, |
| 1336 | try renderExpression(allocator, stream, tree, indent, if_node.body, Space.Space); | 1334 | }; |
| 1337 | } else { | | |
| 1338 | try renderExpression(allocator, stream, tree, indent, if_node.body, Space.Newline); | | |
| 1339 | try stream.writeByteNTimes(' ', indent); | | |
| 1340 | } | | |
| 1341 | | 1335 | |
| 1342 | try renderExpression(allocator, stream, tree, indent, &@"else".base, space); | 1336 | if (body_is_block) { |
| 1343 | } else { | 1337 | try renderToken(tree, stream, rparen, indent, Space.Space); // ) |
| 1344 | try renderExpression(allocator, stream, tree, indent, if_node.body, space); | 1338 | |
| 1345 | } | 1339 | if (if_node.payload) |payload| { |
| 1346 | }, | 1340 | try renderExpression(allocator, stream, tree, indent, payload, Space.Space); // |x| |
| 1347 | else => { | 1341 | } |
| 1348 | if (if_node.@"else") |@"else"| { | 1342 | |
| 1349 | try renderExpression(allocator, stream, tree, indent, if_node.body, Space.Space); | 1343 | if (if_node.@"else") |@"else"| { |
| 1350 | try renderToken(tree, stream, @"else".else_token, indent, Space.Space); | 1344 | try renderExpression(allocator, stream, tree, indent, if_node.body, Space.Space); |
| | 1345 | return renderExpression(allocator, stream, tree, indent, &@"else".base, space); |
| | 1346 | } else { |
| | 1347 | return renderExpression(allocator, stream, tree, indent, if_node.body, space); |
| | 1348 | } |
| | 1349 | } |
| | 1350 | |
| | 1351 | const src_has_newline = blk: { |
| | 1352 | const loc = tree.tokenLocation(tree.tokens.at(rparen).end, if_node.body.lastToken()); |
| | 1353 | break :blk loc.line != 0; |
| | 1354 | }; |
| | 1355 | |
| | 1356 | if (src_has_newline) { |
| | 1357 | const after_rparen_space = if (if_node.payload == null) Space.Newline else Space.Space; |
| | 1358 | try renderToken(tree, stream, rparen, indent, after_rparen_space); // ) |
| | 1359 | |
| | 1360 | if (if_node.payload) |payload| { |
| | 1361 | try renderExpression(allocator, stream, tree, indent, payload, Space.Newline); |
| | 1362 | } |
| | 1363 | |
| | 1364 | const new_indent = indent + indent_delta; |
| | 1365 | try stream.writeByteNTimes(' ', new_indent); |
| | 1366 | |
| | 1367 | if (if_node.@"else") |@"else"| { |
| | 1368 | const else_is_block = switch (@"else".body.id) { |
| | 1369 | ast.Node.Id.Block, |
| | 1370 | ast.Node.Id.If, |
| | 1371 | ast.Node.Id.For, |
| | 1372 | ast.Node.Id.While, |
| | 1373 | ast.Node.Id.Switch, |
| | 1374 | => true, |
| | 1375 | else => false, |
| | 1376 | }; |
| | 1377 | try renderExpression(allocator, stream, tree, new_indent, if_node.body, Space.Newline); |
| | 1378 | try stream.writeByteNTimes(' ', indent); |
| | 1379 | |
| | 1380 | if (else_is_block) { |
| | 1381 | try renderToken(tree, stream, @"else".else_token, indent, Space.Space); // else |
| 1351 | | 1382 | |
| 1352 | if (@"else".payload) |payload| { | 1383 | if (@"else".payload) |payload| { |
| 1353 | try renderExpression(allocator, stream, tree, indent, payload, Space.Space); | 1384 | try renderExpression(allocator, stream, tree, indent, payload, Space.Space); |
| 1354 | } | 1385 | } |
| 1355 | | 1386 | |
| 1356 | try renderExpression(allocator, stream, tree, indent, @"else".body, space); | 1387 | return renderExpression(allocator, stream, tree, indent, @"else".body, space); |
| 1357 | } else { | 1388 | } else { |
| 1358 | try renderExpression(allocator, stream, tree, indent, if_node.body, space); | 1389 | const after_else_space = if (@"else".payload == null) Space.Newline else Space.Space; |
| | 1390 | try renderToken(tree, stream, @"else".else_token, indent, after_else_space); // else |
| | 1391 | |
| | 1392 | if (@"else".payload) |payload| { |
| | 1393 | try renderExpression(allocator, stream, tree, indent, payload, Space.Newline); |
| | 1394 | } |
| | 1395 | try stream.writeByteNTimes(' ', new_indent); |
| | 1396 | |
| | 1397 | return renderExpression(allocator, stream, tree, new_indent, @"else".body, space); |
| 1359 | } | 1398 | } |
| 1360 | }, | 1399 | } else { |
| | 1400 | return renderExpression(allocator, stream, tree, new_indent, if_node.body, space); |
| | 1401 | } |
| | 1402 | } |
| | 1403 | |
| | 1404 | try renderToken(tree, stream, rparen, indent, Space.Space); // ) |
| | 1405 | |
| | 1406 | if (if_node.payload) |payload| { |
| | 1407 | try renderExpression(allocator, stream, tree, indent, payload, Space.Space); |
| | 1408 | } |
| | 1409 | |
| | 1410 | if (if_node.@"else") |@"else"| { |
| | 1411 | try renderExpression(allocator, stream, tree, indent, if_node.body, Space.Space); |
| | 1412 | try renderToken(tree, stream, @"else".else_token, indent, Space.Space); |
| | 1413 | |
| | 1414 | if (@"else".payload) |payload| { |
| | 1415 | try renderExpression(allocator, stream, tree, indent, payload, Space.Space); |
| | 1416 | } |
| | 1417 | |
| | 1418 | return renderExpression(allocator, stream, tree, indent, @"else".body, space); |
| | 1419 | } else { |
| | 1420 | return renderExpression(allocator, stream, tree, indent, if_node.body, space); |
| 1361 | } | 1421 | } |
| 1362 | }, | 1422 | }, |
| 1363 | | 1423 | |