/// <summary> /// TODO: this does not load types that don't have namespace /// (a rare occurance but perhaps one we should account for?) /// </summary> /// <param name="name"></param> /// <param name="rootNamespaces"></param> public static void LoadAssembly(string name, Dictionary<string, HappyNamespaceTracker> rootNamespaces) { AssemblyName assemblyName = new AssemblyName(name); Assembly assembly = Assembly.Load(assemblyName); foreach (Type type in assembly.GetTypes().Where(t => t.Namespace != null)) { string[] namespaceSegments = type.Namespace.Split('.'); HappyNamespaceTracker currentNamespaceTracker; if (!rootNamespaces.TryGetValue(namespaceSegments[0], out currentNamespaceTracker)) { currentNamespaceTracker = new HappyNamespaceTracker(null, namespaceSegments[0]); rootNamespaces.Add(namespaceSegments[0], currentNamespaceTracker); } foreach (string segment in namespaceSegments.Skip(1)) { if (currentNamespaceTracker.HasMember(segment)) currentNamespaceTracker = (HappyNamespaceTracker)currentNamespaceTracker.GetMember(segment); else { HappyNamespaceTracker next = new HappyNamespaceTracker(currentNamespaceTracker, segment); currentNamespaceTracker.SetMember(segment, next); currentNamespaceTracker = next; } } currentNamespaceTracker.SetMember(type.Name, new HappyTypeTracker(type)); } }
/// <summary> /// This method loads the default assemblies and the assemblies specified in loadStatements. /// </summary> /// <param name="loadDirectives"></param> /// <returns> /// A dictionary containing the HappyNamespaceTrackers corresponding to the root namespaces in the loaded assemblies. /// </returns> Dictionary<string, HappyNamespaceTracker> LoadAllAssemblies(LoadDirective[] loadDirectives) { Dictionary<string, HappyNamespaceTracker> rootNamespaces = new Dictionary<string, HappyNamespaceTracker>(); var assembliesToLoad = _defaultReferences.Union(loadDirectives.Select(ls => ls.AssemblyName)); foreach (string name in assembliesToLoad) { AssemblyName assemblyName = new AssemblyName(name); Assembly assembly = Assembly.Load(assemblyName); foreach (Type type in assembly.GetTypes().Where(t => t.Namespace != null)) { string[] namespaceSegments = type.Namespace.Split('.'); HappyNamespaceTracker currentNamespaceTracker; if (!rootNamespaces.TryGetValue(namespaceSegments[0], out currentNamespaceTracker)) { currentNamespaceTracker = new HappyNamespaceTracker(null, namespaceSegments[0]); rootNamespaces.Add(namespaceSegments[0], currentNamespaceTracker); } foreach (string segment in namespaceSegments.Skip(1)) { if (currentNamespaceTracker.HasMember(segment)) currentNamespaceTracker = (HappyNamespaceTracker)currentNamespaceTracker.GetMember(segment); else { HappyNamespaceTracker next = new HappyNamespaceTracker(currentNamespaceTracker, segment); currentNamespaceTracker.SetMember(segment, next); currentNamespaceTracker = next; } } currentNamespaceTracker.SetMember(type.Name, new HappyTypeTracker( /*current,*/ type)); } } return rootNamespaces; }