// // namespace.cs: Tracks namespaces // // Author: // Miguel de Icaza (miguel@ximian.com) // // (C) 2001 Ximian, Inc. // using System; using System.Collections; namespace Mono.CSharp { /// /// Keeps track of the namespaces defined in the C# code. /// public class Namespace { Namespace parent; string name; ArrayList using_clauses; Hashtable aliases; bool decl_found = false; /// /// Constructor Takes the current namespace and the /// name. This is bootstrapped with parent == null /// and name = "" /// public Namespace (Namespace parent, string name) { this.name = name; this.parent = parent; } /// /// The qualified name of the current namespace /// public string Name { get { string pname = parent != null ? parent.Name : ""; if (pname == "") return name; else return parent.Name + "." + name; } } /// /// The parent of this namespace, used by the parser to "Pop" /// the current namespace declaration /// public Namespace Parent { get { return parent; } } /// /// When a declaration is found in a namespace, /// we call this function, to emit an error if the /// program attempts to use a using clause afterwards /// public void DeclarationFound () { decl_found = true; } /// /// Records a new namespace for resolving name references /// public void Using (string ns) { if (decl_found){ CSharpParser.error (1529, "A using clause must precede all other namespace elements"); return; } if (using_clauses == null) using_clauses = new ArrayList (); using_clauses.Add (ns); } public ArrayList UsingTable { get { return using_clauses; } } public void UsingAlias (string alias, string namespace_or_type) { if (aliases == null) aliases = new Hashtable (); aliases [alias] = namespace_or_type; } public string LookupAlias (string alias) { string value = null; // System.Console.WriteLine ("Lookup " + alias + " in " + name); if (aliases != null) value = (string) (aliases [alias]); if (value == null && Parent != null) value = Parent.LookupAlias (alias); return value; } /// /// Used to validate that all the using clauses are correct /// after we are finished parsing all the files /// public void VerifyUsing () { foreach (DictionaryEntry de in using_clauses){ if (de.Value == null){ string name = (string) de.Key; CSharpParser.error (234, "The type or namespace `" + name + "' does not exist in the " + "class or namespace `" + name + "'"); } } } } }