@@ -2351,6 +2351,9 @@ namespace ts {
2351
2351
case SyntaxKind . CallExpression :
2352
2352
return computeCallExpression ( < CallExpression > node , subtreeFlags ) ;
2353
2353
2354
+ case SyntaxKind . NewExpression :
2355
+ return computeNewExpression ( < NewExpression > node , subtreeFlags ) ;
2356
+
2354
2357
case SyntaxKind . ModuleDeclaration :
2355
2358
return computeModuleDeclaration ( < ModuleDeclaration > node , subtreeFlags ) ;
2356
2359
@@ -2428,6 +2431,10 @@ namespace ts {
2428
2431
const expression = node . expression ;
2429
2432
const expressionKind = expression . kind ;
2430
2433
2434
+ if ( node . typeArguments ) {
2435
+ transformFlags |= TransformFlags . AssertTypeScript ;
2436
+ }
2437
+
2431
2438
if ( subtreeFlags & TransformFlags . ContainsSpreadElementExpression
2432
2439
|| isSuperOrSuperProperty ( expression , expressionKind ) ) {
2433
2440
// If the this node contains a SpreadElementExpression, or is a super call, then it is an ES6
@@ -2454,6 +2461,21 @@ namespace ts {
2454
2461
return false ;
2455
2462
}
2456
2463
2464
+ function computeNewExpression ( node : NewExpression , subtreeFlags : TransformFlags ) {
2465
+ let transformFlags = subtreeFlags ;
2466
+ if ( node . typeArguments ) {
2467
+ transformFlags |= TransformFlags . AssertTypeScript ;
2468
+ }
2469
+ if ( subtreeFlags & TransformFlags . ContainsSpreadElementExpression ) {
2470
+ // If the this node contains a SpreadElementExpression then it is an ES6
2471
+ // node.
2472
+ transformFlags |= TransformFlags . AssertES2015 ;
2473
+ }
2474
+ node . transformFlags = transformFlags | TransformFlags . HasComputedFlags ;
2475
+ return transformFlags & ~ TransformFlags . ArrayLiteralOrCallOrNewExcludes ;
2476
+ }
2477
+
2478
+
2457
2479
function computeBinaryExpression ( node : BinaryExpression , subtreeFlags : TransformFlags ) {
2458
2480
let transformFlags = subtreeFlags ;
2459
2481
const operatorTokenKind = node . operatorToken . kind ;
@@ -2482,13 +2504,12 @@ namespace ts {
2482
2504
const initializer = node . initializer ;
2483
2505
const dotDotDotToken = node . dotDotDotToken ;
2484
2506
2485
- // If the parameter has a question token, then it is TypeScript syntax.
2486
- if ( node . questionToken ) {
2487
- transformFlags |= TransformFlags . AssertTypeScript ;
2488
- }
2489
-
2490
- // If the parameter's name is 'this', then it is TypeScript syntax.
2491
- if ( subtreeFlags & TransformFlags . ContainsDecorators || isThisIdentifier ( name ) ) {
2507
+ // The '?' token, type annotations, decorators, and 'this' parameters are TypeSCript
2508
+ // syntax.
2509
+ if ( node . questionToken
2510
+ || node . type
2511
+ || subtreeFlags & TransformFlags . ContainsDecorators
2512
+ || isThisIdentifier ( name ) ) {
2492
2513
transformFlags |= TransformFlags . AssertTypeScript ;
2493
2514
}
2494
2515
@@ -2547,7 +2568,8 @@ namespace ts {
2547
2568
// TypeScript syntax.
2548
2569
// An exported declaration may be TypeScript syntax.
2549
2570
if ( ( subtreeFlags & TransformFlags . TypeScriptClassSyntaxMask )
2550
- || ( modifierFlags & ModifierFlags . Export ) ) {
2571
+ || ( modifierFlags & ModifierFlags . Export )
2572
+ || node . typeParameters ) {
2551
2573
transformFlags |= TransformFlags . AssertTypeScript ;
2552
2574
}
2553
2575
@@ -2568,7 +2590,8 @@ namespace ts {
2568
2590
2569
2591
// A class with a parameter property assignment, property initializer, or decorator is
2570
2592
// TypeScript syntax.
2571
- if ( subtreeFlags & TransformFlags . TypeScriptClassSyntaxMask ) {
2593
+ if ( subtreeFlags & TransformFlags . TypeScriptClassSyntaxMask
2594
+ || node . typeParameters ) {
2572
2595
transformFlags |= TransformFlags . AssertTypeScript ;
2573
2596
}
2574
2597
@@ -2622,10 +2645,10 @@ namespace ts {
2622
2645
2623
2646
function computeConstructor ( node : ConstructorDeclaration , subtreeFlags : TransformFlags ) {
2624
2647
let transformFlags = subtreeFlags ;
2625
- const body = node . body ;
2626
2648
2627
- if ( body === undefined ) {
2628
- // An overload constructor is TypeScript syntax.
2649
+ // TypeScript-specific modifiers and overloads are TypeScript syntax
2650
+ if ( hasModifier ( node , ModifierFlags . TypeScriptModifier )
2651
+ || ! node . body ) {
2629
2652
transformFlags |= TransformFlags . AssertTypeScript ;
2630
2653
}
2631
2654
@@ -2636,27 +2659,24 @@ namespace ts {
2636
2659
function computeMethod ( node : MethodDeclaration , subtreeFlags : TransformFlags ) {
2637
2660
// A MethodDeclaration is ES6 syntax.
2638
2661
let transformFlags = subtreeFlags | TransformFlags . AssertES2015 ;
2639
- const modifierFlags = getModifierFlags ( node ) ;
2640
- const body = node . body ;
2641
- const typeParameters = node . typeParameters ;
2642
- const asteriskToken = node . asteriskToken ;
2643
-
2644
- // A MethodDeclaration is TypeScript syntax if it is either abstract, overloaded,
2645
- // generic, or has a decorator.
2646
- if ( ! body
2647
- || typeParameters
2648
- || ( modifierFlags & ModifierFlags . Abstract )
2649
- || ( subtreeFlags & TransformFlags . ContainsDecorators ) ) {
2662
+
2663
+ // Decorators, TypeScript-specific modifiers, type parameters, type annotations, and
2664
+ // overloads are TypeScript syntax.
2665
+ if ( node . decorators
2666
+ || hasModifier ( node , ModifierFlags . TypeScriptModifier )
2667
+ || node . typeParameters
2668
+ || node . type
2669
+ || ! node . body ) {
2650
2670
transformFlags |= TransformFlags . AssertTypeScript ;
2651
2671
}
2652
2672
2653
2673
// An async method declaration is ES2017 syntax.
2654
- if ( modifierFlags & ModifierFlags . Async ) {
2674
+ if ( hasModifier ( node , ModifierFlags . Async ) ) {
2655
2675
transformFlags |= TransformFlags . AssertES2017 ;
2656
2676
}
2657
2677
2658
2678
// Currently, we only support generators that were originally async function bodies.
2659
- if ( asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2679
+ if ( node . asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2660
2680
transformFlags |= TransformFlags . AssertGenerator ;
2661
2681
}
2662
2682
@@ -2666,14 +2686,13 @@ namespace ts {
2666
2686
2667
2687
function computeAccessor ( node : AccessorDeclaration , subtreeFlags : TransformFlags ) {
2668
2688
let transformFlags = subtreeFlags ;
2669
- const modifierFlags = getModifierFlags ( node ) ;
2670
- const body = node . body ;
2671
2689
2672
- // An accessor is TypeScript syntax if it is either abstract, overloaded,
2673
- // generic, or has a decorator.
2674
- if ( ! body
2675
- || ( modifierFlags & ModifierFlags . Abstract )
2676
- || ( subtreeFlags & TransformFlags . ContainsDecorators ) ) {
2690
+ // Decorators, TypeScript-specific modifiers, type annotations, and overloads are
2691
+ // TypeScript syntax.
2692
+ if ( node . decorators
2693
+ || hasModifier ( node , ModifierFlags . TypeScriptModifier )
2694
+ || node . type
2695
+ || ! node . body ) {
2677
2696
transformFlags |= TransformFlags . AssertTypeScript ;
2678
2697
}
2679
2698
@@ -2699,7 +2718,6 @@ namespace ts {
2699
2718
let transformFlags : TransformFlags ;
2700
2719
const modifierFlags = getModifierFlags ( node ) ;
2701
2720
const body = node . body ;
2702
- const asteriskToken = node . asteriskToken ;
2703
2721
2704
2722
if ( ! body || ( modifierFlags & ModifierFlags . Ambient ) ) {
2705
2723
// An ambient declaration is TypeScript syntax.
@@ -2714,6 +2732,14 @@ namespace ts {
2714
2732
transformFlags |= TransformFlags . AssertTypeScript | TransformFlags . AssertES2015 ;
2715
2733
}
2716
2734
2735
+ // TypeScript-specific modifiers, type parameters, and type annotations are TypeScript
2736
+ // syntax.
2737
+ if ( modifierFlags & ModifierFlags . TypeScriptModifier
2738
+ || node . typeParameters
2739
+ || node . type ) {
2740
+ transformFlags |= TransformFlags . AssertTypeScript ;
2741
+ }
2742
+
2717
2743
// An async function declaration is ES2017 syntax.
2718
2744
if ( modifierFlags & ModifierFlags . Async ) {
2719
2745
transformFlags |= TransformFlags . AssertES2017 ;
@@ -2731,7 +2757,7 @@ namespace ts {
2731
2757
// down-level generator.
2732
2758
// Currently we do not support transforming any other generator fucntions
2733
2759
// down level.
2734
- if ( asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2760
+ if ( node . asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2735
2761
transformFlags |= TransformFlags . AssertGenerator ;
2736
2762
}
2737
2763
}
@@ -2742,11 +2768,17 @@ namespace ts {
2742
2768
2743
2769
function computeFunctionExpression ( node : FunctionExpression , subtreeFlags : TransformFlags ) {
2744
2770
let transformFlags = subtreeFlags ;
2745
- const modifierFlags = getModifierFlags ( node ) ;
2746
- const asteriskToken = node . asteriskToken ;
2771
+
2772
+ // TypeScript-specific modifiers, type parameters, and type annotations are TypeScript
2773
+ // syntax.
2774
+ if ( hasModifier ( node , ModifierFlags . TypeScriptModifier )
2775
+ || node . typeParameters
2776
+ || node . type ) {
2777
+ transformFlags |= TransformFlags . AssertTypeScript ;
2778
+ }
2747
2779
2748
2780
// An async function expression is ES2017 syntax.
2749
- if ( modifierFlags & ModifierFlags . Async ) {
2781
+ if ( hasModifier ( node , ModifierFlags . Async ) ) {
2750
2782
transformFlags |= TransformFlags . AssertES2017 ;
2751
2783
}
2752
2784
@@ -2762,7 +2794,7 @@ namespace ts {
2762
2794
// down-level generator.
2763
2795
// Currently we do not support transforming any other generator fucntions
2764
2796
// down level.
2765
- if ( asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2797
+ if ( node . asteriskToken && getEmitFlags ( node ) & EmitFlags . AsyncFunctionBody ) {
2766
2798
transformFlags |= TransformFlags . AssertGenerator ;
2767
2799
}
2768
2800
@@ -2773,10 +2805,17 @@ namespace ts {
2773
2805
function computeArrowFunction ( node : ArrowFunction , subtreeFlags : TransformFlags ) {
2774
2806
// An ArrowFunction is ES6 syntax, and excludes markers that should not escape the scope of an ArrowFunction.
2775
2807
let transformFlags = subtreeFlags | TransformFlags . AssertES2015 ;
2776
- const modifierFlags = getModifierFlags ( node ) ;
2808
+
2809
+ // TypeScript-specific modifiers, type parameters, and type annotations are TypeScript
2810
+ // syntax.
2811
+ if ( hasModifier ( node , ModifierFlags . TypeScriptModifier )
2812
+ || node . typeParameters
2813
+ || node . type ) {
2814
+ transformFlags |= TransformFlags . AssertTypeScript ;
2815
+ }
2777
2816
2778
2817
// An async arrow function is ES2017 syntax.
2779
- if ( modifierFlags & ModifierFlags . Async ) {
2818
+ if ( hasModifier ( node , ModifierFlags . Async ) ) {
2780
2819
transformFlags |= TransformFlags . AssertES2017 ;
2781
2820
}
2782
2821
@@ -2813,6 +2852,11 @@ namespace ts {
2813
2852
transformFlags |= TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
2814
2853
}
2815
2854
2855
+ // Type annotations are TypeScript syntax.
2856
+ if ( node . type ) {
2857
+ transformFlags |= TransformFlags . AssertTypeScript ;
2858
+ }
2859
+
2816
2860
node . transformFlags = transformFlags | TransformFlags . HasComputedFlags ;
2817
2861
return transformFlags & ~ TransformFlags . NodeExcludes ;
2818
2862
}
0 commit comments