/*
* This file is part of the X10 project (http://x10-lang.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* This file was originally derived from the Polyglot extensible compiler framework.
*
* (C) Copyright 2000-2007 Polyglot project group, Cornell University
* (C) Copyright IBM Corporation 2007-2012.
*/
package polyglot.util;
import polyglot.util.*;
import polyglot.visit.NodeVisitor;
import polyglot.ast.Node;
import polyglot.types.*;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import x10.util.CollectionFactory;
public class ObjectDumper {
CodeWriter w;
int modifiersMask;
public ObjectDumper(CodeWriter w) {
this(w, Modifier.TRANSIENT | Modifier.STATIC);
}
public ObjectDumper(CodeWriter w, int modifiersMask) {
this.w = w;
this.modifiersMask = modifiersMask;
}
public void dump(Object o) {
Set<Object> cache = CollectionFactory.newHashSet();
w.write("(");
dumpObject(o, cache);
w.write(")");
w.newline(0);
try {
w.flush();
}
catch (IOException e) {}
}
protected void dumpObject(Object obj, Set<Object> cache) {
if (obj == null) {
w.write("null");
return;
}
w.write(StringUtil.getShortNameComponent(obj.getClass().getName()));
// w.allowBreak(0, " ");
// w.write(obj.toString());
if (cache.contains(obj)) {
return;
}
cache.add(obj);
w.allowBreak(1, " ");
w.begin(0);
try {
Field[] fields = obj.getClass().getDeclaredFields();
java.lang.reflect.AccessibleObject.setAccessible(fields, true);
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
if ((field.getModifiers() & modifiersMask) != 0)
continue;
w.write("(");
w.write(field.getName());
w.allowBreak(1, " ");
try {
Object o = field.get(obj);
dumpObject(o, cache);
}
catch (IllegalAccessException exn) {
w.write("##["+exn.getMessage()+"]");
}
w.write(")");
w.newline(0);
}
}
catch (SecurityException exn) {
}
w.end();
}
}