Example #1
0
        /// <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));
            }
        }
Example #2
0
        /// <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;
        }