// // 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; 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; } } /// /// 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 + "'"); } } } } }