diff --git a/src/compiler/transform.ts b/src/compiler/transform.ts
index f49b3eafa17..568cf1d839e 100644
--- a/src/compiler/transform.ts
+++ b/src/compiler/transform.ts
@@ -2,6 +2,9 @@
///
/* @internal */
namespace ts.transform {
+
+ /* @internal */ export let aggregateTime = 0;
+
// Flags enum to track count of temp variables and a few dedicated names
const enum TempFlags {
Auto = 0x00000000, // No preferred name
@@ -40,6 +43,8 @@ namespace ts.transform {
function aggregateTransformFlagsForNode(node: Node) {
forEachChild(node, aggregateTransformFlagsForChildNode);
+ let start = new Date().getTime();
+
if (node.flags & NodeFlags.Ambient) {
transformFlags |= TransformFlags.ThisNodeIsTypeScript;
}
@@ -281,9 +286,34 @@ namespace ts.transform {
case SyntaxKind.ExportDeclaration:
transformFlags |= TransformFlags.ThisNodeIsES6;
break;
+
+ case SyntaxKind.AnyKeyword:
+ case SyntaxKind.NumberKeyword:
+ case SyntaxKind.StringKeyword:
+ case SyntaxKind.BooleanKeyword:
+ case SyntaxKind.SymbolKeyword:
+ case SyntaxKind.TypeParameter:
+ case SyntaxKind.CallSignature:
+ case SyntaxKind.ConstructSignature:
+ case SyntaxKind.IndexSignature:
+ case SyntaxKind.MethodSignature:
+ case SyntaxKind.PropertySignature:
+ transformFlags |= TransformFlags.ThisNodeIsTypeScript;
+ node.excludeTransformFlags = TransformFlags.TypeExcludes;
+ break;
+
+ default:
+ if (SyntaxKind.FirstTypeNode <= node.kind && node.kind <= SyntaxKind.LastTypeNode) {
+ transformFlags |= TransformFlags.ThisNodeIsTypeScript;
+ node.excludeTransformFlags = TransformFlags.TypeExcludes;
+ }
+ break;
+
}
node.transformFlags = transformFlags;
+
+ aggregateTime += new Date().getTime() - start;
}
export class VisitorContext {
diff --git a/src/compiler/transforms/chain.ts b/src/compiler/transforms/chain.ts
index b398211f985..bc28e53d726 100644
--- a/src/compiler/transforms/chain.ts
+++ b/src/compiler/transforms/chain.ts
@@ -4,6 +4,9 @@
///
/*@internal*/
namespace ts.transform {
+
+ export let transformTime = 0;
+
export type TransformationChain = (context: VisitorContext, statements: NodeArray) => NodeArray;
export function getTransformationChain(options: CompilerOptions): TransformationChain {
@@ -25,6 +28,7 @@ namespace ts.transform {
}
function runTransformation(chain: TransformationChain, context: VisitorContext, statements: NodeArray) {
+ let start = new Date().getTime();
context.pushLexicalEnvironment();
let transformed = chain(context, statements);
@@ -34,6 +38,7 @@ namespace ts.transform {
}
context.popLexicalEnvironment();
+ transformTime += new Date().getTime() - start;
return transformed;
}
diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts
index 8fc69d70e38..9ec1b187c67 100644
--- a/src/compiler/tsc.ts
+++ b/src/compiler/tsc.ts
@@ -118,7 +118,7 @@ namespace ts {
}
function reportStatisticalValue(name: string, value: string) {
- sys.write(padRight(name + ":", 12) + padLeft(value.toString(), 10) + sys.newLine);
+ sys.write(padRight(name + ":", 20) + padLeft(value.toString(), 10) + sys.newLine);
}
function reportCountStatistic(name: string, count: number) {
@@ -316,6 +316,8 @@ namespace ts {
bindTime = 0;
checkTime = 0;
emitTime = 0;
+ transform.aggregateTime = 0;
+ transform.transformTime = 0;
let program = createProgram(fileNames, compilerOptions, compilerHost);
let exitStatus = compileProgram();
@@ -348,6 +350,8 @@ namespace ts {
reportTimeStatistic("Parse time", programTime);
reportTimeStatistic("Bind time", bindTime);
reportTimeStatistic("Check time", checkTime);
+ reportTimeStatistic("Pre-transform time", transform.aggregateTime);
+ reportTimeStatistic("Transform time", transform.transformTime);
reportTimeStatistic("Emit time", emitTime);
reportTimeStatistic("Total time", programTime + bindTime + checkTime + emitTime);
}
diff --git a/src/compiler/types.ts b/src/compiler/types.ts
index 35dc62f0849..8bcb8f9e2e3 100644
--- a/src/compiler/types.ts
+++ b/src/compiler/types.ts
@@ -623,6 +623,9 @@ namespace ts {
ContainsES6VariableBindingPattern |
ContainsES6ParameterBindingPattern,
+ TypeExcludes =
+ ~ContainsTypeScript,
+
CallOrArrayLiteralExcludes =
ContainsES6SpreadElement,
}