public class CSharpParser {
NamespaceEntry current_namespace;
TypeContainer current_container;
- TypeContainer current_class;
+ DeclSpace current_class;
IIteratorContainer iterator_container;
/// Hack to help create non-typed array initializer
/// </summary>
public static Expression current_array_type;
+ Expression pushed_current_array_type;
/// <summary>
/// Used to determine if we are parsing the get/set pair
current_namespace = new NamespaceEntry (
current_namespace, file, name.GetName ());
+ current_class = current_namespace.SlaveDeclSpace;
+ current_container = current_class.PartialContainer;
}
namespace_body opt_semicolon
{
current_namespace = current_namespace.Parent;
+ current_class = current_namespace.SlaveDeclSpace;
+ current_container = current_class.PartialContainer;
}
;
STRUCT member_name
{
MemberName name = MakeName ((MemberName) $5);
- current_class = new Struct (
+ push_current_class (new Struct (
current_namespace, current_class, name, (int) $2,
- (Attributes) $1);
+ (Attributes) $1), false, $3);
- if ($3 != null) {
- current_container = current_container.AddPartial (current_class);
- } else {
- current_container.AddClassOrStruct (current_class);
- current_container = current_class;
- }
}
opt_class_base
{
if ($7 != null)
- current_class.Bases = (ArrayList) $7;
+ current_container.AddBasesForPart (current_class, (ArrayList) $7);
if (RootContext.Documentation != null)
current_container.DocComment = Lexer.consume_doc_comment ();
{
$$ = new StackAlloc ((Expression) $2, (Expression) $4, (Location) $1);
}
+ | ARGLIST
+ {
+ $$ = new ArglistAccess ((Location) $1);
+ }
| STACKALLOC type
{
Report.Error (1575, (Location) $1, "A stackalloc expression requires [] after type");
Report.Error (231, ((Parameter) $1).Location, "A params parameter must be the last parameter in a formal parameter list");
$$ = null;
}
+ | fixed_parameters COMMA parameter_array COMMA error
+ {
+ if ($3 != null)
+ Report.Error (231, ((Parameter) $3).Location, "A params parameter must be the last parameter in a formal parameter list");
+ $$ = null;
+ }
| ARGLIST COMMA error
{
Report.Error (257, (Location) $1, "An __arglist parameter must be the last parameter in a formal parameter list");
$$ = null;
}
+ | fixed_parameters COMMA ARGLIST COMMA error
+ {
+ Report.Error (257, (Location) $3, "An __arglist parameter must be the last parameter in a formal parameter list");
+ $$ = null;
+ }
| parameter_array
{
$$ = new Parameters (new Parameter[] { (Parameter) $1 } );
{
MemberName name = MakeName ((MemberName) $5);
- current_class = new Interface (
+ push_current_class (new Interface (
current_namespace, current_class, name, (int) $2,
- (Attributes) $1);
-
- if ($3 != null) {
- current_container = current_container.AddPartial (current_class);
- } else {
- current_container.AddInterface (current_class);
- current_container = current_class;
- }
+ (Attributes) $1), true, $3);
}
opt_class_base
{
- current_class.Bases = (ArrayList) $7;
+ current_container.AddBasesForPart (current_class, (ArrayList) $7);
if (RootContext.Documentation != null) {
current_container.DocComment = Lexer.consume_doc_comment ();
"`{0}': static constructor cannot have an explicit `this' or `base' constructor call",
c.GetSignatureForError ());
}
-
- if (!c.Parameters.Empty){
- Report.Error (132, c.Location,
- "`{0}': The static constructor must be parameterless", c.GetSignatureForError ());
- }
} else {
c.ModFlags = Modifiers.Check (Constructor.AllowedModifiers, (int) $2, Modifiers.PRIVATE, c.Location);
}
}
current_container.AddEnum (e);
- RootContext.Tree.RecordDecl (current_namespace.NS, name, e);
$$ = e;
}
}
current_container.AddDelegate (del);
- RootContext.Tree.RecordDecl (current_namespace.NS, name, del);
$$ = del;
}
;
| predefined_type DOT IDENTIFIER
{
LocatedToken lt = (LocatedToken) $3;
- $$ = new MemberAccess ((Expression) $1, lt.Value);
+ // TODO: Location is wrong as some predefined types doesn't hold a location
+ $$ = new MemberAccess ((Expression) $1, lt.Value, lt.Location);
}
;
;
typeof_expression
- : TYPEOF OPEN_PARENS VOID CLOSE_PARENS
- {
- $$ = new TypeOfVoid ((Location) $1);
+ : TYPEOF
+ {
+ pushed_current_array_type = current_array_type;
}
- | TYPEOF OPEN_PARENS type CLOSE_PARENS
+ OPEN_PARENS type CLOSE_PARENS
{
- $$ = new TypeOf ((Expression) $3, (Location) $1);
+ Expression type = (Expression)$4;
+ if (type == TypeManager.system_void_expr)
+ $$ = new TypeOfVoid ((Location) $1);
+ else
+ $$ = new TypeOf (type, (Location) $1);
+ current_array_type = pushed_current_array_type;
}
;
anonymous_method_expression
: DELEGATE opt_anonymous_method_signature
{
+ if (oob_stack == null)
+ oob_stack = new Stack (6);
+
oob_stack.Push (current_local_parameters);
current_local_parameters = (Parameters)$2;
MemberName name = MakeName ((MemberName) $5);
int mod_flags = (int) $2;
- current_class = new Class (
+ push_current_class (new Class (
current_namespace, current_class, name,
- mod_flags, (Attributes) $1);
-
- if ($3 != null) {
- current_container = current_container.AddPartial (current_class);
- } else {
- current_container.AddClassOrStruct (current_class);
- current_container = current_class;
- }
+ mod_flags, (Attributes) $1), false, $3);
}
opt_class_base
{
"The class System.Object cannot have a base " +
"class or implement an interface.");
}
- current_class.Bases = (ArrayList) $7;
+ current_container.AddBasesForPart (current_class, (ArrayList) $7);
}
if (RootContext.Documentation != null) {
: IDENTIFIER COLON
{
LocatedToken lt = (LocatedToken) $1;
- LabeledStatement labeled = new LabeledStatement (lt.Location);
+ LabeledStatement labeled = new LabeledStatement (lt.Value, lt.Location);
- if (current_block.AddLabel (lt.Value, labeled, lt.Location))
+ if (current_block.AddLabel (labeled))
current_block.AddStatement (labeled);
}
statement
switch_statement
: SWITCH OPEN_PARENS
{
+ if (switch_stack == null)
+ switch_stack = new Stack (2);
switch_stack.Push (current_block);
}
expression CLOSE_PARENS
opt_switch_sections
: /* empty */
{
- Report.Error (1522, lexer.Location, "Empty switch block");
+ Report.Warning (1522, 1, lexer.Location, "Empty switch block");
+ $$ = new ArrayList ();
}
| switch_sections
;
}
}
-TypeContainer pop_current_class ()
+void push_current_class (TypeContainer tc, bool is_interface, object partial_token)
+{
+ if (partial_token != null)
+ current_container = current_container.AddPartial (tc, is_interface);
+ else
+ current_container = current_container.AddTypeContainer (tc, is_interface);
+ current_class = tc;
+}
+
+DeclSpace pop_current_class ()
{
- TypeContainer retval = current_class;
+ DeclSpace retval = current_class;
- current_class = (TypeContainer) current_class.Parent;
+ current_class = current_class.Parent;
current_container = current_class.PartialContainer;
return retval;
public CSharpParser (SeekableStreamReader reader, SourceFile file, ArrayList defines)
{
- current_namespace = new NamespaceEntry (null, file, null);
this.name = file.Name;
this.file = file;
- current_container = RootContext.Tree.Types;
- // TODO: Make RootContext.Tree.Types a PartialContainer.
- current_class = current_container;
- current_container.NamespaceEntry = current_namespace;
- oob_stack = new Stack ();
- switch_stack = new Stack ();
+ current_namespace = new NamespaceEntry (null, file, null);
+ current_class = current_namespace.SlaveDeclSpace;
+ current_container = current_class.PartialContainer; // == RootContest.ToplevelTypes
lexer = new Tokenizer (reader, file, defines);
}
Console.WriteLine (e);
}
- RootContext.Tree.Types.NamespaceEntry = null;
+ if (RootContext.ToplevelTypes.NamespaceEntry != null)
+ throw new InternalErrorException ("who set it?");
}
static void CheckToken (int error, int yyToken, string msg, Location loc)