X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5934cda171bc0535abd044da92f3728524a11faf..f3fda1aa01b9036e9050813a2af62c2544984087:/utils/ifacecheck/src/xmlparser.h diff --git a/utils/ifacecheck/src/xmlparser.h b/utils/ifacecheck/src/xmlparser.h index 648c121bf1..f160c79b3f 100644 --- a/utils/ifacecheck/src/xmlparser.h +++ b/utils/ifacecheck/src/xmlparser.h @@ -15,10 +15,11 @@ #include #include #include +#include // helper macros #define LogMessage(fmt, ...) { wxPrintf(fmt "\n", __VA_ARGS__); fflush(stdout); } -#define LogWarning(fmt, ...) { wxPrintf("WARNING: " fmt "\n", __VA_ARGS__); fflush(stdout); } +#define LogWarning(fmt, ...) { wxPrintf(fmt "\n", __VA_ARGS__); fflush(stdout); } #define LogError(fmt, ...) { wxPrintf("ERROR: " fmt "\n", __VA_ARGS__); fflush(stdout); } #define wxPrint(str) { wxPrintf(str); fflush(stdout); } @@ -32,14 +33,12 @@ class wxType public: wxType() {} wxType(const wxString& type) - { SetFromString(type); } + { SetTypeFromString(type); } - void SetFromString(const wxString& t); + void SetTypeFromString(const wxString& t); wxString GetAsString() const { return m_strType; } - wxString GetClean() const; - bool IsConst() const { return m_strType.Contains("const"); } bool IsStatic() const @@ -56,13 +55,57 @@ public: bool IsOk() const; protected: - wxString m_strType; + wxString m_strType, + m_strTypeClean; // m_strType "cleaned" of its attributes + // (only for internal use) }; extern wxType wxEmptyType; WX_DECLARE_OBJARRAY(wxType, wxTypeArray); +// ---------------------------------------------------------------------------- +// Represents a type used as argument for some wxMethod +// ---------------------------------------------------------------------------- +class wxArgumentType : public wxType +{ +public: + wxArgumentType() {} + wxArgumentType(const wxString& type, const wxString& defVal, + const wxString& argName = wxEmptyString) + { SetTypeFromString(type); SetDefaultValue(defVal); m_strArgName = argName; } + + void SetArgumentName(const wxString& name) + { m_strArgName=name.Strip(wxString::both); } + wxString GetArgumentName() const + { return m_strArgName; } + + void SetDefaultValue(const wxString& defval, const wxString& defvalForCmp = wxEmptyString); + 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); } + +protected: + wxString m_strDefaultValue; + + // this string may differ from m_strDefaultValue if there were + // preprocessor substitutions; can be wxEmptyString. + wxString m_strDefaultValueForCmp; + + wxString m_strArgName; // this one only makes sense when this wxType is + // used as argument type (and not as return type) + // and can be empty. +}; + +extern wxArgumentType wxEmptyArgumentType; +WX_DECLARE_OBJARRAY(wxArgumentType, wxArgumentTypeArray); + // ---------------------------------------------------------------------------- // Represents a single prototype of a class' member. @@ -70,19 +113,21 @@ WX_DECLARE_OBJARRAY(wxType, wxTypeArray); class wxMethod { public: - wxMethod() { m_bConst=m_bVirtual=m_bStatic=false; m_nLine=-1; } + wxMethod() + { m_bConst=m_bVirtual=m_bPureVirtual=m_bStatic=m_bDeprecated=false; + m_nLine=-1; m_nAvailability=wxPORT_UNKNOWN; } + wxMethod(const wxType& rettype, const wxString& name, - const wxTypeArray& arguments, const wxArrayString& defaults, + const wxArgumentTypeArray& arguments, bool isConst, bool isStatic, bool isVirtual) : m_retType(rettype), m_strName(name.Strip(wxString::both)), m_bConst(isConst), m_bStatic(isStatic), m_bVirtual(isVirtual) - { SetArgumentTypes(arguments,defaults); m_nLine=-1; } + { SetArgumentTypes(arguments); m_nLine=-1; } public: // getters - //void SetFromString(const wxString& proto); - wxString GetAsString() const; + wxString GetAsString(bool bWithArgumentNames = true) const; // parser of the prototype: // all these functions return strings with spaces stripped @@ -90,12 +135,12 @@ public: // getters { return m_retType; } wxString GetName() const { return m_strName; } - wxTypeArray GetArgumentTypes() const + wxArgumentTypeArray GetArgumentTypes() const { return m_args; } - wxArrayString GetArgumentDefaults() const - { return m_argDefaults; } int GetLocation() const { return m_nLine; } + int GetAvailability() const + { return m_nAvailability; } bool IsConst() const { return m_bConst; } @@ -103,6 +148,8 @@ public: // getters { return m_bStatic; } bool IsVirtual() const { return m_bVirtual; } + bool IsPureVirtual() const + { return m_bPureVirtual; } bool IsOk() const; bool IsCtor() const @@ -110,6 +157,9 @@ public: // getters bool IsDtor() const { return m_retType==wxEmptyType && m_strName.StartsWith("~"); } + bool IsDeprecated() const + { return m_bDeprecated; } + public: // setters @@ -117,15 +167,25 @@ public: // setters { m_retType=t; } void SetName(const wxString& name) { m_strName=name; } - void SetArgumentTypes(const wxTypeArray& arr, const wxArrayString& defaults); + void SetArgumentTypes(const wxArgumentTypeArray& arr) + { m_args=arr; } void SetConst(bool c = true) { m_bConst=c; } void SetStatic(bool c = true) { m_bStatic=c; } void SetVirtual(bool c = true) { m_bVirtual=c; } + void SetPureVirtual(bool c = true) + { + m_bPureVirtual=c; + if (c) m_bVirtual=c; // pure virtual => virtual + } + void SetDeprecated(bool c = true) + { m_bDeprecated=c; } void SetLocation(int lineNumber) { m_nLine=lineNumber; } + void SetAvailability(int nAvail) + { m_nAvailability=nAvail; } public: // misc @@ -138,12 +198,23 @@ public: // misc protected: wxType m_retType; wxString m_strName; - wxTypeArray m_args; - wxArrayString m_argDefaults; + wxArgumentTypeArray m_args; + + // misc attributes: bool m_bConst; bool m_bStatic; bool m_bVirtual; + bool m_bPureVirtual; + bool m_bDeprecated; + + // m_nLine can be -1 if no location infos are available int m_nLine; + + // this is a combination of wxPORT_* flags (see wxPortId) or wxPORT_UNKNOWN + // if this method should be available for all wxWidgets ports. + // NOTE: this is not used for comparing wxMethod objects + // (gccXML never gives this kind of info). + int m_nAvailability; }; WX_DECLARE_OBJARRAY(wxMethod, wxMethodArray); @@ -160,18 +231,18 @@ public: wxClass(const wxString& name, const wxString& headername) : m_strName(name), m_strHeader(headername) {} - void AddMethod(const wxMethod& func) - { m_methods.Add(func); } + +public: // setters void SetHeader(const wxString& header) { m_strHeader=header; } void SetName(const wxString& name) { m_strName=name; } - wxString GetName() const - { return m_strName; } - wxString GetHeader() const - { return m_strHeader; } - wxString GetNameWithoutTemplate() const; + void SetAvailability(int nAvail) + { m_nAvailability=nAvail; } + + +public: // getters bool IsOk() const { return !m_strName.IsEmpty() && !m_methods.IsEmpty(); } @@ -179,6 +250,12 @@ public: bool IsValidCtorForThisClass(const wxMethod& m) const; bool IsValidDtorForThisClass(const wxMethod& m) const; + wxString GetName() const + { return m_strName; } + wxString GetHeader() const + { return m_strHeader; } + wxString GetNameWithoutTemplate() const; + unsigned int GetMethodCount() const { return m_methods.GetCount(); } wxMethod& GetMethod(unsigned int n) const @@ -186,6 +263,14 @@ public: wxMethod& GetLastMethod() const { return m_methods.Last(); } + int GetAvailability() const + { return m_nAvailability; } + +public: // misc + + void AddMethod(const wxMethod& func) + { m_methods.Add(func); } + // returns a single result (the first, which is also the only // one if CheckConsistency() return true) const wxMethod* FindMethod(const wxMethod& m) const; @@ -204,6 +289,9 @@ protected: wxString m_strName; wxString m_strHeader; wxMethodArray m_methods; + + // see the wxMethod::m_nAvailability field for more info + int m_nAvailability; }; WX_DECLARE_OBJARRAY(wxClass, wxClassArray); @@ -243,6 +331,9 @@ public: return methods; } + // pass a full-path header filename: + wxClassPtrArray FindClassesDefinedIn(const wxString& headerfile) const; + void ShowProgress() { /*wxPrint(".");*/ } @@ -253,11 +344,17 @@ protected: }; #if 1 +// for wxTypeIdHashMap, keys == gccxml IDs and values == associated type strings +// e.g. key = "0x123f" and value = "const wxAboutDialogInfo&" +WX_DECLARE_HASH_MAP( unsigned long, wxString, + wxIntegerHash, wxIntegerEqual, + wxTypeIdHashMap ); + WX_DECLARE_STRING_HASH_MAP( wxString, wxStringHashMap ); #else #include typedef std::basic_string stlString; -typedef std::map wxStringHashMap; +typedef std::map wxTypeIdHashMap; #endif @@ -268,20 +365,27 @@ typedef std::map wxStringHashMap; class wxXmlGccInterface : public wxXmlInterface { public: - wxXmlGccInterface() {} - - // !!SPEEDUP-TODO!! - // Using wxXmlDocument::Load as is, all the types contained in the - // the entire gccXML file are stored in memory while parsing; - // however we are only interested to wx's own structs/classes/funcs/etc - // so that we could use the file IDs to avoid loading stuff which does - // not belong to wx. See the very end of the gccXML file: it contains - // a set of nodes referenced by all nodes above. + wxXmlGccInterface() + { + // FIXME: we should retrieve this from the XML file! + // here we suppose the XML was created for the currently-running port + m_portId = wxPlatformInfo::Get().GetPortId(); + } bool Parse(const wxString& filename); bool ParseMethod(const wxXmlNode *p, - const wxStringHashMap& types, + const wxTypeIdHashMap& types, wxMethod& m); + + wxPortId GetInterfacePort() const + { return m_portId; } + + wxString GetInterfacePortName() const + { return wxPlatformInfo::GetPortIdName(m_portId, false); } + +protected: + // the port for which the gcc XML was generated + wxPortId m_portId; }; @@ -305,6 +409,14 @@ public: bool Parse(const wxString& filename); bool ParseCompoundDefinition(const wxString& filename); bool ParseMethod(const wxXmlNode*, wxMethod&, wxString& header); + + // this class can take advantage of the preprocessor output to give + // a minor number of false positive warnings in the final comparison + void AddPreprocessorValue(const wxString& name, const wxString& val) + { m_preproc[name]=val; } + +protected: + wxStringHashMap m_preproc; };