diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts
index 8b88da5b749..6b04e22551d 100644
--- a/src/compiler/binder.ts
+++ b/src/compiler/binder.ts
@@ -139,6 +139,8 @@ namespace ts {
file.classifiableNames = classifiableNames;
}
+ file = undefined;
+ options = undefined;
parent = undefined;
container = undefined;
blockScopeContainer = undefined;
diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts
index e4cd57542a7..bdeac582bbf 100644
--- a/src/compiler/emitter.ts
+++ b/src/compiler/emitter.ts
@@ -516,7 +516,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
let decorateEmitted: boolean;
let paramEmitted: boolean;
let awaiterEmitted: boolean;
- let tempFlags: TempFlags;
+ let tempFlags: TempFlags = 0;
let tempVariables: Identifier[];
let tempParameters: Identifier[];
let externalImports: (ImportDeclaration | ImportEqualsDeclaration | ExportDeclaration)[];
@@ -584,33 +584,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
return doEmit;
function doEmit(jsFilePath: string, rootFile?: SourceFile) {
- // reset the state
- writer.reset();
- currentSourceFile = undefined;
- currentText = undefined;
- currentLineMap = undefined;
- exportFunctionForFile = undefined;
generatedNameSet = {};
nodeToGeneratedName = [];
- computedPropertyNamesToGeneratedNames = undefined;
- convertedLoopState = undefined;
-
- extendsEmitted = false;
- decorateEmitted = false;
- paramEmitted = false;
- awaiterEmitted = false;
- tempFlags = 0;
- tempVariables = undefined;
- tempParameters = undefined;
- externalImports = undefined;
- exportSpecifiers = undefined;
- exportEquals = undefined;
- hasExportStars = undefined;
- detachedCommentsInfo = undefined;
- sourceMapData = undefined;
- isEs6Module = false;
- renamedDependencies = undefined;
- isCurrentFileExternalModule = false;
root = rootFile;
if (compilerOptions.sourceMap || compilerOptions.inlineSourceMap) {
@@ -634,6 +609,34 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
writeLine();
writeEmittedFiles(writer.getText(), jsFilePath, /*writeByteOrderMark*/ compilerOptions.emitBOM);
+
+ // reset the state
+ writer.reset();
+ currentSourceFile = undefined;
+ currentText = undefined;
+ currentLineMap = undefined;
+ exportFunctionForFile = undefined;
+ generatedNameSet = undefined;
+ nodeToGeneratedName = undefined;
+ computedPropertyNamesToGeneratedNames = undefined;
+ convertedLoopState = undefined;
+ extendsEmitted = false;
+ decorateEmitted = false;
+ paramEmitted = false;
+ awaiterEmitted = false;
+ tempFlags = 0;
+ tempVariables = undefined;
+ tempParameters = undefined;
+ externalImports = undefined;
+ exportSpecifiers = undefined;
+ exportEquals = undefined;
+ hasExportStars = undefined;
+ detachedCommentsInfo = undefined;
+ sourceMapData = undefined;
+ isEs6Module = false;
+ renamedDependencies = undefined;
+ isCurrentFileExternalModule = false;
+ root = undefined;
}
function emitSourceFile(sourceFile: SourceFile): void {
diff --git a/tests/cases/unittests/versionCache.ts b/tests/cases/unittests/versionCache.ts
index 06c2cadbfe9..c1d283ca8cd 100644
--- a/tests/cases/unittests/versionCache.ts
+++ b/tests/cases/unittests/versionCache.ts
@@ -20,7 +20,10 @@ module ts {
}
describe('VersionCache TS code', () => {
- var testContent = `///
+ let validateEditAtLineCharIndex: (line: number, char: number, deleteLength: number, insertString: string) => void;
+
+ before(() => {
+ let testContent = `///
var x = 10;
var y = { zebra: 12, giraffe: "ell" };
z.a;
@@ -31,16 +34,21 @@ k=y;
var p:Point=new Point();
var q:Point=p;`
- let {lines, lineMap} = server.LineIndex.linesFromText(testContent);
- assert.isTrue(lines.length > 0, "Failed to initialize test text. Expected text to have at least one line");
+ let {lines, lineMap} = server.LineIndex.linesFromText(testContent);
+ assert.isTrue(lines.length > 0, "Failed to initialize test text. Expected text to have at least one line");
- let lineIndex = new server.LineIndex();
- lineIndex.load(lines);
+ let lineIndex = new server.LineIndex();
+ lineIndex.load(lines);
- function validateEditAtLineCharIndex(line: number, char: number, deleteLength: number, insertString: string): void {
- let position = lineColToPosition(lineIndex, line, char);
- validateEdit(lineIndex, testContent, position, deleteLength, insertString);
- }
+ validateEditAtLineCharIndex = (line: number, char: number, deleteLength: number, insertString: string) => {
+ let position = lineColToPosition(lineIndex, line, char);
+ validateEdit(lineIndex, testContent, position, deleteLength, insertString);
+ };
+ });
+
+ after(() => {
+ validateEditAtLineCharIndex = undefined;
+ })
it('change 9 1 0 1 {"y"}', () => {
validateEditAtLineCharIndex(9, 1, 0, "y");
@@ -68,22 +76,35 @@ var q:Point=p;`
});
describe('VersionCache simple text', () => {
- let testContent = `in this story:
+ let validateEditAtPosition: (position: number, deleteLength: number, insertString: string) => void;
+ let testContent: string;
+ let lines: string[];
+ let lineMap: number[];
+ before(() => {
+ testContent = `in this story:
the lazy brown fox
jumped over the cow
that ate the grass
that was purple at the tips
and grew 1cm per day`;
- let {lines, lineMap} = server.LineIndex.linesFromText(testContent);
- assert.isTrue(lines.length > 0, "Failed to initialize test text. Expected text to have at least one line");
+ ({lines, lineMap} = server.LineIndex.linesFromText(testContent));
+ assert.isTrue(lines.length > 0, "Failed to initialize test text. Expected text to have at least one line");
- let lineIndex = new server.LineIndex();
- lineIndex.load(lines);
+ let lineIndex = new server.LineIndex();
+ lineIndex.load(lines);
- function validateEditAtPosition(position: number, deleteLength: number, insertString: string): void {
- validateEdit(lineIndex, testContent, position, deleteLength, insertString);
- }
+ validateEditAtPosition = (position: number, deleteLength: number, insertString: string) => {
+ validateEdit(lineIndex, testContent, position, deleteLength, insertString);
+ }
+ });
+
+ after(() => {
+ validateEditAtPosition = undefined;
+ testContent = undefined;
+ lines = undefined;
+ lineMap = undefined;
+ });
it('Insert at end of file', () => {
validateEditAtPosition(testContent.length, 0, "hmmmm...\r\n");
@@ -159,50 +180,69 @@ and grew 1cm per day`;
});
describe('VersionCache stress test', () => {
- const iterationCount = 20;
- //const interationCount = 20000; // uncomment for testing
-
- // Use scanner.ts, decent size, does not change frequentlly
- let testFileName = "src/compiler/scanner.ts";
- let testContent = Harness.IO.readFile(testFileName);
- let totalChars = testContent.length;
- assert.isTrue(totalChars > 0, "Failed to read test file.");
-
- let {lines, lineMap} = server.LineIndex.linesFromText(testContent);
- assert.isTrue(lines.length > 0, "Failed to initialize test text. Expected text to have at least one line");
-
- let lineIndex = new server.LineIndex();
- lineIndex.load(lines);
-
let rsa: number[] = [];
let la: number[] = [];
let las: number[] = [];
let elas: number[] = [];
let ersa: number[] = [];
let ela: number[] = [];
- let etotalChars = totalChars;
+ const iterationCount = 20;
+ //const iterationCount = 20000; // uncomment for testing
+ let lines: string[];
+ let lineMap: number[];
+ let lineIndex: server.LineIndex;
+ let testContent: string;
- for (let j = 0; j < 100000; j++) {
- rsa[j] = Math.floor(Math.random() * totalChars);
- la[j] = Math.floor(Math.random() * (totalChars - rsa[j]));
- if (la[j] > 4) {
- las[j] = 4;
- }
- else {
- las[j] = la[j];
- }
- if (j < 4000) {
- ersa[j] = Math.floor(Math.random() * etotalChars);
- ela[j] = Math.floor(Math.random() * (etotalChars - ersa[j]));
- if (ela[j] > 4) {
- elas[j] = 4;
+ before(() => {
+ // Use scanner.ts, decent size, does not change frequently
+ let testFileName = "src/compiler/scanner.ts";
+ testContent = Harness.IO.readFile(testFileName);
+ let totalChars = testContent.length;
+ assert.isTrue(totalChars > 0, "Failed to read test file.");
+
+ ({lines, lineMap} = server.LineIndex.linesFromText(testContent));
+ assert.isTrue(lines.length > 0, "Failed to initialize test text. Expected text to have at least one line");
+
+ lineIndex = new server.LineIndex();
+ lineIndex.load(lines);
+
+ let etotalChars = totalChars;
+
+ for (let j = 0; j < 100000; j++) {
+ rsa[j] = Math.floor(Math.random() * totalChars);
+ la[j] = Math.floor(Math.random() * (totalChars - rsa[j]));
+ if (la[j] > 4) {
+ las[j] = 4;
}
else {
- elas[j] = ela[j];
+ las[j] = la[j];
+ }
+ if (j < 4000) {
+ ersa[j] = Math.floor(Math.random() * etotalChars);
+ ela[j] = Math.floor(Math.random() * (etotalChars - ersa[j]));
+ if (ela[j] > 4) {
+ elas[j] = 4;
+ }
+ else {
+ elas[j] = ela[j];
+ }
+ etotalChars += (las[j] - elas[j]);
}
- etotalChars += (las[j] - elas[j]);
}
- }
+ });
+
+ after(() => {
+ rsa = undefined;
+ la = undefined;
+ las = undefined;
+ elas = undefined;
+ ersa = undefined;
+ ela = undefined;
+ lines = undefined;
+ lineMap = undefined;
+ lineIndex = undefined;
+ testContent = undefined;
+ });
it("Range (average length 1/4 file size)", () => {
for (let i = 0; i < iterationCount; i++) {