From 6170c56af4f133029b8c14825222f0045257d803 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 9 Dec 2014 16:08:01 -0800 Subject: [PATCH] Remove 'isOpen' and 'version' from teh compiler's SourceFile type. Also, provide a way for creators of a source file to specify if they want parent nodes hooked up. --- src/compiler/parser.ts | 26 +++++++++++++++++++++++--- src/compiler/tsc.ts | 2 +- src/compiler/types.ts | 2 -- src/harness/harness.ts | 10 +++++----- src/harness/harnessLanguageService.ts | 10 ++++++++-- src/harness/projectsRunner.ts | 2 +- src/services/services.ts | 25 ++++++------------------- 7 files changed, 44 insertions(+), 33 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index d406b938d4e..4f4b7bd96e0 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1015,7 +1015,24 @@ module ts { return 0; } - export function createSourceFile(filename: string, sourceText: string, languageVersion: ScriptTarget, version: string, isOpen: boolean = false): SourceFile { + function fixupParentReferences(sourceFile: SourceFile) { + // normally parent references are set during binding. + // however here SourceFile data is used only for syntactic features so running the whole binding process is an overhead. + // walk over the nodes and set parent references + var parent: Node = sourceFile; + function walk(n: Node): void { + n.parent = parent; + + var saveParent = parent; + parent = n; + forEachChild(n, walk); + parent = saveParent; + } + + forEachChild(sourceFile, walk); + } + + export function createSourceFile(filename: string, sourceText: string, languageVersion: ScriptTarget, setParentNodes = false): SourceFile { var parsingContext: ParsingContext; var identifiers: Map = {}; var identifierCount = 0; @@ -1131,10 +1148,13 @@ module ts { sourceFile.nodeCount = nodeCount; sourceFile.identifierCount = identifierCount; - sourceFile.version = version; - sourceFile.isOpen = isOpen; sourceFile.languageVersion = languageVersion; sourceFile.identifiers = identifiers; + + if (setParentNodes) { + fixupParentReferences(sourceFile); + } + return sourceFile; function setContextFlag(val: Boolean, flag: ParserContextFlags) { diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index fbe596ee0f7..bb031c0e902 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -158,7 +158,7 @@ module ts { } text = ""; } - return text !== undefined ? createSourceFile(filename, text, languageVersion, /*version:*/ "0") : undefined; + return text !== undefined ? createSourceFile(filename, text, languageVersion) : undefined; } function writeFile(fileName: string, data: string, writeByteOrderMark: boolean, onError?: (message: string) => void) { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 19baf052406..37a7775491e 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -895,8 +895,6 @@ module ts { nodeCount: number; identifierCount: number; symbolCount: number; - isOpen: boolean; - version: string; languageVersion: ScriptTarget; identifiers: Map; } diff --git a/src/harness/harness.ts b/src/harness/harness.ts index c0d3ddedce3..4afbc98c48a 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -538,8 +538,8 @@ module Harness { } export var defaultLibFileName = 'lib.d.ts'; - export var defaultLibSourceFile = ts.createSourceFile(defaultLibFileName, IO.readFile(libFolder + 'lib.core.d.ts'), /*languageVersion*/ ts.ScriptTarget.Latest, /*version:*/ "0"); - export var defaultES6LibSourceFile = ts.createSourceFile(defaultLibFileName, IO.readFile(libFolder + 'lib.core.es6.d.ts'), /*languageVersion*/ ts.ScriptTarget.Latest, /*version:*/ "0"); + export var defaultLibSourceFile = ts.createSourceFile(defaultLibFileName, IO.readFile(libFolder + 'lib.core.d.ts'), /*languageVersion*/ ts.ScriptTarget.Latest); + export var defaultES6LibSourceFile = ts.createSourceFile(defaultLibFileName, IO.readFile(libFolder + 'lib.core.es6.d.ts'), /*languageVersion*/ ts.ScriptTarget.Latest); // Cache these between executions so we don't have to re-parse them for every test @@ -565,7 +565,7 @@ module Harness { function register(file: { unitName: string; content: string; }) { if (file.content !== undefined) { var filename = ts.normalizeSlashes(file.unitName); - filemap[getCanonicalFileName(filename)] = ts.createSourceFile(filename, file.content, scriptTarget, /*version:*/ "0"); + filemap[getCanonicalFileName(filename)] = ts.createSourceFile(filename, file.content, scriptTarget); } }; inputFiles.forEach(register); @@ -579,7 +579,7 @@ module Harness { } else if (fn === fourslashFilename) { var tsFn = 'tests/cases/fourslash/' + fourslashFilename; - fourslashSourceFile = fourslashSourceFile || ts.createSourceFile(tsFn, Harness.IO.readFile(tsFn), scriptTarget, /*version*/ "0", /*isOpen*/ false); + fourslashSourceFile = fourslashSourceFile || ts.createSourceFile(tsFn, Harness.IO.readFile(tsFn), scriptTarget); return fourslashSourceFile; } else { @@ -786,7 +786,7 @@ module Harness { var register = (file: { unitName: string; content: string; }) => { if (file.content !== undefined) { var filename = ts.normalizeSlashes(file.unitName); - filemap[getCanonicalFileName(filename)] = ts.createSourceFile(filename, file.content, options.target, /*version:*/ "0"); + filemap[getCanonicalFileName(filename)] = ts.createSourceFile(filename, file.content, options.target); } }; inputFiles.forEach(register); diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index d3082a17ba2..fe635349ec8 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -111,7 +111,10 @@ module Harness.LanguageService { scriptSnapshot: ts.IScriptSnapshot, version: string, isOpen: boolean): ts.SourceFile { - return ts.createSourceFile(fileName, scriptSnapshot.getText(0, scriptSnapshot.getLength()), compilationSettings.target, version, isOpen); + var sourceFile = ts.createSourceFile(fileName, scriptSnapshot.getText(0, scriptSnapshot.getLength()), compilationSettings.target); + sourceFile.version = version; + sourceFile.isOpen = isOpen; + return sourceFile; } public updateDocument( @@ -264,7 +267,10 @@ module Harness.LanguageService { /** Parse file given its source text */ public parseSourceText(fileName: string, sourceText: ts.IScriptSnapshot): ts.SourceFile { - return ts.createSourceFile(fileName, sourceText.getText(0, sourceText.getLength()), ts.ScriptTarget.Latest, "1", true); + var result = ts.createSourceFile(fileName, sourceText.getText(0, sourceText.getLength()), ts.ScriptTarget.Latest); + result.version = "1"; + result.isOpen = true; + return result; } /** Parse a file on disk given its fileName */ diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index f46f9ae3698..fc841aa3e3c 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -176,7 +176,7 @@ class ProjectRunner extends RunnerBase { else { var text = getSourceFileText(filename); if (text !== undefined) { - sourceFile = ts.createSourceFile(filename, text, languageVersion, /*version:*/ "0"); + sourceFile = ts.createSourceFile(filename, text, languageVersion); } } diff --git a/src/services/services.ts b/src/services/services.ts index 759d2bac2c5..b435c554420 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -59,6 +59,9 @@ module ts { } export interface SourceFile { + isOpen: boolean; + version: string; + getScriptSnapshot(): IScriptSnapshot; getNamedDeclarations(): Declaration[]; update(scriptSnapshot: IScriptSnapshot, version: string, isOpen: boolean, textChangeRange: TextChangeRange): SourceFile; @@ -866,7 +869,9 @@ module ts { } public static createSourceFileObject(filename: string, scriptSnapshot: IScriptSnapshot, languageVersion: ScriptTarget, version: string, isOpen: boolean) { - var newSourceFile = createSourceFile(filename, scriptSnapshot.getText(0, scriptSnapshot.getLength()), languageVersion, version, isOpen); + var newSourceFile = createSourceFile(filename, scriptSnapshot.getText(0, scriptSnapshot.getLength()), languageVersion, /*setParentNodes:*/ true); + newSourceFile.version = version; + newSourceFile.isOpen = isOpen; newSourceFile.scriptSnapshot = scriptSnapshot; return newSourceFile; } @@ -1678,7 +1683,6 @@ module ts { this.host.log("SyntaxTreeCache.Initialize: createSourceFile: " + (new Date().getTime() - start)); var start = new Date().getTime(); - fixupParentReferences(sourceFile); this.host.log("SyntaxTreeCache.Initialize: fixupParentRefs : " + (new Date().getTime() - start)); } else if (this.currentFileVersion !== version) { @@ -1693,7 +1697,6 @@ module ts { this.host.log("SyntaxTreeCache.Initialize: updateSourceFile: " + (new Date().getTime() - start)); var start = new Date().getTime(); - fixupParentReferences(sourceFile); this.host.log("SyntaxTreeCache.Initialize: fixupParentRefs : " + (new Date().getTime() - start)); } @@ -1703,22 +1706,6 @@ module ts { this.currentFilename = filename; this.currentSourceFile = sourceFile; } - - function fixupParentReferences(sourceFile: SourceFile) { - // normally parent references are set during binding. - // however here SourceFile data is used only for syntactic features so running the whole binding process is an overhead. - // walk over the nodes and set parent references - var parent: Node = sourceFile; - function walk(n: Node): void { - n.parent = parent; - - var saveParent = parent; - parent = n; - forEachChild(n, walk); - parent = saveParent; - } - forEachChild(sourceFile, walk); - } } public getCurrentSourceFile(filename: string): SourceFile {