//
// decl.cs: Declaration base class for structs, classes, enums and interfaces.
//
// Author: Miguel de Icaza (miguel@gnu.org)
//
// Licensed under the terms of the GNU GPL
//
// (C) 2001 Ximian, Inc (http://www.ximian.com)
//
// TODO: Move the method verification stuff from the class.cs and interface.cs here
//
using System;
using System.Collections;
using System.Reflection.Emit;
namespace CIR {
//
// Base class for structs, classes, enums and interfaces. They all create
// new declaration spaces. This provides the common foundation
// for managing those name spaces
//
public abstract class DeclSpace {
//
// this points to the actual definition that is being
// created with System.Reflection.Emit
//
TypeBuilder definition;
//
// Location where this declaration happens
//
public readonly Location Location;
string name, basename;
//
// The result value from adding an declaration into
// a struct or a class
//
public enum AdditionResult {
//
// The declaration has been successfully
// added to the declation space.
//
Success,
//
// The symbol has already been defined.
//
NameExists,
//
// Returned if the declation being added to the
// name space clashes with its container name.
//
// The only exceptions for this are constructors
// and static constructors
//
EnclosingClash,
//
// Returned if a constructor was created (because syntactically
// it looked like a constructor) but was not (because the name
// of the method is not the same as the container class
//
NotAConstructor
}
public string Name {
get {
return name;
}
}
public string Basename {
get {
return basename;
}
}
//
// defined_names is used for toplevel objects
//
protected Hashtable defined_names;
public DeclSpace (string name, Location l)
{
this.name = name;
this.basename = name.Substring (1 + name.LastIndexOf ('.'));
defined_names = new Hashtable ();
Location = l;
}
//
// Returns a status code based purely on the name
// of the member being added
//
protected AdditionResult IsValid (string name)
{
if (name == basename)
return AdditionResult.EnclosingClash;
if (defined_names.Contains (name))
return AdditionResult.NameExists;
return AdditionResult.Success;
}
//
// Introduce @name into this declaration space and
// associates it with the object @o. Note that for
// methods this will just point to the first method. o
//
protected void DefineName (string name, object o)
{
defined_names.Add (name, o);
}
bool in_transit = false;
//
// This function is used to catch recursive definitions
// in declarations.
//
public bool InTransit {
get {
return in_transit;
}
set {
in_transit = value;
}
}
public TypeBuilder TypeBuilder {
get {
return definition;
}
set {
definition = value;
}
}
}
}