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
This commit is contained in:
Stephan Bergmann
2012-11-23 14:04:51 +01:00
parent ae41f95042
commit 44ea5d1414
6 changed files with 47 additions and 11 deletions
+32 -3
View File
@@ -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++)
+1
View File
@@ -191,6 +191,7 @@ protected:
sal_uInt32 m_inheritedMemberCount;
bool m_hasAttributes;
bool m_hasMethods;
bool m_isDeprecated;
private:
void dumpExceptionSpecification(
-1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -2
View File
@@ -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();
}
+12 -4
View File
@@ -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,