private assertNoDuplicateEnumValues()

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