From 17c1272b2a545a0a4a001065bf8e2898d6fc6f7e Mon Sep 17 00:00:00 2001 From: Date: Thu, 12 Oct 2017 10:18:06 +1300 Subject: [PATCH 1/6] Add support for castxml and MSVC --- Cable/CxxTypes/cxxUtils.h | 2 +- Cable/Parsers/cableUtils.h | 2 +- Cable/Parsers/cableXMLSourceParser.cxx | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Cable/CxxTypes/cxxUtils.h b/Cable/CxxTypes/cxxUtils.h index 319919d..2c8c099 100644 --- a/Cable/CxxTypes/cxxUtils.h +++ b/Cable/CxxTypes/cxxUtils.h @@ -29,7 +29,7 @@ #endif // Visual C++ for-loop scoping hack. -#ifdef _MSC_VER +#if defined(_MSC_VER) && _MSC_VER < 1700 #ifndef for #define for if(false) {} else for #endif diff --git a/Cable/Parsers/cableUtils.h b/Cable/Parsers/cableUtils.h index 4341e08..8ec69ed 100644 --- a/Cable/Parsers/cableUtils.h +++ b/Cable/Parsers/cableUtils.h @@ -36,7 +36,7 @@ // Visual C++ for-loop scoping hack. We can use this inside the CABLE // application without interfering with user code. -#ifdef _MSC_VER +#if defined(_MSC_VER) && _MSC_VER < 1700 #ifndef for #define for if(false) {} else for #endif diff --git a/Cable/Parsers/cableXMLSourceParser.cxx b/Cable/Parsers/cableXMLSourceParser.cxx index 2360faf..568bcb2 100644 --- a/Cable/Parsers/cableXMLSourceParser.cxx +++ b/Cable/Parsers/cableXMLSourceParser.cxx @@ -579,6 +579,14 @@ bool XMLSourceParser::SetupNamed(XMLSourceElement* element, Named* named) { named->SetName("{anonymous-constructor}"); } + else if (Destructor::SafeDownCast(named)) + { + named->SetName("{anonymous-destructor}"); + } + else if (Converter::SafeDownCast(named)) + { + named->SetName("{operator}"); + } else { cableErrorMacro("No name on Named object " << named->GetNameOfClass()); From 51e1aab7cb84b619274e36b8168bb01ab52f4d2f Mon Sep 17 00:00:00 2001 From: Todd Martin Date: Wed, 1 Nov 2017 11:32:10 +1300 Subject: [PATCH 2/6] Fix files for CMake >3.1 --- Cable/CMakeLists.txt | 2 +- GCC_XML/KWSys/CMakeLists.txt | 2 +- GCC_XML/KWSys/kwsysPlatformTests.cmake | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cable/CMakeLists.txt b/Cable/CMakeLists.txt index d4ef449..d0c8375 100644 --- a/Cable/CMakeLists.txt +++ b/Cable/CMakeLists.txt @@ -1,4 +1,4 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 1.4) +CMAKE_MINIMUM_REQUIRED(VERSION 2.4) IF (CMAKE_MAJOR_VERSION MATCHES "^1$") IF (CMAKE_MINOR_VERSION MATCHES "^[56]$") diff --git a/GCC_XML/KWSys/CMakeLists.txt b/GCC_XML/KWSys/CMakeLists.txt index ca496ab..3a3ea66 100644 --- a/GCC_XML/KWSys/CMakeLists.txt +++ b/GCC_XML/KWSys/CMakeLists.txt @@ -243,7 +243,7 @@ STRING(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}" KWSYS_IN_SOURCE_BUILD) IF(NOT KWSYS_IN_SOURCE_BUILD) CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/kwsysPrivate.h - ${PROJECT_BINARY_DIR}/kwsysPrivate.h COPY_ONLY IMMEDIATE) + ${PROJECT_BINARY_DIR}/kwsysPrivate.h COPYONLY IMMEDIATE) ENDIF(NOT KWSYS_IN_SOURCE_BUILD) # Select plugin module file name convention. diff --git a/GCC_XML/KWSys/kwsysPlatformTests.cmake b/GCC_XML/KWSys/kwsysPlatformTests.cmake index d042450..fce1983 100644 --- a/GCC_XML/KWSys/kwsysPlatformTests.cmake +++ b/GCC_XML/KWSys/kwsysPlatformTests.cmake @@ -13,7 +13,7 @@ SET(KWSYS_PLATFORM_TEST_FILE_C kwsysPlatformTestsC.c) SET(KWSYS_PLATFORM_TEST_FILE_CXX kwsysPlatformTestsCXX.cxx) MACRO(KWSYS_PLATFORM_TEST lang var description invert) - IF("${var}_COMPILED" MATCHES "^${var}_COMPILED$") + IF(${var}_COMPILED MATCHES ^${var}_COMPILED$) MESSAGE(STATUS "${description}") TRY_COMPILE(${var}_COMPILED ${CMAKE_CURRENT_BINARY_DIR} @@ -42,7 +42,7 @@ MACRO(KWSYS_PLATFORM_TEST lang var description invert) MESSAGE(STATUS "${description} - no") ENDIF(${var}_COMPILED) ENDIF(${invert} MATCHES INVERT) - ENDIF("${var}_COMPILED" MATCHES "^${var}_COMPILED$") + ENDIF(${var}_COMPILED MATCHES ^${var}_COMPILED$) IF(${invert} MATCHES INVERT) IF(${var}_COMPILED) SET(${var} 0) @@ -59,7 +59,7 @@ MACRO(KWSYS_PLATFORM_TEST lang var description invert) ENDMACRO(KWSYS_PLATFORM_TEST) MACRO(KWSYS_PLATFORM_TEST_RUN lang var description invert) - IF("${var}" MATCHES "^${var}$") + IF(${var} MATCHES ^${var}$) MESSAGE(STATUS "${description}") TRY_RUN(${var} ${var}_COMPILED ${CMAKE_CURRENT_BINARY_DIR} @@ -106,7 +106,7 @@ MACRO(KWSYS_PLATFORM_TEST_RUN lang var description invert) MESSAGE(STATUS "${description} - failed to compile") ENDIF(${var}_COMPILED) ENDIF(${invert} MATCHES INVERT) - ENDIF("${var}" MATCHES "^${var}$") + ENDIF(${var} MATCHES ^${var}$) IF(${invert} MATCHES INVERT) IF(${var}_COMPILED) @@ -150,7 +150,7 @@ ENDMACRO(KWSYS_PLATFORM_C_TEST_RUN) MACRO(KWSYS_PLATFORM_CXX_TEST var description invert) SET(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_CXX_TEST_DEFINES}) SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_CXX_TEST_EXTRA_FLAGS}) - KWSYS_PLATFORM_TEST(CXX "${var}" "${description}" "${invert}") + KWSYS_PLATFORM_TEST(CXX ${var} ${description} ${invert}) SET(KWSYS_PLATFORM_TEST_DEFINES) SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS) ENDMACRO(KWSYS_PLATFORM_CXX_TEST) @@ -158,7 +158,7 @@ ENDMACRO(KWSYS_PLATFORM_CXX_TEST) MACRO(KWSYS_PLATFORM_CXX_TEST_RUN var description invert) SET(KWSYS_PLATFORM_TEST_DEFINES ${KWSYS_PLATFORM_CXX_TEST_DEFINES}) SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS ${KWSYS_PLATFORM_CXX_TEST_EXTRA_FLAGS}) - KWSYS_PLATFORM_TEST_RUN(CXX "${var}" "${description}" "${invert}") + KWSYS_PLATFORM_TEST_RUN(CXX ${var} ${description} ${invert}) SET(KWSYS_PLATFORM_TEST_DEFINES) SET(KWSYS_PLATFORM_TEST_EXTRA_FLAGS) ENDMACRO(KWSYS_PLATFORM_CXX_TEST_RUN) From 909e5d05c613eb9a1c6e75fef41fc55d859d1842 Mon Sep 17 00:00:00 2001 From: Todd Martin Date: Wed, 1 Nov 2017 15:33:14 +1300 Subject: [PATCH 3/6] Add "override" property to Cable methods for virtual overridden methods. --- Cable/Parsers/cableMethod.cxx | 12 ++++++++++++ Cable/Parsers/cableMethod.h | 7 +++++++ Cable/Parsers/cableXMLSourceParser.cxx | 7 +++++++ 3 files changed, 26 insertions(+) diff --git a/Cable/Parsers/cableMethod.cxx b/Cable/Parsers/cableMethod.cxx index dd4dddd..4036a6a 100644 --- a/Cable/Parsers/cableMethod.cxx +++ b/Cable/Parsers/cableMethod.cxx @@ -89,6 +89,18 @@ void Method::SetPureVirtual(bool s) m_PureVirtual = s; } +//---------------------------------------------------------------------------- +bool Method::GetOverride() const +{ + return m_Override; +} + +//---------------------------------------------------------------------------- +void Method::SetOverride(bool s) +{ + m_Override = s; +} + //---------------------------------------------------------------------------- void Method::Print(std::ostream& os, Indent indent) const { diff --git a/Cable/Parsers/cableMethod.h b/Cable/Parsers/cableMethod.h index 52a8afc..28133c5 100644 --- a/Cable/Parsers/cableMethod.h +++ b/Cable/Parsers/cableMethod.h @@ -44,6 +44,10 @@ class CABLE_PARSERS_EXPORT Method: public Function bool GetPureVirtual() const; void SetPureVirtual(bool s); + /** Get/Set whether the method is overridden. */ + bool GetOverride() const; + void SetOverride(bool s); + /** Get/Set whether the method is const. */ bool GetConst() const; void SetConst(bool c); @@ -61,6 +65,9 @@ class CABLE_PARSERS_EXPORT Method: public Function // Whether or not the method is virtual. bool m_Virtual; + // Whether or not the method is overridden. + bool m_Override; + // Whether or not the method is static. bool m_Static; diff --git a/Cable/Parsers/cableXMLSourceParser.cxx b/Cable/Parsers/cableXMLSourceParser.cxx index 568bcb2..a8e5739 100644 --- a/Cable/Parsers/cableXMLSourceParser.cxx +++ b/Cable/Parsers/cableXMLSourceParser.cxx @@ -1356,9 +1356,15 @@ SourceObject* XMLSourceParser::AddMethod(XMLSourceElement* element) bool isStatic = false; bool isVirtual = false; bool isPureVirtual = false; + bool isOverride = false; const char* virtualAttr = element->GetAttribute("virtual"); if(virtualAttr && (String(virtualAttr) == "1")) { isVirtual = true; } + if (isVirtual) + { + const char* overridesAttr = element->GetAttribute("overrides"); + if (overridesAttr && (String(overridesAttr) != "")) { isOverride = true; } + } const char* pureVirtualAttr = element->GetAttribute("pure_virtual"); if(pureVirtualAttr && (String(pureVirtualAttr) == "1")) { isPureVirtual = true; } @@ -1389,6 +1395,7 @@ SourceObject* XMLSourceParser::AddMethod(XMLSourceElement* element) m->SetStatic(isStatic); m->SetVirtual(isVirtual); m->SetPureVirtual(isPureVirtual); + m->SetOverride(isOverride); // Add the FunctionType element with a dummy id. String fid = element->GetId(); From 8e81b7b5e4d127f7ba45aa24cefff87f00e9bfd0 Mon Sep 17 00:00:00 2001 From: Todd Martin <15134761+todoooo@users.noreply.github.com> Date: Tue, 27 Mar 2018 18:58:16 +1300 Subject: [PATCH 4/6] Switch decayed pointer types to their original (array/function) types --- Cable/Parsers/cableXMLSourceParser.cxx | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/Cable/Parsers/cableXMLSourceParser.cxx b/Cable/Parsers/cableXMLSourceParser.cxx index a8e5739..4e2ca9f 100644 --- a/Cable/Parsers/cableXMLSourceParser.cxx +++ b/Cable/Parsers/cableXMLSourceParser.cxx @@ -708,13 +708,24 @@ bool XMLSourceParser::SetupFunctionType(XMLSourceElement* element, XMLSourceElement* argElement = element->GetNestedElement(i); if(String(argElement->GetName()) == "Argument") { - const char* typeId = argElement->GetAttribute("type"); - if(!typeId) - { - cableErrorMacro("No type attribute on Argument " << i << " in " - << element->GetName() << " " << element->GetId()); - return false; - } + const char* typeId; + const char* originaltypeId = argElement->GetAttribute("original_type"); + if (originaltypeId) + { + //when arrays and functions decay to a pointer type, then swap the type for the original + typeId = originaltypeId; + } + else + { + typeId = argElement->GetAttribute("type"); + if (!typeId) + { + cableErrorMacro("No type attribute on Argument " << i << " in " + << element->GetName() << " " << element->GetId()); + return false; + } + } + Type* argType = this->GetTypeFromId(typeId); if(!argType) { From 392d8166b1c82f4660858f27eab4e63ad348791d Mon Sep 17 00:00:00 2001 From: Todd Martin <15134761+todoooo@users.noreply.github.com> Date: Sat, 28 Apr 2018 20:14:06 +1200 Subject: [PATCH 5/6] Fix array length text --- Cable/CxxTypes/cxxArrayType.cxx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Cable/CxxTypes/cxxArrayType.cxx b/Cable/CxxTypes/cxxArrayType.cxx index 28c000d..58147ff 100644 --- a/Cable/CxxTypes/cxxArrayType.cxx +++ b/Cable/CxxTypes/cxxArrayType.cxx @@ -87,8 +87,11 @@ String ArrayType::GenerateDeclaration(const String& name, */ String ArrayType::GenerateLengthString() const { - char buf[128]; - sprintf(buf, "%lu", m_Length); + char buf[128] = ""; + if (m_Length > 0) + { + sprintf(buf, "%lu", m_Length); + } return buf; } From d7bf39f5d3b27fcf067ad2bf4139578fc758be13 Mon Sep 17 00:00:00 2001 From: Todd Martin <15134761+todoooo@users.noreply.github.com> Date: Sun, 16 Dec 2018 17:35:08 +1300 Subject: [PATCH 6/6] Add GetIndexOf(argname) to FunctionType --- Cable/Parsers/cableFunctionType.cxx | 13 +++++++++++++ Cable/Parsers/cableFunctionType.h | 5 ++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Cable/Parsers/cableFunctionType.cxx b/Cable/Parsers/cableFunctionType.cxx index 9532018..7abc26f 100644 --- a/Cable/Parsers/cableFunctionType.cxx +++ b/Cable/Parsers/cableFunctionType.cxx @@ -142,6 +142,19 @@ unsigned int FunctionType::GetNumberOfRequiredArguments() const return m_RequiredArguments; } +//---------------------------------------------------------------------------- +int FunctionType::GetIndexOf(const std::string& argname) const +{ + int result = -1; + std::vector::iterator iterator = std::find(m_ArgumentNameVector.begin(), m_ArgumentNameVector.end(), argname); + if (iterator != m_ArgumentNameVector.end()) + { + result = iterator - m_ArgumentNameVector.begin(); + } + + return result; +} + //---------------------------------------------------------------------------- Type* FunctionType::GetArgument(unsigned int index) const { diff --git a/Cable/Parsers/cableFunctionType.h b/Cable/Parsers/cableFunctionType.h index 4058319..74f4ddd 100644 --- a/Cable/Parsers/cableFunctionType.h +++ b/Cable/Parsers/cableFunctionType.h @@ -52,7 +52,10 @@ class CABLE_PARSERS_EXPORT FunctionType: public Type /** Get the number of arguments without default values. */ unsigned int GetNumberOfRequiredArguments() const; - + + /** Get the index of an argument by name */ + int GetIndexOf(const std::string& argname) const; + /** Get the argument with the given index. */ Type* GetArgument(unsigned int index) const;