clang-query:检查函数参数类型的模板参数的名称

问题描述

我有一个大项目,以及大量的 C++ 类成员函数

Return cclass::MemberFunction(
   Arg1 arg1,//...
   std::weak_ptr<IMemberFunctionListenerInterface> listener) {
//...
}

我正在尝试编写一个匹配器来查找此类函数,这些函数的参数类型在其名称中包含字符串“Listener”。

我可以找到参数类型在其名称中包含“weak_ptr”的函数

clang-query> m cxxMethodDecl(hasAnyParameter(hasType(cxxRecordDecl(matchesName("weak_ptr")))))

这和上面的函数匹配得很好。但是,如果我将 "weak_ptr" 更改为 "Listener",则该函数不再匹配。我猜这是因为它是 std::weak_ptr 类模板的模板参数的名称

我已经尝试了这个查询的许多不同变体,但我没有找到与我感兴趣的函数相匹配的那个。

有什么指点吗?

解决方法

一行:

/**
 * @param {Number} key 
 * @param {Array} array 
 * @returns {Object}
 */
function findObj(key,array) {
  for (const item of array) {
    if (item.key === key) {
      return item
    } 
    else if (item.children) {
      const foundChildren = findObj(key,item.children)
      if (foundChildren) return foundChildren
    }
  }
  return null
}

/**
 * @param {Object} obj 
 * @param {Array} array 
 * @returns Boolean
 */
function saveEditing(obj,array) {
  const foundObj = obj.key && findObj(obj.key,array)
  if (foundObj) {
    Object.assign(foundObj,{...obj})
    return true
  }
  return false
}

clang 格式:

clang-query> m cxxMethodDecl(hasAnyParameter(hasType(allOf(cxxRecordDecl(matchesName("weak_ptr")),classTemplateSpecializationDecl(hasTemplateArgument(0,templateArgument(refersToType(hasDeclaration(cxxRecordDecl(matchesName(".*Listener")))))))))))