001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package dwarfvsmodel;
043:
044: import java.io.PrintStream;
045: import java.util.Formatter;
046: import org.netbeans.modules.cnd.api.model.*;
047: import org.netbeans.modules.cnd.api.model.util.*;
048: import org.netbeans.modules.cnd.dwarfdump.dwarf.DwarfDeclaration;
049: import org.netbeans.modules.cnd.dwarfdump.dwarf.DwarfEntry;
050:
051: /**
052: * Prints trace info
053: * @author vk155633
054: */
055: public class Tracer {
056:
057: private final int step = 4;
058: private StringBuffer indentBuffer = new StringBuffer();
059: private PrintStream stream;
060:
061: public Tracer(PrintStream stream) {
062: this .stream = stream;
063: }
064:
065: public void indent() {
066: setupIndentBuffer(indentBuffer.length() + step);
067: }
068:
069: public void unindent() {
070: setupIndentBuffer(indentBuffer.length() - step);
071: }
072:
073: private void setupIndentBuffer(int len) {
074: if (len <= 0) {
075: indentBuffer.setLength(0);
076: } else {
077: indentBuffer.setLength(len);
078: for (int i = 0; i < len; i++) {
079: indentBuffer.setCharAt(i, ' ');
080: }
081: }
082: }
083:
084: public void println(String s) {
085: print(s);
086: }
087:
088: public void print(String s) {
089: stream.println(indentBuffer.toString() + s);
090: }
091:
092: public void printf(String format, Object... args) {
093: // StringBuilder sb = new StringBuilder(indentBuffer.toString());
094: // Formatter formatter = new Formatter(sb);
095: // formatter.format(format, args);
096: stream.printf(indentBuffer.toString() + format, args);
097: }
098:
099: // private interface Node {
100: // Iterable<Object> getLeaves();
101: // Iterable<Iterable<Object>> getBranches();
102: // }
103:
104: public void traceModel(Node<CsmDeclaration> node, String text) {
105: print(text);
106: traceModel(node);
107: }
108:
109: public void traceModel(Node<CsmDeclaration> node) {
110: print("NODE"); // NOI18N
111: indent();
112: for (CsmDeclaration decl : node.getDeclarations()) {
113: trace(decl);
114: }
115: for (Node<CsmDeclaration> subnode : node.getSubnodes()) {
116: traceModel(subnode);
117: }
118: unindent();
119: }
120:
121: private void trace(CsmDeclaration decl) {
122: //print(decl.getKind().toString() + ' ' + decl.getName() + ' ' + CsmTracer.getOffsetString((CsmOffsetable)decl)); // NOI18N
123: print(toString(decl));
124: }
125:
126: public static String toString(CsmDeclaration decl) {
127: StringBuilder sb = new StringBuilder(decl.getQualifiedName());
128: sb.append(" "); // NOI18N
129: if (CsmKindUtilities.isFunction(decl)
130: && !CsmKindUtilities.isConstructor(decl)
131: && !CsmKindUtilities.isDestructor(decl)) {
132: CsmFunction fun = (CsmFunction) decl;
133: sb.append(ComparisonUtils.getSignature(fun));
134: sb.append(" -> "); // NOI18N
135: sb.append(ComparisonUtils.getText(fun.getReturnType()));
136: } else {
137: sb.append(decl.getName());
138: }
139: sb.append(" "); // NOI18N
140:
141: if (decl instanceof CsmOffsetable) {
142: sb.append(CsmTracer.getOffsetString((CsmOffsetable) decl));
143: }
144: if (CsmKindUtilities.isVariable(decl)) {
145: sb.append(" "); // NOI18N
146: sb.append(ComparisonUtils.getText(((CsmVariable) decl)
147: .getType()));
148: }
149: return sb.toString();
150: }
151:
152: public void traceDwarf(Node<DwarfEntry> node, String text) {
153: print(text);
154: traceDwarf(node);
155: }
156:
157: public void traceDwarf(Node<DwarfEntry> node) {
158: print("NODE"); // NOI18N
159: indent();
160: for (DwarfEntry decl : node.getDeclarations()) {
161: traceDwarf(decl);
162: }
163: for (Node<DwarfEntry> subnode : node.getSubnodes()) {
164: traceDwarf(subnode);
165: }
166: unindent();
167: }
168:
169: public void traceDwarf(DwarfEntry entry) {
170: DwarfDeclaration decl = entry.getDeclaration();
171: print(decl == null ? "null" : decl.toString()); // NOI18N
172: }
173:
174: public void traceRecursive(DwarfEntry entry) {
175: String name = entry.getName();
176: printf("\n---------- Tracing entry %s ----------\n", name); // NOI18N
177: _traceRecursive(entry);
178: printf("---------- End trace for %s ----------\n\n", name); // NOI18N
179: }
180:
181: private void _traceRecursive(DwarfEntry entry) {
182: traceDwarf(entry);
183: indent();
184: for (DwarfEntry child : entry.getChildren()) {
185: _traceRecursive(child);
186: }
187: unindent();
188: }
189:
190: }
|