summaryrefslogtreecommitdiffstats
path: root/compilerplugins/clang/store/removeforwardstringdecl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'compilerplugins/clang/store/removeforwardstringdecl.cxx')
-rw-r--r--compilerplugins/clang/store/removeforwardstringdecl.cxx78
1 files changed, 78 insertions, 0 deletions
diff --git a/compilerplugins/clang/store/removeforwardstringdecl.cxx b/compilerplugins/clang/store/removeforwardstringdecl.cxx
new file mode 100644
index 000000000..e7a546a8f
--- /dev/null
+++ b/compilerplugins/clang/store/removeforwardstringdecl.cxx
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * Based on LLVM/Clang.
+ *
+ * This file is distributed under the University of Illinois Open Source
+ * License. See LICENSE.TXT for details.
+ *
+ */
+
+#include "removeforwardstringdecl.hxx"
+
+/*
+This is a rewriter.
+
+Remove all forward declarations of rtl strings. I.e. 'namespace rtl { class OUString; }' etc.
+*/
+
+namespace loplugin
+{
+
+RemoveForwardStringDecl::RemoveForwardStringDecl( CompilerInstance& compiler, Rewriter& rewriter )
+ : FilteringRewritePlugin( compiler, rewriter )
+ {
+ }
+
+void RemoveForwardStringDecl::run()
+ {
+ TraverseDecl( compiler.getASTContext().getTranslationUnitDecl());
+ }
+
+bool RemoveForwardStringDecl::VisitNamespaceDecl( const NamespaceDecl* declaration )
+ {
+ if( ignoreLocation( declaration ))
+ return true;
+ if( declaration->getQualifiedNameAsString() != "rtl" )
+ return true;
+ bool canRemove = true;
+ for( NamespaceDecl::decl_iterator it = declaration->decls_begin();
+ it != declaration->decls_end();
+ ++it )
+ {
+ if( *it != NULL )
+ {
+ if( !tryRemoveStringForwardDecl( *it ))
+ canRemove = false;
+ }
+ }
+ if( canRemove ) // contained only forward decls that we removed
+ removeText( declaration->getSourceRange(), RemoveLineIfEmpty );
+ return true;
+ }
+
+bool RemoveForwardStringDecl::tryRemoveStringForwardDecl( const Decl* decl )
+ {
+ const CXXRecordDecl* classdecl = dyn_cast< CXXRecordDecl >( decl );
+ if( classdecl == NULL )
+ return false;
+ if( !classdecl->isFreeStanding() || classdecl->isCompleteDefinition())
+ return false; // not a simple forward declaration
+ if( classdecl->getName() == "OString" || classdecl->getName() == "OUString"
+ || classdecl->getName() == "OStringBuffer" || classdecl->getName() == "OUStringBuffer"
+ || classdecl->getName() == "OStringHash" || classdecl->getName() == "OUStringHash"
+ || classdecl->getName() == "OStringLiteral" || classdecl->getName() == "OUStringLiteral" )
+ {
+ removeText( SourceRange( classdecl->getOuterLocStart(), classdecl->getLocEnd()),
+ RemoveLineIfEmpty | RemoveWholeStatement );
+ return true;
+ }
+ return false;
+ }
+
+static Plugin::Registration< RemoveForwardStringDecl > X( "removeforwardstringdecl" );
+
+} // namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */