root <- '/bundle'
paths <- list.files(root, recursive=TRUE, full.names=TRUE)
paths <- paths[endsWith(paths,'.R')]
names_found <- character()
walk <- function(x) {
 if (is.call(x)) {
  h <- x[[1]]
  if (is.symbol(h)) names_found <<- union(names_found,as.character(h))
  else names_found <<- union(names_found,paste(deparse(h),collapse=' '))
  for (a in as.list(x)[-1]) try(walk(a),silent=TRUE)
 } else if (is.expression(x) || is.pairlist(x)) for (a in as.list(x)) try(walk(a),silent=TRUE)
}
for (p in paths) {
 parsed <- parse(p, keep.source=TRUE);walk(parsed)
 cat(p,':',length(parsed),'top-level expressions; syntax valid\n')
}
cat('\nALL CALL HEADS\n');cat(sort(names_found),sep='\n')
