blob: 28b411f928292f6dcb3f2e60c8dc961626aa5f14 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2016 Symbian Software Systems and others.
* 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:
* Symbian - Initial implementation
*******************************************************************************/
package org.eclipse.cdt.internal.pdom.tests;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMNode;
import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.internal.core.index.CIndex;
import org.eclipse.cdt.internal.core.index.IIndexFragment;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.core.runtime.CoreException;
/**
* Dump the contents of the PDOM index to stdout (for when you need
* a low-fidelity debugging tool)
*/
public class PDOMPrettyPrinter implements IPDOMVisitor {
StringBuilder indent = new StringBuilder();
final String step = " "; //$NON-NLS-1$
@Override
public void leave(IPDOMNode node) throws CoreException {
// if (node instanceof PDOMCPPClassTemplate) {
// ((PDOMCPPClassTemplate) node).specializationsAccept(this);
// }
if (indent.length() >= step.length())
indent.setLength(indent.length() - step.length());
}
@Override
public boolean visit(IPDOMNode node) throws CoreException {
indent.append(step);
StringBuilder sb= new StringBuilder();
sb.append(indent);
sb.append(node);
if (node instanceof PDOMBinding) {
sb.append(" ");
PDOMBinding binding= (PDOMBinding) node;
sb.append(' ').append(binding.getRecord());
}
System.out.println(sb);
return true;
}
/**
* Dumps the contents of the specified linkage for all primary fragments of the specified index
* to standard out, including file local scopes.
* @param index
* @param linkageID
*/
public static void dumpLinkage(IIndex index, final int linkageID) {
final IPDOMVisitor v= new PDOMPrettyPrinter();
IIndexFragment[] frg= ((CIndex) index).getFragments();
for (IIndexFragment element : frg) {
final PDOM pdom = (PDOM) element;
dumpLinkage(pdom, linkageID, v);
}
}
public static void dumpLinkage(PDOM pdom, final int linkageID) {
final IPDOMVisitor v= new PDOMPrettyPrinter();
dumpLinkage(pdom, linkageID, v);
}
private static void dumpLinkage(final PDOM pdom, final int linkageID, final IPDOMVisitor v) {
try {
final PDOMLinkage linkage = pdom.getLinkage(linkageID);
if (linkage != null) {
linkage.getIndex().accept(new IBTreeVisitor() {
@Override
public int compare(long record) throws CoreException {
return 0;
}
@Override
public boolean visit(long record) throws CoreException {
if (record == 0)
return false;
PDOMNode node = PDOMNode.load(pdom, record);
if (v.visit(node))
node.accept(v);
v.leave(node);
return true;
}
});
}
} catch (CoreException e) {
CCorePlugin.log(e);
}
}
}