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