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