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