@@ -1210,21 +1210,6 @@ func isThisProperty(node *ast.Node) bool {
1210
1210
return (ast .IsPropertyAccessExpression (node ) || ast .IsElementAccessExpression (node )) && node .Expression ().Kind == ast .KindThisKeyword
1211
1211
}
1212
1212
1213
- func anyToString (v any ) string {
1214
- // !!! This function should behave identically to the expression `"" + v` in JS
1215
- switch v := v .(type ) {
1216
- case string :
1217
- return v
1218
- case jsnum.Number :
1219
- return v .String ()
1220
- case bool :
1221
- return core .IfElse (v , "true" , "false" )
1222
- case PseudoBigInt :
1223
- return "(BigInt)" // !!!
1224
- }
1225
- panic ("Unhandled case in anyToString" )
1226
- }
1227
-
1228
1213
func isValidNumberString (s string , roundTripOnly bool ) bool {
1229
1214
if s == "" {
1230
1215
return false
@@ -1423,136 +1408,6 @@ func isObjectLiteralElementLike(node *ast.Node) bool {
1423
1408
return ast .IsObjectLiteralElement (node )
1424
1409
}
1425
1410
1426
- type EvaluatorResult struct {
1427
- value any
1428
- isSyntacticallyString bool
1429
- resolvedOtherFiles bool
1430
- hasExternalReferences bool
1431
- }
1432
-
1433
- func evaluatorResult (value any , isSyntacticallyString bool , resolvedOtherFiles bool , hasExternalReferences bool ) EvaluatorResult {
1434
- return EvaluatorResult {value , isSyntacticallyString , resolvedOtherFiles , hasExternalReferences }
1435
- }
1436
-
1437
- type Evaluator func (expr * ast.Node , location * ast.Node ) EvaluatorResult
1438
-
1439
- func createEvaluator (evaluateEntity Evaluator ) Evaluator {
1440
- var evaluate Evaluator
1441
- evaluateTemplateExpression := func (expr * ast.Node , location * ast.Node ) EvaluatorResult {
1442
- var sb strings.Builder
1443
- sb .WriteString (expr .AsTemplateExpression ().Head .Text ())
1444
- resolvedOtherFiles := false
1445
- hasExternalReferences := false
1446
- for _ , span := range expr .AsTemplateExpression ().TemplateSpans .Nodes {
1447
- spanResult := evaluate (span .Expression (), location )
1448
- if spanResult .value == nil {
1449
- return evaluatorResult (nil , true /*isSyntacticallyString*/ , false , false )
1450
- }
1451
- sb .WriteString (anyToString (spanResult .value ))
1452
- sb .WriteString (span .AsTemplateSpan ().Literal .Text ())
1453
- resolvedOtherFiles = resolvedOtherFiles || spanResult .resolvedOtherFiles
1454
- hasExternalReferences = hasExternalReferences || spanResult .hasExternalReferences
1455
- }
1456
- return evaluatorResult (sb .String (), true , resolvedOtherFiles , hasExternalReferences )
1457
- }
1458
- evaluate = func (expr * ast.Node , location * ast.Node ) EvaluatorResult {
1459
- isSyntacticallyString := false
1460
- resolvedOtherFiles := false
1461
- hasExternalReferences := false
1462
- // It's unclear when/whether we should consider skipping other kinds of outer expressions.
1463
- // Type assertions intentionally break evaluation when evaluating literal types, such as:
1464
- // type T = `one ${"two" as any} three`; // string
1465
- // But it's less clear whether such an assertion should break enum member evaluation:
1466
- // enum E {
1467
- // A = "one" as any
1468
- // }
1469
- // SatisfiesExpressions and non-null assertions seem to have even less reason to break
1470
- // emitting enum members as literals. However, these expressions also break Babel's
1471
- // evaluation (but not esbuild's), and the isolatedModules errors we give depend on
1472
- // our evaluation results, so we're currently being conservative so as to issue errors
1473
- // on code that might break Babel.
1474
- expr = ast .SkipParentheses (expr )
1475
- switch expr .Kind {
1476
- case ast .KindPrefixUnaryExpression :
1477
- result := evaluate (expr .AsPrefixUnaryExpression ().Operand , location )
1478
- resolvedOtherFiles = result .resolvedOtherFiles
1479
- hasExternalReferences = result .hasExternalReferences
1480
- if value , ok := result .value .(jsnum.Number ); ok {
1481
- switch expr .AsPrefixUnaryExpression ().Operator {
1482
- case ast .KindPlusToken :
1483
- return evaluatorResult (value , isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1484
- case ast .KindMinusToken :
1485
- return evaluatorResult (- value , isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1486
- case ast .KindTildeToken :
1487
- return evaluatorResult (value .BitwiseNOT (), isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1488
- }
1489
- }
1490
- case ast .KindBinaryExpression :
1491
- left := evaluate (expr .AsBinaryExpression ().Left , location )
1492
- right := evaluate (expr .AsBinaryExpression ().Right , location )
1493
- operator := expr .AsBinaryExpression ().OperatorToken .Kind
1494
- isSyntacticallyString = (left .isSyntacticallyString || right .isSyntacticallyString ) && expr .AsBinaryExpression ().OperatorToken .Kind == ast .KindPlusToken
1495
- resolvedOtherFiles = left .resolvedOtherFiles || right .resolvedOtherFiles
1496
- hasExternalReferences = left .hasExternalReferences || right .hasExternalReferences
1497
- leftNum , leftIsNum := left .value .(jsnum.Number )
1498
- rightNum , rightIsNum := right .value .(jsnum.Number )
1499
- if leftIsNum && rightIsNum {
1500
- switch operator {
1501
- case ast .KindBarToken :
1502
- return evaluatorResult (leftNum .BitwiseOR (rightNum ), isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1503
- case ast .KindAmpersandToken :
1504
- return evaluatorResult (leftNum .BitwiseAND (rightNum ), isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1505
- case ast .KindGreaterThanGreaterThanToken :
1506
- return evaluatorResult (leftNum .SignedRightShift (rightNum ), isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1507
- case ast .KindGreaterThanGreaterThanGreaterThanToken :
1508
- return evaluatorResult (leftNum .UnsignedRightShift (rightNum ), isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1509
- case ast .KindLessThanLessThanToken :
1510
- return evaluatorResult (leftNum .LeftShift (rightNum ), isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1511
- case ast .KindCaretToken :
1512
- return evaluatorResult (leftNum .BitwiseXOR (rightNum ), isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1513
- case ast .KindAsteriskToken :
1514
- return evaluatorResult (leftNum * rightNum , isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1515
- case ast .KindSlashToken :
1516
- return evaluatorResult (leftNum / rightNum , isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1517
- case ast .KindPlusToken :
1518
- return evaluatorResult (leftNum + rightNum , isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1519
- case ast .KindMinusToken :
1520
- return evaluatorResult (leftNum - rightNum , isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1521
- case ast .KindPercentToken :
1522
- return evaluatorResult (leftNum .Remainder (rightNum ), isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1523
- case ast .KindAsteriskAsteriskToken :
1524
- return evaluatorResult (leftNum .Exponentiate (rightNum ), isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1525
- }
1526
- }
1527
- leftStr , leftIsStr := left .value .(string )
1528
- rightStr , rightIsStr := right .value .(string )
1529
- if (leftIsStr || leftIsNum ) && (rightIsStr || rightIsNum ) && operator == ast .KindPlusToken {
1530
- if leftIsNum {
1531
- leftStr = leftNum .String ()
1532
- }
1533
- if rightIsNum {
1534
- rightStr = rightNum .String ()
1535
- }
1536
- return evaluatorResult (leftStr + rightStr , isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1537
- }
1538
- case ast .KindStringLiteral , ast .KindNoSubstitutionTemplateLiteral :
1539
- return evaluatorResult (expr .Text (), true /*isSyntacticallyString*/ , false , false )
1540
- case ast .KindTemplateExpression :
1541
- return evaluateTemplateExpression (expr , location )
1542
- case ast .KindNumericLiteral :
1543
- return evaluatorResult (jsnum .FromString (expr .Text ()), false , false , false )
1544
- case ast .KindIdentifier , ast .KindElementAccessExpression :
1545
- return evaluateEntity (expr , location )
1546
- case ast .KindPropertyAccessExpression :
1547
- if ast .IsEntityNameExpression (expr ) {
1548
- return evaluateEntity (expr , location )
1549
- }
1550
- }
1551
- return evaluatorResult (nil , isSyntacticallyString , resolvedOtherFiles , hasExternalReferences )
1552
- }
1553
- return evaluate
1554
- }
1555
-
1556
1411
func isInfinityOrNaNString (name string ) bool {
1557
1412
return name == "Infinity" || name == "-Infinity" || name == "NaN"
1558
1413
}
@@ -1844,11 +1699,8 @@ func expressionResultIsUnused(node *ast.Node) bool {
1844
1699
}
1845
1700
}
1846
1701
1847
- func pseudoBigIntToString (value PseudoBigInt ) string {
1848
- if value .negative && value .base10Value != "0" {
1849
- return "-" + value .base10Value
1850
- }
1851
- return value .base10Value
1702
+ func pseudoBigIntToString (value jsnum.PseudoBigInt ) string {
1703
+ return value .String ()
1852
1704
}
1853
1705
1854
1706
func getSuperContainer (node * ast.Node , stopOnFunctions bool ) * ast.Node {
0 commit comments