From bbc9d65320f78085fd584a2876ac5ae49f9d844b Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Thu, 20 Jul 2017 14:07:13 -0700 Subject: [PATCH 1/2] processDiagnosticMessages: Simplify check for uniqueness of names --- scripts/processDiagnosticMessages.ts | 130 ++++----------------------- 1 file changed, 17 insertions(+), 113 deletions(-) diff --git a/scripts/processDiagnosticMessages.ts b/scripts/processDiagnosticMessages.ts index db7a9e0f1f267..5409838b20aa8 100644 --- a/scripts/processDiagnosticMessages.ts +++ b/scripts/processDiagnosticMessages.ts @@ -30,14 +30,21 @@ function main(): void { var diagnosticMessages: InputDiagnosticMessageTable = JSON.parse(inputStr); - var names = Utilities.getObjectKeys(diagnosticMessages); - var nameMap = buildUniqueNameMap(names); + var names = Object.keys(diagnosticMessages); + // Check that there are no duplicates. + const seenNames = ts.createMap(); + for (const name of names) { + const low = name.toLowerCase(); + if (seenNames.has(low)) + throw new Error(`Name ${low} appears twice`); + seenNames.set(low, true); + } - var infoFileOutput = buildInfoFileOutput(diagnosticMessages, nameMap); + var infoFileOutput = buildInfoFileOutput(diagnosticMessages); checkForUniqueCodes(names, diagnosticMessages); writeFile("diagnosticInformationMap.generated.ts", infoFileOutput); - var messageOutput = buildDiagnosticMessageOutput(diagnosticMessages, nameMap); + var messageOutput = buildDiagnosticMessageOutput(diagnosticMessages); writeFile("diagnosticMessages.generated.json", messageOutput); } @@ -68,30 +75,16 @@ function checkForUniqueCodes(messages: string[], diagnosticTable: InputDiagnosti } } -function buildUniqueNameMap(names: string[]): ts.Map { - var nameMap = ts.createMap(); - - var uniqueNames = NameGenerator.ensureUniqueness(names, /* isCaseSensitive */ false, /* isFixed */ undefined); - - for (var i = 0; i < names.length; i++) { - nameMap.set(names[i], uniqueNames[i]); - } - - return nameMap; -} - -function buildInfoFileOutput(messageTable: InputDiagnosticMessageTable, nameMap: ts.Map): string { +function buildInfoFileOutput(messageTable: InputDiagnosticMessageTable): string { var result = '// \r\n' + '/// \r\n' + '/* @internal */\r\n' + 'namespace ts {\r\n' + ' export const Diagnostics = {\r\n'; - var names = Utilities.getObjectKeys(messageTable); - for (var i = 0; i < names.length; i++) { - var name = names[i]; + for (const name of Object.keys(messageTable)) { var diagnosticDetails = messageTable[name]; - var propName = convertPropertyName(nameMap.get(name)); + var propName = convertPropertyName(name); result += ' ' + propName + @@ -107,14 +100,14 @@ function buildInfoFileOutput(messageTable: InputDiagnosticMessageTable, nameMap: return result; } -function buildDiagnosticMessageOutput(messageTable: InputDiagnosticMessageTable, nameMap: ts.Map): string { +function buildDiagnosticMessageOutput(messageTable: InputDiagnosticMessageTable): string { var result = '{'; - var names = Utilities.getObjectKeys(messageTable); + var names = Object.keys(messageTable); for (var i = 0; i < names.length; i++) { var name = names[i]; var diagnosticDetails = messageTable[name]; - var propName = convertPropertyName(nameMap.get(name)); + var propName = convertPropertyName(name); result += '\r\n "' + createKey(propName, diagnosticDetails.code) + '"' + ' : "' + name.replace(/[\"]/g, '\\"') + '"'; if (i !== names.length - 1) { @@ -152,93 +145,4 @@ function convertPropertyName(origName: string): string { return result; } -module NameGenerator { - export function ensureUniqueness(names: string[], isCaseSensitive: boolean, isFixed?: boolean[]): string[]{ - if (!isFixed) { - isFixed = names.map(() => false) - } - - var names = names.slice(); - ensureUniquenessInPlace(names, isCaseSensitive, isFixed); - return names; - } - - function ensureUniquenessInPlace(names: string[], isCaseSensitive: boolean, isFixed: boolean[]): void { - for (var i = 0; i < names.length; i++) { - var name = names[i]; - var collisionIndices = Utilities.collectMatchingIndices(name, names, isCaseSensitive); - - // We will always have one "collision" because getCollisionIndices returns the index of name itself as well; - // so if we only have one collision, then there are no issues. - if (collisionIndices.length < 2) { - continue; - } - - handleCollisions(name, names, isFixed, collisionIndices, isCaseSensitive); - } - } - - function handleCollisions(name: string, proposedNames: string[], isFixed: boolean[], collisionIndices: number[], isCaseSensitive: boolean): void { - var suffix = 1; - - for (var i = 0; i < collisionIndices.length; i++) { - var collisionIndex = collisionIndices[i]; - - if (isFixed[collisionIndex]) { - // can't do anything about this name. - continue; - } - - while (true) { - var newName = name + suffix; - suffix++; - - // Check if we've synthesized a unique name, and if so - // replace the conflicting name with the new one. - if (!proposedNames.some(name => Utilities.stringEquals(name, newName, isCaseSensitive))) { - proposedNames[collisionIndex] = newName; - break; - } - } - } - } -} - -module Utilities { - /// Return a list of all indices where a string occurs. - export function collectMatchingIndices(name: string, proposedNames: string[], isCaseSensitive: boolean): number[] { - var matchingIndices: number[] = []; - - for (var i = 0; i < proposedNames.length; i++) { - if (stringEquals(name, proposedNames[i], isCaseSensitive)) { - matchingIndices.push(i); - } - } - - return matchingIndices; - } - - export function stringEquals(s1: string, s2: string, caseSensitive: boolean): boolean { - if (caseSensitive) { - s1 = s1.toLowerCase(); - s2 = s2.toLowerCase(); - } - - return s1 == s2; - } - - // Like Object.keys - export function getObjectKeys(obj: any): string[] { - var result: string[] = []; - - for (var name in obj) { - if (obj.hasOwnProperty(name)) { - result.push(name); - } - } - - return result; - } -} - main(); \ No newline at end of file From 88d9b0df1369d632b55186319e0109d929e7a992 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Tue, 25 Jul 2017 13:03:19 -0700 Subject: [PATCH 2/2] Be case-sensitive --- scripts/processDiagnosticMessages.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/scripts/processDiagnosticMessages.ts b/scripts/processDiagnosticMessages.ts index 5409838b20aa8..dd113e3b56b32 100644 --- a/scripts/processDiagnosticMessages.ts +++ b/scripts/processDiagnosticMessages.ts @@ -34,10 +34,9 @@ function main(): void { // Check that there are no duplicates. const seenNames = ts.createMap(); for (const name of names) { - const low = name.toLowerCase(); - if (seenNames.has(low)) - throw new Error(`Name ${low} appears twice`); - seenNames.set(low, true); + if (seenNames.has(name)) + throw new Error(`Name ${name} appears twice`); + seenNames.set(name, true); } var infoFileOutput = buildInfoFileOutput(diagnosticMessages);