Browse Source

AS Bindings: don't show unnamed union ids, optimize iterators

1vanK 3 years ago
parent
commit
a5a31f097e

+ 5 - 5
Source/Tools/BindingGenerator/ASClassBinder.cpp

@@ -417,7 +417,7 @@ static bool ContainsSameSignature(const string& className, const string& methodS
 static void InitCachedMemberSignatures()
 { 
     // Fill signatures
-    for (auto element : SourceData::classesByID_)
+    for (pair<const string, xml_node>& element : SourceData::classesByID_)
     {
         xml_node compounddef = element.second;
         ClassAnalyzer classAnalyzer(compounddef);
@@ -429,7 +429,7 @@ static void InitCachedMemberSignatures()
     }
 
     // Fill hidden in any derived classes members
-    for (auto element : SourceData::classesByID_)
+    for (pair<const string, xml_node>& element : SourceData::classesByID_)
     {
         xml_node compounddef = element.second;
         ClassAnalyzer classAnalyzer(compounddef);
@@ -1178,8 +1178,8 @@ static void RegisterField(const FieldAnalyzer& fieldAnalyzer, ProcessedClass& pr
         catch (const Exception& e)
         {
             MemberRegistrationError regError;
-            regError.name_ = fieldAnalyzer.GetName();
-            regError.comment_ = fieldAnalyzer.GetDeclaration();
+            regError.name_ = HideUnnamedType(fieldAnalyzer.GetName());
+            regError.comment_ = HideUnnamedType(fieldAnalyzer.GetDeclaration());
             regError.message_ = e.what();
             processedClass.unregisteredTemplateFields_.push_back(regError);
             return;
@@ -1396,7 +1396,7 @@ void ProcessAllClasses()
 {
     InitCachedMemberSignatures();
 
-    for (auto element : SourceData::classesByID_)
+    for (pair<const string, xml_node>& element : SourceData::classesByID_)
     {
         xml_node compounddef = element.second;
         ClassAnalyzer analyzer(compounddef);

+ 9 - 0
Source/Tools/BindingGenerator/ASUtils.cpp

@@ -548,8 +548,17 @@ ConvertedVariable CppVariableToAS(const TypeAnalyzer& type, VariableUsage usage,
     return result;
 }
 
+string HideUnnamedType(const string& name)
+{
+    regex rgx("@\\d+");
+    return regex_replace(name, rgx, "@?");
+}
+
 string CppTypeToAS(const TypeAnalyzer& type, TypeUsage typeUsage)
 {
+    if (Contains(type.GetName(), "@")) // Unnamed union inside class
+        throw Exception("Error: type \"" + HideUnnamedType(type.ToString()) + "\" can not automatically bind");
+
     if (type.IsRvalueReference() || type.IsDoublePointer() || type.IsRefToPointer())
         throw Exception("Error: type \"" + type.ToString() + "\" can not automatically bind");
 

+ 4 - 0
Source/Tools/BindingGenerator/ASUtils.h

@@ -73,6 +73,10 @@ class Exception : public std::runtime_error
 
 bool IsKnownCppType(const std::string& name);
 
+// A union within a class may not have a type name. For such types, Doxygen generates identifiers like @123.
+// These identifiers can change and produce redundant changes in commits.
+std::string HideUnnamedType(const std::string& name);
+
 std::shared_ptr<ClassAnalyzer> FindClassByName(const std::string& name);
 std::shared_ptr<ClassAnalyzer> FindClassByID(const std::string& name);
 

+ 4 - 4
Source/Urho3D/AngelScript/Generated_Members.h

@@ -4432,10 +4432,10 @@ template <class T> void RegisterMembers_Serializer(asIScriptEngine* engine, cons
 // struct ShaderParameter | File: ../Graphics/ShaderVariation.h
 template <class T> void RegisterMembers_ShaderParameter(asIScriptEngine* engine, const char* className)
 {
-    // union ShaderParameter::@5 Urho3D::ShaderParameter::@6
-    // Error: type "union Urho3D::ShaderParameter::@5" can not automatically bind
-    // union ShaderParameter::@7 Urho3D::ShaderParameter::@8
-    // Error: type "union Urho3D::ShaderParameter::@7" can not automatically bind
+    // union ShaderParameter::@? Urho3D::ShaderParameter::@?
+    // Error: type "union Urho3D::ShaderParameter::@?" can not automatically bind
+    // union ShaderParameter::@? Urho3D::ShaderParameter::@?
+    // Error: type "union Urho3D::ShaderParameter::@?" can not automatically bind
     // ConstantBuffer* ShaderParameter::bufferPtr_
     // Not registered because pointer