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