//
// tree.cs: keeps a tree representation of the generated code
//
// Author: Miguel de Icaza (miguel@gnu.org)
//
// Licensed under the terms of the GNU GPL
//
// (C) 2001 Ximian, Inc (http://www.ximian.com)
//
//
using System;
using System.Collections;
using System.Reflection;
using System.Reflection.Emit;
using System.IO;
namespace Mono.CSharp
{
public interface ITreeDump {
int Dump (Tree tree, StreamWriter output);
void ParseOptions (string options);
}
//
//
// We store here all the toplevel types that we have parsed,
// this is the root of all information we have parsed.
//
//
public class Tree {
TypeContainer root_types;
//
// Keeps track of namespaces defined in the source code
//
Hashtable namespaces;
//
// Keeps track of all the types definied (classes, structs, ifaces, enums)
//
Hashtable decls;
public Tree ()
{
root_types = new TypeContainer ();
decls = new Hashtable ();
namespaces = new Hashtable ();
}
DoubleHash decl_ns_name = new DoubleHash ();
public void RecordDecl (string 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);
}
public DeclSpace LookupByNamespace (string ns, string name)
{
object res;
decl_ns_name.Lookup (ns, name, out res);
return (DeclSpace) res;
}
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);
}
return ns;
}
//
// FIXME: Why are we using Types?
//
public TypeContainer Types {
get {
return root_types;
}
}
public Hashtable Decls {
get {
return decls;
}
}
public Hashtable Namespaces {
get {
return namespaces;
}
}
}
}