add generateBOM switch

This commit is contained in:
Mohamed Hegazy
2014-08-06 11:32:51 -07:00
parent 63b835a7a9
commit b1335e1795
9 changed files with 37 additions and 20 deletions

View File

@@ -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" },

View File

@@ -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();

View File

@@ -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");
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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,

View File

@@ -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 });
}

View File

@@ -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 => {

View File

@@ -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;
}