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