Made JS enum declarations compatible with google closure

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

Change-Id: Ib65bd02156d1c3637ed278a8334a2307caacaa44
parent ca68d8b0
...@@ -168,7 +168,8 @@ class JsTsGenerator : public BaseGenerator { ...@@ -168,7 +168,8 @@ class JsTsGenerator : public BaseGenerator {
for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end(); for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
++it) { ++it) {
auto &enum_def = **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 { ...@@ -322,12 +323,16 @@ class JsTsGenerator : public BaseGenerator {
// Generate an enum declaration and an enum string lookup table. // Generate an enum declaration and an enum string lookup table.
void GenEnum(EnumDef &enum_def, std::string *code_ptr, 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 (enum_def.generated) return;
if (reverse && lang_.language == IDLOptions::kTs) return; // FIXME.
std::string &code = *code_ptr; std::string &code = *code_ptr;
std::string &exports = *exports_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 ns = GetNameSpace(enum_def);
std::string enum_def_name = enum_def.name + (reverse ? "Name" : "");
if (lang_.language == IDLOptions::kTs) { if (lang_.language == IDLOptions::kTs) {
if (!ns.empty()) { code += "export namespace " + ns + "{\n"; } if (!ns.empty()) { code += "export namespace " + ns + "{\n"; }
code += "export enum " + enum_def.name + "{\n"; code += "export enum " + enum_def.name + "{\n";
...@@ -335,15 +340,15 @@ class JsTsGenerator : public BaseGenerator { ...@@ -335,15 +340,15 @@ class JsTsGenerator : public BaseGenerator {
if (enum_def.defined_namespace->components.empty()) { if (enum_def.defined_namespace->components.empty()) {
code += "var "; code += "var ";
if (parser_.opts.use_goog_js_export_format) { if (parser_.opts.use_goog_js_export_format) {
exports += "goog.exportSymbol('" + enum_def.name + "', " + exports += "goog.exportSymbol('" + enum_def_name + "', " +
enum_def.name + ");\n"; enum_def.name + ");\n";
} else if (parser_.opts.use_ES6_js_export_format) { } else if (parser_.opts.use_ES6_js_export_format) {
exports += "export {" + enum_def.name + "};\n"; exports += "export {" + enum_def_name + "};\n";
} else { } 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(); for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
++it) { ++it) {
...@@ -354,18 +359,14 @@ class JsTsGenerator : public BaseGenerator { ...@@ -354,18 +359,14 @@ class JsTsGenerator : public BaseGenerator {
} }
// Generate mapping between EnumName: EnumValue(int) // Generate mapping between EnumName: EnumValue(int)
code += " " + ev.name; if (reverse) {
code += lang_.language == IDLOptions::kTs ? "= " : ": "; code += " " + NumToString(ev.value);
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);
code += lang_.language == IDLOptions::kTs ? "= " : ": "; code += lang_.language == IDLOptions::kTs ? "= " : ": ";
code += "'" + ev.name + "'"; 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"; code += (it + 1) != enum_def.vals.vec.end() ? ",\n" : "\n";
......
...@@ -25,42 +25,81 @@ MyGame.Example2 = MyGame.Example2 || {}; ...@@ -25,42 +25,81 @@ MyGame.Example2 = MyGame.Example2 || {};
MyGame.OtherNameSpace = MyGame.OtherNameSpace || {}; MyGame.OtherNameSpace = MyGame.OtherNameSpace || {};
/** /**
* @enum * @enum {number}
*/ */
MyGame.Example.Color = { MyGame.Example.Color = {
Red: 1, 1: 'Red', Red: 1,
Green: 2, 2: 'Green', Green: 2,
Blue: 8, 8: 'Blue' Blue: 8
}; };
/** /**
* @enum * @enum {string}
*/
MyGame.Example.ColorName = {
1: 'Red',
2: 'Green',
8: 'Blue'
};
/**
* @enum {number}
*/ */
MyGame.Example.Any = { MyGame.Example.Any = {
NONE: 0, 0: 'NONE', NONE: 0,
Monster: 1, 1: 'Monster', Monster: 1,
TestSimpleTableWithEnum: 2, 2: 'TestSimpleTableWithEnum', TestSimpleTableWithEnum: 2,
MyGame_Example2_Monster: 3, 3: 'MyGame_Example2_Monster' MyGame_Example2_Monster: 3
};
/**
* @enum {string}
*/
MyGame.Example.AnyName = {
0: 'NONE',
1: 'Monster',
2: 'TestSimpleTableWithEnum',
3: 'MyGame_Example2_Monster'
}; };
/** /**
* @enum * @enum {number}
*/ */
MyGame.Example.AnyUniqueAliases = { MyGame.Example.AnyUniqueAliases = {
NONE: 0, 0: 'NONE', NONE: 0,
M: 1, 1: 'M', M: 1,
T: 2, 2: 'T', T: 2,
M2: 3, 3: 'M2' M2: 3
}; };
/** /**
* @enum * @enum {string}
*/
MyGame.Example.AnyUniqueAliasesName = {
0: 'NONE',
1: 'M',
2: 'T',
3: 'M2'
};
/**
* @enum {number}
*/ */
MyGame.Example.AnyAmbiguousAliases = { MyGame.Example.AnyAmbiguousAliases = {
NONE: 0, 0: 'NONE', NONE: 0,
M1: 1, 1: 'M1', M1: 1,
M2: 2, 2: 'M2', M2: 2,
M3: 3, 3: 'M3' M3: 3
};
/**
* @enum {string}
*/
MyGame.Example.AnyAmbiguousAliasesName = {
0: 'NONE',
1: 'M1',
2: 'M2',
3: 'M3'
}; };
/** /**
......
// automatically generated by the FlatBuffers compiler, do not modify // automatically generated by the FlatBuffers compiler, do not modify
/** /**
* @enum * @enum {number}
*/ */
export namespace MyGame.Example{ export namespace MyGame.Example{
export enum Color{ export enum Color{
...@@ -11,7 +11,7 @@ export enum Color{ ...@@ -11,7 +11,7 @@ export enum Color{
}}; }};
/** /**
* @enum * @enum {number}
*/ */
export namespace MyGame.Example{ export namespace MyGame.Example{
export enum Any{ export enum Any{
...@@ -22,7 +22,7 @@ export enum Any{ ...@@ -22,7 +22,7 @@ export enum Any{
}}; }};
/** /**
* @enum * @enum {number}
*/ */
export namespace MyGame.Example{ export namespace MyGame.Example{
export enum AnyUniqueAliases{ export enum AnyUniqueAliases{
...@@ -33,7 +33,7 @@ export enum AnyUniqueAliases{ ...@@ -33,7 +33,7 @@ export enum AnyUniqueAliases{
}}; }};
/** /**
* @enum * @enum {number}
*/ */
export namespace MyGame.Example{ export namespace MyGame.Example{
export enum AnyAmbiguousAliases{ export enum AnyAmbiguousAliases{
......
...@@ -13,12 +13,21 @@ var NamespaceA = NamespaceA || {}; ...@@ -13,12 +13,21 @@ var NamespaceA = NamespaceA || {};
NamespaceA.NamespaceB = NamespaceA.NamespaceB || {}; NamespaceA.NamespaceB = NamespaceA.NamespaceB || {};
/** /**
* @enum * @enum {number}
*/ */
NamespaceA.NamespaceB.EnumInNestedNS = { NamespaceA.NamespaceB.EnumInNestedNS = {
A: 0, 0: 'A', A: 0,
B: 1, 1: 'B', B: 1,
C: 2, 2: 'C' C: 2
};
/**
* @enum {string}
*/
NamespaceA.NamespaceB.EnumInNestedNSName = {
0: 'A',
1: 'B',
2: 'C'
}; };
/** /**
......
// automatically generated by the FlatBuffers compiler, do not modify // automatically generated by the FlatBuffers compiler, do not modify
/** /**
* @enum * @enum {number}
*/ */
export namespace NamespaceA.NamespaceB{ export namespace NamespaceA.NamespaceB{
export enum EnumInNestedNS{ export enum EnumInNestedNS{
......
// automatically generated by the FlatBuffers compiler, do not modify // automatically generated by the FlatBuffers compiler, do not modify
/** /**
* @enum * @enum {number}
*/ */
var Character = { var Character = {
NONE: 0, 0: 'NONE', NONE: 0,
MuLan: 1, 1: 'MuLan', MuLan: 1,
Rapunzel: 2, 2: 'Rapunzel', Rapunzel: 2,
Belle: 3, 3: 'Belle', Belle: 3,
BookFan: 4, 4: 'BookFan', BookFan: 4,
Other: 5, 5: 'Other', Other: 5,
Unused: 6, 6: 'Unused' Unused: 6
};
/**
* @enum {string}
*/
var CharacterName = {
0: 'NONE',
1: 'MuLan',
2: 'Rapunzel',
3: 'Belle',
4: 'BookFan',
5: 'Other',
6: 'Unused'
}; };
/** /**
...@@ -459,6 +472,7 @@ Movie.createMovie = function(builder, mainCharacterType, mainCharacterOffset, ch ...@@ -459,6 +472,7 @@ Movie.createMovie = function(builder, mainCharacterType, mainCharacterOffset, ch
// Exports for Node.js and RequireJS // Exports for Node.js and RequireJS
this.Character = Character; this.Character = Character;
this.CharacterName = CharacterName;
this.Attacker = Attacker; this.Attacker = Attacker;
this.Rapunzel = Rapunzel; this.Rapunzel = Rapunzel;
this.BookReader = BookReader; this.BookReader = BookReader;
......
// automatically generated by the FlatBuffers compiler, do not modify // automatically generated by the FlatBuffers compiler, do not modify
/** /**
* @enum * @enum {number}
*/ */
export enum Character{ export enum Character{
NONE= 0, NONE= 0,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment