问题描述
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")))))))))))