// // sourcebeingcompiled.cs: Tracks once-per-source things // // Author: // Rafael Teixeira (rafaelteixeirabr@hotmail.com) // // (C) 2004 Rafael Teixeira. // using System; using System.Collections; using Mono.Languages; namespace Mono.MonoBASIC { /// /// Keeps track of the once-per-source things in the VB.NET code. /// public class SourceBeingCompiled { Hashtable imports_clauses; Hashtable aliases; // // This class holds the location where a using definition is // done, and whether it has been used by the program or not. // // We use this to flag using clauses for namespaces that do not // exist. // public class ImportsEntry { public string Name; public bool Used; public Location Location; public ImportsEntry (string name, Location loc) { Name = name; Location = loc; Used = false; } } public SourceBeingCompiled () { } /// /// Initializes the list of preimported namespaces /// public void InitializeImports (ArrayList ImportsList) { foreach(string preImportedNamespace in ImportsList) this.Imports(preImportedNamespace, Location.Null); } /// /// Records a new namespace for resolving name references /// public void Imports (string ns, Location loc) { if (imports_clauses == null) imports_clauses = new CaseInsensitiveHashtable (); ImportsEntry ue = new ImportsEntry (ns, loc); imports_clauses [ns] = ue; } public ICollection ImportsTable { get { return imports_clauses.Values; } } public string[] GetNamespacesInScope(string currentNamespace) { ArrayList list = new ArrayList(); foreach(ImportsEntry ie in ImportsTable) list.Add(ie.Name); list.Add(currentNamespace); return (string[])list.ToArray(typeof(string)); } public void ImportsWithAlias (string alias, string namespace_or_type, Location loc) { if (aliases == null) aliases = new CaseInsensitiveHashtable (); if (aliases.Contains (alias)){ Report.Error (1537, loc, "The Imports clause with alias '" + alias + "' appeared previously in this namespace"); return; } aliases [alias] = namespace_or_type; } public string LookupAlias (string alias) { string value = null; if (aliases != null) value = (string) (aliases [alias]); return value; } /// /// Used to validate that all the using clauses are correct /// after we are finished parsing all the files. /// public void VerifyImports () { ArrayList unused = new ArrayList (); foreach (ImportsEntry ue in ImportsTable) { if (ue.Used) continue; unused.Add (ue); } // // If we have unused imports aliases, load all namespaces and check // whether it is unused, or it was missing // /* FIXME: why is happening a ghostly NullReferenceException inside TypeManager.GetNamespaces ()? if (unused.Count > 0) { CaseInsensitiveHashtable namespaces = TypeManager.GetNamespaces (); foreach (ImportsEntry ue in unused) { if (namespaces.Contains (ue.Name)){ Report.Warning (6024, ue.Location, "Unused namespace in 'Imports' declaration"); continue; } Report.Error (246, ue.Location, "The namespace '" + ue.Name + "' can not be found (missing assembly reference?)"); } } */ } } }