From 80f35256261bb7303a6aa9ce2145e7a16c9b4721 Mon Sep 17 00:00:00 2001 From: Vassil Vassilev Date: Sat, 13 Feb 2016 17:24:51 +0100 Subject: [PATCH] Teach TemplateNonTypeArgToInt to replace template params, too. --- clang_delta/RewriteUtils.cpp | 7 +++++++ clang_delta/RewriteUtils.h | 14 ++++++++++++++ clang_delta/TemplateNonTypeArgToInt.cpp | 12 +++++++++--- clang_delta/test/TemplateNonTypeArgToInt.cpp | 12 ++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 clang_delta/test/TemplateNonTypeArgToInt.cpp diff --git a/clang_delta/RewriteUtils.cpp b/clang_delta/RewriteUtils.cpp index 57f7ac84..e4d958eb 100644 --- a/clang_delta/RewriteUtils.cpp +++ b/clang_delta/RewriteUtils.cpp @@ -882,6 +882,13 @@ bool RewriteUtils::replaceNamedDeclName(const NamedDecl *ND, ND->getNameAsString().size(), NameStr)); } +bool RewriteUtils::replaceValueDecl(const ValueDecl *VD, const std::string &Str) +{ + SourceRange Range = VD->getSourceRange(); + unsigned RangeSize = TheRewriter->getRangeSize(Range); + return !(TheRewriter->ReplaceText(Range.getBegin(), RangeSize, Str)); +} + bool RewriteUtils::replaceVarDeclName(VarDecl *VD, const std::string &NameStr) { diff --git a/clang_delta/RewriteUtils.h b/clang_delta/RewriteUtils.h index 50b9400a..d2049014 100644 --- a/clang_delta/RewriteUtils.h +++ b/clang_delta/RewriteUtils.h @@ -49,6 +49,7 @@ namespace clang { class ClassTemplateDecl; class CXXMethodDecl; class NestedNameSpecifierLoc; + class ValueDecl; } class RewriteUtils { @@ -203,6 +204,19 @@ class RewriteUtils { bool replaceNamedDeclName(const clang::NamedDecl *ND, const std::string &NameStr); + ///\brief Replaces a value decl with a given string. + /// + ///For example: \code + /// enum E {...}; + /// template struct S { } => template struct S { } + ///\endcode + /// + ///\param[in] VD - The decl to be replaced. + ///\param[in] Str - The replacement + ///\returns true on success. + /// + bool replaceValueDecl(const clang::ValueDecl *ValD, const std::string &Str); + bool replaceCXXDtorCallExpr(const clang::CXXMemberCallExpr *CE, std::string &Name); diff --git a/clang_delta/TemplateNonTypeArgToInt.cpp b/clang_delta/TemplateNonTypeArgToInt.cpp index b4dd9147..e8400444 100644 --- a/clang_delta/TemplateNonTypeArgToInt.cpp +++ b/clang_delta/TemplateNonTypeArgToInt.cpp @@ -105,8 +105,8 @@ void TemplateNonTypeArgToInt::HandleTranslationUnit(ASTContext &Ctx) } Ctx.getDiagnostics().setSuppressAllDiagnostics(false); - TransAssert(TheExpr && "NULL TheExpr"); - RewriteHelper->replaceExpr(TheExpr, IntString); + if (TheExpr) + RewriteHelper->replaceExpr(TheExpr, IntString); if (Ctx.getDiagnostics().hasErrorOccurred() || Ctx.getDiagnostics().hasFatalErrorOccurred()) @@ -219,8 +219,14 @@ void TemplateNonTypeArgToInt::handleOneTemplateDecl(const TemplateDecl *D) for (TemplateParameterList::const_iterator I = TPList->begin(), E = TPList->end(); I != E; ++I) { const NamedDecl *ParamND = (*I); - if (isValidParameter(ParamND)) + if (isValidParameter(ParamND)) { ValidParamIdx->insert(Idx); + if (const ValueDecl* ValD = dyn_cast(ParamND)) { + ++ValidInstanceNum; + RewriteHelper->replaceValueDecl(ValD, + "int " + ParamND->getNameAsString()); + } + } Idx++; } diff --git a/clang_delta/test/TemplateNonTypeArgToInt.cpp b/clang_delta/test/TemplateNonTypeArgToInt.cpp new file mode 100644 index 00000000..fa46b7e1 --- /dev/null +++ b/clang_delta/test/TemplateNonTypeArgToInt.cpp @@ -0,0 +1,12 @@ +//RUN: %clang_delta --transformation=template-non-type-arg-to-int --counter=1 %s | FileCheck %s + +enum _Lock_policy { _S_atomic } const __default_lock_policy = _S_atomic; +template <_Lock_policy _Lp> class __shared_count { +public: + template __shared_count(_Ptr __p) { } +}; + +//CHECK: template class __shared_count { +//CHECK-NEXT: public: +//CHECK-NEXT: template __shared_count(_Ptr __p) { } +//CHECK-NEXT: };