// Extern aliased refs require special handling
if (alias == null)
- RootNamespace.Global.AddAssemblyReference (a);
+ GlobalRootNamespace.Instance.AddAssemblyReference (a);
else
- RootNamespace.DefineRootNamespace (alias, a);
+ GlobalRootNamespace.Instance.DefineRootNamespace (alias, a);
} catch (BadImageFormatException f) {
// .NET 2.0 throws this if we try to load a module without an assembly manifest ...
}
}
- RootNamespace.Global.AddModuleReference (m);
+ GlobalRootNamespace.Instance.AddModuleReference (m);
} catch (BadImageFormatException f) {
Error9 ("module", f.FileName, f.FusionLog);
foreach (DictionaryEntry entry in external_aliases)
LoadAssembly ((string) entry.Value, (string) entry.Key, false);
- RootNamespace.ComputeNamespaces ();
+ GlobalRootNamespace.Instance.ComputeNamespaces ();
}
static string [] LoadArgs (string file)
set_method.Invoke (CodeGen.Assembly.Builder, BindingFlags.Default, null, new object[]{true}, null);
}
- RootNamespace.Global.AddModuleReference (CodeGen.Module.Builder);
+ GlobalRootNamespace.Instance.AddModuleReference (CodeGen.Module.Builder);
//
// Load assemblies required
TypeHandle.Reset ();
if (full_flag)
- RootNamespace.Reset ();
+ GlobalRootNamespace.Reset ();
NamespaceEntry.Reset ();
CodeGen.Reset ();
namespace Mono.CSharp {
- public class RootNamespace : Namespace {
+ class RootNamespace : Namespace {
//
// Points to Mono's GetNamespaces method, an
// optimization when running on Mono to fetch all the
//
static MethodInfo get_namespaces_method;
- string alias_name;
+ protected readonly string alias_name;
protected Assembly [] referenced_assemblies;
Hashtable all_namespaces;
- static ListDictionary root_namespaces;
- public static GlobalRootNamespace Global;
-
static RootNamespace ()
{
get_namespaces_method = typeof (Assembly).GetMethod ("GetNamespaces", BindingFlags.Instance | BindingFlags.NonPublic);
-
- Reset ();
}
- public static void Reset ()
- {
- root_namespaces = new ListDictionary ();
- Global = new GlobalRootNamespace ();
- root_namespaces ["global"] = Global;
- }
-
- protected RootNamespace (string alias_name)
+ public RootNamespace (string alias_name)
: base (null, String.Empty)
{
this.alias_name = alias_name;
referenced_assemblies = n;
}
- public static void DefineRootNamespace (string alias, Assembly assembly)
- {
- if (alias == "global") {
- NamespaceEntry.Error_GlobalNamespaceRedefined (Location.Null);
- return;
- }
-
- RootNamespace retval = GetRootNamespace (alias);
- if (retval == null) {
- retval = new RootNamespace (alias);
- root_namespaces.Add (alias, retval);
- }
-
- retval.AddAssemblyReference (assembly);
- }
-
- public static RootNamespace GetRootNamespace (string name)
+ public void ComputeNamespace ()
{
- return (RootNamespace) root_namespaces [name];
- }
-
- public static void ComputeNamespaces ()
- {
- //
- // Do very early lookup because type is required when we cache
- // imported extension types in ComputeNamespaces
- //
- TypeManager.extension_attribute_type = TypeManager.CoreLookupType ("System.Runtime.CompilerServices", "ExtensionAttribute", Kind.Class, false);
-
- foreach (RootNamespace rn in root_namespaces.Values) {
- foreach (Assembly a in rn.referenced_assemblies) {
- try {
- rn.ComputeNamespaces (a);
- } catch (TypeLoadException e) {
- Report.Error (11, Location.Null, e.Message);
- } catch (System.IO.FileNotFoundException) {
- Report.Error (12, Location.Null, "An assembly `{0}' is used without being referenced",
- a.FullName);
- }
+ foreach (Assembly a in referenced_assemblies) {
+ try {
+ ComputeNamespaces (a);
+ } catch (TypeLoadException e) {
+ Report.Error (11, Location.Null, e.Message);
+ } catch (System.IO.FileNotFoundException) {
+ Report.Error (12, Location.Null, "An assembly `{0}' is used without being referenced",
+ a.FullName);
}
}
}
void RegisterExtensionMethodClass (Type t)
{
string n = t.Namespace;
- Namespace ns = n == null ? Global : (Namespace)all_namespaces [n];
+ Namespace ns = n == null ? GlobalRootNamespace.Instance : (Namespace) all_namespaces[n];
if (ns == null)
ns = GetNamespace (n, true);
ns.RegisterExternalExtensionMethodClass (t);
}
- protected void ComputeNamespaces (Assembly assembly)
+ void ComputeNamespaces (Assembly assembly)
{
bool contains_extension_methods = TypeManager.extension_attribute_type != null &&
assembly.IsDefined(TypeManager.extension_attribute_type, false);
}
}
- public class GlobalRootNamespace : RootNamespace {
+ class GlobalRootNamespace : RootNamespace {
Module [] modules;
+ ListDictionary root_namespaces;
- public GlobalRootNamespace ()
+ public static GlobalRootNamespace Instance = new GlobalRootNamespace ();
+
+ GlobalRootNamespace ()
: base ("global")
{
+ root_namespaces = new ListDictionary ();
+ root_namespaces.Add (alias_name, this);
+ }
+
+ public static void Reset ()
+ {
+ Instance = new GlobalRootNamespace ();
}
public Assembly [] Assemblies {
RegisterNamespace (t.Namespace);
}
+ public void ComputeNamespaces ()
+ {
+ //
+ // Do very early lookup because type is required when we cache
+ // imported extension types in ComputeNamespaces
+ //
+ TypeManager.extension_attribute_type = TypeManager.CoreLookupType ("System.Runtime.CompilerServices", "ExtensionAttribute", Kind.Class, false);
+
+ foreach (RootNamespace rn in root_namespaces.Values) {
+ rn.ComputeNamespace ();
+ }
+ }
+
+ public void DefineRootNamespace (string alias, Assembly assembly)
+ {
+ if (alias == alias_name) {
+ NamespaceEntry.Error_GlobalNamespaceRedefined (Location.Null);
+ return;
+ }
+
+ RootNamespace retval = GetRootNamespace (alias);
+ if (retval == null) {
+ retval = new RootNamespace (alias);
+ root_namespaces.Add (alias, retval);
+ }
+
+ retval.AddAssemblyReference (assembly);
+ }
+
public override void Error_NamespaceDoesNotExist(DeclSpace ds, Location loc, string name)
{
Report.Error (400, loc, "The type or namespace name `{0}' could not be found in the global namespace (are you missing an assembly reference?)",
name);
}
+ public RootNamespace GetRootNamespace (string name)
+ {
+ return (RootNamespace) root_namespaces[name];
+ }
+
public override Type LookupTypeReflection (string name, Location loc)
{
Type found_type = base.LookupTypeReflection (name, loc);
public virtual FullNamedExpression Resolve (IResolveContext rc)
{
- FullNamedExpression fne = RootNamespace.GetRootNamespace (Alias);
+ FullNamedExpression fne = GlobalRootNamespace.Instance.GetRootNamespace (Alias);
if (fne == null) {
Report.Error (430, Location,
"The extern alias `{0}' was not specified in -reference option",
if (parent != null)
ns = parent.NS.GetNamespace (name, true);
else if (name != null)
- ns = RootNamespace.Global.GetNamespace (name, true);
+ ns = GlobalRootNamespace.Instance.GetNamespace (name, true);
else
- ns = RootNamespace.Global;
+ ns = GlobalRootNamespace.Instance;
SlaveDeclSpace = new RootDeclSpace (this);
}