diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2012-11-23 13:41:15 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2012-11-23 14:04:51 +0100 |
commit | 44ea5d14140cccdc77a5fd8e2473804e879880df (patch) | |
tree | 77700e8cddf9176d5bc0604336129c76c22bc824 | |
parent | ae41f950425f8f832e4a41e47c788b45fdbf243b (diff) |
Adding SAL_DEPRECATED_INTERNAL to an implementation function is pointless
...as there are typically no direct calls to it anyway. What is apparently
needed is to decorate the cppumaker-generated headers instead:
* cppumaker obtains deprecation-information from the documentation strings in
.rdb files. As these are normally generated by idlc without documentation
included (no -C), idlc got changed to nevertheless contain documentation
consisting of just "@deprecated" in this case, to allow to easily tunnel this
information to cppumaker always.
* The mechanism of parsing for "@deprecated" in documentation strings is
somewhat crude, of course.
* For now, cppumaker only decorates C++ functions that correspond to UNOIDL
interface attributes and methods. More should be possible (but, e.g., being
able to decorate a complete C++ class corresponding to a deprecated UNOIDL
interface type depends on whether all platforms would accept
SAL_DEPRECATED_INTERNAL at the same position in a C++ class declaration.
* This could also be extended to other languages than C++/cppumaker.
* Always using SAL_DEPRECATED_INERNAL instead of SAL_DEPRECATED for decoration
is to keep things simple and our codebase working. Improvements are possible
here, too, of course.
Change-Id: Ia2917892f780d477652e4cd9f286588a6898c3f5
-rw-r--r-- | codemaker/source/cppumaker/cpputype.cxx | 35 | ||||
-rw-r--r-- | codemaker/source/cppumaker/cpputype.hxx | 1 | ||||
-rw-r--r-- | cppuhelper/inc/cppuhelper/weakagg.hxx | 1 | ||||
-rw-r--r-- | idlc/inc/idlc/idlc.hxx | 2 | ||||
-rw-r--r-- | idlc/source/astdeclaration.cxx | 3 | ||||
-rw-r--r-- | idlc/source/idlc.cxx | 16 |
6 files changed, 47 insertions, 11 deletions
diff --git a/codemaker/source/cppumaker/cpputype.cxx b/codemaker/source/cppumaker/cpputype.cxx index eca01435a4e2..149653f2e757 100644 --- a/codemaker/source/cppumaker/cpputype.cxx +++ b/codemaker/source/cppumaker/cpputype.cxx @@ -1354,6 +1354,22 @@ OString CppuType::indent() const //************************************************************************* // InterfaceType //************************************************************************* + +namespace { + +bool isDocumentedDeprecated(OUString const & documentation) { + return documentation.indexOf("@deprecated") != -1; + //TODO: this check is somewhat crude +} + +void dumpDeprecation(FileStream & o, bool deprecated) { + if (deprecated) { + o << "SAL_DEPRECATED_INTERNAL(\"marked @deprecated in UNOIDL\") "; + } +} + +} + InterfaceType::InterfaceType(typereg::Reader& typeReader, const OString& typeName, const TypeManager& typeMgr) @@ -1362,6 +1378,7 @@ InterfaceType::InterfaceType(typereg::Reader& typeReader, m_inheritedMemberCount = 0; m_hasAttributes = false; m_hasMethods = false; + m_isDeprecated = isDocumentedDeprecated(m_reader.getDocumentation()); } InterfaceType::~InterfaceType() @@ -1465,13 +1482,18 @@ void InterfaceType::dumpAttributes(FileStream& o) fieldType = rtl::OUStringToOString( m_reader.getFieldTypeName(i), RTL_TEXTENCODING_UTF8); + bool depr = m_isDeprecated + || isDocumentedDeprecated(m_reader.getFieldDocumentation(i)); + if (first) { first = sal_False; o << "\n" << indent() << "// Attributes\n"; } - o << indent() << "virtual "; + o << indent(); + dumpDeprecation(o, depr); + o << "virtual "; dumpType(o, fieldType); o << " SAL_CALL get" << fieldName << "()"; dumpAttributeExceptionSpecification(o, name, RT_MODE_ATTRIBUTE_GET); @@ -1480,7 +1502,9 @@ void InterfaceType::dumpAttributes(FileStream& o) if ((access & RT_ACCESS_READONLY) == 0) { bool byRef = passByReference(fieldType); - o << indent() << "virtual void SAL_CALL set" << fieldName << "( "; + o << indent(); + dumpDeprecation(o, depr); + o << "virtual void SAL_CALL set" << fieldName << "( "; dumpType(o, fieldType, byRef, byRef); o << " _" << fieldName.toAsciiLowerCase() << " )"; dumpAttributeExceptionSpecification(o, name, RT_MODE_ATTRIBUTE_SET); @@ -1529,7 +1553,12 @@ void InterfaceType::dumpMethods(FileStream& o) o << "\n" << indent() << "// Methods\n"; } - o << indent() << "virtual "; + o << indent(); + dumpDeprecation( + o, + (m_isDeprecated + || isDocumentedDeprecated(m_reader.getMethodDocumentation(i)))); + o << "virtual "; dumpType(o, returnType); o << " SAL_CALL " << methodName << "( "; for (sal_uInt16 j=0; j < paramCount; j++) diff --git a/codemaker/source/cppumaker/cpputype.hxx b/codemaker/source/cppumaker/cpputype.hxx index a2781cba2557..12abd54cf958 100644 --- a/codemaker/source/cppumaker/cpputype.hxx +++ b/codemaker/source/cppumaker/cpputype.hxx @@ -191,6 +191,7 @@ protected: sal_uInt32 m_inheritedMemberCount; bool m_hasAttributes; bool m_hasMethods; + bool m_isDeprecated; private: void dumpExceptionSpecification( diff --git a/cppuhelper/inc/cppuhelper/weakagg.hxx b/cppuhelper/inc/cppuhelper/weakagg.hxx index f4ae380a7218..094e178ec222 100644 --- a/cppuhelper/inc/cppuhelper/weakagg.hxx +++ b/cppuhelper/inc/cppuhelper/weakagg.hxx @@ -79,7 +79,6 @@ public: @param Delegator the object that delegate its queryInterface to this aggregate. */ - SAL_DEPRECATED_INTERNAL("do not use XAggregation") virtual void SAL_CALL setDelegator( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & Delegator ) throw(::com::sun::star::uno::RuntimeException); /** Called by the delegator or queryInterface. Re-implement this method instead of diff --git a/idlc/inc/idlc/idlc.hxx b/idlc/inc/idlc/idlc.hxx index df110603425f..30f54362b4bf 100644 --- a/idlc/inc/idlc/idlc.hxx +++ b/idlc/inc/idlc/idlc.hxx @@ -78,7 +78,7 @@ public: m_documentation = documentation; m_bIsDocValid = sal_True; } - sal_Bool isDocValid(); + OUString processDocumentation(); sal_Bool isInMainFile() { return m_bIsInMainfile; } void setInMainfile(sal_Bool bInMainfile) diff --git a/idlc/source/astdeclaration.cxx b/idlc/source/astdeclaration.cxx index 7a1bf314b3ed..ef0996323153 100644 --- a/idlc/source/astdeclaration.cxx +++ b/idlc/source/astdeclaration.cxx @@ -76,8 +76,7 @@ AstDeclaration::AstDeclaration(NodeType type, const OString& name, AstScope* pSc m_bImported = sal_True; } - if ( idlc()->isDocValid() ) - m_documentation = OStringToOUString(idlc()->getDocumentation(), RTL_TEXTENCODING_UTF8); + m_documentation = idlc()->processDocumentation(); m_bPublished = idlc()->isPublished(); } diff --git a/idlc/source/idlc.cxx b/idlc/source/idlc.cxx index a064e7b1d4a3..895a54554ff6 100644 --- a/idlc/source/idlc.cxx +++ b/idlc/source/idlc.cxx @@ -274,11 +274,19 @@ void Idlc::reset() m_includes.clear(); } -sal_Bool Idlc::isDocValid() +OUString Idlc::processDocumentation() { - if ( m_bGenerateDoc ) - return m_bIsDocValid; - return sal_False;; + OUString doc; + if (m_bIsDocValid) { + OString raw(getDocumentation()); + if (m_bGenerateDoc) { + doc = OStringToOUString(raw, RTL_TEXTENCODING_UTF8); + } else if (raw.indexOf("@deprecated") != -1) { + //TODO: this check is somewhat crude + doc = "@deprecated"; + } + } + return doc; } static void lcl_writeString(::osl::File & rFile, ::osl::FileBase::RC & o_rRC, |