1
package gov.llnl.babel.visitor;
3
import gov.llnl.babel.ast.ASTNode;
4
import gov.llnl.babel.ast.Argument;
5
import gov.llnl.babel.ast.ArgumentList;
6
import gov.llnl.babel.ast.ArrayType;
7
import gov.llnl.babel.ast.Assertion;
8
import gov.llnl.babel.ast.Attribute;
9
import gov.llnl.babel.ast.AttributeList;
10
import gov.llnl.babel.ast.BinaryExpr;
11
import gov.llnl.babel.ast.BooleanLiteral;
12
import gov.llnl.babel.ast.CharacterLiteral;
13
import gov.llnl.babel.ast.ClassType;
14
import gov.llnl.babel.ast.DComplexLiteral;
15
import gov.llnl.babel.ast.DoubleLiteral;
16
import gov.llnl.babel.ast.Ensures;
17
import gov.llnl.babel.ast.EnumItem;
18
import gov.llnl.babel.ast.Enumeration;
19
import gov.llnl.babel.ast.Extents;
20
import gov.llnl.babel.ast.FComplexLiteral;
21
import gov.llnl.babel.ast.FixedType;
22
import gov.llnl.babel.ast.FloatLiteral;
23
import gov.llnl.babel.ast.FromClause;
24
import gov.llnl.babel.ast.FuncExpr;
25
import gov.llnl.babel.ast.ImportClause;
26
import gov.llnl.babel.ast.IntLiteral;
27
import gov.llnl.babel.ast.InterfaceType;
28
import gov.llnl.babel.ast.Method;
29
import gov.llnl.babel.ast.Name;
30
import gov.llnl.babel.ast.Package;
31
import gov.llnl.babel.ast.RArrayType;
32
import gov.llnl.babel.ast.RequireClause;
33
import gov.llnl.babel.ast.Requires;
34
import gov.llnl.babel.ast.SIDLFile;
35
import gov.llnl.babel.ast.ScopedID;
36
import gov.llnl.babel.ast.SplicerBlock;
37
import gov.llnl.babel.ast.SplicerImpl;
38
import gov.llnl.babel.ast.SplicerImplList;
39
import gov.llnl.babel.ast.SplicerList;
40
import gov.llnl.babel.ast.StringLiteral;
41
import gov.llnl.babel.ast.StructItem;
42
import gov.llnl.babel.ast.StructType;
43
import gov.llnl.babel.ast.ThrowsList;
44
import gov.llnl.babel.ast.UnaryExpr;
46
import java.io.PrintStream;
47
import java.util.Iterator;
50
* PrettyPrints a SIDL AST to a PrintStream (useful for development and
53
public class DumpVisitor extends Visitor {
55
protected PrintStream d_out;
57
private int d_indent = 0;
59
public DumpVisitor(PrintStream ps) {
64
private String indentString() {
65
StringBuffer sb = new StringBuffer();
66
for (int i = 0; i < d_indent; ++i) {
72
private void printAttributes(AttributeList attrs, boolean withIndent) {
73
if ( attrs == null ) { return; }
75
d_out.print(indentString());
77
boolean inAttribRun = false;
78
for( Iterator i = attrs.iterator(); i.hasNext(); ) {
79
Attribute a = (Attribute) i.next();
80
if ( a.isBuiltin() ) {
89
d_out.print(" %attrib{");
102
public Object visitSIDLFile(SIDLFile node, Object data) {
103
d_out.println(indentString() + "-------------- begin ("
104
+ node.getFilename() + ")-----------");
105
super.visitSIDLFile(node, data);
106
d_out.println(indentString() + "---------------end file--------------");
110
public Object visitImportClause(ImportClause node, Object data) {
111
d_out.print(indentString() + "import " + node.getScopedID());
112
if ((node.getVersion() != null)
113
&& (node.getVersion().toString().length() > 0)) {
114
d_out.print(" version " + node.getVersion());
120
public Object visitRequireClause(RequireClause node, Object data) {
121
d_out.print(indentString() + "require " + node.getScopedID());
122
if (node.getVersion().toString().length() > 0) {
123
d_out.print(" version " + node.getVersion());
129
public Object visitPackage(Package node, Object data) {
130
if (node.hasDocComment()) {
131
d_out.println("/** " + node.getDocComment() + "*/");
133
if ( node.getAttributeList() != null ) {
134
final boolean withIndent = true;
135
printAttributes( node.getAttributeList(), withIndent );
137
d_out.print("package " + node.getName());
138
if (node.getVersion() != null
139
&& node.getVersion().toString().length() > 0) {
140
d_out.print(" version " + node.getVersion());
144
super.visitPackage(node, data);
146
d_out.println(indentString() + "}");
150
public Object visitEnumeration( Enumeration node, Object data ) {
151
if (node.hasDocComment()) {
152
d_out.println("/** " +node.getDocComment()+ "*/");
154
printAttributes( node.getAttributeList(), true );
155
d_out.println("enum " + node.getName() + " {");
157
super.visitEnumeration(node, data);
159
d_out.println(indentString() + "}");
163
public Object visitEnumItem( EnumItem node, Object data ) {
164
d_out.println( indentString() + node.toString() + ", ");
168
public Object visitStructType( StructType node, Object data ) {
169
if (node.hasDocComment()) {
170
d_out.println("/** " +node.getDocComment()+ "*/");
172
d_out.println(indentString() + "struct " + node.getName() + " {");
174
super.visitStructType(node,data);
176
d_out.println(indentString() + "}");
180
public Object visitStructItem( StructItem node, Object data) {
181
d_out.println(indentString() + node.getType() + " " + node.getName() + ";");
185
public Object visitInterfaceType(InterfaceType node, Object data) {
186
if (node.hasDocComment()) {
187
d_out.println("/** " +node.getDocComment()+ "*/");
189
final boolean withIndent = true;
190
printAttributes( node.getAttributeList(), withIndent );
191
d_out.print("interface " + node.getName());
192
if ( node.getExtends().size() > 0 ) {
193
d_out.print(" extends");
194
for( Iterator it = node.getExtends().iterator(); it.hasNext(); ) {
195
d_out.print( " " + (ScopedID) it.next() );
200
super.visitInterfaceType(node, data);
202
d_out.println(indentString() + "}");
206
public Object visitClassType(ClassType node, Object data) {
207
if (node.hasDocComment()) {
208
d_out.println("/** " +node.getDocComment()+ "*/");
210
final boolean withIndent = true;
211
printAttributes( node.getAttributeList(), withIndent );
212
d_out.print("class " + node.getName());
213
if ( node.getExtends() != null ) {
214
d_out.print(" extends " + node.getExtends() );
216
if ( node.getImplementsList() != null && node.getImplementsList().size() > 0 ) {
217
Iterator it = node.getImplementsList().iterator();
219
while( it.hasNext() ) {
220
ScopedID iface = (ScopedID) it.next();
221
if ( node.getImplementsList().isImplementsAll(iface) ) {
225
d_out.print(" implements-all ");
232
d_out.print(" implements ");
236
d_out.print( iface.toString() );
241
super.visitClassType(node, data);
243
d_out.println(indentString() + "}");
247
public Object visitMethod(Method node, Object data) {
248
if (node.hasDocComment()) {
249
d_out.println("/** " +node.getDocComment()+ "*/");
251
final boolean withIndent = true;
252
printAttributes( node.getAttributeList(), withIndent);
253
if (node.getReturnType() == null) {
254
d_out.print("void ");
256
d_out.print(node.getReturnType().toString() + " ");
258
d_out.print(node.getMethodName().toString());
259
node.getArgumentList().accept(this,data);
260
node.getThrowsList().accept(this,data);
261
if ( node.getFromClause() != null ) {
262
node.getFromClause().accept(this,data);
264
if (node.getRequires() != null) {
266
node.getRequires().accept(this, data);
268
if (node.getEnsures() != null ) {
270
node.getEnsures().accept(this, data);
272
if ((node.getRequires() != null) || (node.getEnsures() != null)) {
273
d_out.println(indentString() + ";");
278
if (node.getSplicerList() != null) {
279
node.getSplicerList().accept(this, data);
284
public Object visitArgumentList(ArgumentList node, Object data ) {
286
for(Iterator it = node.iterator(); it.hasNext(); ) {
287
Argument arg = (Argument) it.next();
288
arg.accept(this,data);
297
public Object visitArgument(Argument node, Object data) {
298
if (node.hasDocComment()) {
299
d_out.println("/** " +node.getDocComment()+ "*/");
301
if ( node.getAttributeList() != null ) {
302
final boolean withIndent=false;
303
printAttributes( node.getAttributeList(), withIndent );
305
d_out.print( node.getMode() + " ");
306
node.getType().accept(this,data);
307
d_out.print(" " + node.getName() );
308
if ( node.getType() instanceof RArrayType) {
309
RArrayType t = (RArrayType) node.getType();
311
t.getExtents().accept(this,data);
317
public Object visitBinaryExpr(BinaryExpr be, Object data) {
319
be.getLHS().accept(this, data);
320
d_out.print(")" + BinaryExpr.getOpSIDL(be.getOperator()));
322
be.getRHS().accept(this, data);
327
public Object visitUnaryExpr(UnaryExpr ue, Object data) {
328
d_out.print(UnaryExpr.getOpSIDL(ue.getOperator()));
330
ue.getOperand().accept(this, data);
336
public Object visitExtents(Extents node, Object data) {
337
for(Iterator it = node.getExtents().iterator(); it.hasNext(); ) {
338
ASTNode n = (ASTNode) it.next();
339
n.accept(this, data);
347
public Object visitFixedType(FixedType node, Object data) {
348
d_out.print(node.toString());
352
public Object visitArrayType(ArrayType node, Object data) {
353
d_out.print(node.toString());
357
public Object visitRArrayType(RArrayType node, Object data) {
358
d_out.print(node.toString());
362
public Object visitScopedID(ScopedID node, Object data) {
363
d_out.print(node.toString());
367
public Object visitThrowsList(ThrowsList node, Object data) {
368
if (node.size() > 0) {
369
d_out.print(" throws ");
370
for(Iterator it = node.iterator(); it.hasNext(); ) {
371
ScopedID id = (ScopedID) it.next();
372
id.accept(this,data);
381
public Object visitFromClause(FromClause node, Object data) {
383
d_out.print(" from " + node.getScopedID() + "." + node.getMethodName() );
388
public Object visitIntLiteral(IntLiteral il, Object data) {
389
d_out.print(Integer.toString(il.getInt()));
393
public Object visitBooleanLiteral(BooleanLiteral bl, Object data)
395
d_out.print(bl.getBoolean() ? "true" : "false");
399
public Object visitCharacterLiteral(CharacterLiteral cl, Object data)
401
char ch = cl.getChar();
402
if (Character.isISOControl(ch) || (ch == '\'') || (ch == '\\')) {
403
d_out.print("'\\" + Integer.toOctalString(Character.getNumericValue(ch))
407
d_out.print("'" + ch + "'");
412
public Object visitStringLiteral(StringLiteral sl, Object data)
414
d_out.print("\"" + sl.getString() + "\"");
418
public Object visitFComplexLiteral(FComplexLiteral dl, Object data)
420
d_out.print(dl.toString());
424
public Object visitDComplexLiteral(DComplexLiteral dl, Object data)
426
d_out.print(dl.toString());
430
public Object visitFloatLiteral(FloatLiteral dl, Object data)
432
d_out.print(dl.toString());
436
public Object visitDoubleLiteral(DoubleLiteral dl, Object data)
438
d_out.print(dl.toString());
442
public Object visitEnsures(Ensures r, Object data) {
443
d_out.println(indentString() + "ensures");
446
return super.visitEnsures(r, data);
453
public Object visitRequires(Requires r, Object data) {
454
d_out.println(indentString() + "requires");
457
return super.visitRequires(r, data);
464
public Object visitFuncExpr(FuncExpr fe, Object data) {
465
d_out.print(fe.getName() + "(");
466
Iterator i = fe.getArguments().iterator();
468
((ASTNode)i.next()).accept(this, data);
477
public Object visitName(Name n, Object data) {
478
d_out.print(n.toString());
482
public Object visitAssertion(Assertion a, Object data)
484
d_out.print(indentString());
485
if (a.getName() != null) {
486
a.getName().accept(this, data);
489
Object retval = a.getExpr().accept(this, data);
494
public Object visitSplicerList(SplicerList sl, Object data)
497
for (Iterator i = sl.getList().iterator(); i.hasNext();) {
498
SplicerBlock sb = (SplicerBlock) i.next();
499
sb.accept(this, data);
505
public Object visitSplicerBlock(SplicerBlock sb, Object data)
507
d_out.print(indentString() + "/** Splicer Block (tagged " + sb.getName());
508
d_out.println(" in " + sb.getLocation() + ") */");
509
if (sb.getSplicerImplList() != null) {
510
sb.getSplicerImplList().accept(this, data);
516
public Object visitSplicerImplList(SplicerImplList sil, Object data)
518
for (Iterator i = sil.getList().iterator(); i.hasNext();) {
519
SplicerImpl si = (SplicerImpl) i.next();
520
si.accept(this, data);
525
public Object visitSplicerImpl(SplicerImpl impl, Object data)
527
d_out.println(indentString() + impl.toString());