in src/assembler.ts [1547:1590]
private assertNoDuplicateEnumValues(decl: ts.EnumDeclaration): void {
type EnumValue = {
name: string;
value: string;
decl: ts.DeclarationName | undefined;
};
const enumValues = decl.members
.filter((m) => m.initializer)
.map((member): EnumValue => {
return {
value: member.initializer!.getText(),
name: member.name.getText(),
decl: ts.getNameOfDeclaration(member),
};
});
const hasDuplicateEnumValues = enumValues.some(
(val, _, arr) => arr.filter((e) => val.value === e.value).length > 1,
);
if (hasDuplicateEnumValues) {
const enumValueMap = enumValues.reduce<Record<string, EnumValue[]>>((acc, val) => {
if (!acc[val.value]) {
acc[val.value] = [];
}
acc[val.value].push(val);
return acc;
}, {});
for (const duplicateValue of Object.keys(enumValueMap)) {
if (enumValueMap[duplicateValue].length > 1) {
const err = JsiiDiagnostic.JSII_1004_DUPLICATE_ENUM_VALUE.create(
enumValueMap[duplicateValue][0].decl!,
duplicateValue,
enumValueMap[duplicateValue].map((v) => v.name),
);
for (let i = 1; i < enumValueMap[duplicateValue].length; i++) {
err.addRelatedInformation(enumValueMap[duplicateValue][i].decl!, 'The conflicting declaration is here');
}
this._diagnostics.push(err);
}
}
}
}