Browse Source

Issue #532 Sort objects before generating typescript bindings

Matt Benic 9 years ago
parent
commit
4f86a7fe18

+ 1 - 1
Source/ToolCore/JSBind/JSBClass.h

@@ -106,7 +106,7 @@ public:
     JSBClass(Context* context, JSBModule* module, const String& name, const String& nativeName);
     JSBClass(Context* context, JSBModule* module, const String& name, const String& nativeName);
     virtual ~JSBClass();
     virtual ~JSBClass();
 
 
-    const String& GetName() { return name_; }
+    const String& GetName() const { return name_; }
     const String& GetNativeName() { return nativeName_; }
     const String& GetNativeName() { return nativeName_; }
     JSBClass* GetBaseClass();
     JSBClass* GetBaseClass();
     PODVector<JSBClass*>& GetBaseClasses() {return baseClasses_; }
     PODVector<JSBClass*>& GetBaseClasses() {return baseClasses_; }

+ 1 - 1
Source/ToolCore/JSBind/JSBEnum.h

@@ -29,7 +29,7 @@ public:
     JSBEnum(Context* context, JSBModule* module, const String& name);
     JSBEnum(Context* context, JSBModule* module, const String& name);
     virtual ~JSBEnum();
     virtual ~JSBEnum();
 
 
-    const String& GetName() { return name_; }
+    const String& GetName() const { return name_; }
     JSBHeader* GetHeader() { return header_; }
     JSBHeader* GetHeader() { return header_; }
 
 
     JSBPackage* GetPackage();
     JSBPackage* GetPackage();

+ 35 - 7
Source/ToolCore/JSBind/JSBTypeScript.cpp

@@ -162,6 +162,11 @@ void JSBTypeScript::ExportFunction(JSBFunction* function)
 
 
 }
 }
 
 
+inline bool CompareJSBClassesByName(const SharedPtr<JSBClass>& lhs, const SharedPtr<JSBClass>& rhs)
+{
+    return lhs->GetName() < rhs->GetName();
+}
+
 void JSBTypeScript::ExportModuleClasses(JSBModule* module)
 void JSBTypeScript::ExportModuleClasses(JSBModule* module)
 {
 {
     Vector<SharedPtr<JSBClass>> classes = module->GetClasses();
     Vector<SharedPtr<JSBClass>> classes = module->GetClasses();
@@ -169,6 +174,9 @@ void JSBTypeScript::ExportModuleClasses(JSBModule* module)
     if (!classes.Size())
     if (!classes.Size())
         return;
         return;
 
 
+    // Sort classes to ensure consistent output across machines
+    Sort(classes.Begin(), classes.End(), CompareJSBClassesByName);
+
     source_ += "\n";
     source_ += "\n";
 
 
     for (unsigned i = 0; i < classes.Size(); i++)
     for (unsigned i = 0; i < classes.Size(); i++)
@@ -265,11 +273,14 @@ void JSBTypeScript::ExportModuleClasses(JSBModule* module)
 
 
 void JSBTypeScript::ExportModuleConstants(JSBModule* module)
 void JSBTypeScript::ExportModuleConstants(JSBModule* module)
 {
 {
-    const Vector<String>& constants = module->GetConstants().Keys();
+    Vector<String>& constants = module->GetConstants().Keys();
 
 
     if (!constants.Size())
     if (!constants.Size())
         return;
         return;
 
 
+    // Sort constants to ensure consistent output across machines
+    Sort(constants.Begin(), constants.End());
+
     source_ += "\n";
     source_ += "\n";
 
 
     for (unsigned i = 0; i < constants.Size(); i++)
     for (unsigned i = 0; i < constants.Size(); i++)
@@ -283,14 +294,23 @@ void JSBTypeScript::ExportModuleConstants(JSBModule* module)
 
 
 }
 }
 
 
+inline bool CompareJSBEnumsByName(const SharedPtr<JSBEnum>& lhs, const SharedPtr<JSBEnum>& rhs)
+{
+    return lhs->GetName() < rhs->GetName();
+}
+
 void JSBTypeScript::ExportModuleEnums(JSBModule* module)
 void JSBTypeScript::ExportModuleEnums(JSBModule* module)
 {
 {
 
 
     Vector<SharedPtr<JSBEnum>> enums = module->GetEnums();
     Vector<SharedPtr<JSBEnum>> enums = module->GetEnums();
 
 
-    for (unsigned i = 0; i <enums.Size(); i++)
+    // Sort enums alphabetically to ensure consistent output across machines
+    Sort(enums.Begin(), enums.End(), CompareJSBEnumsByName);
+
+    Vector<SharedPtr<JSBEnum>>::Iterator enumIter;
+    for (enumIter = enums.Begin(); enumIter != enums.End(); enumIter++)
     {
     {
-        JSBEnum* _enum = enums[i];
+        JSBEnum* _enum = *enumIter;
 
 
         // can't use a TS enum, so use a type alias
         // can't use a TS enum, so use a type alias
 
 
@@ -299,15 +319,15 @@ void JSBTypeScript::ExportModuleEnums(JSBModule* module)
 
 
         HashMap<String, String>& values = _enum->GetValues();
         HashMap<String, String>& values = _enum->GetValues();
 
 
-        HashMap<String, String>::ConstIterator itr = values.Begin();
+        HashMap<String, String>::ConstIterator valsIter = values.Begin();
 
 
-        while (itr != values.End())
+        while (valsIter != values.End())
         {
         {
-            String name = (*itr).first_;
+            String name = (*valsIter).first_;
 
 
             source_ += "   export var " + name + ": " +  _enum->GetName() + ";\n";
             source_ += "   export var " + name + ": " +  _enum->GetName() + ";\n";
 
 
-            itr++;
+            valsIter++;
         }
         }
 
 
         source_ += "\n";
         source_ += "\n";
@@ -327,12 +347,20 @@ void JSBTypeScript::WriteToFile(const String &path)
 
 
 }
 }
 
 
+inline bool CompareJSBModulesByName(const SharedPtr<JSBModule>& lhs, const SharedPtr<JSBModule>& rhs)
+{
+    return lhs->GetName() < rhs->GetName();
+}
+
 void JSBTypeScript::Emit(JSBPackage* package, const String& path)
 void JSBTypeScript::Emit(JSBPackage* package, const String& path)
 {
 {
     package_ = package;
     package_ = package;
 
 
     Vector<SharedPtr<JSBModule>>& modules = package->GetModules();
     Vector<SharedPtr<JSBModule>>& modules = package->GetModules();
 
 
+    // Sort modules alphabetically to ensure consistent output across machines
+    Sort(modules.Begin(), modules.End(), CompareJSBModulesByName);
+
     Begin();
     Begin();
 
 
     for (unsigned i = 0; i < modules.Size(); i++)
     for (unsigned i = 0; i < modules.Size(); i++)