| ... | ... | @@ -1203,19 +1203,35 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 1203 | 1203 | try renderToken(tree, stream, tree.nextToken(asm_node.asm_token), indent, Space.None); // ( |
| 1204 | 1204 | } |
| 1205 | 1205 | |
| 1206 | if (asm_node.outputs.len == 0 and asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) { |
| 1207 | try renderExpression(allocator, stream, tree, indent, asm_node.template, Space.None); |
| 1208 | try renderToken(tree, stream, asm_node.rparen, indent, space); |
| 1209 | return; |
| 1210 | } |
| 1211 | |
| 1206 | 1212 | try renderExpression(allocator, stream, tree, indent, asm_node.template, Space.Newline); |
| 1213 | |
| 1207 | 1214 | const indent_once = indent + indent_delta; |
| 1208 | 1215 | try stream.writeByteNTimes(' ', indent_once); |
| 1209 | | try stream.print(": "); |
| 1216 | |
| 1217 | const colon1 = tree.nextToken(asm_node.template.lastToken()); |
| 1210 | 1218 | const indent_extra = indent_once + 2; |
| 1211 | 1219 | |
| 1212 | | { |
| 1220 | const colon2 = if (asm_node.outputs.len == 0) blk: { |
| 1221 | try renderToken(tree, stream, colon1, indent, Space.Newline); // : |
| 1222 | try stream.writeByteNTimes(' ', indent_once); |
| 1223 | |
| 1224 | break :blk tree.nextToken(colon1); |
| 1225 | } else blk: { |
| 1226 | try renderToken(tree, stream, colon1, indent, Space.Space); // : |
| 1227 | |
| 1213 | 1228 | var it = asm_node.outputs.iterator(0); |
| 1214 | | while (it.next()) |asm_output| { |
| 1229 | while (true) { |
| 1230 | const asm_output = ??it.next(); |
| 1215 | 1231 | const node = &(asm_output.*).base; |
| 1216 | | try renderExpression(allocator, stream, tree, indent_extra, node, Space.None); |
| 1217 | 1232 | |
| 1218 | 1233 | if (it.peek()) |next_asm_output| { |
| 1234 | try renderExpression(allocator, stream, tree, indent_extra, node, Space.None); |
| 1219 | 1235 | const next_node = &(next_asm_output.*).base; |
| 1220 | 1236 | |
| 1221 | 1237 | const comma = tree.prevToken(next_asm_output.*.firstToken()); |
| ... | ... | @@ -1223,21 +1239,38 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 1223 | 1239 | try renderExtraNewline(tree, stream, next_node); |
| 1224 | 1240 | |
| 1225 | 1241 | try stream.writeByteNTimes(' ', indent_extra); |
| 1242 | } else if (asm_node.inputs.len == 0 and asm_node.clobbers.len == 0) { |
| 1243 | try renderExpression(allocator, stream, tree, indent_extra, node, Space.Newline); |
| 1244 | try stream.writeByteNTimes(' ', indent); |
| 1245 | try renderToken(tree, stream, asm_node.rparen, indent, space); |
| 1246 | return; |
| 1247 | } else { |
| 1248 | try renderExpression(allocator, stream, tree, indent_extra, node, Space.Newline); |
| 1249 | try stream.writeByteNTimes(' ', indent_once); |
| 1250 | const comma_or_colon = tree.nextToken(node.lastToken()); |
| 1251 | break :blk switch (tree.tokens.at(comma_or_colon).id) { |
| 1252 | Token.Id.Comma => tree.nextToken(comma_or_colon), |
| 1253 | else => comma_or_colon, |
| 1254 | }; |
| 1226 | 1255 | } |
| 1227 | 1256 | } |
| 1228 | | } |
| 1257 | }; |
| 1229 | 1258 | |
| 1230 | | try stream.write("\n"); |
| 1231 | | try stream.writeByteNTimes(' ', indent_once); |
| 1232 | | try stream.write(": "); |
| 1259 | const colon3 = if (asm_node.inputs.len == 0) blk: { |
| 1260 | try renderToken(tree, stream, colon2, indent, Space.Newline); // : |
| 1261 | try stream.writeByteNTimes(' ', indent_once); |
| 1262 | |
| 1263 | break :blk tree.nextToken(colon2); |
| 1264 | } else blk: { |
| 1265 | try renderToken(tree, stream, colon2, indent, Space.Space); // : |
| 1233 | 1266 | |
| 1234 | | { |
| 1235 | 1267 | var it = asm_node.inputs.iterator(0); |
| 1236 | | while (it.next()) |asm_input| { |
| 1268 | while (true) { |
| 1269 | const asm_input = ??it.next(); |
| 1237 | 1270 | const node = &(asm_input.*).base; |
| 1238 | | try renderExpression(allocator, stream, tree, indent_extra, node, Space.None); |
| 1239 | 1271 | |
| 1240 | 1272 | if (it.peek()) |next_asm_input| { |
| 1273 | try renderExpression(allocator, stream, tree, indent_extra, node, Space.None); |
| 1241 | 1274 | const next_node = &(next_asm_input.*).base; |
| 1242 | 1275 | |
| 1243 | 1276 | const comma = tree.prevToken(next_asm_input.*.firstToken()); |
| ... | ... | @@ -1245,26 +1278,40 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 1245 | 1278 | try renderExtraNewline(tree, stream, next_node); |
| 1246 | 1279 | |
| 1247 | 1280 | try stream.writeByteNTimes(' ', indent_extra); |
| 1281 | } else if (asm_node.clobbers.len == 0) { |
| 1282 | try renderExpression(allocator, stream, tree, indent_extra, node, Space.Newline); |
| 1283 | try stream.writeByteNTimes(' ', indent); |
| 1284 | try renderToken(tree, stream, asm_node.rparen, indent, space); // ) |
| 1285 | return; |
| 1286 | } else { |
| 1287 | try renderExpression(allocator, stream, tree, indent_extra, node, Space.Newline); |
| 1288 | try stream.writeByteNTimes(' ', indent_once); |
| 1289 | const comma_or_colon = tree.nextToken(node.lastToken()); |
| 1290 | break :blk switch (tree.tokens.at(comma_or_colon).id) { |
| 1291 | Token.Id.Comma => tree.nextToken(comma_or_colon), |
| 1292 | else => comma_or_colon, |
| 1293 | }; |
| 1248 | 1294 | } |
| 1249 | 1295 | } |
| 1250 | | } |
| 1296 | }; |
| 1251 | 1297 | |
| 1252 | | try stream.write("\n"); |
| 1253 | | try stream.writeByteNTimes(' ', indent_once); |
| 1254 | | try stream.write(": "); |
| 1298 | try renderToken(tree, stream, colon3, indent, Space.Space); // : |
| 1255 | 1299 | |
| 1256 | | { |
| 1257 | | var it = asm_node.clobbers.iterator(0); |
| 1258 | | while (it.next()) |node| { |
| 1259 | | try renderExpression(allocator, stream, tree, indent_once, node.*, Space.None); |
| 1300 | var it = asm_node.clobbers.iterator(0); |
| 1301 | while (true) { |
| 1302 | const clobber_token = ??it.next(); |
| 1260 | 1303 | |
| 1261 | | if (it.peek() != null) { |
| 1262 | | try stream.write(", "); |
| 1263 | | } |
| 1304 | if (it.peek() == null) { |
| 1305 | try renderToken(tree, stream, clobber_token.*, indent_once, Space.Newline); |
| 1306 | try stream.writeByteNTimes(' ', indent); |
| 1307 | try renderToken(tree, stream, asm_node.rparen, indent, space); |
| 1308 | return; |
| 1309 | } else { |
| 1310 | try renderToken(tree, stream, clobber_token.*, indent_once, Space.None); |
| 1311 | const comma = tree.nextToken(clobber_token.*); |
| 1312 | try renderToken(tree, stream, comma, indent_once, Space.Space); // , |
| 1264 | 1313 | } |
| 1265 | 1314 | } |
| 1266 | | |
| 1267 | | try renderToken(tree, stream, asm_node.rparen, indent, space); |
| 1268 | 1315 | }, |
| 1269 | 1316 | |
| 1270 | 1317 | ast.Node.Id.AsmInput => { |