1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 package org.codehaus.groovy.control;
48
49 /***
50 * A base class for data structures that can collect messages and errors
51 * during processing.
52 *
53 * @author <a href="mailto:cpoirier@dreaming.org">Chris Poirier</a>
54 * @version $Id: ProcessingUnit.java,v 1.15 2005/06/12 21:04:15 blackdrag Exp $
55 */
56
57 public abstract class ProcessingUnit {
58
59 /***
60 * The current phase
61 */
62 protected int phase;
63 /***
64 * Set true if phase is finished
65 */
66 protected boolean phaseComplete;
67
68 /***
69 * Configuration and other settings that control processing
70 */
71 protected CompilerConfiguration configuration;
72
73 /***
74 * The ClassLoader to use during processing
75 */
76 protected ClassLoader classLoader;
77
78 /***
79 * a helper to share errors and report them
80 */
81 protected ErrorCollector errorCollector;
82
83
84 /***
85 * Initialize the ProcessingUnit to the empty state.
86 */
87
88 public ProcessingUnit(CompilerConfiguration configuration, ClassLoader classLoader, ErrorCollector er) {
89
90 this.phase = Phases.INITIALIZATION;
91 this.classLoader = (classLoader == null ? new CompilerClassLoader() : classLoader);
92
93 configure((configuration == null ? new CompilerConfiguration() : configuration));
94 if (er==null) er = new ErrorCollector(getConfiguration());
95 this.errorCollector = er;
96 }
97
98
99 /***
100 * Reconfigures the ProcessingUnit.
101 */
102 public void configure(CompilerConfiguration configuration) {
103 this.configuration = configuration;
104 }
105
106
107 public CompilerConfiguration getConfiguration() {
108 return configuration;
109 }
110
111 public void setConfiguration(CompilerConfiguration configuration) {
112 this.configuration = configuration;
113 }
114
115 /***
116 * Returns the class loader in use by this ProcessingUnit.
117 */
118
119 public ClassLoader getClassLoader() {
120 return classLoader;
121 }
122
123
124 /***
125 * Sets the class loader for use by this ProcessingUnit.
126 */
127
128 public void setClassLoader(ClassLoader loader) {
129 this.classLoader = loader;
130 }
131
132
133 /***
134 * Returns the current phase.
135 */
136
137 public int getPhase() {
138 return this.phase;
139 }
140
141
142 /***
143 * Returns the description for the current phase.
144 */
145
146 public String getPhaseDescription() {
147 return Phases.getDescription(this.phase);
148 }
149
150 public ErrorCollector getErrorCollector() {
151 return errorCollector;
152 }
153
154
155
156
157
158 /***
159 * Marks the current phase complete and processes any
160 * errors.
161 */
162
163 public void completePhase() throws CompilationFailedException {
164 errorCollector.failIfErrors();
165 phaseComplete = true;
166 }
167
168
169 /***
170 * A synonym for <code>gotoPhase( phase + 1 )</code>.
171 */
172 public void nextPhase() throws CompilationFailedException {
173 gotoPhase(this.phase + 1);
174 }
175
176
177 /***
178 * Wraps up any pending operations for the current phase
179 * and switches to the next phase.
180 */
181 public void gotoPhase(int phase) throws CompilationFailedException {
182 if (!this.phaseComplete) {
183 completePhase();
184 }
185
186 this.phase = phase;
187 this.phaseComplete = false;
188 }
189
190 }
191
192
193
194