Skip to content

Commit c3879bc

Browse files
committed
Merge branch 'master' of https://github.com/Microsoft/TypeScript into fixingTypeParameters
2 parents e0f9825 + d17f13a commit c3879bc

36 files changed

+1444
-889
lines changed

Jakefile.js

+11-8
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ var languageServiceLibrarySources = [
113113
return path.join(serverDirectory, f);
114114
}).concat(servicesSources);
115115

116-
var harnessSources = [
116+
var harnessCoreSources = [
117117
"harness.ts",
118118
"sourceMapRecorder.ts",
119119
"harnessLanguageService.ts",
@@ -129,7 +129,9 @@ var harnessSources = [
129129
"runner.ts"
130130
].map(function (f) {
131131
return path.join(harnessDirectory, f);
132-
}).concat([
132+
});
133+
134+
var harnessSources = harnessCoreSources.concat([
133135
"incrementalParser.ts",
134136
"jsDocParsing.ts",
135137
"services/colorization.ts",
@@ -730,12 +732,13 @@ task("update-sublime", ["local", serverFile], function() {
730732
// run this task automatically
731733
desc("Runs tslint on the compiler sources");
732734
task("lint", [], function() {
733-
for(var i in compilerSources) {
734-
var f = compilerSources[i];
735+
function success(f) { return function() { console.log('SUCCESS: No linter errors in ' + f + '\n'); }};
736+
function failure(f) { return function() { console.log('FAILURE: Please fix linting errors in ' + f + '\n') }};
737+
738+
var lintTargets = compilerSources.concat(harnessCoreSources);
739+
for(var i in lintTargets) {
740+
var f = lintTargets[i];
735741
var cmd = 'tslint -f ' + f;
736-
exec(cmd,
737-
function() { console.log('SUCCESS: No linter errors'); },
738-
function() { console.log('FAILURE: Please fix linting errors in ' + f + '\n');
739-
});
742+
exec(cmd, success(f), failure(f));
740743
}
741744
}, { async: true });

src/compiler/parser.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -5135,7 +5135,12 @@ namespace ts {
51355135
}
51365136
else {
51375137
node.exportClause = parseNamedImportsOrExports(SyntaxKind.NamedExports);
5138-
if (parseOptional(SyntaxKind.FromKeyword)) {
5138+
5139+
// It is not uncommon to accidentally omit the 'from' keyword. Additionally, in editing scenarios,
5140+
// the 'from' keyword can be parsed as a named export when the export clause is unterminated (i.e. `export { from "moduleName";`)
5141+
// If we don't have a 'from' keyword, see if we have a string literal such that ASI won't take effect.
5142+
if (token === SyntaxKind.FromKeyword || (token === SyntaxKind.StringLiteral && !scanner.hasPrecedingLineBreak())) {
5143+
parseExpected(SyntaxKind.FromKeyword)
51395144
node.moduleSpecifier = parseModuleSpecifier();
51405145
}
51415146
}

src/harness/compilerRunner.ts

+39-40
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,26 @@ class CompilerBaselineRunner extends RunnerBase {
4242
describe('compiler tests for ' + fileName, () => {
4343
// Mocha holds onto the closure environment of the describe callback even after the test is done.
4444
// Everything declared here should be cleared out in the "after" callback.
45-
var justName: string;
46-
var content: string;
47-
var testCaseContent: { settings: Harness.TestCaseParser.CompilerSetting[]; testUnitData: Harness.TestCaseParser.TestUnitData[]; }
45+
let justName: string;
46+
let content: string;
47+
let testCaseContent: { settings: Harness.TestCaseParser.CompilerSetting[]; testUnitData: Harness.TestCaseParser.TestUnitData[]; };
4848

49-
var units: Harness.TestCaseParser.TestUnitData[];
50-
var tcSettings: Harness.TestCaseParser.CompilerSetting[];
51-
var createNewInstance: boolean;
49+
let units: Harness.TestCaseParser.TestUnitData[];
50+
let tcSettings: Harness.TestCaseParser.CompilerSetting[];
5251

53-
var lastUnit: Harness.TestCaseParser.TestUnitData;
54-
var rootDir: string;
52+
let lastUnit: Harness.TestCaseParser.TestUnitData;
53+
let rootDir: string;
5554

56-
var result: Harness.Compiler.CompilerResult;
57-
var program: ts.Program;
58-
var options: ts.CompilerOptions;
55+
let result: Harness.Compiler.CompilerResult;
56+
let program: ts.Program;
57+
let options: ts.CompilerOptions;
5958
// equivalent to the files that will be passed on the command line
60-
var toBeCompiled: { unitName: string; content: string }[];
59+
let toBeCompiled: { unitName: string; content: string }[];
6160
// equivalent to other files on the file system not directly passed to the compiler (ie things that are referenced by other files)
62-
var otherFiles: { unitName: string; content: string }[];
63-
var harnessCompiler: Harness.Compiler.HarnessCompiler;
61+
let otherFiles: { unitName: string; content: string }[];
62+
let harnessCompiler: Harness.Compiler.HarnessCompiler;
6463

65-
var createNewInstance = false;
64+
let createNewInstance = false;
6665

6766
before(() => {
6867
justName = fileName.replace(/^.*[\\\/]/, ''); // strips the fileName from the path.
@@ -105,7 +104,7 @@ class CompilerBaselineRunner extends RunnerBase {
105104
/* The compiler doesn't handle certain flags flipping during a single compilation setting. Tests on these flags will need
106105
a fresh compiler instance for themselves and then create a fresh one for the next test. Would be nice to get dev fixes
107106
eventually to remove this limitation. */
108-
for (var i = 0; i < tcSettings.length; ++i) {
107+
for (let i = 0; i < tcSettings.length; ++i) {
109108
// noImplicitAny is passed to getCompiler, but target is just passed in the settings blob to setCompilerSettings
110109
if (!createNewInstance && (tcSettings[i].flag == "noimplicitany" || tcSettings[i].flag === 'target')) {
111110
harnessCompiler = Harness.Compiler.getCompiler();
@@ -162,7 +161,7 @@ class CompilerBaselineRunner extends RunnerBase {
162161
it('Correct sourcemap content for ' + fileName, () => {
163162
if (options.sourceMap || options.inlineSourceMap) {
164163
Harness.Baseline.runBaseline('Correct sourcemap content for ' + fileName, justName.replace(/\.tsx?$/, '.sourcemap.txt'), () => {
165-
var record = result.getSourceMapRecord();
164+
let record = result.getSourceMapRecord();
166165
if (options.noEmitOnError && result.errors.length !== 0 && record === undefined) {
167166
// Because of the noEmitOnError option no files are created. We need to return null because baselining isn't required.
168167
return null;
@@ -180,33 +179,33 @@ class CompilerBaselineRunner extends RunnerBase {
180179

181180
// check js output
182181
Harness.Baseline.runBaseline('Correct JS output for ' + fileName, justName.replace(/\.tsx?/, '.js'), () => {
183-
var tsCode = '';
184-
var tsSources = otherFiles.concat(toBeCompiled);
182+
let tsCode = '';
183+
let tsSources = otherFiles.concat(toBeCompiled);
185184
if (tsSources.length > 1) {
186185
tsCode += '//// [' + fileName + '] ////\r\n\r\n';
187186
}
188-
for (var i = 0; i < tsSources.length; i++) {
187+
for (let i = 0; i < tsSources.length; i++) {
189188
tsCode += '//// [' + Harness.Path.getFileName(tsSources[i].unitName) + ']\r\n';
190189
tsCode += tsSources[i].content + (i < (tsSources.length - 1) ? '\r\n' : '');
191190
}
192191

193-
var jsCode = '';
194-
for (var i = 0; i < result.files.length; i++) {
192+
let jsCode = '';
193+
for (let i = 0; i < result.files.length; i++) {
195194
jsCode += '//// [' + Harness.Path.getFileName(result.files[i].fileName) + ']\r\n';
196195
jsCode += getByteOrderMarkText(result.files[i]);
197196
jsCode += result.files[i].code;
198197
}
199198

200199
if (result.declFilesCode.length > 0) {
201200
jsCode += '\r\n\r\n';
202-
for (var i = 0; i < result.declFilesCode.length; i++) {
201+
for (let i = 0; i < result.declFilesCode.length; i++) {
203202
jsCode += '//// [' + Harness.Path.getFileName(result.declFilesCode[i].fileName) + ']\r\n';
204203
jsCode += getByteOrderMarkText(result.declFilesCode[i]);
205204
jsCode += result.declFilesCode[i].code;
206205
}
207206
}
208207

209-
var declFileCompilationResult = harnessCompiler.compileDeclarationFiles(toBeCompiled, otherFiles, result, function (settings) {
208+
let declFileCompilationResult = harnessCompiler.compileDeclarationFiles(toBeCompiled, otherFiles, result, function (settings) {
210209
harnessCompiler.setCompilerSettings(tcSettings);
211210
}, options);
212211

@@ -244,8 +243,8 @@ class CompilerBaselineRunner extends RunnerBase {
244243
return null;
245244
}
246245

247-
var sourceMapCode = '';
248-
for (var i = 0; i < result.sourceMaps.length; i++) {
246+
let sourceMapCode = '';
247+
for (let i = 0; i < result.sourceMaps.length; i++) {
249248
sourceMapCode += '//// [' + Harness.Path.getFileName(result.sourceMaps[i].fileName) + ']\r\n';
250249
sourceMapCode += getByteOrderMarkText(result.sourceMaps[i]);
251250
sourceMapCode += result.sourceMaps[i].code;
@@ -293,7 +292,7 @@ class CompilerBaselineRunner extends RunnerBase {
293292

294293
// Produce baselines. The first gives the types for all expressions.
295294
// The second gives symbols for all identifiers.
296-
var e1: Error, e2: Error;
295+
let e1: Error, e2: Error;
297296
try {
298297
checkBaseLines(/*isSymbolBaseLine:*/ false);
299298
}
@@ -335,32 +334,32 @@ class CompilerBaselineRunner extends RunnerBase {
335334
let typeMap: { [fileName: string]: { [lineNum: number]: string[]; } } = {};
336335

337336
allFiles.forEach(file => {
338-
var codeLines = file.content.split('\n');
337+
let codeLines = file.content.split('\n');
339338
typeWriterResults[file.unitName].forEach(result => {
340339
if (isSymbolBaseline && !result.symbol) {
341340
return;
342341
}
343342

344-
var typeOrSymbolString = isSymbolBaseline ? result.symbol : result.type;
345-
var formattedLine = result.sourceText.replace(/\r?\n/g, "") + " : " + typeOrSymbolString;
343+
let typeOrSymbolString = isSymbolBaseline ? result.symbol : result.type;
344+
let formattedLine = result.sourceText.replace(/\r?\n/g, "") + " : " + typeOrSymbolString;
346345
if (!typeMap[file.unitName]) {
347346
typeMap[file.unitName] = {};
348347
}
349348

350-
var typeInfo = [formattedLine];
351-
var existingTypeInfo = typeMap[file.unitName][result.line];
349+
let typeInfo = [formattedLine];
350+
let existingTypeInfo = typeMap[file.unitName][result.line];
352351
if (existingTypeInfo) {
353352
typeInfo = existingTypeInfo.concat(typeInfo);
354353
}
355354
typeMap[file.unitName][result.line] = typeInfo;
356355
});
357356

358357
typeLines.push('=== ' + file.unitName + ' ===\r\n');
359-
for (var i = 0; i < codeLines.length; i++) {
360-
var currentCodeLine = codeLines[i];
358+
for (let i = 0; i < codeLines.length; i++) {
359+
let currentCodeLine = codeLines[i];
361360
typeLines.push(currentCodeLine + '\r\n');
362361
if (typeMap[file.unitName]) {
363-
var typeInfo = typeMap[file.unitName][i];
362+
let typeInfo = typeMap[file.unitName][i];
364363
if (typeInfo) {
365364
typeInfo.forEach(ty => {
366365
typeLines.push('>' + ty + '\r\n');
@@ -388,13 +387,13 @@ class CompilerBaselineRunner extends RunnerBase {
388387
public initializeTests() {
389388
describe(this.testSuiteName + ' tests', () => {
390389
describe("Setup compiler for compiler baselines", () => {
391-
var harnessCompiler = Harness.Compiler.getCompiler();
390+
let harnessCompiler = Harness.Compiler.getCompiler();
392391
this.parseOptions();
393392
});
394393

395394
// this will set up a series of describe/it blocks to run between the setup and cleanup phases
396395
if (this.tests.length === 0) {
397-
var testFiles = this.enumerateFiles(this.basePath, /\.tsx?$/, { recursive: true });
396+
let testFiles = this.enumerateFiles(this.basePath, /\.tsx?$/, { recursive: true });
398397
testFiles.forEach(fn => {
399398
fn = fn.replace(/\\/g, "/");
400399
this.checkTestCodeOutput(fn);
@@ -405,7 +404,7 @@ class CompilerBaselineRunner extends RunnerBase {
405404
}
406405

407406
describe("Cleanup after compiler baselines", () => {
408-
var harnessCompiler = Harness.Compiler.getCompiler();
407+
let harnessCompiler = Harness.Compiler.getCompiler();
409408
});
410409
});
411410
}
@@ -417,8 +416,8 @@ class CompilerBaselineRunner extends RunnerBase {
417416
this.decl = false;
418417
this.output = false;
419418

420-
var opts = this.options.split(',');
421-
for (var i = 0; i < opts.length; i++) {
419+
let opts = this.options.split(',');
420+
for (let i = 0; i < opts.length; i++) {
422421
switch (opts[i]) {
423422
case 'error':
424423
this.errors = true;

0 commit comments

Comments
 (0)