From 63b835a7a90661a7c0838319799a11b09206f1c7 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 6 Aug 2014 11:06:19 -0700 Subject: [PATCH 1/6] Remove ByteOrderMark --- src/compiler/parser.ts | 3 +-- src/compiler/tc.ts | 2 +- src/compiler/types.ts | 8 -------- src/harness/fourslash.ts | 6 +++--- src/harness/harness.ts | 4 ++-- src/harness/harnessLanguageService.ts | 10 ++-------- src/harness/projectsRunner.ts | 4 ++-- src/harness/rwcRunner.ts | 2 +- src/services/services.ts | 22 ++++++---------------- src/services/shims.ts | 5 ----- 10 files changed, 18 insertions(+), 48 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 929e676c305..bac23211bc3 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -417,7 +417,7 @@ module ts { nodeIsNestedInLabel(label: Identifier, requireIterationStatement: boolean, stopAtFunctionBoundary: boolean): ControlBlockContext; } - export function createSourceFile(filename: string, sourceText: string, languageVersion: ScriptTarget, byteOrderMark: ByteOrderMark, version: number = 0, isOpen: boolean = false): SourceFile { + export function createSourceFile(filename: string, sourceText: string, languageVersion: ScriptTarget, version: number = 0, isOpen: boolean = false): SourceFile { var file: SourceFile; var scanner: Scanner; var token: SyntaxKind; @@ -3535,7 +3535,6 @@ module ts { file.nodeCount = nodeCount; file.identifierCount = identifierCount; file.version = version; - file.byteOrderMark = byteOrderMark; file.isOpen = isOpen; file.languageVersion = languageVersion; return file; diff --git a/src/compiler/tc.ts b/src/compiler/tc.ts index cbe9bcee6df..e564002d03f 100644 --- a/src/compiler/tc.ts +++ b/src/compiler/tc.ts @@ -135,7 +135,7 @@ module ts { } text = ""; } - return text !== undefined ? createSourceFile(filename, text, languageVersion, ByteOrderMark.None) : undefined; + return text !== undefined ? createSourceFile(filename, text, languageVersion) : undefined; } function writeFile(fileName: string, data: string, onError?: (message: string) => void) { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index e967c58f618..68f546b27ff 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -525,7 +525,6 @@ module ts { nodeCount: number; identifierCount: number; symbolCount: number; - byteOrderMark: ByteOrderMark; isOpen: boolean; version: number; languageVersion: ScriptTarget; @@ -1119,11 +1118,4 @@ module ts { useCaseSensitiveFileNames(): boolean; getNewLine(): string; } - - export enum ByteOrderMark { - None = 0, - Utf8 = 1, - Utf16BigEndian = 2, - Utf16LittleEndian = 3, - } } diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 25cc615c8e0..6cba438e31c 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -1895,12 +1895,12 @@ module FourSlash { var result = ''; var fourslashFilename = 'fourslash.ts'; var tsFn = 'tests/cases/fourslash/' + fourslashFilename; - fourslashSourceFile = fourslashSourceFile || ts.createSourceFile(tsFn, Harness.IO.readFile(tsFn), ts.ScriptTarget.ES5, ts.ByteOrderMark.None, /*version*/ 0, /*isOpen*/ false); - libdtsSourceFile = libdtsSourceFile || ts.createSourceFile('lib.d.ts', Harness.Compiler.libTextMinimal, ts.ScriptTarget.ES3, ts.ByteOrderMark.None, /*version*/ 0, /*isOpen*/ false); + fourslashSourceFile = fourslashSourceFile || ts.createSourceFile(tsFn, Harness.IO.readFile(tsFn), ts.ScriptTarget.ES5, /*version*/ 0, /*isOpen*/ false); + libdtsSourceFile = libdtsSourceFile || ts.createSourceFile('lib.d.ts', Harness.Compiler.libTextMinimal, ts.ScriptTarget.ES3, /*version*/ 0, /*isOpen*/ false); var files: { [filename: string]: ts.SourceFile; } = {}; files[fourslashFilename] = fourslashSourceFile; - files[fileName] = ts.createSourceFile(fileName, content, ts.ScriptTarget.ES5, ts.ByteOrderMark.None, /*version*/ 0, /*isOpen*/ false); + files[fileName] = ts.createSourceFile(fileName, content, ts.ScriptTarget.ES5, /*version*/ 0, /*isOpen*/ false); files['lib.d.ts'] = libdtsSourceFile; var host = Harness.Compiler.createCompilerHost(files, (fn, contents) => result = contents); diff --git a/src/harness/harness.ts b/src/harness/harness.ts index b77514611d5..f90d096f536 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -544,7 +544,7 @@ module Harness { } else { var lib = 'lib.d.ts'; if (fn.substr(fn.length - lib.length) === lib) { - return filemap[fn] = ts.createSourceFile('lib.d.ts', libTextMinimal, languageVersion, ts.ByteOrderMark.None); + return filemap[fn] = ts.createSourceFile('lib.d.ts', libTextMinimal, languageVersion); } // Don't throw here -- the compiler might be looking for a test that actually doesn't exist as part of the TC return null; @@ -720,7 +720,7 @@ module Harness { var filemap: { [name: string]: ts.SourceFile; } = {}; var register = (file: { unitName: string; content: string; }) => { var filename = Path.switchToForwardSlashes(file.unitName); - filemap[filename] = ts.createSourceFile(filename, file.content, options.target, ts.ByteOrderMark.None); + filemap[filename] = ts.createSourceFile(filename, file.content, options.target); }; inputFiles.forEach(register); otherFiles.forEach(register); diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 400cae2abe1..4ca56bb299a 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -7,7 +7,7 @@ module Harness.LanguageService { public editRanges: { length: number; textChangeRange: TypeScript.TextChangeRange; }[] = []; public lineMap: TypeScript.LineMap = null; - constructor(public fileName: string, public content: string, public isOpen = true, public byteOrderMark: ts.ByteOrderMark = ts.ByteOrderMark.None) { + constructor(public fileName: string, public content: string, public isOpen = true) { this.setContent(content); } @@ -132,7 +132,6 @@ module Harness.LanguageService { getScriptSnapshot(fileName: string): TypeScript.IScriptSnapshot { return new ScriptSnapshotShimAdapter(this.shimHost.getScriptSnapshot(fileName));} getScriptVersion(fileName: string): number { return this.shimHost.getScriptVersion(fileName);} getScriptIsOpen(fileName: string): boolean { return this.shimHost.getScriptIsOpen(fileName); } - getScriptByteOrderMark(fileName: string): ts.ByteOrderMark { return this.shimHost.getScriptByteOrderMark(fileName);} getLocalizedDiagnosticMessages(): any { JSON.parse(this.shimHost.getLocalizedDiagnosticMessages());} getCancellationToken(): ts.CancellationToken { return this.shimHost.getCancellationToken(); } } @@ -145,10 +144,9 @@ module Harness.LanguageService { fileName: string, compilationSettings: ts.CompilerOptions, scriptSnapshot: TypeScript.IScriptSnapshot, - byteOrderMark: ts.ByteOrderMark, version: number, isOpen: boolean): ts.SourceFile { - return ts.createSourceFile(fileName, scriptSnapshot.getText(0, scriptSnapshot.getLength()), compilationSettings.target, byteOrderMark, version, isOpen); + return ts.createSourceFile(fileName, scriptSnapshot.getText(0, scriptSnapshot.getLength()), compilationSettings.target, version, isOpen); } public updateDocument( @@ -262,10 +260,6 @@ module Harness.LanguageService { return this.getScriptInfo(fileName).isOpen; } - public getScriptByteOrderMark(fileName: string): ts.ByteOrderMark { - return this.getScriptInfo(fileName).byteOrderMark; - } - public getLocalizedDiagnosticMessages(): string { return JSON.stringify({}); } diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index e6ec6d6f9de..e747def849a 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -139,7 +139,7 @@ class ProjectRunner extends RunnerBase { function getSourceFile(filename: string, languageVersion: ts.ScriptTarget): ts.SourceFile { var sourceFile: ts.SourceFile = undefined; if (filename === 'lib.d.ts') { - sourceFile = ts.createSourceFile('lib.d.ts', Harness.Compiler.libTextMinimal, languageVersion, ts.ByteOrderMark.None); + sourceFile = ts.createSourceFile('lib.d.ts', Harness.Compiler.libTextMinimal, languageVersion); } else { assert.isTrue(!ts.filter(readInputFiles, sourceFile => sourceFile.filename == filename).length, "Compiler trying to read same file again: " + filename); @@ -154,7 +154,7 @@ class ProjectRunner extends RunnerBase { } if (text !== undefined) { - sourceFile = ts.createSourceFile(filename, text, languageVersion, ts.ByteOrderMark.None); + sourceFile = ts.createSourceFile(filename, text, languageVersion); } } diff --git a/src/harness/rwcRunner.ts b/src/harness/rwcRunner.ts index 98006cd6bce..576b06e3435 100644 --- a/src/harness/rwcRunner.ts +++ b/src/harness/rwcRunner.ts @@ -107,7 +107,7 @@ module RWC { catch (e) { // Leave fileContents undefined; } - return ts.createSourceFile(fileName, fileContents, languageVersion, ts.ByteOrderMark.None); + return ts.createSourceFile(fileName, fileContents, languageVersion); }, getDefaultLibFilename: () => libPath, writeFile: (fn, contents) => emitterIOHost.writeFile(fn, contents, false), diff --git a/src/services/services.ts b/src/services/services.ts index aaac93c9eef..893a7da4f54 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -320,7 +320,6 @@ module ts { public identifierCount: number; public symbolCount: number; public statements: NodeArray; - public byteOrderMark: ByteOrderMark; public version: number; public isOpen: boolean; public languageVersion: ScriptTarget; @@ -417,11 +416,11 @@ module ts { ? TypeScript.Parser.parse(this.filename, text, this.languageVersion, TypeScript.isDTSFile(this.filename)) : TypeScript.IncrementalParser.parse(oldSyntaxTree, textChangeRange, text); - return SourceFileObject.createSourceFileObject(this.languageVersion, this.filename, scriptSnapshot, this.byteOrderMark, version, isOpen, newSyntaxTree); + return SourceFileObject.createSourceFileObject(this.languageVersion, this.filename, scriptSnapshot, version, isOpen, newSyntaxTree); } - public static createSourceFileObject(languageVersion: ScriptTarget, filename: string, scriptSnapshot: TypeScript.IScriptSnapshot, byteOrderMark: ByteOrderMark, version: number, isOpen: boolean, syntaxTree: TypeScript.SyntaxTree) { - var newSoruceFile = createSourceFile(filename, scriptSnapshot.getText(0, scriptSnapshot.getLength()), languageVersion, byteOrderMark, version, isOpen); + public static createSourceFileObject(languageVersion: ScriptTarget, filename: string, scriptSnapshot: TypeScript.IScriptSnapshot, version: number, isOpen: boolean, syntaxTree: TypeScript.SyntaxTree) { + var newSoruceFile = createSourceFile(filename, scriptSnapshot.getText(0, scriptSnapshot.getLength()), languageVersion, version, isOpen); newSoruceFile.scriptSnapshot = scriptSnapshot; newSoruceFile.syntaxTree = syntaxTree; return newSoruceFile; @@ -445,7 +444,6 @@ module ts { getScriptFileNames(): string[]; getScriptVersion(fileName: string): number; getScriptIsOpen(fileName: string): boolean; - getScriptByteOrderMark(fileName: string): ByteOrderMark; getScriptSnapshot(fileName: string): TypeScript.IScriptSnapshot; getLocalizedDiagnosticMessages(): any; getCancellationToken(): CancellationToken; @@ -694,7 +692,6 @@ module ts { filename: string, compilationSettings: CompilerOptions, scriptSnapshot: TypeScript.IScriptSnapshot, - byteOrderMark: ByteOrderMark, version: number, isOpen: boolean, referencedFiles: string[]): SourceFile; @@ -824,7 +821,6 @@ module ts { filename: string; version: number; isOpen: boolean; - byteOrderMark: ByteOrderMark; sourceText?: TypeScript.IScriptSnapshot; } @@ -893,8 +889,7 @@ module ts { this.filenameToEntry[TypeScript.switchToForwardSlashes(filename)] = { filename: filename, version: host.getScriptVersion(filename), - isOpen: host.getScriptIsOpen(filename), - byteOrderMark: host.getScriptByteOrderMark(filename) + isOpen: host.getScriptIsOpen(filename) }; } @@ -941,10 +936,6 @@ module ts { return this.getEntry(filename).isOpen; } - public getByteOrderMark(filename: string): ByteOrderMark { - return this.getEntry(filename).byteOrderMark; - } - public getScriptSnapshot(filename: string): TypeScript.IScriptSnapshot { var file = this.getEntry(filename); if (!file.sourceText) { @@ -1143,14 +1134,13 @@ module ts { filename: string, compilationSettings: CompilerOptions, scriptSnapshot: TypeScript.IScriptSnapshot, - byteOrderMark: ByteOrderMark, version: number, isOpen: boolean): SourceFile { var bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/ true); var entry = lookUp(bucket, filename); if (!entry) { - var sourceFile = createSourceFile(filename, scriptSnapshot.getText(0, scriptSnapshot.getLength()), compilationSettings.target, byteOrderMark, version, isOpen); + var sourceFile = createSourceFile(filename, scriptSnapshot.getText(0, scriptSnapshot.getLength()), compilationSettings.target, version, isOpen); bucket[filename] = entry = { sourceFile: sourceFile, @@ -1360,7 +1350,7 @@ module ts { sourceFile = documentRegistry.updateDocument(sourceFile, filename, compilationSettings, scriptSnapshot, version, isOpen, textChangeRange); } else { - sourceFile = documentRegistry.acquireDocument(filename, compilationSettings, scriptSnapshot, hostCache.getByteOrderMark(filename), version, isOpen, []); + sourceFile = documentRegistry.acquireDocument(filename, compilationSettings, scriptSnapshot, version, isOpen, []); } // Remeber the new sourceFile diff --git a/src/services/shims.ts b/src/services/shims.ts index f02b9b62088..5d506db9632 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -50,7 +50,6 @@ module ts { getScriptFileNames(): string; getScriptVersion(fileName: string): number; getScriptIsOpen(fileName: string): boolean; - getScriptByteOrderMark(fileName: string): number; getScriptSnapshot(fileName: string): ScriptSnapshotShim; getLocalizedDiagnosticMessages(): string; getCancellationToken(): CancellationToken; @@ -355,10 +354,6 @@ module ts { return this.shimHost.getScriptIsOpen(fileName); } - public getScriptByteOrderMark(fileName: string): ByteOrderMark { - return this.shimHost.getScriptByteOrderMark(fileName); - } - public getLocalizedDiagnosticMessages(): any { var diagnosticMessagesJson = this.shimHost.getLocalizedDiagnosticMessages(); if (diagnosticMessagesJson == null || diagnosticMessagesJson == "") { From b1335e17950810f995a6341776bd8e085306fc95 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 6 Aug 2014 11:32:51 -0700 Subject: [PATCH 2/6] add generateBOM switch --- src/compiler/commandLineParser.ts | 1 + src/compiler/emitter.ts | 18 +++++++++--------- src/compiler/sys.ts | 20 ++++++++++++++++---- src/compiler/tc.ts | 4 ++-- src/compiler/types.ts | 3 ++- src/harness/harness.ts | 2 +- src/harness/projectsRunner.ts | 4 ++-- src/services/services.ts | 2 +- src/services/shims.ts | 3 +++ 9 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index 00aa5efcee4..7248d44d754 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -19,6 +19,7 @@ module ts { { name: "codepage", type: "number" }, { name: "declaration", type: "boolean" }, { name: "diagnostics", type: "boolean" }, + { name: "generateBOM", type: "boolean" }, { name: "help", type: "boolean" }, { name: "locale", type: "string" }, { name: "mapRoot", type: "string" }, diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index b867a555ef0..1ad9e560878 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -156,8 +156,8 @@ module ts { return text.substring(skipTrivia(text, node.pos), node.end); } - function writeFile(filename: string, data: string) { - compilerHost.writeFile(filename, data, hostErrorMessage => { + function writeFile(filename: string, data: string, writeByteOrderMark: boolean) { + compilerHost.writeFile(filename, data, writeByteOrderMark, hostErrorMessage => { diagnostics.push(createCompilerDiagnostic(Diagnostics.Could_not_write_file_0_Colon_1, filename, hostErrorMessage)); }); } @@ -423,7 +423,7 @@ module ts { sourceMapNameIndices.pop(); }; - function writeJavaScriptAndSourceMapFile(emitOutput: string) { + function writeJavaScriptAndSourceMapFile(emitOutput: string, writeByteOrderMark: boolean) { // Write source map file encodeLastRecordedSourceMapSpan(); writeFile(sourceMapData.sourceMapFilePath, JSON.stringify({ @@ -433,11 +433,11 @@ module ts { sources: sourceMapData.sourceMapSources, names: sourceMapData.sourceMapNames, mappings: sourceMapData.sourceMapMappings - })); + }), /*writeByteOrderMark*/ false); sourceMapDataList.push(sourceMapData); // Write sourcemap url to the js file and write the js file - writeJavaScriptFile(emitOutput + "//# sourceMappingURL=" + sourceMapData.jsSourceMappingURL); + writeJavaScriptFile(emitOutput + "//# sourceMappingURL=" + sourceMapData.jsSourceMappingURL, writeByteOrderMark); } // Initialize source map data @@ -510,8 +510,8 @@ module ts { scopeEmitEnd = recordScopeNameEnd; } - function writeJavaScriptFile(emitOutput: string) { - writeFile(jsFilePath, emitOutput); + function writeJavaScriptFile(emitOutput: string, writeByteOrderMark: boolean) { + writeFile(jsFilePath, emitOutput, writeByteOrderMark); } function emitTokenText(tokenKind: SyntaxKind, startPos: number, emitFn?: () => void) { @@ -1851,7 +1851,7 @@ module ts { } writeLine(); - writeEmittedFiles(writer.getText()); + writeEmittedFiles(writer.getText(), /*writeByteOrderMark*/ compilerOptions.generateBOM); } function emitDeclarations(jsFilePath: string, root?: SourceFile) { @@ -2299,7 +2299,7 @@ module ts { }); } - writeFile(getModuleNameFromFilename(jsFilePath) + ".d.ts", referencePathsOutput + writer.getText()); + writeFile(getModuleNameFromFilename(jsFilePath) + ".d.ts", referencePathsOutput + writer.getText(), /*writeByteOrderMark*/ compilerOptions.generateBOM); } var shouldEmitDeclarations = resolver.shouldEmitDeclarations(); diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 564f22b9f08..19902f821a7 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -6,7 +6,7 @@ interface System { useCaseSensitiveFileNames: boolean; write(s: string): void; readFile(fileName: string, encoding?: string): string; - writeFile(fileName: string, data: string): void; + writeFile(fileName: string, data: string, writeByteOrderMark?: boolean): void; watchFile?(fileName: string, callback: (fileName: string) => void): FileWatcher; resolvePath(path: string): string; fileExists(path: string): boolean; @@ -75,14 +75,21 @@ var sys: System = (function () { } } - function writeFile(fileName: string, data: string): void { + function writeFile(fileName: string, data: string, writeByteOrderMark?: boolean): void { fileStream.Open(); binaryStream.Open(); try { // Write characters in UTF-8 encoding fileStream.Charset = "utf-8"; fileStream.WriteText(data); - // Skip byte order mark and copy remaining data to binary stream + // If we don't want the BOM, then skip it by setting the starting location to 3 (size of BOM). + // If not, start from position 0, as the BOM will be added automatically when charset==utf8. + if (writeByteOrderMark) { + fileStream.Position = 0; + } + else { + fileStream.Position = 3; + } fileStream.Position = 3; fileStream.CopyTo(binaryStream); binaryStream.SaveToFile(fileName, 2 /*overwrite*/); @@ -175,7 +182,12 @@ var sys: System = (function () { return buffer.toString("utf8"); } - function writeFile(fileName: string, data: string): void { + function writeFile(fileName: string, data: string, writeByteOrderMark?: boolean): void { + // If a BOM is required, emit one + if (writeByteOrderMark) { + data = '\uFEFF' + data; + } + _fs.writeFileSync(fileName, data, "utf8"); } diff --git a/src/compiler/tc.ts b/src/compiler/tc.ts index e564002d03f..37812fd3256 100644 --- a/src/compiler/tc.ts +++ b/src/compiler/tc.ts @@ -138,7 +138,7 @@ module ts { return text !== undefined ? createSourceFile(filename, text, languageVersion) : undefined; } - function writeFile(fileName: string, data: string, onError?: (message: string) => void) { + function writeFile(fileName: string, data: string, writeByteOrderMark: boolean, onError?: (message: string) => void) { function directoryExists(directoryPath: string): boolean { if (hasProperty(existingDirectories, directoryPath)) { @@ -161,7 +161,7 @@ module ts { try { ensureDirectoriesExist(getDirectoryPath(normalizePath(fileName))); - sys.writeFile(fileName, data); + sys.writeFile(fileName, data, writeByteOrderMark); } catch (e) { if (onError) onError(e.message); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 68f546b27ff..e19b3b57ac4 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -924,6 +924,7 @@ module ts { codepage?: number; declaration?: boolean; diagnostics?: boolean; + generateBOM?: boolean; help?: boolean; locale?: string; mapRoot?: string; @@ -1112,7 +1113,7 @@ module ts { getSourceFile(filename: string, languageVersion: ScriptTarget, onError?: (message: string) => void): SourceFile; getDefaultLibFilename(): string; getCancellationToken? (): CancellationToken; - writeFile(filename: string, data: string, onError?: (message: string) => void): void; + writeFile(filename: string, data: string, writeByteOrderMark: boolean, onError?: (message: string) => void): void; getCurrentDirectory(): string; getCanonicalFileName(fileName: string): string; useCaseSensitiveFileNames(): boolean; diff --git a/src/harness/harness.ts b/src/harness/harness.ts index f90d096f536..9a57aa9244e 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -534,7 +534,7 @@ module Harness { export var libText = IO.readFile(libFolder + "lib.d.ts"); export var libTextMinimal = IO.readFile('bin/lib.core.d.ts'); - export function createCompilerHost(filemap: { [filename: string]: ts.SourceFile; }, writeFile: (fn: string, contents: string) => void): ts.CompilerHost { + export function createCompilerHost(filemap: { [filename: string]: ts.SourceFile; }, writeFile: (fn: string, contents: string, writeByteOrderMark:boolean) => void): ts.CompilerHost { return { getCurrentDirectory: sys.getCurrentDirectory, getCancellationToken: (): any => undefined, diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index e747def849a..f87f1b3822b 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -164,7 +164,7 @@ class ProjectRunner extends RunnerBase { return sourceFile; } - function writeFile(filename: string, data: string) { + function writeFile(filename: string, data: string, writeByteOrderMark: boolean) { var diskFileName = ts.isRootedDiskPath(filename) ? filename : ts.normalizeSlashes(testCase.projectRoot) + "/" + ts.normalizeSlashes(filename); @@ -207,7 +207,7 @@ class ProjectRunner extends RunnerBase { } } ensureDirectoryStructure(ts.getDirectoryPath(ts.normalizePath(outputFilePath))); - sys.writeFile(outputFilePath, data); + sys.writeFile(outputFilePath, data, writeByteOrderMark); outputFiles.push({ emittedFileName: filename, code: data, fileName: diskRelativeName }); } diff --git a/src/services/services.ts b/src/services/services.ts index 893a7da4f54..be05a48cee9 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1245,7 +1245,7 @@ module ts { getDefaultLibFilename: (): string => { throw Error("TOD:: getDefaultLibfilename"); }, - writeFile: (filename, data) => { + writeFile: (filename, data, writeByteOrderMark) => { throw Error("TODO: write file"); }, getCurrentDirectory: (): string => { diff --git a/src/services/shims.ts b/src/services/shims.ts index 5d506db9632..2e9a8349037 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -169,6 +169,7 @@ module ts { useCaseSensitiveFileResolution?: boolean; gatherDiagnostics?: boolean; codepage?: number; + generateBom?: boolean; } function languageVersionToScriptTarget(languageVersion: LanguageVersion): ScriptTarget { @@ -231,6 +232,7 @@ module ts { options.declaration = settings.generateDeclarationFiles; //options.useCaseSensitiveFileResolution = settings.useCaseSensitiveFileResolution; options.codepage = settings.codepage; + options.generateBOM = settings.generateBom; return options; } @@ -251,6 +253,7 @@ module ts { settings.generateDeclarationFiles = options.declaration; // settings.useCaseSensitiveFileResolution = options.useCaseSensitiveFileResolution; settings.codepage = options.codepage; + settings.generateBom = options.generateBOM; return settings; } From 35c1577ff5be1fc5dd837971dfcbb6f567a5372b Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 6 Aug 2014 12:05:01 -0700 Subject: [PATCH 3/6] Add tests for generateBOM switch --- src/harness/compilerRunner.ts | 7 +++++ src/harness/harness.ts | 23 +++++++-------- src/harness/projectsRunner.ts | 6 ++-- tests/baselines/reference/generateBOM.js | 11 ++++++++ tests/baselines/reference/generateBOM.js.map | 2 ++ .../reference/generateBOM.sourcemap.txt | 28 +++++++++++++++++++ tests/cases/compiler/generateBOM.ts | 6 ++++ 7 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 tests/baselines/reference/generateBOM.js create mode 100644 tests/baselines/reference/generateBOM.js.map create mode 100644 tests/baselines/reference/generateBOM.sourcemap.txt create mode 100644 tests/cases/compiler/generateBOM.ts diff --git a/src/harness/compilerRunner.ts b/src/harness/compilerRunner.ts index c4bd2f9719c..e237b58785c 100644 --- a/src/harness/compilerRunner.ts +++ b/src/harness/compilerRunner.ts @@ -118,6 +118,10 @@ class CompilerBaselineRunner extends RunnerBase { } }); + function getByteOrderMarkText(file: Harness.Compiler.GeneratedFile): string { + return file.writeByteOrderMark ? String.fromCharCode(ts.CharacterCodes.byteOrderMark) : ''; + } + function getErrorBaseline(toBeCompiled: { unitName: string; content: string }[], otherFiles: { unitName: string; content: string }[], result: Harness.Compiler.CompilerResult @@ -282,6 +286,7 @@ class CompilerBaselineRunner extends RunnerBase { var jsCode = ''; for (var i = 0; i < result.files.length; i++) { jsCode += '//// [' + Harness.Path.getFileName(result.files[i].fileName) + ']\r\n'; + jsCode += getByteOrderMarkText(result.files[i]); jsCode += result.files[i].code; // Re-enable this if we want to do another comparison of old vs new compiler baselines // jsCode += SyntacticCleaner.clean(result.files[i].code); @@ -291,6 +296,7 @@ class CompilerBaselineRunner extends RunnerBase { jsCode += '\r\n\r\n'; for (var i = 0; i < result.files.length; i++) { jsCode += '//// [' + Harness.Path.getFileName(result.declFilesCode[i].fileName) + ']\r\n'; + jsCode += getByteOrderMarkText(result.declFilesCode[i]); jsCode += result.declFilesCode[i].code; } } @@ -320,6 +326,7 @@ class CompilerBaselineRunner extends RunnerBase { var sourceMapCode = ''; for (var i = 0; i < result.sourceMaps.length; i++) { sourceMapCode += '//// [' + Harness.Path.getFileName(result.sourceMaps[i].fileName) + ']\r\n'; + sourceMapCode += getByteOrderMarkText(result.sourceMaps[i]); sourceMapCode += result.sourceMaps[i].code; } diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 9a57aa9244e..04796ef6f36 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -712,6 +712,10 @@ module Harness { // Not supported yet break; + case 'generatebom': + options.generateBOM = !!setting.value; + break; + default: throw new Error('Unsupported compiler setting ' + setting.flag); } @@ -725,13 +729,10 @@ module Harness { inputFiles.forEach(register); otherFiles.forEach(register); - var fileOutputs: { - fileName: string; - file: string; - }[] = []; + var fileOutputs: GeneratedFile[] = []; var programFiles = inputFiles.map(file => file.unitName); - var program = ts.createProgram(programFiles, options, createCompilerHost(filemap, (fn, contents) => fileOutputs.push({ fileName: fn, file: contents }))); + var program = ts.createProgram(programFiles, options, createCompilerHost(filemap, (fn, contents, writeByteOrderMark) => fileOutputs.push({ fileName: fn, code: contents, writeByteOrderMark: writeByteOrderMark }))); var hadParseErrors = program.getDiagnostics().length > 0; @@ -810,6 +811,7 @@ module Harness { export interface GeneratedFile { fileName: string; code: string; + writeByteOrderMark: boolean; } function stringEndsWith(str: string, end: string) { @@ -837,19 +839,18 @@ module Harness { public sourceMapRecord: string; /** @param fileResults an array of strings for the fileName and an ITextWriter with its code */ - constructor(fileResults: { fileName: string; file: string; }[], errors: MinimalDiagnostic[], sourceMapRecordLines: string[]) { + constructor(fileResults: GeneratedFile[], errors: MinimalDiagnostic[], sourceMapRecordLines: string[]) { var lines: string[] = []; fileResults.forEach(emittedFile => { - var fileObj = { fileName: emittedFile.fileName, code: emittedFile.file }; if (isDTS(emittedFile.fileName)) { // .d.ts file, add to declFiles emit - this.declFilesCode.push(fileObj); + this.declFilesCode.push(emittedFile); } else if (isJS(emittedFile.fileName)) { // .js file, add to files - this.files.push(fileObj); + this.files.push(emittedFile); } else if (isJSMap(emittedFile.fileName)) { - this.sourceMaps.push(fileObj); + this.sourceMaps.push(emittedFile); } else { throw new Error('Unrecognized file extension for file ' + emittedFile.fileName); } @@ -896,7 +897,7 @@ module Harness { var optionRegex = /^[\/]{2}\s*@(\w+)\s*:\s*(\S*)/gm; // multiple matches on multiple lines // List of allowed metadata names - var fileMetadataNames = ["filename", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outDir", "noimplicitany", "noresolve", "newline", "newlines"]; + var fileMetadataNames = ["filename", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outDir", "noimplicitany", "noresolve", "newline", "newlines", "generatebom"]; function extractCompilerSettings(content: string): CompilerSetting[] { diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index f87f1b3822b..5ddcf57804c 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -25,10 +25,8 @@ interface ProjectRunnerTestCaseResolutionInfo extends ProjectRunnerTestCase { emittedFiles: string[]; // List of files that wre emitted by the compiler } -interface BatchCompileProjectTestCaseEmittedFile { +interface BatchCompileProjectTestCaseEmittedFile extends Harness.Compiler.GeneratedFile { emittedFileName: string; - code: string; - fileName: string; } interface BatchCompileProjectTestCaseResult { @@ -209,7 +207,7 @@ class ProjectRunner extends RunnerBase { ensureDirectoryStructure(ts.getDirectoryPath(ts.normalizePath(outputFilePath))); sys.writeFile(outputFilePath, data, writeByteOrderMark); - outputFiles.push({ emittedFileName: filename, code: data, fileName: diskRelativeName }); + outputFiles.push({ emittedFileName: filename, code: data, fileName: diskRelativeName, writeByteOrderMark: writeByteOrderMark }); } function getCurrentDirectory() { diff --git a/tests/baselines/reference/generateBOM.js b/tests/baselines/reference/generateBOM.js new file mode 100644 index 00000000000..468aafd7bcd --- /dev/null +++ b/tests/baselines/reference/generateBOM.js @@ -0,0 +1,11 @@ +//// [generateBOM.ts] + +// JS and d.ts output should have a BOM but not the sourcemap +var x; + +//// [generateBOM.js] +var x; +//# sourceMappingURL=generateBOM.js.map + +//// [generateBOM.d.ts] +declare var x: any; diff --git a/tests/baselines/reference/generateBOM.js.map b/tests/baselines/reference/generateBOM.js.map new file mode 100644 index 00000000000..60734dfee05 --- /dev/null +++ b/tests/baselines/reference/generateBOM.js.map @@ -0,0 +1,2 @@ +//// [generateBOM.js.map] +{"version":3,"file":"generateBOM.js","sourceRoot":"","sources":["generateBOM.ts"],"names":[],"mappings":"AAEA,IAAI,CAAC,CAAC"} \ No newline at end of file diff --git a/tests/baselines/reference/generateBOM.sourcemap.txt b/tests/baselines/reference/generateBOM.sourcemap.txt new file mode 100644 index 00000000000..86161151626 --- /dev/null +++ b/tests/baselines/reference/generateBOM.sourcemap.txt @@ -0,0 +1,28 @@ +=================================================================== +JsFile: generateBOM.js +mapUrl: generateBOM.js.map +sourceRoot: +sources: generateBOM.ts +=================================================================== +------------------------------------------------------------------- +emittedFile:tests/cases/compiler/generateBOM.js +sourceFile:generateBOM.ts +------------------------------------------------------------------- +>>>var x; +1 > +2 >^^^^ +3 > ^ +4 > ^ +5 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-> +1 > + >// JS and d.ts output should have a BOM but not the sourcemap + > +2 >var +3 > x +4 > ; +1 >Emitted(1, 1) Source(3, 1) + SourceIndex(0) +2 >Emitted(1, 5) Source(3, 5) + SourceIndex(0) +3 >Emitted(1, 6) Source(3, 6) + SourceIndex(0) +4 >Emitted(1, 7) Source(3, 7) + SourceIndex(0) +--- +>>>//# sourceMappingURL=generateBOM.js.map \ No newline at end of file diff --git a/tests/cases/compiler/generateBOM.ts b/tests/cases/compiler/generateBOM.ts new file mode 100644 index 00000000000..006a88dabe7 --- /dev/null +++ b/tests/cases/compiler/generateBOM.ts @@ -0,0 +1,6 @@ +//@generateBOM: true +//@declaration: true +//@sourcemap: true + +// JS and d.ts output should have a BOM but not the sourcemap +var x; \ No newline at end of file From a4a773a35299dcbaa884b1b8ab0fdc76aa13d2d1 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 6 Aug 2014 12:36:39 -0700 Subject: [PATCH 4/6] make the BOM visible in the test output --- src/harness/compilerRunner.ts | 2 +- tests/baselines/reference/generateBOM.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/harness/compilerRunner.ts b/src/harness/compilerRunner.ts index e237b58785c..e08981142e0 100644 --- a/src/harness/compilerRunner.ts +++ b/src/harness/compilerRunner.ts @@ -119,7 +119,7 @@ class CompilerBaselineRunner extends RunnerBase { }); function getByteOrderMarkText(file: Harness.Compiler.GeneratedFile): string { - return file.writeByteOrderMark ? String.fromCharCode(ts.CharacterCodes.byteOrderMark) : ''; + return file.writeByteOrderMark ? "\u00EF\u00BB\u00BF" : ""; } function getErrorBaseline(toBeCompiled: { unitName: string; content: string }[], diff --git a/tests/baselines/reference/generateBOM.js b/tests/baselines/reference/generateBOM.js index 468aafd7bcd..dec1ae55601 100644 --- a/tests/baselines/reference/generateBOM.js +++ b/tests/baselines/reference/generateBOM.js @@ -4,8 +4,8 @@ var x; //// [generateBOM.js] -var x; +var x; //# sourceMappingURL=generateBOM.js.map //// [generateBOM.d.ts] -declare var x: any; +declare var x: any; From 9222711ace7d15d6dc12c19b1a3c2a990b544a1f Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 6 Aug 2014 14:24:47 -0700 Subject: [PATCH 5/6] change name of the flag to emitBOM --- src/compiler/commandLineParser.ts | 2 +- src/compiler/emitter.ts | 4 ++-- src/compiler/sys.ts | 1 - src/compiler/types.ts | 2 +- src/harness/harness.ts | 6 +++--- src/services/shims.ts | 6 +++--- tests/cases/compiler/generateBOM.ts | 2 +- 7 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index 326b67817a9..da08aec616f 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -24,7 +24,7 @@ module ts { type: "boolean", }, { - name: "generateBOM", + name: "emitBOM", type: "boolean" }, { diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index eaaca3e164f..8c62617f7f6 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -1854,7 +1854,7 @@ module ts { } writeLine(); - writeEmittedFiles(writer.getText(), /*writeByteOrderMark*/ compilerOptions.generateBOM); + writeEmittedFiles(writer.getText(), /*writeByteOrderMark*/ compilerOptions.emitBOM); } function emitDeclarations(jsFilePath: string, root?: SourceFile) { @@ -2448,7 +2448,7 @@ module ts { // TODO(shkamat): Should we not write any declaration file if any of them can produce error, // or should we just not write this file like we are doing now if (!reportedDeclarationError) { - writeFile(getModuleNameFromFilename(jsFilePath) + ".d.ts", referencePathsOutput + writer.getText(), compilerOptions.generateBOM); + writeFile(getModuleNameFromFilename(jsFilePath) + ".d.ts", referencePathsOutput + writer.getText(), compilerOptions.emitBOM); } } diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 19902f821a7..e215979d2dc 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -90,7 +90,6 @@ var sys: System = (function () { else { fileStream.Position = 3; } - fileStream.Position = 3; fileStream.CopyTo(binaryStream); binaryStream.SaveToFile(fileName, 2 /*overwrite*/); } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 44b9e21fc23..2c9284052d5 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -939,7 +939,7 @@ module ts { codepage?: number; declaration?: boolean; diagnostics?: boolean; - generateBOM?: boolean; + emitBOM?: boolean; help?: boolean; locale?: string; mapRoot?: string; diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 497a4010b91..7abfbd4f196 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -712,8 +712,8 @@ module Harness { // Not supported yet break; - case 'generatebom': - options.generateBOM = !!setting.value; + case 'emitbom': + options.emitBOM = !!setting.value; break; default: @@ -897,7 +897,7 @@ module Harness { var optionRegex = /^[\/]{2}\s*@(\w+)\s*:\s*(\S*)/gm; // multiple matches on multiple lines // List of allowed metadata names - var fileMetadataNames = ["filename", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outDir", "noimplicitany", "noresolve", "newline", "newlines", "generatebom"]; + var fileMetadataNames = ["filename", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outDir", "noimplicitany", "noresolve", "newline", "newlines", "emitbom"]; function extractCompilerSettings(content: string): CompilerSetting[] { diff --git a/src/services/shims.ts b/src/services/shims.ts index 2e9a8349037..891b9e1d913 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -169,7 +169,7 @@ module ts { useCaseSensitiveFileResolution?: boolean; gatherDiagnostics?: boolean; codepage?: number; - generateBom?: boolean; + emitBOM?: boolean; } function languageVersionToScriptTarget(languageVersion: LanguageVersion): ScriptTarget { @@ -232,7 +232,7 @@ module ts { options.declaration = settings.generateDeclarationFiles; //options.useCaseSensitiveFileResolution = settings.useCaseSensitiveFileResolution; options.codepage = settings.codepage; - options.generateBOM = settings.generateBom; + options.emitBOM = settings.emitBOM; return options; } @@ -253,7 +253,7 @@ module ts { settings.generateDeclarationFiles = options.declaration; // settings.useCaseSensitiveFileResolution = options.useCaseSensitiveFileResolution; settings.codepage = options.codepage; - settings.generateBom = options.generateBOM; + settings.emitBOM = options.emitBOM; return settings; } diff --git a/tests/cases/compiler/generateBOM.ts b/tests/cases/compiler/generateBOM.ts index 006a88dabe7..f503cd4de7b 100644 --- a/tests/cases/compiler/generateBOM.ts +++ b/tests/cases/compiler/generateBOM.ts @@ -1,4 +1,4 @@ -//@generateBOM: true +//@emitBOM: true //@declaration: true //@sourcemap: true From 3295cdaa19353d2cd339ad802902cd4ed8a3ca6a Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 6 Aug 2014 14:33:06 -0700 Subject: [PATCH 6/6] rename test --- tests/baselines/reference/emitBOM.js | 11 +++++++++++ tests/baselines/reference/emitBOM.js.map | 2 ++ ...rateBOM.sourcemap.txt => emitBOM.sourcemap.txt} | 14 +++++++------- tests/baselines/reference/generateBOM.js | 11 ----------- tests/baselines/reference/generateBOM.js.map | 2 -- .../cases/compiler/{generateBOM.ts => emitBOM.ts} | 0 6 files changed, 20 insertions(+), 20 deletions(-) create mode 100644 tests/baselines/reference/emitBOM.js create mode 100644 tests/baselines/reference/emitBOM.js.map rename tests/baselines/reference/{generateBOM.sourcemap.txt => emitBOM.sourcemap.txt} (70%) delete mode 100644 tests/baselines/reference/generateBOM.js delete mode 100644 tests/baselines/reference/generateBOM.js.map rename tests/cases/compiler/{generateBOM.ts => emitBOM.ts} (100%) diff --git a/tests/baselines/reference/emitBOM.js b/tests/baselines/reference/emitBOM.js new file mode 100644 index 00000000000..c1616f6386d --- /dev/null +++ b/tests/baselines/reference/emitBOM.js @@ -0,0 +1,11 @@ +//// [emitBOM.ts] + +// JS and d.ts output should have a BOM but not the sourcemap +var x; + +//// [emitBOM.js] +var x; +//# sourceMappingURL=emitBOM.js.map + +//// [emitBOM.d.ts] +declare var x: any; diff --git a/tests/baselines/reference/emitBOM.js.map b/tests/baselines/reference/emitBOM.js.map new file mode 100644 index 00000000000..46a584bf79d --- /dev/null +++ b/tests/baselines/reference/emitBOM.js.map @@ -0,0 +1,2 @@ +//// [emitBOM.js.map] +{"version":3,"file":"emitBOM.js","sourceRoot":"","sources":["emitBOM.ts"],"names":[],"mappings":"AAEA,IAAI,CAAC,CAAC"} \ No newline at end of file diff --git a/tests/baselines/reference/generateBOM.sourcemap.txt b/tests/baselines/reference/emitBOM.sourcemap.txt similarity index 70% rename from tests/baselines/reference/generateBOM.sourcemap.txt rename to tests/baselines/reference/emitBOM.sourcemap.txt index 86161151626..19dd3247a7b 100644 --- a/tests/baselines/reference/generateBOM.sourcemap.txt +++ b/tests/baselines/reference/emitBOM.sourcemap.txt @@ -1,19 +1,19 @@ =================================================================== -JsFile: generateBOM.js -mapUrl: generateBOM.js.map +JsFile: emitBOM.js +mapUrl: emitBOM.js.map sourceRoot: -sources: generateBOM.ts +sources: emitBOM.ts =================================================================== ------------------------------------------------------------------- -emittedFile:tests/cases/compiler/generateBOM.js -sourceFile:generateBOM.ts +emittedFile:tests/cases/compiler/emitBOM.js +sourceFile:emitBOM.ts ------------------------------------------------------------------- >>>var x; 1 > 2 >^^^^ 3 > ^ 4 > ^ -5 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-> +5 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^-> 1 > >// JS and d.ts output should have a BOM but not the sourcemap > @@ -25,4 +25,4 @@ sourceFile:generateBOM.ts 3 >Emitted(1, 6) Source(3, 6) + SourceIndex(0) 4 >Emitted(1, 7) Source(3, 7) + SourceIndex(0) --- ->>>//# sourceMappingURL=generateBOM.js.map \ No newline at end of file +>>>//# sourceMappingURL=emitBOM.js.map \ No newline at end of file diff --git a/tests/baselines/reference/generateBOM.js b/tests/baselines/reference/generateBOM.js deleted file mode 100644 index dec1ae55601..00000000000 --- a/tests/baselines/reference/generateBOM.js +++ /dev/null @@ -1,11 +0,0 @@ -//// [generateBOM.ts] - -// JS and d.ts output should have a BOM but not the sourcemap -var x; - -//// [generateBOM.js] -var x; -//# sourceMappingURL=generateBOM.js.map - -//// [generateBOM.d.ts] -declare var x: any; diff --git a/tests/baselines/reference/generateBOM.js.map b/tests/baselines/reference/generateBOM.js.map deleted file mode 100644 index 60734dfee05..00000000000 --- a/tests/baselines/reference/generateBOM.js.map +++ /dev/null @@ -1,2 +0,0 @@ -//// [generateBOM.js.map] -{"version":3,"file":"generateBOM.js","sourceRoot":"","sources":["generateBOM.ts"],"names":[],"mappings":"AAEA,IAAI,CAAC,CAAC"} \ No newline at end of file diff --git a/tests/cases/compiler/generateBOM.ts b/tests/cases/compiler/emitBOM.ts similarity index 100% rename from tests/cases/compiler/generateBOM.ts rename to tests/cases/compiler/emitBOM.ts