2001-10-27 Miguel de Icaza <miguel@ximian.com>
[mono.git] / mcs / mcs / ChangeLog
1 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
2
3         * expression.cs: Fix bug I introduced lsat night that broke
4         Delegates. 
5         
6 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
7
8         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
9         might arrive here.  I have my doubts that this is correct.
10
11         * statement.cs (Lock): Implement lock statement.
12
13         * cs-parser.jay: Small fixes to support `lock' and `using'
14
15         * cs-tokenizer.cs: Remove extra space
16
17         * driver.cs: New flag --checked, allows to turn on integer math
18         checking. 
19
20         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
21         Threading.Monitor.Exit 
22         
23 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
24
25         * expression.cs (IndexerAccess::DoResolveLValue): Set the
26         Expression Class to be IndexerAccess.
27
28         Notice that Indexer::DoResolve sets the eclass to Value.
29
30 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
31
32         * class.cs (TypeContainer::Emit): Emit code for indexers.
33
34         * assign.cs (IAssignMethod): New interface implemented by Indexers
35         and Properties for handling assignment.
36
37         (Assign::Emit): Simplify and reuse code. 
38         
39         * expression.cs (IndexerAccess, PropertyExpr): Implement
40         IAssignMethod, clean up old code. 
41
42 2001-10-22  Ravi Pratap  <ravi@ximian.com>
43
44         * typemanager.cs (ImplementsInterface): New method to determine if a type
45         implements a given interface. Provides a nice cache too.
46
47         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
48         method.
49
50         (ConvertReferenceExplicit): Ditto.
51
52         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
53         various methods, with correct names etc.
54
55         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
56         Operator.UnaryNegation.
57
58         * cs-parser.jay (operator_declarator): Be a little clever in the case where
59         we have a unary plus or minus operator.
60
61         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
62         UnaryMinus.
63
64         * everywhere : update accordingly.
65
66         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
67         respectively.
68
69         * class.cs (Method::Define): For the case where we are implementing a method
70         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
71         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
72         
73 >>>>>>> 1.142
74 2001-10-21  Ravi Pratap  <ravi@ximian.com>
75
76         * interface.cs (FindMembers): Implement to work around S.R.E
77         lameness.
78
79         * typemanager.cs (IsInterfaceType): Implement.
80
81         (FindMembers): Update to handle interface types too.
82
83         * expression.cs (ImplicitReferenceConversion): Re-write bits which
84         use IsAssignableFrom as that is not correct - it doesn't work.
85
86         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
87         and accordingly override EmitStatement.
88
89         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
90         using the correct logic :-)
91
92 2001-10-19  Ravi Pratap  <ravi@ximian.com>
93
94         * ../errors/cs-11.cs : Add to demonstrate error -11 
95
96 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
97
98         * assign.cs (Assign::Resolve): Resolve right hand side first, and
99         then pass this as a hint to ResolveLValue.
100         
101         * expression.cs (FieldExpr): Add Location information
102
103         (FieldExpr::LValueResolve): Report assignment to readonly
104         variable. 
105         
106         (Expression::ExprClassFromMemberInfo): Pass location information.
107
108         (Expression::ResolveLValue): Add new method that resolves an
109         LValue. 
110
111         (Expression::DoResolveLValue): Default invocation calls
112         DoResolve. 
113
114         (Indexers): New class used to keep track of indexers in a given
115         Type. 
116
117         (IStackStore): Renamed from LValue, as it did not really describe
118         what this did.  Also ResolveLValue is gone from this interface and
119         now is part of Expression.
120
121         (ElementAccess): Depending on the element access type
122         
123         * typemanager.cs: Add `indexer_name_type' as a Core type
124         (System.Runtime.CompilerServices.IndexerNameAttribute)
125
126         * statement.cs (Goto): Take a location.
127         
128 2001-10-18  Ravi Pratap  <ravi@ximian.com>
129
130         * delegate.cs (Delegate::VerifyDelegate): New method to verify
131         if two delegates are compatible.
132
133         (NewDelegate::DoResolve): Update to take care of the case when
134         we instantiate a delegate from another delegate.
135
136         * typemanager.cs (FindMembers): Don't even try to look up members
137         of Delegate types for now.
138
139 2001-10-18  Ravi Pratap  <ravi@ximian.com>
140
141         * delegate.cs (NewDelegate): New class to take care of delegate
142         instantiation.
143
144         * expression.cs (New): Split the delegate related code out into 
145         the NewDelegate class.
146
147         * delegate.cs (DelegateInvocation): New class to handle delegate 
148         invocation.
149
150         * expression.cs (Invocation): Split out delegate related code into
151         the DelegateInvocation class.
152
153 2001-10-17  Ravi Pratap  <ravi@ximian.com>
154
155         * expression.cs (New::DoResolve): Implement delegate creation fully
156         and according to the spec.
157
158         (New::DoEmit): Update to handle delegates differently.
159
160         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
161         because of which we were printing out arguments in reverse order !
162
163         * delegate.cs (VerifyMethod): Implement to check if the given method
164         matches the delegate.
165
166         (FullDelegateDesc): Implement.
167
168         (VerifyApplicability): Implement.
169
170         * expression.cs (Invocation::DoResolve): Update to accordingly handle
171         delegate invocations too.
172
173         (Invocation::Emit): Ditto.
174
175         * ../errors/cs1593.cs : Added.
176
177         * ../errors/cs1594.cs : Added.
178
179         * delegate.cs (InstanceExpression, TargetMethod): New properties.
180
181 2001-10-16  Ravi Pratap  <ravi@ximian.com>
182
183         * typemanager.cs (intptr_type): Core type for System.IntPtr
184
185         (InitCoreTypes): Update for the same.
186
187         (iasyncresult_type, asynccallback_type): Ditto.
188
189         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
190         correct.
191
192         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
193         too.
194
195         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
196         the builders for the 4 members of a delegate type :-)
197
198         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
199         type.
200
201         * expression.cs (New::DoResolve): Implement guts for delegate creation.
202
203         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
204
205 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
206
207         * statement.cs (Break::Emit): Implement.   
208         (Continue::Emit): Implement.
209
210         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
211         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
212         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
213         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
214         end loop
215         
216         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
217         properties that track the label for the current loop (begin of the
218         loop and end of the loop).
219
220 2001-10-15  Ravi Pratap  <ravi@ximian.com>
221
222         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
223         use of emitting anything at all.
224
225         * class.cs, rootcontext.cs : Get rid of calls to the same.
226
227         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
228
229         (Populate): Define the constructor correctly and set the implementation
230         attributes.
231
232         * typemanager.cs (delegate_types): New hashtable to hold delegates that
233         have been defined.
234
235         (AddDelegateType): Implement.
236
237         (IsDelegateType): Implement helper method.
238
239         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
240
241         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
242         and accordingly handle it.
243
244         * delegate.cs (Populate): Take TypeContainer argument.
245         Implement bits to define the Invoke method. However, I still haven't figured out
246         how to take care of the native int bit :-(
247
248         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
249         Qualify the name of the delegate, not its return type !
250
251         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
252         conversion.
253
254         (StandardConversionExists): Checking for array types turns out to be recursive.
255
256         (ConvertReferenceExplicit): Implement array conversion.
257
258         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
259         
260 2001-10-12  Ravi Pratap  <ravi@ximian.com>
261
262         * cs-parser.jay (delegate_declaration): Store the fully qualified
263         name as it is a type declaration.
264
265         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
266         readonly.
267
268         (DefineDelegate): Renamed from Define. Does the same thing essentially,
269         as TypeContainer::DefineType.
270
271         (Populate): Method in which all the definition of the various methods (Invoke)
272         etc is done.
273
274         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
275         see.
276         
277         (CloseDelegate): Finally creates the delegate.
278
279         * class.cs (TypeContainer::DefineType): Update to define delegates.
280         (Populate, Emit and CloseType): Do the same thing here too.
281
282         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
283         delegates in all these operations.
284
285 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
286
287         * expression.cs: LocalTemporary: a new expression used to
288         reference a temporary that has been created.
289
290         * assign.cs: Handle PropertyAccess back here, so that we can
291         provide the proper semantic access to properties.
292
293         * expression.cs (Expression::ConvertReferenceExplicit): Implement
294         a few more explicit conversions. 
295
296         * modifiers.cs: `NEW' modifier maps to HideBySig.
297
298         * expression.cs (PropertyExpr): Make this into an
299         ExpressionStatement, and support the EmitStatement code path. 
300
301         Perform get/set error checking, clean up the interface.
302
303         * assign.cs: recognize PropertyExprs as targets, and if so, turn
304         them into toplevel access objects.
305
306 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
307
308         * expression.cs: PropertyExpr::PropertyExpr: use work around the
309         SRE.
310
311         * typemanager.cs: Keep track here of our PropertyBuilders again to
312         work around lameness in SRE.
313
314 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
315
316         * expression.cs (LValue::LValueResolve): New method in the
317         interface, used to perform a second resolution pass for LValues. 
318         
319         (This::DoResolve): Catch the use of this in static methods.
320
321         (This::LValueResolve): Implement.
322
323         (This::Store): Remove warning, assigning to `this' in structures
324         is 
325
326         (Invocation::Emit): Deal with invocation of
327         methods on value types.  We need to pass the address to structure
328         methods rather than the object itself.  (The equivalent code to
329         emit "this" for structures leaves the entire structure on the
330         stack instead of a pointer to it). 
331
332         (ParameterReference::DoResolve): Compute the real index for the
333         argument based on whether the method takes or not a `this' pointer
334         (ie, the method is static).
335
336         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
337         value types returned from functions when we need to invoke a
338         method on the sturcture.
339         
340
341 2001-10-11  Ravi Pratap  <ravi@ximian.com>
342
343         * class.cs (TypeContainer::DefineType): Method to actually do the business of
344         defining the type in the Modulebuilder or Typebuilder. This is to take
345         care of nested types which need to be defined on the TypeBuilder using
346         DefineNestedMethod.
347
348         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
349         methods in RootContext, only ported to be part of TypeContainer.
350
351         (TypeContainer::GetInterfaceOrClass): Ditto.
352
353         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
354
355         * interface.cs (Interface::DefineInterface): New method. Does exactly
356         what RootContext.CreateInterface did earlier, only it takes care of nested types 
357         too.
358
359         (Interface::GetInterfaces): Move from RootContext here and port.
360
361         (Interface::GetInterfaceByName): Same here.
362
363         * rootcontext.cs (ResolveTree): Re-write.
364
365         (PopulateTypes): Re-write.
366
367         * class.cs (TypeContainer::Populate): Populate nested types too.
368         (TypeContainer::Emit): Emit nested members too.
369
370         * typemanager.cs (AddUserType): Do not make use of the FullName property,
371         instead just use the name argument passed in as it is already fully
372         qualified.
373
374         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
375         to TypeContainer mapping to see if a type is user-defined.
376
377         * class.cs (TypeContainer::CloseType): Implement. 
378
379         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
380         the default constructor.
381         
382         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
383         twice.
384
385         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
386
387         * interface.cs (CloseType): Create the type here.
388         
389         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
390         the hierarchy.
391
392         Remove all the methods which are now in TypeContainer.
393
394 2001-10-10  Ravi Pratap  <ravi@ximian.com>
395
396         * delegate.cs (Define): Re-write bits to define the delegate
397         correctly.
398
399 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
400
401         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
402
403         * expression.cs (ImplicitReferenceConversion): handle null as well
404         as a source to convert to any reference type.
405
406         * statement.cs (Return): Perform any implicit conversions to
407         expected return type.  
408
409         Validate use of return statement.  
410
411         * codegen.cs (EmitContext): Pass the expected return type here.
412
413         * class.cs (Method, Constructor, Property): Pass expected return
414         type to EmitContext.
415
416 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
417
418         * expression.cs: Make DoResolve take an EmitContext instead of a
419         TypeContainer.
420
421         Replaced `l' and `location' for `loc', for consistency.
422         
423         (Error, Warning): Remove unneeded Tc argument.
424
425         * assign.cs, literal.cs, constant.cs: Update to new calling
426         convention. 
427         
428         * codegen.cs: EmitContext now contains a flag indicating whether
429         code is being generated in a static method or not.
430
431         * cs-parser.jay: DecomposeQI, new function that replaces the old
432         QualifiedIdentifier.  Now we always decompose the assembled
433         strings from qualified_identifier productions into a group of
434         memberaccesses.
435
436 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
437
438         * rootcontext.cs: Deal with field-less struct types correctly now
439         by passing the size option to Define Type.
440
441         * class.cs: Removed hack that created one static field. 
442
443 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
444
445         * statement.cs: Moved most of the code generation here. 
446
447 2001-10-09  Ravi Pratap  <ravi@ximian.com>
448
449         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
450         seem very right.
451
452         (ElementAccess): Remove useless bits for now - keep checks as the spec
453         says.
454
455 2001-10-08  Ravi Pratap  <ravi@ximian.com>
456
457         * expression.cs (ElementAccess::DoResolve): Remove my crap code
458         and start performing checks according to the spec.
459
460 2001-10-07  Ravi Pratap  <ravi@ximian.com>
461
462         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
463         rank_specifiers instead.
464
465         (rank_specifiers): Change the order in which the rank specifiers are stored
466
467         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
468
469         * expression.cs (ElementAccess): Implement the LValue interface too.
470         
471 2001-10-06  Ravi Pratap  <ravi@ximian.com>
472         
473         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
474         except that user defined conversions are not included.
475
476         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
477         perform the conversion of the return type, if necessary.
478
479         (New::DoResolve): Check whether we are creating an array or an object
480         and accordingly do the needful.
481
482         (New::Emit): Same here.
483
484         (New::DoResolve): Implement guts of array creation.
485
486         (New::FormLookupType): Helper function.
487
488 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
489
490         * codegen.cs: Removed most of the code generation here, and move the
491         corresponding code generation bits to the statement classes. 
492
493         Added support for try/catch/finalize and throw.
494         
495         * cs-parser.jay: Added support for try/catch/finalize.
496
497         * class.cs: Catch static methods having the flags override,
498         virtual or abstract.
499
500         * expression.cs (UserCast): This user cast was not really doing
501         what it was supposed to do.  Which is to be born in fully resolved
502         state.  Parts of the resolution were being performed at Emit time! 
503
504         Fixed this code.
505
506 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
507
508         * expression.cs: Implicity convert the result from UserCast.
509
510 2001-10-05  Ravi Pratap  <ravi@ximian.com>
511
512         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
513         prevented it from working correctly. 
514
515         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
516         merely ConvertImplicit.
517
518 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
519
520         * typemanager.cs: Make the LookupTypeContainer function static,
521         and not per-instance.  
522
523         * class.cs: Make static FindMembers (the one that takes a Type
524         argument). 
525
526         * codegen.cs: Add EmitForeach here.
527
528         * cs-parser.jay: Make foreach a toplevel object instead of the
529         inline expansion, as we need to perform semantic analysis on it. 
530
531 2001-10-05  Ravi Pratap  <ravi@ximian.com>
532
533         * expression.cs (Expression::ImplicitUserConversion): Rename to
534         UserDefinedConversion.
535
536         (Expression::UserDefinedConversion): Take an extra argument specifying 
537         whether we look for explicit user conversions too.
538
539         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
540
541         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
542
543         (ExplicitUserConversion): Make it a call to UserDefinedConversion
544         with the appropriate arguments.
545
546         * cs-parser.jay (cast_expression): Record location too.
547
548         * expression.cs (Cast): Record location info.
549
550         (Expression::ConvertExplicit): Take location argument.
551
552         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
553         to determine if we are doing explicit conversions.
554
555         (UserCast::Emit): Update accordingly.
556
557         (Expression::ConvertExplicit): Report an error if everything fails.
558
559         * ../errors/cs0030.cs : Add.
560
561 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
562
563         * modifiers.cs: If the ABSTRACT keyword is present, also set the
564         virtual and newslot bits. 
565
566         * class.cs (TypeContainer::RegisterRequiredImplementations):
567         Record methods we need.
568
569         (TypeContainer::MakeKey): Helper function to make keys for
570         MethodBases, since the Methodbase key is useless.
571
572         (TypeContainer::Populate): Call RegisterRequiredImplementations
573         before defining the methods.   
574
575         Create a mapping for method_builders_to_methods ahead of time
576         instead of inside a tight loop.
577
578         (::RequireMethods):  Accept an object as the data to set into the
579         hashtable so we can report interface vs abstract method mismatch.
580
581 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
582
583         * report.cs: Make all of it static.
584
585         * rootcontext.cs: Drop object_type and value_type computations, as
586         we have those in the TypeManager anyways.
587
588         Drop report instance variable too, now it is a global.
589
590         * driver.cs: Use try/catch on command line handling.
591
592         Add --probe option to debug the error reporting system with a test
593         suite. 
594
595         * report.cs: Add support for exiting program when a probe
596         condition is reached.
597
598 2001-10-03  Ravi Pratap  <ravi@ximian.com>
599
600         * expression.cs (Binary::DoNumericPromotions): Fix the case when
601         we do a forcible conversion regardless of type, to check if 
602         ForceConversion returns a null.
603
604         (Binary::error19): Use location to report error.
605
606         (Unary::error23): Use location here too.
607
608         * ../errors/cs0019.cs : Check in.
609
610         * ../errors/cs0023.cs : Check in.
611
612         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
613         case of a non-null MethodInfo object with a length of 0 !
614
615         (Binary::ResolveOperator): Flag error if overload resolution fails to find
616         an applicable member - according to the spec :-)
617         Also fix logic to find members in base types.
618
619         (Unary::ResolveOperator): Same here.
620
621         (Unary::report23): Change name to error23 and make first argument a TypeContainer
622         as I was getting thoroughly confused between this and error19 :-)
623         
624         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
625         (::FindMostEncompassedType): Implement.
626         (::FindMostEncompassingType): Implement.
627         (::StandardConversionExists): Implement.
628
629         (UserImplicitCast): Re-vamp. We now need info about most specific
630         source and target types so that we can do the necessary conversions.
631
632         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
633         mathematical union with no duplicates.
634
635 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
636
637         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
638         in order from base classes to child classes, so that we can in
639         child classes look up in our parent for method names and
640         attributes (required for handling abstract, virtual, new, override
641         constructs: we need to instrospect our base class, and if we dont
642         populate the classes in order, the introspection might be
643         incorrect.  For example, a method could query its parent before
644         the parent has any methods and would determine that the parent has
645         no abstract methods (while it could have had them)).
646
647         (RootContext::CreateType): Record the order in which we define the
648         classes.
649
650 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
651
652         * class.cs (TypeContainer::Populate): Also method definitions can
653         fail now, keep track of this.
654
655         (TypeContainer::FindMembers): Implement support for
656         DeclaredOnly/noDeclaredOnly flag.
657
658         (Constructor::Emit) Return the ConstructorBuilder.
659
660         (Method::Emit) Return the MethodBuilder. 
661         Check for abstract or virtual methods to be public.
662
663         * rootcontext.cs (RootContext::CreateType): Register all the
664         abstract methods required for the class to be complete and the
665         interface methods that must be implemented. 
666
667         * cs-parser.jay: Report error 501 (method requires body if it is
668         not marked abstract or extern).
669
670         * expression.cs (TypeOf::Emit): Implement.
671
672         * typemanager.cs: runtime_handle_type, new global type.
673
674         * class.cs (Property::Emit): Generate code for properties.
675
676 2001-10-02  Ravi Pratap  <ravi@ximian.com>
677
678         * expression.cs (Unary::ResolveOperator): Find operators on base type
679         too - we now conform exactly to the spec.
680
681         (Binary::ResolveOperator): Same here.
682
683         * class.cs (Operator::Define): Fix minor quirk in the tests.
684
685         * ../errors/cs0215.cs : Added.
686
687         * ../errors/cs0556.cs : Added.
688
689         * ../errors/cs0555.cs : Added.
690
691 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
692
693         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
694         single integer which is really efficient
695
696 2001-10-01  Ravi Pratap  <ravi@ximian.com>
697
698         *  expression.cs (Expression::ImplicitUserConversion): Use location
699         even in the case when we are examining True operators.
700  
701         * class.cs (Operator::Define): Perform extensive checks to conform
702         with the rules for operator overloading in the spec.
703
704         * expression.cs (Expression::ImplicitReferenceConversion): Implement
705         some of the other conversions mentioned in the spec.
706
707         * typemanager.cs (array_type): New static member for the System.Array built-in
708         type.
709
710         (cloneable_interface): For System.ICloneable interface.
711
712         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
713         we start resolving the tree and populating types.
714
715         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
716  
717 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
718
719         * expression.cs (Expression::ExprClassFromMemberInfo,
720         Expression::Literalize): Create literal expressions from
721         FieldInfos which are literals.
722
723         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
724         type casts, because they were wrong.  The test suite in tests
725         caught these ones.
726
727         (ImplicitNumericConversion): ushort to ulong requires a widening
728         cast. 
729
730         Int32 constant to long requires widening cast as well.
731
732         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
733         for integers because the type on the stack is not i4.
734
735 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
736
737         * expression.cs (report118): require location argument. 
738
739         * parameter.cs: Do not dereference potential null value.
740
741         * class.cs: Catch methods that lack the `new' keyword when
742         overriding a name.  Report warnings when `new' is used without
743         anything being there to override.
744
745         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
746
747         * class.cs: Only add constructor to hashtable if it is non-null
748         (as now constructors can fail on define).
749
750         (TypeManager, Class, Struct): Take location arguments.
751
752         Catch field instance initialization in structs as errors.
753
754         accepting_filter: a new filter for FindMembers that is static so
755         that we dont create an instance per invocation.
756
757         (Constructor::Define): Catch errors where a struct constructor is
758         parameterless 
759
760         * cs-parser.jay: Pass location information for various new
761         constructs. 
762         
763         * delegate.cs (Delegate): take a location argument.
764
765         * driver.cs: Do not call EmitCode if there were problesm in the
766         Definition of the types, as many Builders wont be there. 
767
768         * decl.cs (Decl::Decl): Require a location argument.
769
770         * cs-tokenizer.cs: Handle properly hex constants that can not fit
771         into integers, and find the most appropiate integer for it.
772
773         * literal.cs: Implement ULongLiteral.
774
775         * rootcontext.cs: Provide better information about the location of
776         failure when CreateType fails.
777         
778 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
779
780         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
781         as well.
782
783         * expression.cs (Binary::CheckShiftArguments): Add missing type
784         computation.
785         (Binary::ResolveOperator): Add type to the logical and and logical
786         or, Bitwise And/Or and Exclusive Or code paths, it was missing
787         before.
788
789         (Binary::DoNumericPromotions): In the case where either argument
790         is ulong (and most signed types combined with ulong cause an
791         error) perform implicit integer constant conversions as well.
792
793 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
794
795         * expression.cs (UserImplicitCast): Method should always be
796         non-null. 
797         (Invocation::BetterConversion): Simplified test for IntLiteral.
798
799         (Expression::ImplicitNumericConversion): Split this routine out.
800         Put the code that performs implicit constant integer conversions
801         here. 
802
803         (Expression::Resolve): Become a wrapper around DoResolve so we can
804         check eclass and type being set after resolve.
805
806         (Invocation::Badness): Remove this dead function
807
808         (Binary::ResolveOperator): Do not compute the expensive argumnets
809         unless we have a union for it.
810
811         (Probe::Emit): Is needs to do an isinst and then
812         compare against null.
813
814         (::CanConvert): Added Location argument.  If the Location argument
815         is null (Location.Null), then we do not report errors.  This is
816         used by the `probe' mechanism of the Explicit conversion.  We do
817         not want to generate an error for something that the user
818         explicitly requested to be casted.  But the pipeline for an
819         explicit cast first tests for potential implicit casts.
820
821         So for now, if the Location is null, it means `Probe only' to
822         avoid adding another argument.   Might have to revise this
823         strategy later.
824
825         (ClassCast): New class used to type cast objects into arbitrary
826         classes (used in Explicit Reference Conversions).
827
828         Implement `as' as well.
829
830         Reverted all the patches from Ravi below: they were broken:
831
832                 * The use of `level' as a mechanism to stop recursive
833                   invocations is wrong.  That was there just to catch the
834                   bug with a strack trace but not as a way of addressing
835                   the problem.
836
837                   To fix the problem we have to *understand* what is going
838                   on and the interactions and come up with a plan, not
839                   just get things going.
840
841                 * The use of the type conversion cache that I proposed
842                   last night had an open topic: How does this work across
843                   protection domains.  A user defined conversion might not
844                   be public in the location where we are applying the
845                   conversion, a different conversion might be selected
846                   (ie, private A->B (better) but public B->A (worse),
847                   inside A, A->B applies, but outside it, B->A will
848                   apply).
849
850                 * On top of that (ie, even if the above is solved),
851                   conversions in a cache need to be abstract.  Ie, `To
852                   convert from an Int to a Short use an OpcodeCast', not
853                   `To convert from an Int to a Short use the OpcodeCast on
854                   the variable 5' (which is what this patch was doing).
855         
856 2001-09-28  Ravi Pratap  <ravi@ximian.com>
857
858         * expression.cs (Invocation::ConversionExists): Re-write to use
859         the conversion cache
860         
861         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
862         cache all conversions done, not just user-defined ones.
863
864         (Invocation::BetterConversion): The real culprit. Use ConversionExists
865         to determine if a conversion exists instead of acutually trying to 
866         perform the conversion. It's faster too.
867
868         (Expression::ConvertExplicit): Modify to use ConversionExists to check
869         and only then attempt the implicit conversion.
870
871 2001-09-28  Ravi Pratap  <ravi@ximian.com>
872
873         * expression.cs (ConvertImplicit): Use a cache for conversions
874         already found. Check level of recursion and bail out if necessary.
875         
876 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
877
878         * typemanager.cs (string_concat_string_string, string_concat_object_object):
879         Export standard methods that we expect for string operations.
880         
881         * statement.cs (Block::UsageWarning): Track usage of variables and
882         report the errors for not used variables.
883
884         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
885         operator. 
886
887 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
888
889         * codegen.cs: remove unnneded code 
890
891         * expression.cs: Removed BuiltinTypeAccess class
892
893         Fix the order in which implicit conversions are
894         done.  
895
896         The previous fixed dropped support for boxed conversions (adding a
897         test to the test suite now)
898
899         (UserImplicitCast::CanConvert): Remove test for source being null,
900         that code is broken.  We should not feed a null to begin with, if
901         we do, then we should track the bug where the problem originates
902         and not try to cover it up here.
903
904         Return a resolved expression of type UserImplicitCast on success
905         rather than true/false.  Ravi: this is what I was talking about,
906         the pattern is to use a static method as a "constructor" for
907         objects. 
908
909         Also, do not create arguments until the very last minute,
910         otherwise we always create the arguments even for lookups that
911         will never be performed. 
912
913         (UserImplicitCast::Resolve): Eliminate, objects of type
914         UserImplicitCast are born in a fully resolved state. 
915         
916         * typemanager.cs (InitCoreTypes): Init also value_type
917         (System.ValueType). 
918
919         * expression.cs (Cast::Resolve): First resolve the child expression.
920
921         (LValue): Add new method AddressOf to be used by
922         the `&' operator.  
923
924         Change the argument of Store to take an EmitContext instead of an
925         ILGenerator, because things like FieldExpr need to be able to call
926         their children expression to generate the instance code. 
927
928         (Expression::Error, Expression::Warning): Sugar functions for
929         reporting errors.
930
931         (Expression::MemberLookup): Accept a TypeContainer instead of a
932         Report as the first argument.
933
934         (Expression::ResolvePrimary): Killed.  I still want to improve
935         this as currently the code is just not right.
936
937         (Expression::ResolveMemberAccess): Simplify, but it is still
938         wrong. 
939
940         (Unary::Resolve): Catch errors in AddressOf operators.
941
942         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
943         index to a byte for the short-version, or the compiler will choose
944         the wrong Emit call, which generates the wrong data.
945
946         (ParameterReference::Emit, ::Store): same.
947
948         (FieldExpr::AddressOf): Implement.
949         
950         * typemanager.cs: TypeManager: made public variable instead of
951         property.
952         
953         * driver.cs: document --fatal.
954
955         * report.cs (ErrorMessage, WarningMessage): new names for the old
956         Error and Warning classes.
957
958         * cs-parser.jay (member_access): Turn built-in access to types
959         into a normal simplename
960
961 2001-09-27  Ravi Pratap  <ravi@ximian.com>
962
963         * expression.cs (Invocation::BetterConversion): Fix to cope
964         with q being null, since this was introducing a bug.
965
966         * expression.cs (ConvertImplicit): Do built-in conversions first.
967
968 2001-09-27  Ravi Pratap  <ravi@ximian.com>
969
970         * expression.cs (UserImplicitCast::Resolve): Fix bug.
971
972 2001-09-27  Ravi Pratap  <ravi@ximian.com>
973
974         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
975         I had introduced long ago (what's new ?).
976
977         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
978         the work of all the checking. 
979         (ConvertImplicit): Call CanConvert and only then create object if necessary.
980         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
981
982         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
983         that is the right way. 
984
985         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
986         overloading resolution. Use everywhere instead of cutting and pasting code.
987
988         (Binary::ResolveOperator): Use MakeUnionSet.
989
990         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
991         we have to convert to bool types. Not complete yet.
992         
993 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
994
995         * typemanager.cs (TypeManager::CSharpName): support ushort.
996
997         * expression.cs (Expression::TryImplicitIntConversion): Attempts
998         to provide an expression that performsn an implicit constant int
999         conversion (section 6.1.6).
1000         (Expression::ConvertImplicitRequired): Reworked to include
1001         implicit constant expression conversions.
1002
1003         (Expression::ConvertNumericExplicit): Finished.
1004
1005         (Invocation::Emit): If InstanceExpression is null, then it means
1006         that we perform a call on this.
1007         
1008 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
1009
1010         * expression.cs (Unary::Emit): Remove some dead code.
1011         (Probe): Implement Resolve and Emit for `is'.
1012         (Expression::ConvertImplicitRequired): Attempt to do constant
1013         expression conversions here.  Maybe should be moved to
1014         ConvertImplicit, but I am not sure.
1015         (Expression::ImplicitLongConstantConversionPossible,
1016         Expression::ImplicitIntConstantConversionPossible): New functions
1017         that tell whether is it possible to apply an implicit constant
1018         expression conversion.
1019
1020         (ConvertNumericExplicit): Started work on explicit numeric
1021         conversions.
1022
1023         * cs-parser.jay: Update operator constants.
1024
1025         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
1026         (Parameters::GetSignature): Hook up VerifyArgs here.
1027         (Parameters::VerifyArgs): Verifies that no two arguments have the
1028         same name. 
1029
1030         * class.cs (Operator): Update the operator names to reflect the
1031         ones that the spec expects (as we are just stringizing the
1032         operator names).
1033         
1034         * expression.cs (Unary::ResolveOperator): Fix bug: Use
1035         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
1036         previous usage did only work for our methods.
1037         (Expression::ConvertImplicit): Handle decimal implicit numeric
1038         conversions as well.
1039         (Expression::InternalTypeConstructor): Used to invoke constructors
1040         on internal types for default promotions.
1041
1042         (Unary::Emit): Implement special handling for the pre/post
1043         increment/decrement for overloaded operators, as they need to have
1044         the same semantics as the other operators.
1045
1046         (Binary::ResolveOperator): ditto.
1047         (Invocation::ConversionExists): ditto.
1048         (UserImplicitCast::Resolve): ditto.
1049         
1050 2001-09-26  Ravi Pratap  <ravi@ximian.com>
1051
1052         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
1053         operator, return after emitting body. Regression tests pass again !
1054
1055         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
1056         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
1057         (Invocation::OverloadResolve): Ditto.
1058         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
1059
1060         * everywhere : update calls to the above methods accordingly.
1061
1062 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
1063
1064         * assign.cs (Assign): Make it inherit from ExpressionStatement.
1065
1066         * expression.cs (ExpressionStatement): New base class used for
1067         expressions that can appear in statements, so that we can provide
1068         an alternate path to generate expression that do not leave a value
1069         on the stack.
1070
1071         (Expression::Emit, and all the derivatives): We no longer return
1072         whether a value is left on the stack or not.  Every expression
1073         after being emitted leaves a single value on the stack.
1074
1075         * codegen.cs (EmitContext::EmitStatementExpression): Use the
1076         facilties of ExpressionStatement if possible.
1077
1078         * cs-parser.jay: Update statement_expression.
1079
1080 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
1081
1082         * driver.cs: Change the wording of message
1083
1084 2001-09-25  Ravi Pratap  <ravi@ximian.com>
1085
1086         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
1087         the type of the expression to the return type of the method if
1088         we have an overloaded operator match ! The regression tests pass again !
1089         (Unary::ResolveOperator): Ditto.
1090
1091         * expression.cs (Invocation::ConversionExists): Correct the member lookup
1092         to find "op_Implicit", not "implicit" ;-)
1093         (UserImplicitCast): New class to take care of user-defined implicit conversions.
1094         (ConvertImplicit, ForceConversion): Take TypeContainer argument
1095
1096         * everywhere : Correct calls to the above accordingly.
1097
1098         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
1099         (ConvertImplicit): Do user-defined conversion if it exists.
1100
1101 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
1102
1103         * assign.cs: track location.
1104         (Resolve): Use implicit conversions on assignment.
1105
1106         * literal.cs: Oops.  Not good, Emit of short access values should
1107         pass (Bytes) or the wrong argument will be selected.
1108
1109         * expression.cs (Unary::Emit): Emit code for -expr.
1110         
1111         (Unary::ResolveOperator): Handle `Substract' for non-constants
1112         (substract from zero from the non-constants).
1113         Deal with Doubles as well. 
1114         
1115         (Expression::ConvertImplicitRequired): New routine that reports an
1116         error if no implicit conversion exists. 
1117
1118         (Invocation::OverloadResolve): Store the converted implicit
1119         expressions if we make them
1120         
1121 2001-09-24  Ravi Pratap  <ravi@ximian.com>
1122
1123         * class.cs (ConstructorInitializer): Take a Location argument.
1124         (ConstructorBaseInitializer): Same here.
1125         (ConstructorThisInitializer): Same here.
1126
1127         * cs-parser.jay : Update all calls accordingly.
1128
1129         * expression.cs (Unary, Binary, New): Take location argument.
1130         Update accordingly everywhere.
1131
1132         * cs-parser.jay : Update all calls to the above to take a location
1133         argument.
1134
1135         * class.cs : Ditto.
1136
1137 2001-09-24  Ravi Pratap  <ravi@ximian.com>
1138
1139         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
1140         (Invocation::BetterConversion): Same here
1141         (Invocation::ConversionExists): Ditto.
1142
1143         (Invocation::ConversionExists): Implement.
1144
1145 2001-09-22  Ravi Pratap  <ravi@ximian.com>
1146
1147         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
1148         Also take an additional TypeContainer argument.
1149
1150         * All over : Pass in TypeContainer as argument to OverloadResolve.
1151
1152         * typemanager.cs (CSharpName): Update to check for the string type and return
1153         that too.
1154
1155         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
1156         a given method.
1157         
1158 2001-09-21  Ravi Pratap  <ravi@ximian.com>
1159
1160         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
1161         (Invocation::BetterFunction): Implement.
1162         (Invocation::BetterConversion): Implement.
1163         (Invocation::ConversionExists): Skeleton, no implementation yet.
1164
1165         Okay, things work fine !
1166
1167 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
1168
1169         * typemanager.cs: declare and load enum_type, delegate_type and
1170         void_type. 
1171
1172         * expression.cs (Expression::Emit): Now emit returns a value that
1173         tells whether a value is left on the stack or not.  This strategy
1174         might be reveted tomorrow with a mechanism that would address
1175         multiple assignments.
1176         (Expression::report118): Utility routine to report mismatches on
1177         the ExprClass.
1178
1179         (Unary::Report23): Report impossible type/operator combination
1180         utility function.
1181
1182         (Unary::IsIncrementableNumber): Whether the type can be
1183         incremented or decremented with add.
1184         (Unary::ResolveOperator): Also allow enumerations to be bitwise
1185         complemented. 
1186         (Unary::ResolveOperator): Implement ++, !, ~, ++ and --.
1187
1188         (Invocation::Emit): Deal with new Emit convetion.
1189         
1190         * All Expression derivatives: Updated their Emit method to return
1191         whether they leave values on the stack or not.
1192         
1193         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
1194         stack for expressions that are statements. 
1195
1196 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
1197
1198         * expression.cs (LValue): New interface.  Must be implemented by
1199         LValue objects.
1200         (LocalVariableReference, ParameterReference, FieldExpr): Implement
1201         LValue interface.
1202         
1203         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
1204         interface for generating code, simplifies the code.
1205
1206 2001-09-20  Ravi Pratap  <ravi@ximian.com>
1207
1208         * expression.cs (everywhere): Comment out return statements in ::Resolve
1209         methods to avoid the warnings.
1210
1211 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
1212
1213         * driver.cs (parse): Report error 2001 if we can not open the
1214         source file.
1215
1216         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
1217         not resolve it.
1218
1219         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
1220         object. 
1221
1222         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
1223         otherwise nested blocks end up with the same index.
1224
1225         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
1226
1227         * expression.cs:  Instead of having FIXMEs in the Resolve
1228         functions, throw exceptions so it is obvious that we are facing a
1229         bug. 
1230
1231         * cs-parser.jay (invocation_expression): Pass Location information.
1232
1233         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
1234         Use a basename for those routines because .NET does not like paths
1235         on them. 
1236
1237         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
1238         already defined.
1239
1240 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
1241
1242         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
1243         are loading the correct data types (throws an exception if not).
1244         (TypeManager::InitCoreTypes): Use CoreLookupType
1245
1246         * expression.cs (Unary::ResolveOperator): return the child
1247         expression for expressions which are just +expr.
1248         (Unary::ResolveOperator): Return negative literals for -LITERAL
1249         expressions (otherwise they are Unary {Literal}).
1250         (Invocation::Badness): Take into account `Implicit constant
1251         expression conversions'.
1252
1253         * literal.cs (LongLiteral): Implement long literal class.
1254         (IntLiteral): export the `Value' of the intliteral. 
1255
1256 2001-09-19  Ravi Pratap  <ravi@ximian.com>
1257
1258         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
1259
1260         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
1261         instead of 'Operator'
1262
1263         * expression.cs (Binary::ResolveOperator): Update accordingly.
1264         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
1265         and 'Minus'
1266
1267         * cs-parser.jay (unary_expression): Update to use the new names.
1268
1269         * gen-treedump.cs (GetUnary): Same here.
1270
1271         * expression.cs (Unary::Resolve): Implement.
1272         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
1273         operators are found instead of making noise ;-)
1274         (Unary::ResolveOperator): New method to do precisely the same thing which
1275         Binary::ResolveOperator does for Binary expressions.
1276         (Unary.method, .Arguments): Add.
1277         (Unary::OperName): Implement.   
1278         (Unary::ForceConversion): Copy and Paste !
1279
1280         * class.cs (Operator::Define): Fix a small bug for the case when we have 
1281         a unary operator.
1282
1283         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
1284         for the inbuilt operators. Only overloading works for now ;-)
1285
1286 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
1287
1288         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
1289         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
1290
1291         * expression.cs (This::Emit): Implement. 
1292         (This::Resolve): Implement.
1293         (TypeOf:Resolve): Implement.
1294         (Expression::ResolveSimpleName): Add an implicit this to instance
1295         field references. 
1296         (MemberAccess::Resolve): Deal with Parameters and Fields. 
1297         Bind instance variable to Field expressions.
1298         (FieldExpr::Instance): New field used to track the expression that
1299         represents the object instance.
1300         (FieldExpr::Resolve): Track potential errors from MemberLookup not
1301         binding 
1302         (FieldExpr::Emit): Implement.
1303
1304         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
1305         the last instruction contains a return opcode to avoid generating
1306         the last `ret' instruction (this generates correct code, and it is
1307         nice to pass the peverify output).
1308
1309         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
1310         initializer for static and instance variables.
1311         (Constructor::Emit): Allow initializer to be null in the case of
1312         static constructors.  Only emit initializer for instance
1313         constructors. 
1314
1315         (TypeContainer::FindMembers): Return a null array if there are no
1316         matches.
1317
1318         Also fix the code for the MemberTypes.Method branch, as it was not
1319         scanning that for operators (or tried to access null variables before).
1320
1321         * assign.cs (Assign::Emit): Handle instance and static fields. 
1322
1323         * TODO: Updated.
1324
1325         * driver.cs: Stop compilation if there are parse errors.
1326
1327         * cs-parser.jay (constructor_declaration): Provide default base
1328         initializer for non-static constructors.
1329         (constructor_declarator): Do not provide a default base
1330         initializers if none was specified.
1331         Catch the fact that constructors should not have parameters.
1332
1333         * class.cs: Do not emit parent class initializers for static
1334         constructors, that should be flagged as an error.
1335
1336 2001-09-18  Ravi Pratap  <ravi@ximian.com>
1337
1338         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
1339         Move back code into TypeContainer::Populate.
1340
1341 2001-09-18  Ravi Pratap  <ravi@ximian.com>
1342
1343         * class.cs (TypeContainer::AddConstructor): Fix the check to
1344         compare against Name, not Basename. 
1345         (Operator::OpType): Change Plus and Minus to Add and Subtract.
1346
1347         * cs-parser.jay : Update accordingly.
1348
1349         * class.cs (TypeContainer::FindMembers): For the case where we are searching
1350         for methods, don't forget to look into the operators too.
1351         (RegisterMethodBuilder): Helper method to take care of this for
1352         methods, constructors and operators.
1353         (Operator::Define): Completely revamp.
1354         (Operator.OperatorMethod, MethodName): New fields.
1355         (TypeContainer::Populate): Move the registering of builders into
1356         RegisterMethodBuilder.
1357         (Operator::Emit): Re-write.
1358
1359         * expression.cs (Binary::Emit): Comment out code path to emit method
1360         invocation stuff for the case when we have a user defined operator. I am
1361         just not able to get it right !
1362         
1363 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
1364
1365         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
1366         argument. 
1367
1368         (Expression::MemberLookup): Provide a version that allows to
1369         specify the MemberTypes and BindingFlags. 
1370
1371         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
1372         so it was not fetching variable information from outer blocks.
1373
1374         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
1375         Beforefieldinit as it was buggy.
1376
1377         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
1378         that Ravi put here.  
1379
1380         * class.cs (Constructor::Emit): Only emit if block is not null.
1381         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
1382         deal with this by semantically definining it as if the user had
1383         done it.
1384
1385         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
1386         constructors as we now "emit" them at a higher level.
1387
1388         (TypeContainer::DefineDefaultConstructor): Used to define the
1389         default constructors if none was provided.
1390
1391         (ConstructorInitializer): Add methods Resolve and Emit. 
1392         
1393         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
1394
1395 2001-09-17  Ravi Pratap  <ravi@ximian.com>
1396
1397         * class.cs (TypeContainer::EmitDefaultConstructor): Register
1398         the default constructor builder with our hashtable for methodbuilders
1399         to methodcores.
1400
1401         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
1402         and argument_count is 0 in which case we have a match.
1403         (Binary::ResolveOperator): More null checking and miscellaneous coding
1404         style cleanup.
1405
1406 2001-09-17  Ravi Pratap  <ravi@ximian.com>
1407
1408         * rootcontext.cs (IsNameSpace): Compare against null.
1409
1410         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
1411
1412         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
1413         and Unary::Operator.
1414
1415         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
1416         accordingly.
1417
1418         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
1419         we have overloaded operators.
1420         (Binary::ResolveOperator): Implement the part which does the operator overload
1421         resolution.
1422
1423         * class.cs (Operator::Emit): Implement.
1424         (TypeContainer::Emit): Emit the operators we have too.
1425
1426         * expression.cs (Binary::Emit): Update to emit the appropriate code for
1427         the case when we have a user-defined operator.
1428         
1429 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
1430
1431         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
1432
1433 2001-09-16  Ravi Pratap  <ravi@ximian.com>
1434
1435         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
1436         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
1437         (Constructor::Emit): Implement.
1438         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
1439         if we have no work to do. 
1440         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
1441         Emit method.
1442
1443         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
1444         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
1445
1446         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
1447         of parent.parent.
1448
1449 2001-09-15  Ravi Pratap  <ravi@ximian.com>
1450
1451         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
1452         in the source.
1453         (Tree::RecordNamespace): Method to do what the name says ;-)
1454         (Tree::Namespaces): Property to get at the namespaces hashtable.
1455
1456         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
1457         keep track.
1458
1459         * rootcontext.cs (IsNamespace): Fixed it :-)
1460
1461 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
1462
1463         * class.cs (TypeContainer::FindMembers): Add support for
1464         constructors. 
1465         (MethodCore): New class that encapsulates both the shared aspects
1466         of a Constructor and a Method.  
1467         (Method, Constructor): Factored pieces into MethodCore.
1468
1469         * driver.cs: Added --fatal which makes errors throw exceptions.
1470         Load System assembly as well as part of the standard library.
1471
1472         * report.cs: Allow throwing exceptions on errors for debugging.
1473
1474         * modifiers.cs: Do not use `parent', instead use the real type
1475         container to evaluate permission settings.
1476
1477         * class.cs: Put Ravi's patch back in.  He is right, and we will
1478         have to cope with the
1479
1480 2001-09-14  Ravi Pratap  <ravi@ximian.com>
1481
1482         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
1483         FamORAssem, not FamANDAssem.
1484         
1485 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
1486
1487         * driver.cs: Added --parse option that only parses its input files
1488         and terminates.
1489
1490         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
1491         incorrect.  IsTopLevel is not used to tell whether an object is
1492         root_types or not (that can be achieved by testing this ==
1493         root_types).  But to see if this is a top-level *class* (not
1494         necessarly our "toplevel" container). 
1495
1496 2001-09-14  Ravi Pratap  <ravi@ximian.com>
1497
1498         * enum.cs (Enum::Define): Modify to call the Lookup method on the
1499         parent instead of a direct call to GetType.
1500
1501 2001-09-14  Ravi Pratap  <ravi@ximian.com>
1502
1503         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
1504         Modifiers.TypeAttr. This should just be a call to that method.
1505
1506         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
1507         object so that we can determine if we are top-level or not.
1508
1509         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
1510         TypeContainer too.
1511
1512         * enum.cs (Enum::Define): Ditto.
1513
1514         * modifiers.cs (FieldAttr): Re-write.
1515
1516         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
1517         (TypeContainer::HaveStaticConstructor): New property to provide access
1518         to precisely that info.
1519
1520         * modifiers.cs (MethodAttr): Re-write.
1521         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
1522
1523         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
1524         of top-level types as claimed.
1525         
1526 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
1527
1528         * expression.cs (MemberLookup): Fruitless attempt to lookup
1529         constructors.  Maybe I need to emit default constructors?  That
1530         might be it (currently .NET emits this for me automatically).
1531         (Invocation::OverloadResolve): Cope with Arguments == null.
1532         (Invocation::EmitArguments): new function, shared by the new
1533         constructor and us.
1534         (Invocation::Emit): Handle static and instance methods.  Emit
1535         proper call instruction for virtual or non-virtual invocations.
1536         (New::Emit): Implement.
1537         (New::Resolve): Implement.
1538         (MemberAccess:Resolve): Implement.
1539         (MethodGroupExpr::InstanceExpression): used conforming to the spec
1540         to track instances.
1541         (FieldExpr::Resolve): Set type.
1542
1543         * support.cs: Handle empty arguments.
1544                 
1545         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
1546         SimpleLookup): Auxiliary routines to help parse a qualifier
1547         identifier.  
1548
1549         Update qualifier_identifier rule.
1550
1551         * codegen.cs: Removed debugging messages.
1552
1553         * class.cs: Make this a global thing, this acts just as a "key" to
1554         objects that we might have around.
1555
1556         (Populate): Only initialize method_builders_to_methods once.
1557
1558         * expression.cs (PropertyExpr): Initialize type from the
1559         PropertyType. 
1560
1561         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
1562         Resolve pattern.  Attempt to implicitly convert value to boolean.
1563         Emit code.
1564
1565         * expression.cs: Set the type for the int32/int32 argument case.
1566         (Binary::ResolveOperator): Set the return type to boolean for
1567         comparission operators
1568
1569         * typemanager.cs: Remove debugging print code.
1570
1571         (Invocation::Resolve): resolve type.
1572
1573         * class.cs: Allocate a MemberInfo of the correct size, as the code
1574         elsewhere depends on the test to reflect the correct contents.
1575
1576         (Method::) Keep track of parameters, due to System.Reflection holes
1577
1578         (TypeContainer::Populate): Keep track of MethodBuilders to Method
1579         mapping here.
1580
1581         (TypeContainer::FindMembers): Use ArrayList and then copy an array
1582         of the exact size and return that.
1583
1584         (Class::LookupMethodByBuilder): New function that maps
1585         MethodBuilders to its methods.  Required to locate the information
1586         on methods because System.Reflection bit us again.
1587
1588         * support.cs: New file, contains an interface ParameterData and
1589         two implementations: ReflectionParameters and InternalParameters
1590         used to access Parameter information.  We will need to grow this
1591         as required.
1592
1593         * expression.cs (Invocation::GetParameterData): implement a cache
1594         and a wrapper around the ParameterData creation for methods. 
1595         (Invocation::OverloadResolve): Use new code.
1596
1597 2001-09-13  Ravi Pratap  <ravi@ximian.com>
1598
1599         * class.cs (TypeContainer::EmitField): Remove and move into 
1600         (Field::Define): here and modify accordingly.
1601         (Field.FieldBuilder): New member.
1602         (TypeContainer::Populate): Update accordingly.
1603         (TypeContainer::FindMembers): Implement.
1604
1605 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
1606
1607         * statement.cs: (VariableInfo::VariableType): New field to be
1608         initialized with the full type once it is resolved. 
1609
1610 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
1611
1612         * parameter.cs (GetParameterInfo): Use a type cache to compute
1613         things only once, and to reuse this information
1614
1615         * expression.cs (LocalVariableReference::Emit): Implement.
1616         (OpcodeCast::Emit): fix.
1617
1618         (ParameterReference::Resolve): Implement.
1619         (ParameterReference::Emit): Implement.
1620
1621         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
1622         that are expressions need to stay as Expressions.
1623
1624         * typemanager.cs (CSharpName): Returns the C# name of a type if
1625         possible. 
1626
1627         * expression.cs (Expression::ConvertImplicit): New function that
1628         implements implicit type conversions.
1629
1630         (Expression::ImplicitReferenceConversion): Implements implicit
1631         reference conversions.
1632
1633         (EmptyCast): New type for transparent casts.
1634
1635         (OpcodeCast): New type for casts of types that are performed with
1636         a sequence of bytecodes.
1637         
1638         (BoxedCast): New type used for casting value types into reference
1639         types.  Emits a box opcode.
1640
1641         (Binary::DoNumericPromotions): Implements numeric promotions of
1642         and computation of the Binary::Type.
1643
1644         (Binary::EmitBranchable): Optimization.
1645
1646         (Binary::Emit): Implement code emission for expressions.
1647         
1648         * typemanager.cs (TypeManager): Added two new core types: sbyte
1649         and byte.
1650
1651 2001-09-12  Ravi Pratap  <ravi@ximian.com>
1652
1653         * class.cs (TypeContainer::FindMembers): Method which does exactly
1654         what Type.FindMembers does, only we don't have to use reflection. No
1655         implementation yet.
1656
1657         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
1658         typecontainer objects as we need to get at them.
1659         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
1660
1661         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
1662         typecontainer object.
1663
1664         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
1665         of just a Report object.
1666
1667 2001-09-11  Ravi Pratap  <ravi@ximian.com>
1668
1669         * class.cs (Event::Define): Go back to using the prefixes "add_" and
1670         "remove_"
1671         (TypeContainer::Populate): Now define the delegates of the type too.
1672         (TypeContainer.Delegates): Property to access the list of delegates defined
1673         in the type.
1674
1675         * delegates.cs (Delegate::Define): Implement partially.
1676
1677         * modifiers.cs (TypeAttr): Handle more flags.
1678
1679 2001-09-11  Ravi Pratap  <ravi@ximian.com>
1680
1681         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
1682         and not <=
1683         (Operator::Define): Re-write logic to get types by using the LookupType method
1684         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
1685         (Indexer::Define): Ditto.
1686         (Event::Define): Ditto.
1687         (Property::Define): Ditto.
1688         
1689 2001-09-10  Ravi Pratap  <ravi@ximian.com>
1690
1691         * class.cs (TypeContainer::Populate): Now define operators too. 
1692         (TypeContainer.Operators): New property to access the list of operators
1693         in a type.
1694         (Operator.OperatorMethodBuilder): New member to hold the method builder
1695         for the operator we are defining.
1696         (Operator::Define): Implement.
1697
1698 2001-09-10  Ravi Pratap  <ravi@ximian.com>
1699
1700         * class.cs (Event::Define): Make the prefixes of the accessor methods
1701         addOn_ and removeOn_ 
1702
1703         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
1704         of the location being passed in too. Ideally, this should go later since all
1705         error reporting should be done through the Report object.
1706
1707         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
1708         (Populate): Iterate thru the indexers we have and define them too.
1709         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
1710         for the get and set accessors.
1711         (Indexer::Define): Implement.
1712         
1713 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
1714
1715         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
1716         my previous implementation, did not work.
1717
1718         * typemanager.cs: Add a couple of missing types (the longs).
1719
1720         * literal.cs: Use TypeManager.bool_type instead of getting it.
1721
1722         * expression.cs (EventExpr): New kind of expressions.
1723         (Expressio::ExprClassFromMemberInfo): finish
1724
1725 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
1726
1727         * assign.cs: Emit stores to static fields differently.
1728
1729 2001-09-08  Ravi Pratap  <ravi@ximian.com>
1730
1731         * Merge in changes and adjust code to tackle conflicts. Backed out my
1732         code in Assign::Resolve ;-) 
1733
1734 2001-09-08  Ravi Pratap  <ravi@ximian.com>
1735
1736         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
1737         instead Report.Error and also pass in the location.
1738         (CSharpParser::Lexer): New readonly property to return the reference
1739         to the Tokenizer object.
1740         (declare_local_variables): Use Report.Error with location instead of plain 
1741         old error.
1742         (CheckDef): Ditto.
1743
1744         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
1745         (Operator.CheckBinaryOperator): Ditto.
1746
1747         * cs-parser.jay (operator_declarator): Update accordingly.
1748
1749         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
1750         (CheckBinaryOperator): Same here.
1751
1752         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
1753         on the name without any prefixes of namespace names etc. This is because we
1754         already might have something already fully qualified like 
1755         'System.Console.WriteLine'
1756
1757         * assign.cs (Resolve): Begin implementation. Stuck ;-)
1758
1759 2001-09-07  Ravi Pratap  <ravi@ximian.com>
1760
1761         * cs-tokenizer.cs (location): Return a string which also contains
1762         the file name.
1763
1764         * expression.cs (ElementAccess): New class for expressions of the
1765         type 'element access.'
1766         (BaseAccess): New class for expressions of the type 'base access.'
1767         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
1768         respectively.
1769         
1770         * cs-parser.jay (element_access): Implement action.
1771         (base_access): Implement actions.
1772         (checked_expression, unchecked_expression): Implement.
1773
1774         * cs-parser.jay (local_variable_type): Correct and implement.
1775         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
1776
1777         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
1778
1779         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
1780         name and the specifiers.
1781
1782         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
1783         
1784         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
1785         making them all public ;-)
1786
1787         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
1788         class anyways.
1789         
1790 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
1791
1792         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
1793         PropertyExprs.
1794         (FieldExpr, PropertyExprs): New resolved expressions.
1795         (SimpleName::MemberStaticCheck): Perform static checks for access
1796         to non-static fields on static methods. Maybe this should be
1797         generalized for MemberAccesses. 
1798         (SimpleName::ResolveSimpleName): More work on simple name
1799         resolution. 
1800
1801         * cs-parser.jay (primary_expression/qualified_identifier): track
1802         the parameter index.
1803
1804         * codegen.cs (CodeGen::Save): Catch save exception, report error.
1805         (EmitContext::EmitBoolExpression): Chain to expression generation
1806         instead of temporary hack.
1807         (::EmitStatementExpression): Put generic expression code generation.
1808
1809         * assign.cs (Assign::Emit): Implement variable assignments to
1810         local variables, parameters and fields.
1811
1812 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
1813
1814         * statement.cs (Block::GetVariableInfo): New method, returns the
1815         VariableInfo for a variable name in a block.
1816         (Block::GetVariableType): Implement in terms of GetVariableInfo
1817
1818         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
1819         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
1820
1821 2001-09-06  Ravi Pratap  <ravi@ximian.com>
1822
1823         * cs-parser.jay (operator_declaration): Continue on my quest : update
1824         to take attributes argument.
1825         (event_declaration): Ditto.
1826         (enum_declaration): Ditto.
1827         (indexer_declaration): Ditto.
1828         
1829         * class.cs (Operator::Operator): Update constructor accordingly.
1830         (Event::Event): Ditto.
1831
1832         * delegate.cs (Delegate::Delegate): Same here.
1833
1834         * enum.cs (Enum::Enum): Same here.
1835         
1836 2001-09-05  Ravi Pratap  <ravi@ximian.com>
1837
1838         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
1839
1840         * ../tests/cs0658.cs : New file to demonstrate error 0658.
1841
1842         * attribute.cs (Attributes): New class to encapsulate all attributes which were
1843         being passed around as an arraylist.
1844         (Attributes::AddAttribute): Method to add attribute sections.
1845
1846         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
1847         (struct_declaration): Update accordingly.
1848         (constant_declaration): Update.
1849         (field_declaration): Update.
1850         (method_header): Update.
1851         (fixed_parameter): Update.
1852         (parameter_array): Ditto.
1853         (property_declaration): Ditto.
1854         (destructor_declaration): Ditto.
1855         
1856         * class.cs (Struct::Struct): Update constructors accordingly.
1857         (Class::Class): Ditto.
1858         (Field::Field): Ditto.
1859         (Method::Method): Ditto.
1860         (Property::Property): Ditto.
1861         (TypeContainer::OptAttribute): update property's return type.
1862         
1863         * interface.cs (Interface.opt_attributes): New member.
1864         (Interface::Interface): Update to take the extra Attributes argument.
1865
1866         * parameter.cs (Parameter::Parameter): Ditto.
1867
1868         * constant.cs (Constant::Constant): Ditto.
1869
1870         * interface.cs (InterfaceMemberBase): New OptAttributes field.
1871         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
1872         the attributes as a parameter.
1873         (InterfaceProperty): Update constructor call.
1874         (InterfaceEvent): Ditto.
1875         (InterfaceMethod): Ditto.
1876         (InterfaceIndexer): Ditto.
1877
1878         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
1879         pass the attributes too.
1880         (interface_event_declaration): Ditto.
1881         (interface_property_declaration): Ditto.
1882         (interface_method_declaration): Ditto.
1883         (interface_declaration): Ditto.
1884
1885 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
1886
1887         * class.cs (Method::Define): Track the "static Main" definition to
1888         create an entry point. 
1889
1890         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
1891         EntryPoint if we find it. 
1892
1893         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
1894         (EmitContext::ig): Make this variable public.
1895
1896         * driver.cs: Make the default output file be the first file name
1897         with the .exe extension.  
1898
1899         Detect empty compilations
1900
1901         Handle various kinds of output targets.  Handle --target and
1902         rename -t to --dumper.
1903
1904         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
1905         methods inherited from Expression return now an Expression.  This
1906         will is used during the tree rewriting as we resolve them during
1907         semantic analysis.
1908
1909         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
1910         the spec.  Missing entirely is the information about
1911         accessability of elements of it.
1912
1913         (Expression::ExprClassFromMemberInfo): New constructor for
1914         Expressions that creates a fully initialized Expression based on
1915         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
1916         a Type.
1917
1918         (Invocation::Resolve): Begin implementing resolution of invocations.
1919         
1920         * literal.cs (StringLiteral):  Implement Emit.
1921
1922 2001-09-05  Ravi Pratap  <ravi@ximian.com>
1923
1924         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
1925         member.
1926         
1927 2001-09-04  Ravi Pratap  <ravi@ximian.com>
1928
1929         * cs-parser.jay (attribute_arguments): Implement actions.
1930         (attribute): Fix bug in production. Implement action.
1931         (attribute_list): Implement.
1932         (attribute_target): Implement.
1933         (attribute_target_specifier, opt_target_specifier): Implement
1934         (CheckAttributeTarget): New method to check if the attribute target
1935         is valid.
1936         (attribute_section): Implement.
1937         (opt_attributes): Implement.
1938
1939         * attribute.cs : New file to handle attributes.
1940         (Attribute): Class to hold attribute info.
1941
1942         * cs-parser.jay (opt_attribute_target_specifier): Remove production
1943         (attribute_section): Modify production to use 2 different rules to 
1944         achieve the same thing. 1 s/r conflict down !
1945         Clean out commented, useless, non-reducing dimension_separator rules.
1946         
1947         * class.cs (TypeContainer.attributes): New member to hold list
1948         of attributes for a type.
1949         (Struct::Struct): Modify to take one more argument, the attribute list.
1950         (Class::Class): Ditto.
1951         (Field::Field): Ditto.
1952         (Method::Method): Ditto.
1953         (Property::Property): Ditto.
1954         
1955         * cs-parser.jay (struct_declaration): Update constructor call to
1956         pass in the attributes too.
1957         (class_declaration): Ditto.
1958         (constant_declaration): Ditto.
1959         (field_declaration): Ditto.
1960         (method_header): Ditto.
1961         (fixed_parameter): Ditto.
1962         (parameter_array): Ditto.
1963         (property_declaration): Ditto.
1964
1965         * constant.cs (Constant::Constant): Update constructor similarly.
1966         Use System.Collections.
1967
1968         * parameter.cs (Parameter::Parameter): Update as above.
1969
1970 2001-09-02  Ravi Pratap  <ravi@ximian.com>
1971
1972         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
1973         (TypeContainer.delegates): New member to hold list of delegates.
1974
1975         * cs-parser.jay (delegate_declaration): Implement the action correctly 
1976         this time as I seem to be on crack ;-)
1977
1978 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
1979
1980         * rootcontext.cs (RootContext::IsNamespace): new function, used to
1981         tell whether an identifier represents a namespace.
1982
1983         * expression.cs (NamespaceExpr): A namespace expression, used only
1984         temporarly during expression resolution.
1985         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
1986         utility functions to resolve names on expressions.
1987
1988 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
1989
1990         * codegen.cs: Add hook for StatementExpressions. 
1991
1992         * class.cs: Fix inverted test for static flag in methods.
1993
1994 2001-09-02  Ravi Pratap  <ravi@ximian.com>
1995
1996         * class.cs (Operator::CheckUnaryOperator): Correct error number used
1997         to make it coincide with MS' number.
1998         (Operator::CheckBinaryOperator): Ditto.
1999
2000         * ../errors/errors.txt : Remove error numbers added earlier.
2001
2002         * ../errors/cs1019.cs : Test case for error # 1019
2003
2004         * ../errros/cs1020.cs : Test case for error # 1020
2005
2006         * cs-parser.jay : Clean out commented cruft.
2007         (dimension_separators, dimension_separator): Comment out. Ostensibly not
2008         used anywhere - non-reducing rule.
2009         (namespace_declarations): Non-reducing rule - comment out.
2010
2011         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
2012         with TypeContainer::AddEnum.
2013
2014         * delegate.cs : New file for delegate handling classes.
2015         (Delegate): Class for declaring delegates.
2016
2017         * makefile : Update.
2018
2019         * cs-parser.jay (delegate_declaration): Implement.
2020
2021 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
2022
2023         * class.cs (Event::Define): Implement.
2024         (Event.EventBuilder): New member.
2025
2026         * class.cs (TypeContainer::Populate): Update to define all enums and events
2027         we have.
2028         (Events): New property for the events arraylist we hold. Shouldn't we move to using
2029         readonly fields for all these cases ?
2030
2031 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
2032
2033         * class.cs (Property): Revamp to use the convention of making fields readonly.
2034         Accordingly modify code elsewhere.
2035
2036         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
2037         the Define method of the Property class.
2038
2039         * class.cs : Clean up applied patch and update references to variables etc. Fix 
2040         trivial bug.
2041         (TypeContainer::Populate): Update to define all the properties we have. Also
2042         define all enumerations.
2043
2044         * enum.cs (Define): Implement.
2045         
2046 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
2047
2048         * cs-parser.jay (overloadable_operator): The semantic value is an
2049         enum of the Operator class.
2050         (operator_declarator): Implement actions.
2051         (operator_declaration): Implement.
2052
2053         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
2054         validity of definitions.
2055         (Operator::CheckBinaryOperator): Static method to check for binary operators
2056         (TypeContainer::AddOperator): New method to add an operator to a type.
2057
2058         * cs-parser.jay (indexer_declaration): Added line to actually call the
2059         AddIndexer method so it gets added ;-)
2060
2061         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
2062         already taken care of by the MS compiler ?  
2063
2064 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
2065
2066         * class.cs (Operator): New class for operator declarations.
2067         (Operator::OpType): Enum for the various operators.
2068
2069 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
2070
2071         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
2072         ostensibly handle this in semantic analysis.
2073
2074         * cs-parser.jay (general_catch_clause): Comment out
2075         (specific_catch_clauses, specific_catch_clause): Ditto.
2076         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
2077         (catch_args, opt_catch_args): New productions.
2078         (catch_clause): Rewrite to use the new productions above
2079         (catch_clauses): Modify accordingly.
2080         (opt_catch_clauses): New production to use in try_statement
2081         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
2082         and re-write the code in the actions to extract the specific and
2083         general catch clauses by being a little smart ;-)
2084
2085         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
2086         Hooray, try and catch statements parse fine !
2087         
2088 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
2089
2090         * statement.cs (Block::GetVariableType): Fix logic to extract the type
2091         string from the hashtable of variables.
2092
2093         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
2094         I end up making that mistake ;-)
2095         (catch_clauses): Fixed gross error which made Key and Value of the 
2096         DictionaryEntry the same : $1 !!
2097
2098 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
2099
2100         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
2101
2102         * cs-parser.jay (event_declaration): Correct to remove the semicolon
2103         when the add and remove accessors are specified. 
2104
2105 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
2106
2107         * cs-parser.jay (IndexerDeclaration): New helper class to hold
2108         information about indexer_declarator.
2109         (indexer_declarator): Implement actions.
2110         (parsing_indexer): New local boolean used to keep track of whether
2111         we are parsing indexers or properties. This is necessary because 
2112         implicit_parameters come into picture even for the get accessor in the 
2113         case of an indexer.
2114         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
2115
2116         * class.cs (Indexer): New class for indexer declarations.
2117         (TypeContainer::AddIndexer): New method to add an indexer to a type.
2118         (TypeContainer::indexers): New member to hold list of indexers for the
2119         type.
2120
2121 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
2122
2123         * cs-parser.jay (add_accessor_declaration): Implement action.
2124         (remove_accessor_declaration): Implement action.
2125         (event_accessors_declaration): Implement
2126         (variable_declarators): swap statements for first rule - trivial.
2127
2128         * class.cs (Event): New class to hold information about event
2129         declarations.
2130         (TypeContainer::AddEvent): New method to add an event to a type
2131         (TypeContainer::events): New member to hold list of events.
2132
2133         * cs-parser.jay (event_declaration): Implement actions.
2134
2135 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
2136
2137         * cs-parser.jay (dim_separators): Implement. Make it a string
2138         concatenating all the commas together, just as they appear.
2139         (opt_dim_separators): Modify accordingly
2140         (rank_specifiers): Update accordingly. Basically do the same
2141         thing - instead, collect the brackets here.
2142         (opt_rank_sepcifiers): Modify accordingly.
2143         (array_type): Modify to actually return the complete type string
2144         instead of ignoring the rank_specifiers.
2145         (expression_list): Implement to collect the expressions
2146         (variable_initializer): Implement. We make it a list of expressions
2147         essentially so that we can handle the array_initializer case neatly too.
2148         (variable_initializer_list): Implement.
2149         (array_initializer): Make it a list of variable_initializers
2150         (opt_array_initializer): Modify accordingly.
2151
2152         * expression.cs (New::NType): Add enumeration to help us
2153         keep track of whether we have an object/delegate creation
2154         or an array creation.
2155         (New:NewType, New::Rank, New::Indices, New::Initializers): New
2156         members to hold data about array creation.
2157         (New:New): Modify to update NewType
2158         (New:New): New Overloaded contructor for the array creation
2159         case.
2160
2161         * cs-parser.jay (array_creation_expression): Implement to call
2162         the overloaded New constructor.
2163         
2164 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
2165
2166         * class.cs (TypeContainer::Constructors): Return member
2167         constructors instead of returning null.
2168
2169 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
2170
2171         * typemanager.cs (InitCoreTypes): Initialize the various core
2172         types after we have populated the type manager with the user
2173         defined types (this distinction will be important later while
2174         compiling corlib.dll)
2175
2176         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
2177         on Expression Classification.  Now all expressions have a method
2178         `Resolve' and a method `Emit'.
2179
2180         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
2181         generation from working.     Also add some temporary debugging
2182         code. 
2183         
2184 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
2185
2186         * codegen.cs: Lots of code generation pieces.  This is only the
2187         beginning, will continue tomorrow with more touches of polish.  We
2188         handle the fundamentals of if, while, do, for, return.  Others are
2189         trickier and I need to start working on invocations soon.
2190         
2191         * gen-treedump.cs: Bug fix, use s.Increment here instead of
2192         s.InitStatement. 
2193
2194         * codegen.cs (EmitContext): New struct, used during code
2195         emission to keep a context.   Most of the code generation will be
2196         here. 
2197
2198         * cs-parser.jay: Add embedded blocks to the list of statements of
2199         this block.  So code generation proceeds in a top down fashion.
2200
2201 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
2202
2203         * statement.cs: Add support for multiple child blocks.
2204
2205 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
2206
2207         * codegen.cs (EmitCode): New function, will emit the code for a
2208         Block of code given a TypeContainer and its ILGenerator. 
2209
2210         * statement.cs (Block): Standard public readonly optimization.
2211         (Block::Block constructors): Link children. 
2212         (Block::Child): Child Linker.
2213         (Block::EmitVariables): Emits IL variable declarations.
2214
2215         * class.cs: Drop support for MethodGroups here, delay until
2216         Semantic Analysis.
2217         (Method::): Applied the same simplification that I did before, and
2218         move from Properties to public readonly fields.
2219         (Method::ParameterTypes): Returns the parameter types for the
2220         function, and implements a cache that will be useful later when I
2221         do error checking and the semantic analysis on the methods is
2222         performed.
2223         (Constructor::GetCallingConvention): Renamed from CallingConvetion
2224         and made a method, optional argument tells whether this is a class
2225         or a structure to apply the `has-this' bit.
2226         (Method::GetCallingConvention): Implement, returns the calling
2227         convention. 
2228         (Method::Define): Defines the type, a second pass is performed
2229         later to populate the methods.
2230
2231         (Constructor::ParameterTypes): implement a cache similar to the
2232         one on Method::ParameterTypes, useful later when we do semantic
2233         analysis. 
2234
2235         (TypeContainer::EmitMethod):  New method.  Emits methods.
2236
2237         * expression.cs: Removed MethodGroup class from here.
2238         
2239         * parameter.cs (Parameters::GetCallingConvention): new method.
2240
2241 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
2242
2243         * class.cs (TypeContainer::Populate): Drop RootContext from the
2244         argument. 
2245
2246         (Constructor::CallingConvention): Returns the calling convention.
2247         (Constructor::ParameterTypes): Returns the constructor parameter
2248         types. 
2249         
2250         (TypeContainer::AddConstructor): Keep track of default constructor
2251         and the default static constructor.
2252
2253         (Constructor::) Another class that starts using `public readonly'
2254         instead of properties. 
2255
2256         (Constructor::IsDefault): Whether this is a default constructor. 
2257
2258         (Field::) use readonly public fields instead of properties also.
2259
2260         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
2261         track of static constructors;  If none is used, turn on
2262         BeforeFieldInit in the TypeAttributes. 
2263
2264         * cs-parser.jay (opt_argument_list): now the return can be null
2265         for the cases where there are no arguments. 
2266
2267         (constructor_declarator): If there is no implicit `base' or
2268         `this', then invoke the default parent constructor. 
2269         
2270         * modifiers.cs (MethodAttr): New static function maps a set of
2271         modifiers flags into a MethodAttributes enum
2272         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
2273         MethodAttr, TypeAttr to represent the various mappings where the
2274         modifiers are used.
2275         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
2276
2277 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
2278
2279         * parameter.cs (GetParameterInfo): Fix bug where there would be no
2280         method arguments.
2281
2282         * interface.cs (PopulateIndexer): Implemented the code generator
2283         for interface indexers.
2284
2285 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
2286
2287         * interface.cs (InterfaceMemberBase): Now we track the new status
2288         here.  
2289
2290         (PopulateProperty): Implement property population.  Woohoo!  Got
2291         Methods and Properties going today. 
2292
2293         Removed all the properties for interfaces, and replaced them with
2294         `public readonly' fields. 
2295
2296 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
2297
2298         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
2299         initialize their hashtables/arraylists only when they are needed
2300         instead of doing this always.
2301
2302         * parameter.cs: Handle refs and out parameters.
2303
2304         * cs-parser.jay: Use an ArrayList to construct the arguments
2305         instead of the ParameterCollection, and then cast that to a
2306         Parameter[] array.
2307
2308         * parameter.cs: Drop the use of ParameterCollection and use
2309         instead arrays of Parameters.
2310
2311         (GetParameterInfo): Use the Type, not the Name when resolving
2312         types. 
2313
2314 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
2315
2316         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
2317         and instead use public readonly fields.
2318
2319         * class.cs: Put back walking code for type containers.
2320
2321 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
2322
2323         * class.cs (MakeConstant): Code to define constants.
2324
2325         * rootcontext.cs (LookupType): New function.  Used to locate types 
2326
2327         
2328 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
2329
2330         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
2331         this System.Reflection code is.  Kudos to Microsoft
2332         
2333         * typemanager.cs: Implement a type cache and avoid loading all
2334         types at boot time.  Wrap in LookupType the internals.  This made
2335         the compiler so much faster.  Wow.  I rule!
2336         
2337         * driver.cs: Make sure we always load mscorlib first (for
2338         debugging purposes, nothing really important).
2339
2340         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
2341         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
2342
2343         * rootcontext.cs: Lookup types on their namespace;  Lookup types
2344         on namespaces that have been imported using the `using' keyword.
2345
2346         * class.cs (TypeContainer::TypeAttr): Virtualize.
2347         (Class::TypeAttr): Return attributes suitable for this bad boy.
2348         (Struct::TypeAttr): ditto.
2349         Handle nested classes.
2350         (TypeContainer::) Remove all the type visiting code, it is now
2351         replaced with the rootcontext.cs code
2352
2353         * rootcontext.cs (GetClassBases): Added support for structs. 
2354
2355 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
2356
2357         * interface.cs, statement.cs, class.cs, parameter.cs,
2358         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
2359         Drop use of TypeRefs, and use strings instead.
2360
2361 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
2362
2363         * rootcontext.cs: 
2364
2365         * class.cs (Struct::Struct): set the SEALED flags after
2366         checking the modifiers.
2367         (TypeContainer::TypeAttr): new property, returns the
2368         TypeAttributes for a class.  
2369
2370         * cs-parser.jay (type_list): Oops, list production was creating a
2371         new list of base types.
2372
2373         * rootcontext.cs (StdLib): New property.
2374         (GetInterfaceTypeByName): returns an interface by type name, and
2375         encapsulates error handling here.
2376         (GetInterfaces): simplified.
2377         (ResolveTree): Encapsulated all the tree resolution here.
2378         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
2379         types. 
2380         
2381         * driver.cs: Add support for --nostdlib, to avoid loading the
2382         default assemblies.
2383         (Main): Do not put tree resolution here. 
2384
2385         * rootcontext.cs: Beginning of the class resolution.
2386
2387 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
2388
2389         * rootcontext.cs: Provide better error reporting. 
2390
2391         * cs-parser.jay (interface_base): set our $$ to be interfaces.
2392
2393         * rootcontext.cs (CreateInterface): Handle the case where there
2394         are no parent interfaces.
2395         
2396         (CloseTypes): Routine to flush types at the end.
2397         (CreateInterface): Track types.
2398         (GetInterfaces): Returns an array of Types from the list of
2399         defined interfaces.
2400
2401         * typemanager.c (AddUserType): Mechanism to track user types (puts
2402         the type on the global type hash, and allows us to close it at the
2403         end). 
2404         
2405 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
2406
2407         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
2408         RecordInterface instead.
2409
2410         * cs-parser.jay: Updated to reflect changes above.
2411
2412         * decl.cs (Definition): Keep track of the TypeBuilder type that
2413         represents this type here.  Not sure we will use it in the long
2414         run, but wont hurt for now.
2415
2416         * driver.cs: Smaller changes to accomodate the new code.
2417
2418         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
2419         when done. 
2420
2421         * rootcontext.cs (CreateInterface):  New method, used to create
2422         the System.TypeBuilder type for interfaces.
2423         (ResolveInterfaces): new entry point to resolve the interface
2424         hierarchy. 
2425         (CodeGen): Property, used to keep track of the code generator.
2426
2427 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
2428
2429         * cs-parser.jay: Add a second production for delegate_declaration
2430         with `VOID'.
2431
2432         (enum_body): Put an opt_comma here instead of putting it on
2433         enum_body or enum_member_declarations so we can handle trailing
2434         commas on enumeration members.  Gets rid of a shift/reduce.
2435         
2436         (type_list): Need a COMMA in the middle.
2437
2438         (indexer_declaration): Tell tokenizer to recognize get/set
2439
2440         * Remove old targets.
2441
2442         * Re-add the parser target.
2443
2444 2001-07-13  Simon Cozens <simon@simon-cozens.org>
2445
2446         * cs-parser.jay: Add precendence rules for a number of operators
2447         ot reduce the number of shift/reduce conflicts in the grammar.
2448         
2449 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
2450
2451         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
2452         and put it here.
2453
2454         Get rid of old crufty code.
2455
2456         * rootcontext.cs: Use this to keep track of the parsed
2457         representation and the defined types available to the program. 
2458
2459         * gen-treedump.cs: adjust for new convention.
2460
2461         * type.cs: Split out the type manager, and the assembly builder
2462         from here. 
2463
2464         * typemanager.cs: the type manager will live here now.
2465
2466         * cil-codegen.cs: And the code generator here. 
2467
2468 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
2469
2470         * makefile: Fixed up for easy making.
2471
2472 2001-07-13  Simon Cozens <simon@simon-cozens.org>
2473
2474         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
2475         the 
2476
2477         (unary_expression): Expand pre_increment_expression and
2478         post_decrement_expression to reduce a shift/reduce.
2479
2480 2001-07-11  Simon Cozens
2481
2482         * cs-tokenizer.cs: Hex numbers should begin with a 0.
2483
2484         Improve allow_keyword_as_indent name.
2485
2486 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
2487
2488         * Adjustments for Beta2. 
2489
2490 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
2491
2492         * decl.cs: Added `Define' abstract method.
2493         (InTransit): new property, used to catch recursive definitions. 
2494
2495         * interface.cs: Implement `Define'. 
2496
2497         * modifiers.cs: Map Modifiers.constants to
2498         System.Reflection.TypeAttribute flags.
2499
2500         * class.cs: Keep track of types and user-defined types.
2501         (BuilderInit): New method for creating an assembly
2502         (ResolveType): New function to launch the resolution process, only
2503         used by interfaces for now.
2504
2505         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
2506         that are inserted into the name space. 
2507
2508 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
2509
2510         * ARGH.  I have screwed up my tree so many times due to the use of
2511         rsync rather than using CVS.  Going to fix this at once. 
2512
2513         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
2514         load types.
2515
2516 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
2517
2518         * Experiment successful: Use System.Type rather that our own
2519         version of Type.  
2520
2521 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
2522
2523         * cs-parser.jay: Removed nsAliases from here.
2524
2525         Use new namespaces, handle `using XXX;' 
2526
2527         * namespace.cs: Reimplemented namespace handling, use a recursive
2528         definition of the class.  Now we can keep track of using clauses
2529         and catch invalid using clauses.
2530
2531 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
2532
2533         * gen-treedump.cs: Adapted for all the renaming.
2534
2535         * expression.cs (Expression): this class now has a Type property
2536         which returns an expression Type.
2537
2538         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
2539         `Type', as this has a different meaning now in the base
2540
2541 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
2542
2543         * interface.cs, class.cs: Removed from all the sources the
2544         references to signature computation, as we can not do method
2545         signature computation during the parsing time, as we are not
2546         trying to solve at that point distinguishing:
2547
2548         class X {
2549                 void a (Blah x) {}
2550                 void a (NS.Blah x) {}
2551         }
2552
2553         Which depending on the context might be valid or not, as we do not
2554         know if Blah is the same thing as NS.Blah at that point.
2555
2556         * Redid everything so the code uses TypeRefs now instead of
2557         Types.  TypeRefs are just temporary type placeholders, that need
2558         to be resolved.  They initially have a pointer to a string and the
2559         current scope in which they are used.  This is used later by the
2560         compiler to resolve the reference to an actual Type. 
2561
2562         * DeclSpace is no longer a CIR.Type, and neither are
2563         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
2564         are all DeclSpaces, but no Types. 
2565
2566         * type.cs (TypeRefManager): This implements the TypeRef manager,
2567         which keeps track of all the types that need to be resolved after
2568         the parsing has finished. 
2569
2570 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
2571
2572         * ARGH.  We are going to have to store `foreach' as a class rather
2573         than resolving it, as we need to verify error 1579 after name
2574         resolution.   *OR* we could keep a flag that says `This request to
2575         IEnumerator comes from a foreach statement' which we can then use
2576         to generate the error.
2577
2578 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
2579
2580         * class.cs (TypeContainer.AddMethod): we now add methods to the
2581         MethodGroup instead of the method hashtable.  
2582
2583         * expression.cs: Add MethodGroup abstraction, which gets us one
2584         step closer to the specification in the way we handle method
2585         declarations.  
2586
2587         * cs-parser.jay (primary_expression): qualified_identifier now
2588         tried to match up an identifier to a local variable reference or
2589         to a parameter reference.
2590
2591         current_local_parameters is now a parser global variable that
2592         points to the current parameters for the block, used during name
2593         lookup.
2594
2595         (property_declaration): Now creates an implicit `value' argument to
2596         the set accessor.
2597
2598 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
2599
2600         * parameter.cs: Do not use `param' arguments as part of the
2601         signature, per the spec.
2602
2603 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
2604
2605         * decl.cs: Base class for classes, structs and interfaces.  This
2606         is the "Declaration Space" 
2607
2608         * cs-parser.jay: Use CheckDef for checking declaration errors
2609         instead of having one on each function.
2610
2611         * class.cs: Factor out some code for handling error handling in
2612         accordance to the "Declarations" section in the "Basic Concepts"
2613         chapter in the ECMA C# spec.
2614
2615         * interface.cs: Make all interface member classes derive from
2616         InterfaceMemberBase.
2617
2618 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
2619
2620         * Many things: all interfaces are parsed and generated in
2621         gen-treedump.  Support for member variables, constructors,
2622         destructors, properties, constants is there.
2623
2624         Beginning of the IL backend, but very little done, just there for
2625         testing purposes. 
2626
2627 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
2628
2629         * cs-parser.jay: Fix labeled statement.
2630
2631         * cs-tokenizer.cs (escape): Escape " and ' always.
2632         ref_line, ref_name: keep track of the line/filename as instructed
2633         by #line by the compiler.
2634         Parse #line.
2635
2636 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
2637
2638         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
2639         to match the values in System.CodeDOM.
2640
2641         Divid renamed to Divide.
2642
2643         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
2644         statements. 
2645         (Statements.set): remove.
2646
2647         * System.CodeDOM/CodeCatchClause.cs: always have a valid
2648         statements. 
2649
2650         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
2651         falseStatements always have valid values. 
2652
2653         * cs-parser.jay: Use System.CodeDOM now.
2654