]> git.saurik.com Git - wxWidgets.git/commitdiff
for each prototype make sure that if the n-th argument has a default value, then...
authorFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Tue, 25 Mar 2008 12:26:23 +0000 (12:26 +0000)
committerFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Tue, 25 Mar 2008 12:26:23 +0000 (12:26 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52807 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

utils/ifacecheck/src/ifacecheck.cpp
utils/ifacecheck/src/xmlparser.cpp
utils/ifacecheck/src/xmlparser.h

index 1e2c5848a1edeb0d08f2333a4ccc01282b781d54..c1192385321631dd7990cb6ba2949a76bb976819 100644 (file)
@@ -259,6 +259,13 @@ int IfaceCheckApp::CompareClasses(const wxClass* iface, const wxClassPtrArray& a
 
             if (overloads.GetCount()==0)
             {
+                /*
+                    TODO: sometimes the interface headers re-document a method
+                          inherited from a base class even if the real header does
+                          not actually re-implement it.
+                          To avoid false positives, we'd need to search in the base classes
+                          of api[] classes and search for a matching method.
+                */
                 LogMessage("%s: real '%s' class has no method '%s'",
                             header, searchedclasses, m.GetAsString());
                 // we've found no overloads
index 35c9e008a374299e8bf35ba69964839880e073cb..51e04d35a4a9d12841bdc711469c758146abc4d4 100644 (file)
@@ -117,7 +117,7 @@ bool wxType::operator==(const wxType& m) const
 
 void wxArgumentType::SetDefaultValue(const wxString& defval)
 {
-    m_strDefaultValue=defval;
+    m_strDefaultValue=defval.Strip(wxString::both);
 
     // in order to make valid&simple comparison on argument defaults,
     // we reduce some of the multiple forms in which the same things may appear
@@ -131,7 +131,7 @@ void wxArgumentType::SetDefaultValue(const wxString& defval)
 
 
     if (m_strDefaultValue.Contains("wxGetTranslation"))
-        m_strDefaultValue = wxEmptyString;     // TODO: wxGetTranslation gives problems to gccxml
+        m_strDefaultValue = "_(TOFIX)";     // TODO: wxGetTranslation gives problems to gccxml
 }
 
 bool wxArgumentType::operator==(const wxArgumentType& m) const
@@ -175,13 +175,28 @@ bool wxMethod::IsOk() const
     for (unsigned int i=0; i<m_args.GetCount(); i++)
         if (!m_args[i].IsOk()) {
             LogError("'%s' method has invalid %d-th argument type: %s",
-                     m_strName, i, m_args[i].GetAsString());
+                     m_strName, i+1, m_args[i].GetAsString());
             return false;
         }
 
     // NB: the default value of the arguments can contain pretty much everything
     //     (think to e.g. wxPoint(3+4/2,0)   or   *wxBLACK   or  someClass<type>)
-    //     so we don't do any test on them.
+    //     so we don't do any test on their contents
+    if (m_args.GetCount()>0)
+    {
+        bool previousArgHasDefault = m_args[0].HasDefaultValue();
+        for (unsigned int i=1; i<m_args.GetCount(); i++)
+        {
+            if (previousArgHasDefault && !m_args[i].HasDefaultValue()) {
+                LogError("'%s' method has %d-th argument which has no default value "
+                         "(while the previous one had one!)",
+                         m_strName, i+1);
+                return false;
+            }
+
+            previousArgHasDefault = m_args[i].HasDefaultValue();
+        }
+    }
 
     return true;
 }
@@ -774,8 +789,11 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
 
                 // this <Method> node is a method of the i-th class!
                 wxMethod newfunc;
-                if (!ParseMethod(child, types, newfunc))
+                if (!ParseMethod(child, types, newfunc)) {
+                    LogError("The method '%s' could not be added to class '%s'",
+                             child->GetAttribute("demangled"), p->GetName());
                     return false;
+                }
 
                 if (newfunc.IsCtor() && !p->IsValidCtorForThisClass(newfunc)) {
                     LogError("The method '%s' does not seem to be a ctor for '%s'",
@@ -798,7 +816,6 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
         if ((++nodes%PROGRESS_RATE)==0) ShowProgress();
     }
 
-    //wxPrint("\n");
     if (!CheckParseResults())
         return false;
 
@@ -981,20 +998,23 @@ bool wxXmlDoxygenInterface::ParseCompoundDefinition(const wxString& filename)
                         {
 
                             wxMethod m;
-                            if (ParseMethod(membernode, m, header))
+                            if (!ParseMethod(membernode, m, header)) {
+                                LogError("The method '%s' could not be added to class '%s'",
+                                         m.GetName(), klass.GetName());
+                                return false;
+                            }
+
+                            if (absoluteFile.IsEmpty())
+                                absoluteFile = header;
+                            else if (header != absoluteFile)
                             {
-                                if (absoluteFile.IsEmpty())
-                                    absoluteFile = header;
-                                else if (header != absoluteFile)
-                                {
-                                    LogError("The method '%s' is documented in a different "
-                                             "file from others (which belong to '%s') ?",
-                                             header, absoluteFile);
-                                    return false;
-                                }
-
-                                klass.AddMethod(m);
+                                LogError("The method '%s' is documented in a different "
+                                            "file from others (which belong to '%s') ?",
+                                            header, absoluteFile);
+                                return false;
                             }
+
+                            klass.AddMethod(m);
                         }
 
                         membernode = membernode->GetNext();
index 200024da61adbfada1e9fad9c376a0b315d08ec8..b503a56d348b30a7c1818526b02686b745f3dcad 100644 (file)
@@ -84,6 +84,9 @@ public:
     wxString GetDefaultValue() const
         { return m_strDefaultValue; }
 
+    bool HasDefaultValue() const
+        { return !m_strDefaultValue.IsEmpty(); }
+
     bool operator==(const wxArgumentType& m) const;
     bool operator!=(const wxArgumentType& m) const
         { return !(*this == m); }