1 //
2 // Copyright (c) 2006, Brian Frank and Andy Frank
3 // Licensed under the Academic Free License version 3.0
4 //
5 // History:
6 // 15 Sep 05 Brian Frank Creation
7 // 24 Jun 06 Brian Frank Ported from Java to Fan
8 //
9
10 **
11 ** AstWriter
12 **
13 class AstWriter
14 {
15
16 //////////////////////////////////////////////////////////////////////////
17 // Construction
18 //////////////////////////////////////////////////////////////////////////
19
20 **
21 ** Make for specified output stream
22 **
23 new make(OutStream out := Sys.out)
24 {
25 this.out = out
26 }
27
28 //////////////////////////////////////////////////////////////////////////
29 // Methods
30 //////////////////////////////////////////////////////////////////////////
31
32 **
33 ** Write and then return this.
34 **
35 AstWriter w(Obj o)
36 {
37 if (needIndent)
38 {
39 out.writeChars(Str.spaces(indentation*2))
40 needIndent = false
41 }
42 out.writeChars(o.toStr)
43 return this
44 }
45
46 **
47 ** Write newline and then return this.
48 **
49 public AstWriter nl()
50 {
51 w("\n")
52 needIndent = true
53 out.flush
54 return this
55 }
56
57 **
58 ** Increment the indentation
59 **
60 AstWriter indent()
61 {
62 indentation++
63 return this
64 }
65
66 **
67 ** Decrement the indentation
68 **
69 AstWriter unindent()
70 {
71 indentation--
72 if (indentation < 0) indentation = 0
73 return this
74 }
75
76 **
77 ** Write the source code for the mask of flags with a trailing space.
78 **
79 AstWriter flags(Int flags)
80 {
81 if (flags & FConst.Public != 0) w("public ")
82 if (flags & FConst.Protected != 0) w("protected ")
83 if (flags & FConst.Private != 0) w("private ")
84 if (flags & FConst.Internal != 0) w("internal ")
85 if (flags & FConst.Native != 0) w("native ")
86 if (flags & FConst.Enum != 0) w("enum ")
87 if (flags & FConst.Mixin != 0) w("mixin ")
88 if (flags & FConst.Final != 0) w("final ")
89 if (flags & FConst.Ctor != 0) w("new ")
90 if (flags & FConst.Override != 0) w("override ")
91 if (flags & FConst.Abstract != 0) w("abstract ")
92 if (flags & FConst.Static != 0) w("static ")
93 if (flags & FConst.Storage != 0) w("storage ")
94 if (flags & FConst.Virtual != 0) w("virtual ")
95
96 if (flags & FConst.Synthetic != 0) w("synthetic ")
97 if (flags & FConst.Getter != 0) w("getter ")
98 if (flags & FConst.Setter != 0) w("setter ")
99
100 return this
101 }
102
103 //////////////////////////////////////////////////////////////////////////
104 // Fields
105 //////////////////////////////////////////////////////////////////////////
106
107 OutStream out
108 Int indentation := 0
109 Bool needIndent := false
110
111 }
2 // Copyright (c) 2006, Brian Frank and Andy Frank
3 // Licensed under the Academic Free License version 3.0
4 //
5 // History:
6 // 15 Sep 05 Brian Frank Creation
7 // 24 Jun 06 Brian Frank Ported from Java to Fan
8 //
9
10 **
11 ** AstWriter
12 **
13 class AstWriter
14 {
15
16 //////////////////////////////////////////////////////////////////////////
17 // Construction
18 //////////////////////////////////////////////////////////////////////////
19
20 **
21 ** Make for specified output stream
22 **
23 new make(OutStream out := Sys.out)
24 {
25 this.out = out
26 }
27
28 //////////////////////////////////////////////////////////////////////////
29 // Methods
30 //////////////////////////////////////////////////////////////////////////
31
32 **
33 ** Write and then return this.
34 **
35 AstWriter w(Obj o)
36 {
37 if (needIndent)
38 {
39 out.writeChars(Str.spaces(indentation*2))
40 needIndent = false
41 }
42 out.writeChars(o.toStr)
43 return this
44 }
45
46 **
47 ** Write newline and then return this.
48 **
49 public AstWriter nl()
50 {
51 w("\n")
52 needIndent = true
53 out.flush
54 return this
55 }
56
57 **
58 ** Increment the indentation
59 **
60 AstWriter indent()
61 {
62 indentation++
63 return this
64 }
65
66 **
67 ** Decrement the indentation
68 **
69 AstWriter unindent()
70 {
71 indentation--
72 if (indentation < 0) indentation = 0
73 return this
74 }
75
76 **
77 ** Write the source code for the mask of flags with a trailing space.
78 **
79 AstWriter flags(Int flags)
80 {
81 if (flags & FConst.Public != 0) w("public ")
82 if (flags & FConst.Protected != 0) w("protected ")
83 if (flags & FConst.Private != 0) w("private ")
84 if (flags & FConst.Internal != 0) w("internal ")
85 if (flags & FConst.Native != 0) w("native ")
86 if (flags & FConst.Enum != 0) w("enum ")
87 if (flags & FConst.Mixin != 0) w("mixin ")
88 if (flags & FConst.Final != 0) w("final ")
89 if (flags & FConst.Ctor != 0) w("new ")
90 if (flags & FConst.Override != 0) w("override ")
91 if (flags & FConst.Abstract != 0) w("abstract ")
92 if (flags & FConst.Static != 0) w("static ")
93 if (flags & FConst.Storage != 0) w("storage ")
94 if (flags & FConst.Virtual != 0) w("virtual ")
95
96 if (flags & FConst.Synthetic != 0) w("synthetic ")
97 if (flags & FConst.Getter != 0) w("getter ")
98 if (flags & FConst.Setter != 0) w("setter ")
99
100 return this
101 }
102
103 //////////////////////////////////////////////////////////////////////////
104 // Fields
105 //////////////////////////////////////////////////////////////////////////
106
107 OutStream out
108 Int indentation := 0
109 Bool needIndent := false
110
111 }