@@ -2330,6 +2330,9 @@ namespace ts {
2330
2330
case SyntaxKind . CallExpression :
2331
2331
return computeCallExpression ( < CallExpression > node , subtreeFlags ) ;
2332
2332
2333
+ case SyntaxKind . NewExpression :
2334
+ return computeNewExpression ( < NewExpression > node , subtreeFlags ) ;
2335
+
2333
2336
case SyntaxKind . ModuleDeclaration :
2334
2337
return computeModuleDeclaration ( < ModuleDeclaration > node , subtreeFlags ) ;
2335
2338
@@ -2407,6 +2410,10 @@ namespace ts {
2407
2410
const expression = node . expression ;
2408
2411
const expressionKind = expression . kind ;
2409
2412
2413
+ if ( node . typeArguments ) {
2414
+ transformFlags |= TransformFlags . AssertTypeScript ;
2415
+ }
2416
+
2410
2417
if ( subtreeFlags & TransformFlags . ContainsSpreadElementExpression
2411
2418
|| isSuperOrSuperProperty ( expression , expressionKind ) ) {
2412
2419
// If the this node contains a SpreadElementExpression, or is a super call, then it is an ES6
@@ -2433,6 +2440,21 @@ namespace ts {
2433
2440
return false ;
2434
2441
}
2435
2442
2443
+ function computeNewExpression ( node : NewExpression , subtreeFlags : TransformFlags ) {
2444
+ let transformFlags = subtreeFlags ;
2445
+ if ( node . typeArguments ) {
2446
+ transformFlags |= TransformFlags . AssertTypeScript ;
2447
+ }
2448
+ if ( subtreeFlags & TransformFlags . ContainsSpreadElementExpression ) {
2449
+ // If the this node contains a SpreadElementExpression then it is an ES6
2450
+ // node.
2451
+ transformFlags |= TransformFlags . AssertES6 ;
2452
+ }
2453
+ node . transformFlags = transformFlags | TransformFlags . HasComputedFlags ;
2454
+ return transformFlags & ~ TransformFlags . ArrayLiteralOrCallOrNewExcludes ;
2455
+ }
2456
+
2457
+
2436
2458
function computeBinaryExpression ( node : BinaryExpression , subtreeFlags : TransformFlags ) {
2437
2459
let transformFlags = subtreeFlags ;
2438
2460
const operatorTokenKind = node . operatorToken . kind ;
@@ -2461,13 +2483,12 @@ namespace ts {
2461
2483
const initializer = node . initializer ;
2462
2484
const dotDotDotToken = node . dotDotDotToken ;
2463
2485
2464
- // If the parameter has a question token, then it is TypeScript syntax.
2465
- if ( node . questionToken ) {
2466
- transformFlags |= TransformFlags . AssertTypeScript ;
2467
- }
2468
-
2469
- // If the parameter's name is 'this', then it is TypeScript syntax.
2470
- if ( subtreeFlags & TransformFlags . ContainsDecorators || isThisIdentifier ( name ) ) {
2486
+ // The '?' token, type annotations, decorators, and 'this' parameters are TypeSCript
2487
+ // syntax.
2488
+ if ( node . questionToken
2489
+ || node . type
2490
+ || subtreeFlags & TransformFlags . ContainsDecorators
2491
+ || isThisIdentifier ( name ) ) {
2471
2492
transformFlags |= TransformFlags . AssertTypeScript ;
2472
2493
}
2473
2494
@@ -2526,7 +2547,8 @@ namespace ts {
2526
2547
// TypeScript syntax.
2527
2548
// An exported declaration may be TypeScript syntax.
2528
2549
if ( ( subtreeFlags & TransformFlags . TypeScriptClassSyntaxMask )
2529
- || ( modifierFlags & ModifierFlags . Export ) ) {
2550
+ || ( modifierFlags & ModifierFlags . Export )
2551
+ || node . typeParameters ) {
2530
2552
transformFlags |= TransformFlags . AssertTypeScript ;
2531
2553
}
2532
2554
@@ -2547,7 +2569,8 @@ namespace ts {
2547
2569
2548
2570
// A class with a parameter property assignment, property initializer, or decorator is
2549
2571
// TypeScript syntax.
2550
- if ( subtreeFlags & TransformFlags . TypeScriptClassSyntaxMask ) {
2572
+ if ( subtreeFlags & TransformFlags . TypeScriptClassSyntaxMask
2573
+ || node . typeParameters ) {
2551
2574
transformFlags |= TransformFlags . AssertTypeScript ;
2552
2575
}
2553
2576
@@ -2601,10 +2624,10 @@ namespace ts {
2601
2624
2602
2625
function computeConstructor ( node : ConstructorDeclaration , subtreeFlags : TransformFlags ) {
2603
2626
let transformFlags = subtreeFlags ;
2604
- const body = node . body ;
2605
2627
2606
- if ( body === undefined ) {
2607
- // An overload constructor is TypeScript syntax.
2628
+ // TypeScript-specific modifiers and overloads are TypeScript syntax
2629
+ if ( hasModifier ( node , ModifierFlags . TypeScriptModifier )
2630
+ || ! node . body ) {
2608
2631
transformFlags |= TransformFlags . AssertTypeScript ;
2609
2632
}
2610
2633
@@ -2615,22 +2638,19 @@ namespace ts {
2615
2638
function computeMethod ( node : MethodDeclaration , subtreeFlags : TransformFlags ) {
2616
2639
// A MethodDeclaration is ES6 syntax.
2617
2640
let transformFlags = subtreeFlags | TransformFlags . AssertES6 ;
2618
- const modifierFlags = getModifierFlags ( node ) ;
2619
- const body = node . body ;
2620
- const typeParameters = node . typeParameters ;
2621
- const asteriskToken = node . asteriskToken ;
2622
-
2623
- // A MethodDeclaration is TypeScript syntax if it is either async, abstract, overloaded,
2624
- // generic, or has a decorator.
2625
- if ( ! body
2626
- || typeParameters
2627
- || ( modifierFlags & ( ModifierFlags . Async | ModifierFlags . Abstract ) )
2628
- || ( subtreeFlags & TransformFlags . ContainsDecorators ) ) {
2641
+
2642
+ // Decorators, TypeScript-specific modifiers, type parameters, type annotations, and
2643
+ // overloads are TypeScript syntax.
2644
+ if ( node . decorators
2645
+ || hasModifier ( node , ModifierFlags . TypeScriptModifier )
2646
+ || node . typeParameters
2647
+ || node . type
2648
+ || ! node . body ) {
2629
2649
transformFlags |= TransformFlags . AssertTypeScript ;
2630
2650
}
2631
2651
2632
2652
// Currently, we only support generators that were originally async function bodies.
2633
- if ( asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2653
+ if ( node . asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2634
2654
transformFlags |= TransformFlags . AssertGenerator ;
2635
2655
}
2636
2656
@@ -2640,14 +2660,13 @@ namespace ts {
2640
2660
2641
2661
function computeAccessor ( node : AccessorDeclaration , subtreeFlags : TransformFlags ) {
2642
2662
let transformFlags = subtreeFlags ;
2643
- const modifierFlags = getModifierFlags ( node ) ;
2644
- const body = node . body ;
2645
2663
2646
- // A MethodDeclaration is TypeScript syntax if it is either async, abstract, overloaded,
2647
- // generic, or has a decorator.
2648
- if ( ! body
2649
- || ( modifierFlags & ( ModifierFlags . Async | ModifierFlags . Abstract ) )
2650
- || ( subtreeFlags & TransformFlags . ContainsDecorators ) ) {
2664
+ // Decorators, TypeScript-specific modifiers, type annotations, and overloads are
2665
+ // TypeScript syntax.
2666
+ if ( node . decorators
2667
+ || hasModifier ( node , ModifierFlags . TypeScriptModifier )
2668
+ || node . type
2669
+ || ! node . body ) {
2651
2670
transformFlags |= TransformFlags . AssertTypeScript ;
2652
2671
}
2653
2672
@@ -2673,7 +2692,6 @@ namespace ts {
2673
2692
let transformFlags : TransformFlags ;
2674
2693
const modifierFlags = getModifierFlags ( node ) ;
2675
2694
const body = node . body ;
2676
- const asteriskToken = node . asteriskToken ;
2677
2695
2678
2696
if ( ! body || ( modifierFlags & ModifierFlags . Ambient ) ) {
2679
2697
// An ambient declaration is TypeScript syntax.
@@ -2688,8 +2706,11 @@ namespace ts {
2688
2706
transformFlags |= TransformFlags . AssertTypeScript | TransformFlags . AssertES6 ;
2689
2707
}
2690
2708
2691
- // If a FunctionDeclaration is async, then it is TypeScript syntax.
2692
- if ( modifierFlags & ModifierFlags . Async ) {
2709
+ // TypeScript-specific modifiers, type parameters, and type annotations are TypeScript
2710
+ // syntax.
2711
+ if ( modifierFlags & ModifierFlags . TypeScriptModifier
2712
+ || node . typeParameters
2713
+ || node . type ) {
2693
2714
transformFlags |= TransformFlags . AssertTypeScript ;
2694
2715
}
2695
2716
@@ -2705,7 +2726,7 @@ namespace ts {
2705
2726
// down-level generator.
2706
2727
// Currently we do not support transforming any other generator fucntions
2707
2728
// down level.
2708
- if ( asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2729
+ if ( node . asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2709
2730
transformFlags |= TransformFlags . AssertGenerator ;
2710
2731
}
2711
2732
}
@@ -2716,11 +2737,12 @@ namespace ts {
2716
2737
2717
2738
function computeFunctionExpression ( node : FunctionExpression , subtreeFlags : TransformFlags ) {
2718
2739
let transformFlags = subtreeFlags ;
2719
- const modifierFlags = getModifierFlags ( node ) ;
2720
- const asteriskToken = node . asteriskToken ;
2721
2740
2722
- // An async function expression is TypeScript syntax.
2723
- if ( modifierFlags & ModifierFlags . Async ) {
2741
+ // TypeScript-specific modifiers, type parameters, and type annotations are TypeScript
2742
+ // syntax.
2743
+ if ( hasModifier ( node , ModifierFlags . TypeScriptModifier )
2744
+ || node . typeParameters
2745
+ || node . type ) {
2724
2746
transformFlags |= TransformFlags . AssertTypeScript ;
2725
2747
}
2726
2748
@@ -2736,7 +2758,7 @@ namespace ts {
2736
2758
// down-level generator.
2737
2759
// Currently we do not support transforming any other generator fucntions
2738
2760
// down level.
2739
- if ( asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2761
+ if ( node . asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2740
2762
transformFlags |= TransformFlags . AssertGenerator ;
2741
2763
}
2742
2764
@@ -2747,10 +2769,12 @@ namespace ts {
2747
2769
function computeArrowFunction ( node : ArrowFunction , subtreeFlags : TransformFlags ) {
2748
2770
// An ArrowFunction is ES6 syntax, and excludes markers that should not escape the scope of an ArrowFunction.
2749
2771
let transformFlags = subtreeFlags | TransformFlags . AssertES6 ;
2750
- const modifierFlags = getModifierFlags ( node ) ;
2751
2772
2752
- // An async arrow function is TypeScript syntax.
2753
- if ( modifierFlags & ModifierFlags . Async ) {
2773
+ // TypeScript-specific modifiers, type parameters, and type annotations are TypeScript
2774
+ // syntax.
2775
+ if ( hasModifier ( node , ModifierFlags . TypeScriptModifier )
2776
+ || node . typeParameters
2777
+ || node . type ) {
2754
2778
transformFlags |= TransformFlags . AssertTypeScript ;
2755
2779
}
2756
2780
@@ -2787,6 +2811,11 @@ namespace ts {
2787
2811
transformFlags |= TransformFlags . AssertES6 | TransformFlags . ContainsBindingPattern ;
2788
2812
}
2789
2813
2814
+ // Type annotations are TypeScript syntax.
2815
+ if ( node . type ) {
2816
+ transformFlags |= TransformFlags . AssertTypeScript ;
2817
+ }
2818
+
2790
2819
node . transformFlags = transformFlags | TransformFlags . HasComputedFlags ;
2791
2820
return transformFlags & ~ TransformFlags . NodeExcludes ;
2792
2821
}
0 commit comments