public class Tree {
TypeContainer root_types;
- // <summary>
- // Keeps track of namespaces defined in the source code
- // </summary>
- Hashtable namespaces;
-
- // <summary>
- // Keeps track of all the types definied (classes, structs, ifaces, enums)
- // </summary>
- Hashtable decls;
-
public Tree ()
{
- root_types = new TypeContainer ();
-
- decls = new Hashtable ();
- namespaces = new Hashtable ();
+ root_types = new RootTypes ();
}
- DoubleHash decl_ns_name = new DoubleHash ();
-
- public void RecordDecl (string name, DeclSpace ds)
+ public void RecordDecl (Namespace ns, MemberName name, DeclSpace ds)
{
- if (decls.Contains (name)){
- DeclSpace other = (DeclSpace) decls [name];
- Report.SymbolRelatedToPreviousError (other.Location, other.GetSignatureForError ());
-
- Report.Error (
- 101, ds.Location,
- "There is already a definition for `" + name + "'");
- return;
- }
-
- ds.RecordDecl ();
-
- int p = name.LastIndexOf ('.');
- if (p == -1)
- decl_ns_name.Insert ("", name, ds);
- else {
- decl_ns_name.Insert (name.Substring (0, p), name.Substring (p+1), ds);
- }
-
- decls.Add (name, ds);
+ if (ds.Parent == root_types)
+ ns.AddDeclSpace (name.Basename, ds);
}
+
+ //
+ // FIXME: Why are we using Types?
+ //
+ public TypeContainer Types {
+ get { return root_types; }
+ }
+ }
- public DeclSpace LookupByNamespace (string ns, string name)
+ public sealed class RootTypes : TypeContainer
+ {
+ public RootTypes ()
+ : base (null, null, MemberName.Null, null, Kind.Root)
{
- object res;
-
- decl_ns_name.Lookup (ns, name, out res);
- return (DeclSpace) res;
+ types = new ArrayList ();
}
-
- public NamespaceEntry RecordNamespace (NamespaceEntry parent, SourceFile file, string name, Location loc)
- {
- NamespaceEntry ns = new NamespaceEntry (parent, file, name, loc);
-
- if (namespaces.Contains (file)){
- Hashtable ns_ns = (Hashtable) namespaces [file];
- if (ns_ns.Contains (ns.FullName))
- return (NamespaceEntry) ns_ns [ns.FullName];
- ns_ns.Add (ns.FullName, ns);
- } else {
- Hashtable new_table = new Hashtable ();
- namespaces [file] = new_table;
-
- new_table.Add (ns.FullName, ns);
- }
+ public override bool IsClsComplianceRequired ()
+ {
+ return true;
+ }
- return ns;
+ public override bool GetClsCompliantAttributeValue ()
+ {
+ return CodeGen.Assembly.IsClsCompliant;
}
- //
- // FIXME: Why are we using Types?
- //
- public TypeContainer Types {
- get {
- return root_types;
- }
- }
+ public override string GetSignatureForError ()
+ {
+ return "";
+ }
- public Hashtable Decls {
- get {
- return decls;
- }
+ protected override bool AddToTypeContainer (DeclSpace ds)
+ {
+ return AddToContainer (ds, ds.Name);
}
- public Hashtable Namespaces {
- get {
- return namespaces;
- }
+ public override TypeContainer AddPartial (TypeContainer nextPart)
+ {
+ return AddPartial (nextPart, nextPart.Name);
}
+
}
}