@@ -171,13 +171,23 @@ public class GenSwift : GenPySwift
171
171
172
172
protected override void WriteLocalName!(FuSymbol symbol, FuPriority parent)
173
173
{
174
- if (symbol.Parent is FuForeach forEach && forEach.Collection.Type is FuStringType) {
175
- Write("Int(");
176
- WriteCamelCaseNotKeyword(symbol.Name);
177
- Write(".value)");
174
+ if (symbol.Parent is FuForeach loop) {
175
+ assert loop.Collection.Type is FuClassType klass;
176
+ if (klass.Class.Id == FuId.StringClass) {
177
+ Write("Int(");
178
+ WriteCamelCaseNotKeyword(symbol.Name);
179
+ Write(".value)");
180
+ return;
181
+ }
182
+ FuType elementType = symbol == loop.First ? klass.GetElementType() : klass.GetValueType();
183
+ if (elementType.Id == FuId.IntType) {
184
+ Write("Int(");
185
+ WriteCamelCaseNotKeyword(symbol.Name);
186
+ WriteChar(')');
187
+ return;
188
+ }
178
189
}
179
- else
180
- base.WriteLocalName(symbol, parent);
190
+ base.WriteLocalName(symbol, parent);
181
191
}
182
192
183
193
protected override void WriteMemberOp!(FuExpr left, FuSymbolReference? symbol)
@@ -272,6 +282,8 @@ public class GenSwift : GenPySwift
272
282
Write("UInt16");
273
283
break;
274
284
case FuId.IntType:
285
+ Write("Int32");
286
+ break;
275
287
case FuId.NIntType:
276
288
Write("Int");
277
289
break;
@@ -310,12 +322,20 @@ public class GenSwift : GenPySwift
310
322
}
311
323
}
312
324
325
+ void WritePromotedType!(FuType type)
326
+ {
327
+ if (type.Id == FuId.IntType)
328
+ Write("Int");
329
+ else
330
+ WriteType(type);
331
+ }
332
+
313
333
protected override void WriteTypeAndName!(FuNamedValue value)
314
334
{
315
335
WriteName(value);
316
336
if (!value.Type.IsFinal() || value.IsAssignableStorage()) {
317
337
Write(" : ");
318
- WriteType (value.Type);
338
+ WritePromotedType (value.Type);
319
339
}
320
340
}
321
341
@@ -356,11 +376,21 @@ public class GenSwift : GenPySwift
356
376
}
357
377
}
358
378
379
+ static bool IsIntIndexing(FuExpr expr)
380
+ {
381
+ if (expr.Type.Id != FuId.IntType)
382
+ return false;
383
+ if (expr is FuUnaryExpr unary && (unary.Op == FuToken.Increment || unary.Op == FuToken.Decrement))
384
+ expr = unary.Inner;
385
+ return expr.IsIndexing();
386
+ }
387
+
359
388
protected override void WriteCoercedInternal!(FuType type, FuExpr expr, FuPriority parent)
360
389
{
361
390
if (type is FuNumericType && !(expr is FuLiteral)
362
- && GetTypeId(type, false) != GetTypeId(expr.Type, expr is FuBinaryExpr binary && binary.Op != FuToken.LeftBracket)) {
363
- WriteType(type);
391
+ && (GetTypeId(type, false) != GetTypeId(expr.Type, expr is FuBinaryExpr && !expr.IsIndexing()))
392
+ || IsIntIndexing(expr)) {
393
+ WritePromotedType(type);
364
394
WriteChar('(');
365
395
if (type is FuIntegerType && expr is FuCallExpr call && call.Method.Symbol.Id == FuId.MathTruncate)
366
396
call.Arguments[0].Accept(this, FuPriority.Argument);
@@ -432,6 +462,17 @@ public class GenSwift : GenPySwift
432
462
WriteAdd(startIndex, length); // FIXME: side effect
433
463
}
434
464
465
+ protected override void WriteElementCoerced!(FuType type, FuExpr value)
466
+ {
467
+ if (type.Id == FuId.IntType && !IsIntIndexing(value)) {
468
+ Write("Int32(");
469
+ value.Accept(this, FuPriority.Argument);
470
+ WriteChar(')');
471
+ }
472
+ else
473
+ WriteCoerced(type, value, FuPriority.Argument);
474
+ }
475
+
435
476
bool AddVar!(string name)
436
477
{
437
478
HashSet<string>! vars = this.VarsAtIndent[this.Indent];
@@ -574,8 +615,9 @@ public class GenSwift : GenPySwift
574
615
WriteChar(')');
575
616
}
576
617
else {
577
- Write(".fill");
578
- WriteCoercedArgsInParentheses(method, args);
618
+ Write(".fill(");
619
+ WriteElementCoerced(obj.Type.AsClassType().GetElementType(), args[0]);
620
+ WriteChar(')');
579
621
}
580
622
break;
581
623
case FuId.ArrayFillPart:
@@ -591,8 +633,13 @@ public class GenSwift : GenPySwift
591
633
else {
592
634
obj.Accept(this, FuPriority.Primary);
593
635
WriteMemberOp(obj, null);
594
- Write("fill");
595
- WriteCoercedArgsInParentheses(method, args);
636
+ Write("fill(");
637
+ WriteElementCoerced(obj.Type.AsClassType().GetElementType(), args[0]);
638
+ Write(", ");
639
+ WriteCoerced(this.System.IntType, args[1], FuPriority.Argument);
640
+ Write(", ");
641
+ WriteCoerced(this.System.IntType, args[2], FuPriority.Argument);
642
+ WriteChar(')');
596
643
}
597
644
break;
598
645
case FuId.ArraySortAll:
@@ -960,7 +1007,7 @@ public class GenSwift : GenPySwift
960
1007
case FuToken.ShiftRight when expr == binary.Left:
961
1008
if (!(expr is FuLiteral)) {
962
1009
FuType type = this.System.PromoteNumericTypes(binary.Left.Type, binary.Right.Type);
963
- if (type != expr.Type) {
1010
+ if (type != expr.Type || IsIntIndexing(expr) ) {
964
1011
WriteCoerced(type, expr, parent);
965
1012
return;
966
1013
}
@@ -1009,7 +1056,16 @@ public class GenSwift : GenPySwift
1009
1056
WriteChar(' ');
1010
1057
Write(expr.GetOpString());
1011
1058
WriteChar(' ');
1012
- if (right is FuLiteralNull
1059
+ if (IsIntIndexing(expr.Left)) {
1060
+ if (IsIntIndexing(right))
1061
+ right.Accept(this, FuPriority.Argument);
1062
+ else {
1063
+ Write("Int32(");
1064
+ right.Accept(this, FuPriority.Argument);
1065
+ WriteChar(')');
1066
+ }
1067
+ }
1068
+ else if (right is FuLiteralNull
1013
1069
&& expr.Left is FuBinaryExpr leftBinary
1014
1070
&& leftBinary.Op == FuToken.LeftBracket
1015
1071
&& leftBinary.Left.Type is FuClassType dict
@@ -1418,7 +1474,7 @@ public class GenSwift : GenPySwift
1418
1474
protected override void WriteResultVar!()
1419
1475
{
1420
1476
Write("let result : ");
1421
- WriteType (this.CurrentMethod.Type);
1477
+ WritePromotedType (this.CurrentMethod.Type);
1422
1478
}
1423
1479
1424
1480
void WriteSwiftCaseValue!(FuSwitch statement, FuExpr value)
@@ -1432,7 +1488,7 @@ public class GenSwift : GenPySwift
1432
1488
Write("let ");
1433
1489
WriteCamelCaseNotKeyword(def.Name);
1434
1490
Write(" as ");
1435
- WriteType (def.Type);
1491
+ WritePromotedType (def.Type);
1436
1492
break;
1437
1493
case FuBinaryExpr when1 when when1.Op == FuToken.When:
1438
1494
WriteSwiftCaseValue(statement, when1.Left);
@@ -1516,7 +1572,7 @@ public class GenSwift : GenPySwift
1516
1572
else
1517
1573
WriteName(param);
1518
1574
Write(" : ");
1519
- WriteType (param.Type);
1575
+ WritePromotedType (param.Type);
1520
1576
}
1521
1577
1522
1578
internal override void VisitEnumValue!(FuConst konst, FuConst? previous)
@@ -1695,7 +1751,7 @@ public class GenSwift : GenPySwift
1695
1751
Write(" throws");
1696
1752
if (method.Type.Id != FuId.VoidType) {
1697
1753
Write(" -> ");
1698
- WriteType (method.Type);
1754
+ WritePromotedType (method.Type);
1699
1755
}
1700
1756
}
1701
1757
WriteNewLine();
0 commit comments