static TypeToAssemblyNamespaceMap ScanProjectTypes(List<ProjectElement> projectsToGetTypes)
        {
            TypeToAssemblyNamespaceMap result = new TypeToAssemblyNamespaceMap();
            if (projectsToGetTypes == null)
                return result;

            foreach (ProjectElement projectToGetTypes in projectsToGetTypes)
            {
                ITypeElement[] projectTypes = GetTypesDeclaredInProject(projectToGetTypes);
                if (projectTypes == null)
                    continue;

                foreach (ITypeElement typeElement in projectTypes)
                {
                    if (typeElement == null)
                        continue;

                    if (typeElement.ParentNamespace == null)
                        continue;

                    string typeNamespace = typeElement.ParentNamespace.FullName;
                    if (String.IsNullOrEmpty(typeNamespace))
                        continue;

                    AssemblyNamespaceList namespaceList;
                    if (!result.TryGetValue(typeElement.Name, out namespaceList))
                    {
                        namespaceList = new AssemblyNamespaceList();
                        result.Add(typeElement.Name, namespaceList);
                    }

                    AssemblyNamespace nameSpace = new AssemblyNamespace();
                    nameSpace.ReferenceProject = projectToGetTypes;
                    nameSpace.Namespace = typeNamespace;
                    namespaceList.Add(nameSpace);
                }
            }
            return result;
        }
        static TypeToAssemblyNamespaceMap ScanAssemblyReferenceTypes(List<AssemblyReference> assemblyReferences)
        {
            TypeToAssemblyNamespaceMap result = new TypeToAssemblyNamespaceMap();
            if (assemblyReferences == null)
                return result;

            foreach (AssemblyReference assemblyReference in assemblyReferences)
            {
                ITypeElement[] types = GetTypesDeclaredInAssembly(assemblyReference);
                if (types == null)
                    continue;

                foreach (ITypeElement typeElement in types)
                {
                    if (typeElement == null)
                        continue;

                    if (typeElement.ParentNamespace == null)
                        continue;

                    string typeNamespace = typeElement.ParentNamespace.FullName;
                    if (String.IsNullOrEmpty(typeNamespace))
                        continue;

                    AssemblyNamespaceList namespaceList;
                    if (!result.TryGetValue(typeElement.Name, out namespaceList))
                    {
                        namespaceList = new AssemblyNamespaceList();
                        result.Add(typeElement.Name, namespaceList);
                    }

                    AssemblyNamespace nameSpace = new AssemblyNamespace();
                    nameSpace.AssemblyFilePath = assemblyReference.FilePath;
                    nameSpace.Namespace = typeNamespace;
                    namespaceList.Add(nameSpace);
                }
            }
            return result;
        }
        TypeToAssemblyNamespaceMap LoadAssemblyMap(BinaryReader reader, ExtendedFrameworkVersion frameworkVersion)
        {
            TypeToAssemblyNamespaceMap result = new TypeToAssemblyNamespaceMap();
              result._AssemblyPath = reader.ReadString();
              result._AssemblySignature = FileSignature.Read(reader);

              int typeCount = reader.ReadInt32();
              for (int typeIndex = 0; typeIndex < typeCount; typeIndex++)
              {
            string typeName = reader.ReadString();
            int namespaceCount = reader.ReadInt32();

            if (!result.ContainsKey(typeName))
              result.Add(typeName, new AssemblyNamespaceList());
            AssemblyNamespaceList assemblyNamespaces = result.GetNamespaceList(typeName);
            for (int i = 0; i < namespaceCount; i++)
            {
              int assemblyIndex = reader.ReadInt32();
              int namespaceIndex = reader.ReadInt32();
              assemblyNamespaces.Add(new AssemblyNamespace(frameworkVersion, assemblyIndex, namespaceIndex));
            }
              }
              return result;
        }
        void SaveAssemblyMap(BinaryWriter writer, TypeToAssemblyNamespaceMap map)
        {
            writer.Write(map._AssemblyPath);
              map._AssemblySignature.Write(writer);

              writer.Write(map._CaseSensitiveData.Keys.Count);
              int typeIndex = 0;
              foreach (string typeName in map._CaseSensitiveData.Keys)
              {
            AssemblyNamespaceList assemblyNamespaces = map._CaseSensitiveData[typeName];
            writer.Write(typeName);
            writer.Write(assemblyNamespaces.Count);
            for (int i = 0; i < assemblyNamespaces.Count; i++)
            {
              AssemblyNamespace thisAssemblyNamespace = assemblyNamespaces[i];
              writer.Write(thisAssemblyNamespace.AssemblyIndex);
              writer.Write(thisAssemblyNamespace.NamespaceIndex);
            }
            typeIndex++;
              }
        }
        TypeToAssemblyNamespaceMap CollectTypes(string assemblyPath, ExtendedFrameworkVersion frameworkVersion)
        {
            assemblyPath = assemblyPath.ToLowerInvariant();

              TypeToAssemblyNamespaceMap result = new TypeToAssemblyNamespaceMap();
              result._AssemblyPath = assemblyPath;
              result._AssemblySignature = new FileSignature(assemblyPath);

              AssemblyTypeLoadResult typeLoadResult = LoadTypesFromAssembly(assemblyPath);
              if (typeLoadResult == null)
            return result;

              foreach (ITypeInfo typeInfo in typeLoadResult.Types)
              {
            if (!result.ContainsKey(typeInfo.NestedName))
              result.Add(typeInfo.NestedName, new AssemblyNamespaceList());
            AssemblyNamespaceList list = result.GetNamespaceList(typeInfo.NestedName);
            list.AddUnique(new AssemblyNamespace(typeLoadResult.AssemblyInfo.FullName, typeInfo.Namespace, frameworkVersion));
              }
              return result;
        }