Made JS enum declarations compatible with google closure

Original change by: https://github.com/alexames

Change-Id: Ib65bd02156d1c3637ed278a8334a2307caacaa44
This commit is contained in:
Wouter van Oortmerssen
2019-03-11 14:33:07 -07:00
parent ca68d8b043
commit 4f066c39ce
7 changed files with 117 additions and 54 deletions

View File

@@ -168,7 +168,8 @@ class JsTsGenerator : public BaseGenerator {
for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
++it) {
auto &enum_def = **it;
GenEnum(enum_def, enum_code_ptr, exports_code_ptr, reexports);
GenEnum(enum_def, enum_code_ptr, exports_code_ptr, reexports, false);
GenEnum(enum_def, enum_code_ptr, exports_code_ptr, reexports, true);
}
}
@@ -322,12 +323,16 @@ class JsTsGenerator : public BaseGenerator {
// Generate an enum declaration and an enum string lookup table.
void GenEnum(EnumDef &enum_def, std::string *code_ptr,
std::string *exports_ptr, reexport_map &reexports) {
std::string *exports_ptr, reexport_map &reexports,
bool reverse) {
if (enum_def.generated) return;
if (reverse && lang_.language == IDLOptions::kTs) return; // FIXME.
std::string &code = *code_ptr;
std::string &exports = *exports_ptr;
GenDocComment(enum_def.doc_comment, code_ptr, "@enum");
GenDocComment(enum_def.doc_comment, code_ptr,
reverse ? "@enum {string}" : "@enum {number}");
std::string ns = GetNameSpace(enum_def);
std::string enum_def_name = enum_def.name + (reverse ? "Name" : "");
if (lang_.language == IDLOptions::kTs) {
if (!ns.empty()) { code += "export namespace " + ns + "{\n"; }
code += "export enum " + enum_def.name + "{\n";
@@ -335,15 +340,15 @@ class JsTsGenerator : public BaseGenerator {
if (enum_def.defined_namespace->components.empty()) {
code += "var ";
if (parser_.opts.use_goog_js_export_format) {
exports += "goog.exportSymbol('" + enum_def.name + "', " +
exports += "goog.exportSymbol('" + enum_def_name + "', " +
enum_def.name + ");\n";
} else if (parser_.opts.use_ES6_js_export_format) {
exports += "export {" + enum_def.name + "};\n";
exports += "export {" + enum_def_name + "};\n";
} else {
exports += "this." + enum_def.name + " = " + enum_def.name + ";\n";
exports += "this." + enum_def_name + " = " + enum_def_name + ";\n";
}
}
code += WrapInNameSpace(enum_def) + " = {\n";
code += WrapInNameSpace(enum_def) + (reverse ? "Name" : "") + " = {\n";
}
for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
++it) {
@@ -354,18 +359,14 @@ class JsTsGenerator : public BaseGenerator {
}
// Generate mapping between EnumName: EnumValue(int)
code += " " + ev.name;
code += lang_.language == IDLOptions::kTs ? "= " : ": ";
code += NumToString(ev.value);
if (lang_.language == IDLOptions::kJs) {
// In pure Javascript, generate mapping between EnumValue(int):
// 'EnumName' so enums can be looked up by their ID.
code += ", ";
code += NumToString(ev.value);
if (reverse) {
code += " " + NumToString(ev.value);
code += lang_.language == IDLOptions::kTs ? "= " : ": ";
code += "'" + ev.name + "'";
} else {
code += " " + ev.name;
code += lang_.language == IDLOptions::kTs ? "= " : ": ";
code += NumToString(ev.value);
}
code += (it + 1) != enum_def.vals.vec.end() ? ",\n" : "\n";