From b6b18c1d7f15b0ffff053904d4fdd1efe28469ef Mon Sep 17 00:00:00 2001 From: Olivier Combe Date: Mon, 18 Sep 2017 15:43:02 +0200 Subject: [PATCH] fix(tsc-wrapped): deduplicate metadata only when the module is the same (#19249) Fixes #19219 PR Close #19249 --- packages/compiler-cli/src/metadata/bundler.ts | 11 ++++++----- packages/compiler-cli/test/metadata/bundler_spec.ts | 8 +++++++- packages/tsc-wrapped/src/bundler.ts | 11 ++++++----- packages/tsc-wrapped/test/bundler_spec.ts | 8 +++++++- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/packages/compiler-cli/src/metadata/bundler.ts b/packages/compiler-cli/src/metadata/bundler.ts index 6024b68bcf..8f87ec55cb 100644 --- a/packages/compiler-cli/src/metadata/bundler.ts +++ b/packages/compiler-cli/src/metadata/bundler.ts @@ -265,24 +265,25 @@ export class MetadataBundler { Array.from(this.symbolMap.values()).forEach(symbol => { if (symbol.referenced && !symbol.reexport) { let name = symbol.name; - const declaredName = symbol.declaration !.name; + const identifier = `${symbol.declaration!.module}:${symbol.declaration !.name}`; if (symbol.isPrivate && !symbol.privateName) { name = newPrivateName(); symbol.privateName = name; } - if (symbolsMap.has(declaredName)) { - const names = symbolsMap.get(declaredName); + if (symbolsMap.has(identifier)) { + const names = symbolsMap.get(identifier); names !.push(name); } else { - symbolsMap.set(declaredName, [name]); + symbolsMap.set(identifier, [name]); } result[name] = symbol.value !; } }); // check for duplicated entries - symbolsMap.forEach((names: string[], declaredName: string) => { + symbolsMap.forEach((names: string[], identifier: string) => { if (names.length > 1) { + const [module, declaredName] = identifier.split(':'); // prefer the export that uses the declared name (if any) let reference = names.indexOf(declaredName); if (reference === -1) { diff --git a/packages/compiler-cli/test/metadata/bundler_spec.ts b/packages/compiler-cli/test/metadata/bundler_spec.ts index f00a620300..5e150319a7 100644 --- a/packages/compiler-cli/test/metadata/bundler_spec.ts +++ b/packages/compiler-cli/test/metadata/bundler_spec.ts @@ -197,26 +197,32 @@ describe('metadata bundler', () => { const host = new MockStringBundlerHost('/', { 'public-api.ts': ` export {A as A2, A, B as B1, B as B2} from './src/core'; + export {A as A3} from './src/alternate'; `, 'src': { 'core.ts': ` export class A {} export class B {} `, + 'alternate.ts': ` + export class A {} + `, } }); const bundler = new MetadataBundler('/public-api', undefined, host); const result = bundler.getMetadataBundle(); - const {A, A2, B1, B2} = result.metadata.metadata as{ + const {A, A2, A3, B1, B2} = result.metadata.metadata as{ A: ClassMetadata, A2: MetadataGlobalReferenceExpression, + A3: ClassMetadata, B1: ClassMetadata, B2: MetadataGlobalReferenceExpression }; expect(A.__symbolic).toEqual('class'); expect(A2.__symbolic).toEqual('reference'); expect(A2.name).toEqual('A'); + expect(A3.__symbolic).toEqual('class'); expect(B1.__symbolic).toEqual('class'); expect(B2.__symbolic).toEqual('reference'); expect(B2.name).toEqual('B1'); diff --git a/packages/tsc-wrapped/src/bundler.ts b/packages/tsc-wrapped/src/bundler.ts index e3659373d8..e6998b2d48 100644 --- a/packages/tsc-wrapped/src/bundler.ts +++ b/packages/tsc-wrapped/src/bundler.ts @@ -265,24 +265,25 @@ export class MetadataBundler { Array.from(this.symbolMap.values()).forEach(symbol => { if (symbol.referenced && !symbol.reexport) { let name = symbol.name; - const declaredName = symbol.declaration !.name; + const identifier = `${symbol.declaration!.module}:${symbol.declaration !.name}`; if (symbol.isPrivate && !symbol.privateName) { name = newPrivateName(); symbol.privateName = name; } - if (symbolsMap.has(declaredName)) { - const names = symbolsMap.get(declaredName); + if (symbolsMap.has(identifier)) { + const names = symbolsMap.get(identifier); names !.push(name); } else { - symbolsMap.set(declaredName, [name]); + symbolsMap.set(identifier, [name]); } result[name] = symbol.value !; } }); // check for duplicated entries - symbolsMap.forEach((names: string[], declaredName: string) => { + symbolsMap.forEach((names: string[], identifier: string) => { if (names.length > 1) { + const [module, declaredName] = identifier.split(':'); // prefer the export that uses the declared name (if any) let reference = names.indexOf(declaredName); if (reference === -1) { diff --git a/packages/tsc-wrapped/test/bundler_spec.ts b/packages/tsc-wrapped/test/bundler_spec.ts index 7c4bf97b48..181ae9f1ad 100644 --- a/packages/tsc-wrapped/test/bundler_spec.ts +++ b/packages/tsc-wrapped/test/bundler_spec.ts @@ -197,26 +197,32 @@ describe('metadata bundler', () => { const host = new MockStringBundlerHost('/', { 'public-api.ts': ` export {A as A2, A, B as B1, B as B2} from './src/core'; + export {A as A3} from './src/alternate'; `, 'src': { 'core.ts': ` export class A {} export class B {} `, + 'alternate.ts': ` + export class A {} + `, } }); const bundler = new MetadataBundler('/public-api', undefined, host); const result = bundler.getMetadataBundle(); - const {A, A2, B1, B2} = result.metadata.metadata as{ + const {A, A2, A3, B1, B2} = result.metadata.metadata as{ A: ClassMetadata, A2: MetadataGlobalReferenceExpression, + A3: ClassMetadata, B1: ClassMetadata, B2: MetadataGlobalReferenceExpression }; expect(A.__symbolic).toEqual('class'); expect(A2.__symbolic).toEqual('reference'); expect(A2.name).toEqual('A'); + expect(A3.__symbolic).toEqual('class'); expect(B1.__symbolic).toEqual('class'); expect(B2.__symbolic).toEqual('reference'); expect(B2.name).toEqual('B1');