|
@@ -31,6 +31,8 @@ import java.util.Objects;
|
31
|
31
|
import java.util.StringJoiner;
|
32
|
32
|
|
33
|
33
|
public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativeTranslator<Void> {
|
|
34
|
+ private static final JavaMethod OBJECTS_TOSTRING = JavaMethod.getNativeStatic(new JavaClass("java.util", "Objects", JavaClass.Kind.CLASS), "toString", "(Ljava/lang/Object;)Ljava/lang/String;");
|
|
35
|
+
|
34
|
36
|
private static final JavaMethod BOOLEAN_PARSE = JavaMethod.getNativeStatic(JavaClass.BOOLEAN, "parseBoolean", "(Ljava/lang/String;)Z");
|
35
|
37
|
private static final JavaMethod BOOLEAN_TO_STRING = JavaMethod.getNativeStatic(JavaClass.BOOLEAN, "toString", "(Z)Ljava/lang/String;");
|
36
|
38
|
private static final JavaMethod BYTE_PARSE = JavaMethod.getNativeStatic(JavaClass.BYTE, "parseByte", "(Ljava/lang/String;)B");
|
|
@@ -1293,7 +1295,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1293
|
1295
|
|
1294
|
1296
|
switch (builtin) {
|
1295
|
1297
|
case BOOL_TO_STRING:
|
1296
|
|
- javaWriter.invokeStatic(BOOLEAN_TO_STRING);
|
|
1298
|
+ if(expression.target.type.isOptional()) {
|
|
1299
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1300
|
+ } else {
|
|
1301
|
+ javaWriter.invokeStatic(BOOLEAN_TO_STRING);
|
|
1302
|
+ }
|
1297
|
1303
|
break;
|
1298
|
1304
|
case BYTE_TO_SBYTE:
|
1299
|
1305
|
javaWriter.i2b();
|
|
@@ -1331,9 +1337,13 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1331
|
1337
|
javaWriter.iAnd();
|
1332
|
1338
|
break;
|
1333
|
1339
|
case BYTE_TO_STRING:
|
1334
|
|
- javaWriter.constant(0xFF);
|
1335
|
|
- javaWriter.iAnd();
|
1336
|
|
- javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1340
|
+ if(expression.target.type.isOptional()) {
|
|
1341
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1342
|
+ } else {
|
|
1343
|
+ javaWriter.constant(0xFF);
|
|
1344
|
+ javaWriter.iAnd();
|
|
1345
|
+ javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1346
|
+ }
|
1337
|
1347
|
break;
|
1338
|
1348
|
case SBYTE_TO_BYTE:
|
1339
|
1349
|
case SBYTE_TO_SHORT:
|
|
@@ -1355,7 +1365,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1355
|
1365
|
case SBYTE_TO_CHAR:
|
1356
|
1366
|
break;
|
1357
|
1367
|
case SBYTE_TO_STRING:
|
1358
|
|
- javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1368
|
+ if(expression.target.type.isOptional()) {
|
|
1369
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1370
|
+ } else {
|
|
1371
|
+ javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1372
|
+ }
|
1359
|
1373
|
break;
|
1360
|
1374
|
case SHORT_TO_BYTE:
|
1361
|
1375
|
break;
|
|
@@ -1380,7 +1394,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1380
|
1394
|
case SHORT_TO_CHAR:
|
1381
|
1395
|
break;
|
1382
|
1396
|
case SHORT_TO_STRING:
|
1383
|
|
- javaWriter.invokeStatic(SHORT_TO_STRING);
|
|
1397
|
+ if(expression.target.type.isOptional()) {
|
|
1398
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1399
|
+ } else {
|
|
1400
|
+ javaWriter.invokeStatic(SHORT_TO_STRING);
|
|
1401
|
+ }
|
1384
|
1402
|
break;
|
1385
|
1403
|
case USHORT_TO_BYTE:
|
1386
|
1404
|
break;
|
|
@@ -1416,10 +1434,14 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1416
|
1434
|
javaWriter.iAnd();
|
1417
|
1435
|
break;
|
1418
|
1436
|
case USHORT_TO_STRING:
|
1419
|
|
- javaWriter.constant(0xFFFFL);
|
1420
|
|
- javaWriter.iAnd();
|
1421
|
|
- javaWriter.invokeStatic(INTEGER_TO_STRING);
|
1422
|
|
- break;
|
|
1437
|
+ if(expression.target.type.isOptional()) {
|
|
1438
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1439
|
+ } else {
|
|
1440
|
+ javaWriter.constant(0xFFFFL);
|
|
1441
|
+ javaWriter.iAnd();
|
|
1442
|
+ javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1443
|
+ }
|
|
1444
|
+ break;
|
1423
|
1445
|
case INT_TO_BYTE:
|
1424
|
1446
|
case USIZE_TO_BYTE:
|
1425
|
1447
|
break;
|
|
@@ -1459,7 +1481,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1459
|
1481
|
break;
|
1460
|
1482
|
case INT_TO_STRING:
|
1461
|
1483
|
case USIZE_TO_STRING:
|
1462
|
|
- javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1484
|
+ if(expression.target.type.isOptional()) {
|
|
1485
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1486
|
+ } else {
|
|
1487
|
+ javaWriter.invokeStatic(INTEGER_TO_STRING);
|
|
1488
|
+ }
|
1463
|
1489
|
break;
|
1464
|
1490
|
case UINT_TO_BYTE:
|
1465
|
1491
|
break;
|
|
@@ -1497,7 +1523,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1497
|
1523
|
javaWriter.i2s();
|
1498
|
1524
|
break;
|
1499
|
1525
|
case UINT_TO_STRING:
|
1500
|
|
- javaWriter.invokeStatic(INTEGER_TO_UNSIGNED_STRING);
|
|
1526
|
+ if(expression.target.type.isOptional()) {
|
|
1527
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1528
|
+ } else {
|
|
1529
|
+ javaWriter.invokeStatic(INTEGER_TO_UNSIGNED_STRING);
|
|
1530
|
+ }
|
1501
|
1531
|
break;
|
1502
|
1532
|
case LONG_TO_BYTE:
|
1503
|
1533
|
javaWriter.l2i();
|
|
@@ -1529,7 +1559,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1529
|
1559
|
javaWriter.i2s();
|
1530
|
1560
|
break;
|
1531
|
1561
|
case LONG_TO_STRING:
|
1532
|
|
- javaWriter.invokeStatic(LONG_TO_STRING);
|
|
1562
|
+ if(expression.target.type.isOptional()) {
|
|
1563
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1564
|
+ } else {
|
|
1565
|
+ javaWriter.invokeStatic(LONG_TO_STRING);
|
|
1566
|
+ }
|
1533
|
1567
|
break;
|
1534
|
1568
|
case ULONG_TO_BYTE:
|
1535
|
1569
|
javaWriter.l2i();
|
|
@@ -1560,7 +1594,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1560
|
1594
|
javaWriter.i2s();
|
1561
|
1595
|
break;
|
1562
|
1596
|
case ULONG_TO_STRING:
|
1563
|
|
- javaWriter.invokeStatic(LONG_TO_UNSIGNED_STRING);
|
|
1597
|
+ if(expression.target.type.isOptional()) {
|
|
1598
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1599
|
+ } else {
|
|
1600
|
+ javaWriter.invokeStatic(LONG_TO_UNSIGNED_STRING);
|
|
1601
|
+ }
|
1564
|
1602
|
break;
|
1565
|
1603
|
case FLOAT_TO_BYTE:
|
1566
|
1604
|
javaWriter.f2i();
|
|
@@ -1587,7 +1625,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1587
|
1625
|
javaWriter.f2d();
|
1588
|
1626
|
break;
|
1589
|
1627
|
case FLOAT_TO_STRING:
|
1590
|
|
- javaWriter.invokeStatic(FLOAT_TO_STRING);
|
|
1628
|
+ if(expression.target.type.isOptional()) {
|
|
1629
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1630
|
+ } else {
|
|
1631
|
+ javaWriter.invokeStatic(FLOAT_TO_STRING);
|
|
1632
|
+ }
|
1591
|
1633
|
break;
|
1592
|
1634
|
case DOUBLE_TO_BYTE:
|
1593
|
1635
|
javaWriter.d2i();
|
|
@@ -1614,7 +1656,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1614
|
1656
|
javaWriter.d2f();
|
1615
|
1657
|
break;
|
1616
|
1658
|
case DOUBLE_TO_STRING:
|
1617
|
|
- javaWriter.invokeStatic(DOUBLE_TO_STRING);
|
|
1659
|
+ if(expression.target.type.isOptional()) {
|
|
1660
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1661
|
+ } else {
|
|
1662
|
+ javaWriter.invokeStatic(DOUBLE_TO_STRING);
|
|
1663
|
+ }
|
1618
|
1664
|
break;
|
1619
|
1665
|
case CHAR_TO_BYTE:
|
1620
|
1666
|
break;
|
|
@@ -1632,7 +1678,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
|
1632
|
1678
|
javaWriter.i2l();
|
1633
|
1679
|
break;
|
1634
|
1680
|
case CHAR_TO_STRING:
|
1635
|
|
- javaWriter.invokeStatic(CHARACTER_TO_STRING);
|
|
1681
|
+ if(expression.target.type.isOptional()) {
|
|
1682
|
+ javaWriter.invokeStatic(OBJECTS_TOSTRING);
|
|
1683
|
+ } else {
|
|
1684
|
+ javaWriter.invokeStatic(CHARACTER_TO_STRING);
|
|
1685
|
+ }
|
1636
|
1686
|
break;
|
1637
|
1687
|
case ENUM_TO_STRING:
|
1638
|
1688
|
javaWriter.invokeVirtual(ENUM_NAME);
|