Skip to content

Commit 29446c7

Browse files
committed
Merge branch 'master' into release-2.4
2 parents deaa1ec + 4d5175b commit 29446c7

File tree

112 files changed

+2850
-653
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

112 files changed

+2850
-653
lines changed

Jakefile.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,8 @@ function runConsoleTests(defaultReporter, runInParallel) {
802802

803803
var debug = process.env.debug || process.env.d;
804804
var inspect = process.env.inspect;
805-
tests = process.env.test || process.env.tests || process.env.t;
805+
var testTimeout = process.env.timeout || defaultTestTimeout;
806+
var tests = process.env.test || process.env.tests || process.env.t;
806807
var light = process.env.light || false;
807808
var stackTraceLimit = process.env.stackTraceLimit;
808809
var testConfigFile = 'test.config';
@@ -820,7 +821,7 @@ function runConsoleTests(defaultReporter, runInParallel) {
820821
} while (fs.existsSync(taskConfigsFolder));
821822
fs.mkdirSync(taskConfigsFolder);
822823

823-
workerCount = process.env.workerCount || os.cpus().length;
824+
workerCount = process.env.workerCount || process.env.p || os.cpus().length;
824825
}
825826

826827
if (tests || light || taskConfigsFolder) {
@@ -925,7 +926,7 @@ function runConsoleTests(defaultReporter, runInParallel) {
925926
}
926927
}
927928

928-
var testTimeout = 20000;
929+
var defaultTestTimeout = 22000;
929930
desc("Runs all the tests in parallel using the built run.js file. Optional arguments are: t[ests]=category1|category2|... d[ebug]=true.");
930931
task("runtests-parallel", ["build-rules", "tests", builtLocalDirectory], function () {
931932
runConsoleTests('min', /*runInParallel*/ true);

scripts/buildProtocol.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class DeclarationsWalker {
113113
}
114114
}
115115

116-
function generateProtocolFile(protocolTs: string, typeScriptServicesDts: string): string {
116+
function writeProtocolFile(outputFile: string, protocolTs: string, typeScriptServicesDts: string) {
117117
const options = { target: ts.ScriptTarget.ES5, declaration: true, noResolve: true, types: <string[]>[], stripInternal: true };
118118

119119
/**
@@ -163,14 +163,17 @@ function generateProtocolFile(protocolTs: string, typeScriptServicesDts: string)
163163
protocolDts += "\nimport protocol = ts.server.protocol;";
164164
protocolDts += "\nexport = protocol;";
165165
protocolDts += "\nexport as namespace protocol;";
166+
166167
// do sanity check and try to compile generated text as standalone program
167168
const sanityCheckProgram = getProgramWithProtocolText(protocolDts, /*includeTypeScriptServices*/ false);
168169
const diagnostics = [...sanityCheckProgram.getSyntacticDiagnostics(), ...sanityCheckProgram.getSemanticDiagnostics(), ...sanityCheckProgram.getGlobalDiagnostics()];
170+
171+
ts.sys.writeFile(outputFile, protocolDts);
172+
169173
if (diagnostics.length) {
170174
const flattenedDiagnostics = diagnostics.map(d => `${ts.flattenDiagnosticMessageText(d.messageText, "\n")} at ${d.file.fileName} line ${d.start}`).join("\n");
171175
throw new Error(`Unexpected errors during sanity check: ${flattenedDiagnostics}`);
172176
}
173-
return protocolDts;
174177
}
175178

176179
if (process.argv.length < 5) {
@@ -181,5 +184,4 @@ if (process.argv.length < 5) {
181184
const protocolTs = process.argv[2];
182185
const typeScriptServicesDts = process.argv[3];
183186
const outputFile = process.argv[4];
184-
const generatedProtocolDts = generateProtocolFile(protocolTs, typeScriptServicesDts);
185-
ts.sys.writeFile(outputFile, generatedProtocolDts);
187+
writeProtocolFile(outputFile, protocolTs, typeScriptServicesDts);

src/compiler/checker.ts

Lines changed: 91 additions & 40 deletions
Large diffs are not rendered by default.

src/compiler/commandLineParser.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,10 +1626,12 @@ namespace ts {
16261626
}
16271627

16281628
// Remove any subpaths under an existing recursively watched directory.
1629-
for (const key in wildcardDirectories) if (hasProperty(wildcardDirectories, key)) {
1630-
for (const recursiveKey of recursiveKeys) {
1631-
if (key !== recursiveKey && containsPath(recursiveKey, key, path, !useCaseSensitiveFileNames)) {
1632-
delete wildcardDirectories[key];
1629+
for (const key in wildcardDirectories) {
1630+
if (hasProperty(wildcardDirectories, key)) {
1631+
for (const recursiveKey of recursiveKeys) {
1632+
if (key !== recursiveKey && containsPath(recursiveKey, key, path, !useCaseSensitiveFileNames)) {
1633+
delete wildcardDirectories[key];
1634+
}
16331635
}
16341636
}
16351637
}
@@ -1717,10 +1719,12 @@ namespace ts {
17171719
/* @internal */
17181720
export function convertCompilerOptionsForTelemetry(opts: ts.CompilerOptions): ts.CompilerOptions {
17191721
const out: ts.CompilerOptions = {};
1720-
for (const key in opts) if (opts.hasOwnProperty(key)) {
1721-
const type = getOptionFromName(key);
1722-
if (type !== undefined) { // Ignore unknown options
1723-
out[key] = getOptionValueWithEmptyStrings(opts[key], type);
1722+
for (const key in opts) {
1723+
if (opts.hasOwnProperty(key)) {
1724+
const type = getOptionFromName(key);
1725+
if (type !== undefined) { // Ignore unknown options
1726+
out[key] = getOptionValueWithEmptyStrings(opts[key], type);
1727+
}
17241728
}
17251729
}
17261730
return out;

src/compiler/core.ts

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ namespace ts {
5151

5252
// Copies keys/values from template. Note that for..in will not throw if
5353
// template is undefined, and instead will just exit the loop.
54-
for (const key in template) if (hasOwnProperty.call(template, key)) {
55-
map.set(key, template[key]);
54+
for (const key in template) {
55+
if (hasOwnProperty.call(template, key)) {
56+
map.set(key, template[key]);
57+
}
5658
}
5759

5860
return map;
@@ -521,8 +523,8 @@ namespace ts {
521523
return result || array;
522524
}
523525

524-
export function mapDefined<T>(array: ReadonlyArray<T>, mapFn: (x: T, i: number) => T | undefined): ReadonlyArray<T> {
525-
const result: T[] = [];
526+
export function mapDefined<T, U>(array: ReadonlyArray<T>, mapFn: (x: T, i: number) => U | undefined): U[] {
527+
const result: U[] = [];
526528
for (let i = 0; i < array.length; i++) {
527529
const item = array[i];
528530
const mapped = mapFn(item, i);
@@ -977,9 +979,12 @@ namespace ts {
977979
*/
978980
export function getOwnKeys<T>(map: MapLike<T>): string[] {
979981
const keys: string[] = [];
980-
for (const key in map) if (hasOwnProperty.call(map, key)) {
981-
keys.push(key);
982+
for (const key in map) {
983+
if (hasOwnProperty.call(map, key)) {
984+
keys.push(key);
985+
}
982986
}
987+
983988
return keys;
984989
}
985990

@@ -1042,8 +1047,10 @@ namespace ts {
10421047
export function assign<T1 extends MapLike<{}>>(t: T1, ...args: any[]): any;
10431048
export function assign<T1 extends MapLike<{}>>(t: T1, ...args: any[]) {
10441049
for (const arg of args) {
1045-
for (const p in arg) if (hasProperty(arg, p)) {
1046-
t[p] = arg[p];
1050+
for (const p in arg) {
1051+
if (hasProperty(arg, p)) {
1052+
t[p] = arg[p];
1053+
}
10471054
}
10481055
}
10491056
return t;
@@ -1058,13 +1065,19 @@ namespace ts {
10581065
export function equalOwnProperties<T>(left: MapLike<T>, right: MapLike<T>, equalityComparer?: (left: T, right: T) => boolean) {
10591066
if (left === right) return true;
10601067
if (!left || !right) return false;
1061-
for (const key in left) if (hasOwnProperty.call(left, key)) {
1062-
if (!hasOwnProperty.call(right, key) === undefined) return false;
1063-
if (equalityComparer ? !equalityComparer(left[key], right[key]) : left[key] !== right[key]) return false;
1068+
for (const key in left) {
1069+
if (hasOwnProperty.call(left, key)) {
1070+
if (!hasOwnProperty.call(right, key) === undefined) return false;
1071+
if (equalityComparer ? !equalityComparer(left[key], right[key]) : left[key] !== right[key]) return false;
1072+
}
10641073
}
1065-
for (const key in right) if (hasOwnProperty.call(right, key)) {
1066-
if (!hasOwnProperty.call(left, key)) return false;
1074+
1075+
for (const key in right) {
1076+
if (hasOwnProperty.call(right, key)) {
1077+
if (!hasOwnProperty.call(left, key)) return false;
1078+
}
10671079
}
1080+
10681081
return true;
10691082
}
10701083

@@ -1106,12 +1119,18 @@ namespace ts {
11061119

11071120
export function extend<T1, T2>(first: T1, second: T2): T1 & T2 {
11081121
const result: T1 & T2 = <any>{};
1109-
for (const id in second) if (hasOwnProperty.call(second, id)) {
1110-
(result as any)[id] = (second as any)[id];
1122+
for (const id in second) {
1123+
if (hasOwnProperty.call(second, id)) {
1124+
(result as any)[id] = (second as any)[id];
1125+
}
11111126
}
1112-
for (const id in first) if (hasOwnProperty.call(first, id)) {
1113-
(result as any)[id] = (first as any)[id];
1127+
1128+
for (const id in first) {
1129+
if (hasOwnProperty.call(first, id)) {
1130+
(result as any)[id] = (first as any)[id];
1131+
}
11141132
}
1133+
11151134
return result;
11161135
}
11171136

@@ -2249,6 +2268,7 @@ namespace ts {
22492268
getSymbolConstructor(): new (flags: SymbolFlags, name: string) => Symbol;
22502269
getTypeConstructor(): new (checker: TypeChecker, flags: TypeFlags) => Type;
22512270
getSignatureConstructor(): new (checker: TypeChecker) => Signature;
2271+
getSourceMapSourceConstructor(): new (fileName: string, text: string, skipTrivia?: (pos: number) => number) => SourceMapSource;
22522272
}
22532273

22542274
function Symbol(this: Symbol, flags: SymbolFlags, name: string) {
@@ -2279,14 +2299,21 @@ namespace ts {
22792299
this.original = undefined;
22802300
}
22812301

2302+
function SourceMapSource(this: SourceMapSource, fileName: string, text: string, skipTrivia?: (pos: number) => number) {
2303+
this.fileName = fileName;
2304+
this.text = text;
2305+
this.skipTrivia = skipTrivia || (pos => pos);
2306+
}
2307+
22822308
export let objectAllocator: ObjectAllocator = {
22832309
getNodeConstructor: () => <any>Node,
22842310
getTokenConstructor: () => <any>Node,
22852311
getIdentifierConstructor: () => <any>Node,
22862312
getSourceFileConstructor: () => <any>Node,
22872313
getSymbolConstructor: () => <any>Symbol,
22882314
getTypeConstructor: () => <any>Type,
2289-
getSignatureConstructor: () => <any>Signature
2315+
getSignatureConstructor: () => <any>Signature,
2316+
getSourceMapSourceConstructor: () => <any>SourceMapSource,
22902317
};
22912318

22922319
export const enum AssertionLevel {

src/compiler/emitter.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -959,7 +959,7 @@ namespace ts {
959959
function emitConstructorType(node: ConstructorTypeNode) {
960960
write("new ");
961961
emitTypeParameters(node, node.typeParameters);
962-
emitParametersForArrow(node, node.parameters);
962+
emitParameters(node, node.parameters);
963963
write(" => ");
964964
emit(node.type);
965965
}
@@ -2283,11 +2283,25 @@ namespace ts {
22832283
emitList(parentNode, parameters, ListFormat.Parameters);
22842284
}
22852285

2286-
function emitParametersForArrow(parentNode: Node, parameters: NodeArray<ParameterDeclaration>) {
2287-
if (parameters &&
2288-
parameters.length === 1 &&
2289-
parameters[0].type === undefined &&
2290-
parameters[0].pos === parentNode.pos) {
2286+
function canEmitSimpleArrowHead(parentNode: FunctionTypeNode | ArrowFunction, parameters: NodeArray<ParameterDeclaration>) {
2287+
const parameter = singleOrUndefined(parameters);
2288+
return parameter
2289+
&& parameter.pos === parentNode.pos // may not have parsed tokens between parent and parameter
2290+
&& !(isArrowFunction(parentNode) && parentNode.type) // arrow function may not have return type annotation
2291+
&& !some(parentNode.decorators) // parent may not have decorators
2292+
&& !some(parentNode.modifiers) // parent may not have modifiers
2293+
&& !some(parentNode.typeParameters) // parent may not have type parameters
2294+
&& !some(parameter.decorators) // parameter may not have decorators
2295+
&& !some(parameter.modifiers) // parameter may not have modifiers
2296+
&& !parameter.dotDotDotToken // parameter may not be rest
2297+
&& !parameter.questionToken // parameter may not be optional
2298+
&& !parameter.type // parameter may not have a type annotation
2299+
&& !parameter.initializer // parameter may not have an initializer
2300+
&& isIdentifier(parameter.name); // parameter name must be identifier
2301+
}
2302+
2303+
function emitParametersForArrow(parentNode: FunctionTypeNode | ArrowFunction, parameters: NodeArray<ParameterDeclaration>) {
2304+
if (canEmitSimpleArrowHead(parentNode, parameters)) {
22912305
emit(parameters[0]);
22922306
}
22932307
else {

src/compiler/factory.ts

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ namespace ts {
228228

229229
// Signature elements
230230

231-
export function createTypeParameterDeclaration(name: string | Identifier, constraint: TypeNode | undefined, defaultType: TypeNode | undefined) {
231+
export function createTypeParameterDeclaration(name: string | Identifier, constraint?: TypeNode, defaultType?: TypeNode) {
232232
const node = createSynthesizedNode(SyntaxKind.TypeParameter) as TypeParameterDeclaration;
233233
node.name = asName(name);
234234
node.constraint = constraint;
@@ -2314,15 +2314,24 @@ namespace ts {
23142314
/**
23152315
* Sets a custom text range to use when emitting source maps.
23162316
*/
2317-
export function setSourceMapRange<T extends Node>(node: T, range: TextRange | undefined) {
2317+
export function setSourceMapRange<T extends Node>(node: T, range: SourceMapRange | undefined) {
23182318
getOrCreateEmitNode(node).sourceMapRange = range;
23192319
return node;
23202320
}
23212321

2322+
let SourceMapSource: new (fileName: string, text: string, skipTrivia?: (pos: number) => number) => SourceMapSource;
2323+
2324+
/**
2325+
* Create an external source map source file reference
2326+
*/
2327+
export function createSourceMapSource(fileName: string, text: string, skipTrivia?: (pos: number) => number): SourceMapSource {
2328+
return new (SourceMapSource || (SourceMapSource = objectAllocator.getSourceMapSourceConstructor()))(fileName, text, skipTrivia);
2329+
}
2330+
23222331
/**
23232332
* Gets the TextRange to use for source maps for a token of a node.
23242333
*/
2325-
export function getTokenSourceMapRange(node: Node, token: SyntaxKind): TextRange | undefined {
2334+
export function getTokenSourceMapRange(node: Node, token: SyntaxKind): SourceMapRange | undefined {
23262335
const emitNode = node.emitNode;
23272336
const tokenSourceMapRanges = emitNode && emitNode.tokenSourceMapRanges;
23282337
return tokenSourceMapRanges && tokenSourceMapRanges[token];
@@ -2331,7 +2340,7 @@ namespace ts {
23312340
/**
23322341
* Sets the TextRange to use for source maps for a token of a node.
23332342
*/
2334-
export function setTokenSourceMapRange<T extends Node>(node: T, token: SyntaxKind, range: TextRange | undefined) {
2343+
export function setTokenSourceMapRange<T extends Node>(node: T, token: SyntaxKind, range: SourceMapRange | undefined) {
23352344
const emitNode = getOrCreateEmitNode(node);
23362345
const tokenSourceMapRanges = emitNode.tokenSourceMapRanges || (emitNode.tokenSourceMapRanges = []);
23372346
tokenSourceMapRanges[token] = range;
@@ -3841,23 +3850,34 @@ namespace ts {
38413850
return emitNode && emitNode.externalHelpersModuleName;
38423851
}
38433852

3844-
export function getOrCreateExternalHelpersModuleNameIfNeeded(node: SourceFile, compilerOptions: CompilerOptions) {
3845-
if (compilerOptions.importHelpers && (isExternalModule(node) || compilerOptions.isolatedModules)) {
3853+
export function getOrCreateExternalHelpersModuleNameIfNeeded(node: SourceFile, compilerOptions: CompilerOptions, hasExportStarsToExportValues?: boolean) {
3854+
if (compilerOptions.importHelpers && isEffectiveExternalModule(node, compilerOptions)) {
38463855
const externalHelpersModuleName = getExternalHelpersModuleName(node);
38473856
if (externalHelpersModuleName) {
38483857
return externalHelpersModuleName;
38493858
}
38503859

3851-
const helpers = getEmitHelpers(node);
3852-
if (helpers) {
3853-
for (const helper of helpers) {
3854-
if (!helper.scoped) {
3855-
const parseNode = getOriginalNode(node, isSourceFile);
3856-
const emitNode = getOrCreateEmitNode(parseNode);
3857-
return emitNode.externalHelpersModuleName || (emitNode.externalHelpersModuleName = createUniqueName(externalHelpersModuleNameText));
3860+
const moduleKind = getEmitModuleKind(compilerOptions);
3861+
let create = hasExportStarsToExportValues
3862+
&& moduleKind !== ModuleKind.System
3863+
&& moduleKind !== ModuleKind.ES2015;
3864+
if (!create) {
3865+
const helpers = getEmitHelpers(node);
3866+
if (helpers) {
3867+
for (const helper of helpers) {
3868+
if (!helper.scoped) {
3869+
create = true;
3870+
break;
3871+
}
38583872
}
38593873
}
38603874
}
3875+
3876+
if (create) {
3877+
const parseNode = getOriginalNode(node, isSourceFile);
3878+
const emitNode = getOrCreateEmitNode(parseNode);
3879+
return emitNode.externalHelpersModuleName || (emitNode.externalHelpersModuleName = createUniqueName(externalHelpersModuleNameText));
3880+
}
38613881
}
38623882
}
38633883

@@ -4240,17 +4260,6 @@ namespace ts {
42404260
let exportEquals: ExportAssignment = undefined;
42414261
let hasExportStarsToExportValues = false;
42424262

4243-
const externalHelpersModuleName = getOrCreateExternalHelpersModuleNameIfNeeded(sourceFile, compilerOptions);
4244-
const externalHelpersImportDeclaration = externalHelpersModuleName && createImportDeclaration(
4245-
/*decorators*/ undefined,
4246-
/*modifiers*/ undefined,
4247-
createImportClause(/*name*/ undefined, createNamespaceImport(externalHelpersModuleName)),
4248-
createLiteral(externalHelpersModuleNameText));
4249-
4250-
if (externalHelpersImportDeclaration) {
4251-
externalImports.push(externalHelpersImportDeclaration);
4252-
}
4253-
42544263
for (const node of sourceFile.statements) {
42554264
switch (node.kind) {
42564265
case SyntaxKind.ImportDeclaration:
@@ -4361,6 +4370,17 @@ namespace ts {
43614370
}
43624371
}
43634372

4373+
const externalHelpersModuleName = getOrCreateExternalHelpersModuleNameIfNeeded(sourceFile, compilerOptions, hasExportStarsToExportValues);
4374+
const externalHelpersImportDeclaration = externalHelpersModuleName && createImportDeclaration(
4375+
/*decorators*/ undefined,
4376+
/*modifiers*/ undefined,
4377+
createImportClause(/*name*/ undefined, createNamespaceImport(externalHelpersModuleName)),
4378+
createLiteral(externalHelpersModuleNameText));
4379+
4380+
if (externalHelpersImportDeclaration) {
4381+
externalImports.unshift(externalHelpersImportDeclaration);
4382+
}
4383+
43644384
return { externalImports, exportSpecifiers, exportEquals, hasExportStarsToExportValues, exportedBindings, exportedNames, externalHelpersImportDeclaration };
43654385
}
43664386

0 commit comments

Comments
 (0)