[cfe-dev] AST matcher: ForEach FunctionDecl -> ParmVarDecl
    Stephen Kelly via cfe-dev 
    cfe-dev at lists.llvm.org
       
    Sun Dec 30 06:41:31 PST 2018
    
    
  
On 30/12/2018 14:00, FarSight Studios via cfe-dev wrote:
> I am trying to match call expressions where the caller arguments are the 
> parameters of another, outer function.
You need to write your own matcher.
These untested/uncompiled snippets should get you started:
bool callArgsAreFuncParams(CallExpr const& C, FunctionDecl const& F)
{
     // TODO: Handle variadic args
     // TODO: Handle default arguments in call
     if (C.argumentCount() != F.parameterCount())
         return false;
     for (auto i = 0; i < C.argumentCount(); ++i)
     {
         if (C.getArg(i).getDecl() != F.getParameter(i))
             return false;
     }
     return true;
}
AST_MATCHER(CallExpr, forwardsAllParameters) {
   const auto &Parents = Finder->getASTContext().getParents(Node, true);
   llvm::SmallVector<ast_type_traits::DynTypedNode, 8> 
Stack(Parents.begin(),
                                                             Parents.end());
   while(!Stack.empty()) {
     const auto &CurNode = Stack.back();
     Stack.pop_back();
     if(const auto *FuncDeclNode = CurNode.get<FunctionDecl>()) {
       if (callArgsAreFuncParams(Node, *FuncDeclNode))
         return true;
     } else if(const auto *LambdaExprNode = CurNode.get<LambdaExpr>()) {
       if (callArgsAreFuncParams(Node, *LambdaExprNode->getCallOperator()))
         return true;
     } else {
       for (const auto &Parent :
            Finder->getASTContext().getParents(CurNode, true))
         Stack.push_back(Parent);
     }
   }
   return false;
}
auto fullMatcher =  callExpr(
     forwardsAllParameters(),
     forFunction(functionDecl().bind("outerFunction"))
     ).bind("innerCall")
It would also be possible to design the matcher such that it is used 
like this:
  forwardsAllParametersFrom(functionDecl().bind("outerFunction"))
That's left as an exercise for the reader.
Thanks,
Stephen.
    
    
More information about the cfe-dev
mailing list