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