/******************************************************************************* * Copyright (c) 2009 STMicroelectronics. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Xavier Raynaud <xavier.raynaud@st.com> - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.internal.gprof.view.histogram; import java.util.LinkedList; import org.eclipse.cdt.core.IBinaryParser.ISymbol; import org.eclipse.core.runtime.Path; import org.eclipse.linuxtools.binutils.utils.STSymbolManager; import org.eclipse.linuxtools.internal.gprof.symbolManager.CallGraphArc; /** * Node in displayed call graph corresponding to {@link CallGraphArc} * * @author Xavier Raynaud <xavier.raynaud@st.com> */ public class CGArc extends AbstractTreeElement { /** The displayed arc - or function call */ public final CallGraphArc arc; /** * Constructor * @param cat the parent category of this tree node * @param arc the object to display in the tree */ public CGArc(CGCategory cat, CallGraphArc arc) { super(cat); this.arc = arc; } @Override public LinkedList<? extends TreeElement> getChildren() { return null; } @Override public boolean hasChildren() { return false; } @Override public int getCalls() { return arc.getCount(); } @Override public int getSamples() { Object o = this.getParent(); CGCategory category = (CGCategory) o; ISymbol symbol; if (CGCategory.CHILDREN.equals(category.category)) { symbol = arc.child.getSymbol(); } else { symbol = arc.parent.getSymbol(); } return HistFunction.getSamples(symbol); } public String getFunctionName() { Object o = this.getParent(); CGCategory category = (CGCategory) o; ISymbol symbol; if (CGCategory.CHILDREN.equals(category.category)) { symbol = arc.child.getSymbol(); } else { symbol = arc.parent.getSymbol(); } return STSymbolManager.sharedInstance.demangle(symbol, arc.getProject()); } @Override public String getName() { String functionName = getFunctionName(); Path p = new Path(getSourcePath()); return functionName + " (" + p.lastSegment() + ":" + getSourceLine() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } @Override public int getSourceLine() { Object o = this.getParent(); CGCategory category = (CGCategory) o; if (CGCategory.CHILDREN.equals(category.category)) { ISymbol symbol = arc.child.getSymbol(); return STSymbolManager.sharedInstance.getLineNumber(symbol, arc.getProject()); } else { return arc.parentLine; } } @Override public String getSourcePath() { Object o = this.getParent(); CGCategory category = (CGCategory) o; if (CGCategory.CHILDREN.equals(category.category)) { ISymbol symbol = arc.child.getSymbol(); return ((HistRoot)getRoot()).decoder.getFileName(symbol); } else { if (arc.parentPath == null) { return "??"; //$NON-NLS-1$ } return arc.parentPath; } } }