Set
我的代码使用ASM生成可以从给定起始集MethodNode
调用的所有潜在entries
的{{1}}。但是,我想以功能的方式重写它。集合的重复映射看起来绝对是递归的,尽管我无法完全理解如何去做。
我想出了这个,虽然它使用了稍微不同(但工作?)的逻辑。是否可以使用尾调用递归来编写它?
private def gatherMethods(current: Set[MethodNode]): Set[MethodNode] = {
val next = current.flatMap(
_.instructions.iterator.asScala
.flatMap(_ match {
case m:MethodInsnNode => Some(MethodCall(m.owner, m.name, m.desc))
case _ => None
})
).toSet.flatMap(findMethod _)
if(next == current) Set()
else current.union(gatherMethods(next))
}