package com.jetbrains.actionscript.profiler.calltree; import com.intellij.openapi.util.Pair; import com.intellij.util.ArrayUtil; import com.jetbrains.actionscript.profiler.sampler.FrameInfo; import gnu.trove.THashSet; import java.util.*; public class CallTree { private final CallTreeNode root; public CallTree() { root = new CallTreeNode(); } CallTree(CallTreeNode root) { this.root = root; } CallTreeNode getRoot() { return root; } public void addFrames(FrameInfo[] frames, long duration) { root.addChildren(Arrays.asList(ArrayUtil.reverseArray(frames)), duration); } /* * @return pair <cumulative time map, self time map> */ public Pair<Map<FrameInfo, Long>, Map<FrameInfo, Long>> getTimeMaps() { return TimeMapBuilder.buildTimeMaps(root, root.getChildren()); } /* * @return pair <cumulative time map, self time map> */ public Pair<Map<FrameInfo, Long>, Map<FrameInfo, Long>> getCallersTimeMaps(FrameInfo[] frames) { List<CallTreeNode> calls = CallerFinder.findCallsByFrames(root, frames); Pair<Map<FrameInfo, Long>, Map<FrameInfo, Long>> timeMaps = TimeMapBuilder.buildTimeMaps(root, calls); Set<FrameInfo> callerNames = getNamesOfNodes(calls); Map<FrameInfo, Long> filteredCountMap = filterMap(timeMaps.getFirst(), callerNames); Map<FrameInfo, Long> filteredSelfTimeMap = filterMap(timeMaps.getSecond(), callerNames); return Pair.create(filteredCountMap, filteredSelfTimeMap); } /* * @return pair <cumulative time map, self time map> */ public Pair<Map<FrameInfo, Long>, Map<FrameInfo, Long>> getCalleesTimeMaps(FrameInfo[] frames) { List<CallTreeNode> calls = CalleeFinder.findCallsByFrameName(root, frames); return TimeMapBuilder.buildTimeMaps(root, calls); } private static Map<FrameInfo, Long> filterMap(Map<FrameInfo, Long> first, Set<FrameInfo> callerNames) { first.keySet().retainAll(callerNames); return first; } private static Set<FrameInfo> getNamesOfNodes(Collection<CallTreeNode> nodes) { THashSet<FrameInfo> names = new THashSet<>(); for (CallTreeNode node : nodes) { names.add(node.getFrameInfo()); } return names; } }