/// <summary> /// Converts the simple namespace into a full namespace. /// </summary> /// <param name="simpleNamespace">The simple namespace to upgrade.</param> /// <returns>An full namespace.</returns> protected CodeDocNamespace ToFullNamespace(CodeDocSimpleNamespace simpleNamespace) { if (simpleNamespace == null) throw new ArgumentNullException("simpleNamespace"); Contract.Ensures(Contract.Result<CodeDocNamespace>() != null); var result = new CodeDocNamespace(simpleNamespace.CRef) { AssemblyCRefs = simpleNamespace.AssemblyCRefs, TypeCRefs = simpleNamespace.TypeCRefs }; CopySimpleMemberAttributes(result, simpleNamespace); result.Uri = simpleNamespace.Uri ?? simpleNamespace.CRef.ToUri(); result.Assemblies = simpleNamespace.AssemblyCRefs.Select(GetCodeDocSimpleAssembly).ToList(); result.Types = simpleNamespace.TypeCRefs.Select(cRef => GetMemberModel(cRef, CodeDocMemberDetailLevel.QuickSummary)).Cast<CodeDocType>().ToList(); return result; }
/// <summary> /// Generates the core collection of related namespaces and assemblies. /// </summary> /// <returns>The related assemblies and namespaces.</returns> protected override SimpleAssemblyNamespaceColleciton CreateSimpleAssemblyNamespaceCollection() { var assemblyModels = new List<CodeDocSimpleAssembly>(); var namespaceModels = new Dictionary<string, CodeDocSimpleNamespace>(); foreach (var assembly in CRefLookup.Assemblies) { var assemblyShortName = assembly.GetName().Name; var assemblyModel = new CodeDocSimpleAssembly(GetCRefIdentifier(assembly)) { AssemblyFileName = Path.GetFileName(assembly.GetFilePath()), Title = assemblyShortName, ShortName = assemblyShortName, FullName = assembly.FullName, NamespaceName = assemblyShortName, SubTitle = "Assembly", NamespaceCRefs = new List<CRefIdentifier>() }; assemblyModel.Uri = assemblyModel.CRef.ToUri(); var assemblyTypeCRefs = new List<CRefIdentifier>(); var assemblyNamespaceNames = new HashSet<string>(); foreach (var type in assembly .GetTypes() .Where(t => !t.IsNested) .Where(MemberFilter) ) { var typeCRef = GetCRefIdentifier(type); assemblyTypeCRefs.Add(typeCRef); var namespaceName = type.Namespace; if (String.IsNullOrWhiteSpace(namespaceName)) namespaceName = String.Empty; CodeDocSimpleNamespace namespaceModel; if (!namespaceModels.TryGetValue(namespaceName, out namespaceModel)) { var namespaceTitle = String.IsNullOrEmpty(namespaceName) ? "global" : namespaceName; Contract.Assume(!String.IsNullOrEmpty("N:" + namespaceName)); namespaceModel = new CodeDocSimpleNamespace(new CRefIdentifier("N:" + namespaceName)) { Title = namespaceTitle, ShortName = namespaceTitle, FullName = namespaceTitle, NamespaceName = namespaceTitle, SubTitle = "Namespace", TypeCRefs = new List<CRefIdentifier>(), AssemblyCRefs = new List<CRefIdentifier>(), }; namespaceModel.Uri = namespaceModel.CRef.ToUri(); namespaceModels.Add(namespaceName, namespaceModel); } namespaceModel.TypeCRefs.Add(typeCRef); if (assemblyNamespaceNames.Add(namespaceName)) { // this is the first time this assembly has seen this namespace namespaceModel.AssemblyCRefs.Add(assemblyModel.CRef); assemblyModel.NamespaceCRefs.Add(namespaceModel.CRef); } } assemblyModel.TypeCRefs = new ReadOnlyCollection<CRefIdentifier>(assemblyTypeCRefs); assemblyModels.Add(assemblyModel); } // freeze the namespace & assembly collections foreach (var namespaceModel in namespaceModels.Values) { namespaceModel.AssemblyCRefs = namespaceModel.AssemblyCRefs.AsReadOnly(); } foreach (var assemblyModel in assemblyModels) { assemblyModel.NamespaceCRefs = assemblyModel.NamespaceCRefs.AsReadOnly(); } return new SimpleAssemblyNamespaceColleciton( assemblyModels.OrderBy(x => x.Title).ToArray(), namespaceModels.Values.OrderBy(x => x.Title).ToArray()); }