3030/** Provides a representation for contexts used during type checking.
3131 */
3232public final class Context extends Phase {
33- private ClassType [] classes ;
33+ private ArrayList < ClassType > classes ;
3434 private ClassType currClass ;
3535 private MethEnv currMethod ;
3636 private int localBytes ;
@@ -40,13 +40,16 @@ public final class Context extends Phase {
4040 private int staticStringCount ;
4141 private Id static_class_id ;
4242
43- public Context (Position pos , Handler handler , ClassType [] classes ) {
43+ public Context (Position pos , Handler handler ) {
4444 super (handler );
45- this .classes = classes ;
4645 this .pos = pos ;
4746 this .uniqueStrings = new Hashtable <String , StringLiteral >();
4847 this .staticStringCount = 0 ;
4948 this .static_class_id = new Id (pos , "MJCStatic" );
49+ this .classes = new ArrayList <ClassType >();
50+ }
51+ public void addClass (ClassType cls ) {
52+ classes .add (cls );
5053 }
5154 public StringLiteral [] getUniqueStrings () {
5255 return uniqueStrings .values ().toArray (new StringLiteral [0 ]);
@@ -62,14 +65,14 @@ public StringLiteral addStringLiteral(StringLiteral s) {
6265 }
6366
6467 public ClassType [] getClasses () {
65- return classes ;
68+ return classes . toArray ( new ClassType [ 0 ]) ;
6669 }
6770 /** Look for the definition of a class by its name.
6871 */
6972 public ClassType findClass (String name ) {
70- for (int i = 0 ; i < classes . length ; i ++ ) {
71- if (name .equals (classes [ i ] .getId ().getName ())) {
72- return classes [ i ] ;
73+ for (ClassType c : classes ) {
74+ if (name .equals (c .getId ().getName ())) {
75+ return c ;
7376 }
7477 }
7578 return null ;
@@ -126,18 +129,19 @@ && checkClasses()
126129 * in the input program.
127130 */
128131 private boolean checkClasses () {
129- ClassType [] classes = this . classes ;
130- for ( int i = classes . length - 1 ; i >= 0 ; i --) {
132+ for ( int i = classes . size () - 1 ; i >= 0 ; i --) {
133+ ClassType c_i = classes . get ( i );
131134 for (int j = 0 ; j < i ; j ++) {
132- if (classes [i ].getId ().sameId (classes [j ].getId ())) {
133- report (new Failure (classes [i ].getPos (),
135+ ClassType c_j = classes .get (j );
136+ if (c_i .getId ().sameId (c_j .getId ())) {
137+ report (new Failure (c_i .getPos (),
134138 "Multiple definitions for class " +
135- classes [ i ] .getId ()));
139+ c_i .getId ()));
136140 break ;
137141 }
138142 }
139143 try {
140- classes [ i ] .checkClass (this );
144+ c_i .checkClass (this );
141145 } catch (Diagnostic d ) {
142146 report (d );
143147 return noFailures ();
@@ -203,14 +207,7 @@ private boolean checkClasses() {
203207 null , new Block (pos , static_body .toArray (new Statement [0 ]))).link (decls );
204208
205209 staticClass = new ClassType (m , static_class_id , null , new Type [0 ], decls );
206- ClassType [] new_classes = new ClassType [classes .length + 1 ];
207- int x = 0 ;
208- for (ClassType c : classes ) {
209- new_classes [x ] = c ;
210- x ++;
211- }
212- new_classes [classes .length ] = staticClass ;
213- this .classes = new_classes ;
210+ classes .add (staticClass );
214211 try {
215212 staticClass .checkClass (this );
216213 } catch (Diagnostic d ) {
@@ -226,10 +223,9 @@ private boolean checkClasses() {
226223 * methods) of the classes in this program.
227224 */
228225 private boolean checkMembers () {
229- ClassType [] classes = this .classes ;
230- for (int i = 0 ; i < classes .length ; i ++) {
231- setCurrClass (classes [i ]);
232- classes [i ].checkMembers (this );
226+ for (ClassType c : classes ) {
227+ setCurrClass (c );
228+ c .checkMembers (this );
233229 }
234230 setCurrClass (null );
235231 return noFailures ();
0 commit comments