using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Xml.Linq; using SDKDocGenerator.Syntax; namespace SDKDocGenerator.Writers { public class ClassWriter : BaseWriter { readonly TypeWrapper _versionType; public ClassWriter(GenerationManifest artifacts, FrameworkVersion version, TypeWrapper versionType) : base(artifacts, version) { _versionType = versionType; _version = version; } protected override string GenerateFilename() { return FilenameGenerator.GenerateFilename(this._versionType); } protected override string GenerateFilepath() { return GenerationManifest.OutputSubFolderFromNamespace(_versionType.Namespace); } protected override string GetTitle() { return string.Format("{0} {1}", GetMemberName(), GetMemberType()); } protected override string GetMemberName() { return this._versionType.GetDisplayName(false); } protected override string GetMemberType() { if (this._versionType.IsInterface) return "Interface"; if (this._versionType.IsStructure) return "Structure"; if (this._versionType.IsEnum) return "Enumeration"; return "Class"; } protected override void WriteContent(TextWriter writer) { AddSummaryDocumentation(writer); AddInheritanceHierarchy(writer); AddNamespace(writer, this._versionType.Namespace, this._versionType.ManifestModuleName); AddSyntax(writer); writer.WriteLine("

The {0} type exposes the following members

", this._versionType.GetDisplayName(false)); if (this._versionType.IsEnum) { AddEnumMembers(writer); } else { AddConstructors(writer); AddProperties(writer); AddMethods(writer); AddEvents(writer); AddFields(writer); AddExamples(writer); } AddRemarksDocumentation(writer); AddVersionInformation(writer, this._versionType); } protected override XElement GetSummaryDocumentation() { var element = NDocUtilities.FindDocumentation(this._versionType); return element; } private void AddInheritanceHierarchy(TextWriter writer) { IList types = new List(); var current = this._versionType; while (current != null) { types.Add(current); current = current.BaseType; } AddSectionHeader(writer, "Inheritance Hierarchy"); int level = 0; foreach (var type in types.Reverse()) { for (int i = 0; i < level * 2; i++) { writer.Write(" "); } if (type.FullName == this._versionType.FullName) writer.WriteLine("{0}.{1}", type.Namespace, type.GetDisplayName(false)); else { writer.WriteLine(type.CreateReferenceHtml(fullTypeName: true)); } writer.WriteLine("
"); ++level; } AddSectionClosing(writer); } void AddConstructors(TextWriter writer) { var constructors = this._versionType.GetConstructors().Where(x => x.IsPublic); if (!constructors.Any()) return; AddMemberTableSectionHeader(writer, "Constructors"); foreach (var info in constructors.OrderBy(x => x.Name)) { AddConstructor(writer, info); } AddMemberTableSectionClosing(writer); } void AddConstructor(TextWriter writer, ConstructorInfoWrapper info) { writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine("\"Public", RootRelativePath); if (info.IsStatic) writer.WriteLine("\"Static", RootRelativePath); writer.WriteLine(""); writer.WriteLine(""); var filename = FilenameGenerator.GenerateFilename(info); var parameters = FormatParameters(info.GetParameters()); var hrefLink = string.Format("{1}({2})", filename, info.DeclaringType.Name, parameters); writer.WriteLine(hrefLink); writer.WriteLine(""); writer.WriteLine(""); var docs = NDocUtilities.FindDocumentation(info); var html = NDocUtilities.TransformDocumentationToHTML(docs, "summary", this.Artifacts.ManifestAssemblyContext.SdkAssembly, this._version); writer.WriteLine(html); writer.WriteLine(""); writer.WriteLine(""); } void AddProperties(TextWriter writer) { var properties = this._versionType.GetProperties(); if (!properties.Any()) return; AddMemberTableSectionHeader(writer, "Properties", PropertiesTableColumnHeaders); foreach (var info in properties.OrderBy(x => x.Name)) { AddProperty(writer, info); } AddMemberTableSectionClosing(writer); } void AddProperty(TextWriter writer, PropertyInfoWrapper propertyInfo) { writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine("\"Public", RootRelativePath); if (propertyInfo.IsStatic) writer.WriteLine("\"Static", RootRelativePath); writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine(propertyInfo.Name); writer.WriteLine(""); writer.WriteLine(""); writer.Write(ConstructTypeInfoLinkContent(propertyInfo.PropertyType)); writer.WriteLine(""); writer.WriteLine(""); string html = string.Empty; var isInherited = !propertyInfo.DeclaringType.Equals(_versionType); if (isInherited) { html = string.Format("Inherited from {0}.{1}.", propertyInfo.DeclaringType.Namespace, propertyInfo.DeclaringType.Name); } else { var docs = NDocUtilities.FindDocumentation(propertyInfo); html = NDocUtilities.TransformDocumentationToHTML(docs, "summary", Artifacts.ManifestAssemblyContext.SdkAssembly, this._version); } writer.WriteLine(html); writer.WriteLine(""); writer.WriteLine(""); } void AddMethods(TextWriter writer) { var methods = this._versionType.GetMethodsToDocument(); if (!methods.Any()) return; AddMemberTableSectionHeader(writer, "Methods"); const string net35PatternNote = "
Note:
" + "

Asynchronous operations (methods ending with Async) in the table below are for .NET 4.5 or higher. " + "For .NET 3.5 the SDK follows the standard naming convention of BeginMethodName and EndMethodName to " + "indicate asynchronous operations - these method pairs are not shown in the table below.

"; writer.WriteLine(net35PatternNote); foreach (var info in methods.OrderBy(x => x.Name)) { AddMethod(writer, info); } AddMemberTableSectionClosing(writer); } void AddMethod(TextWriter writer, MethodInfoWrapper info) { writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine("\"Public", RootRelativePath); if (info.IsStatic) writer.WriteLine("\"Static", RootRelativePath); writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine("{3}({4})", RootRelativePath, GenerationManifest.OutputSubFolderFromNamespace(info.DeclaringType.Namespace), FilenameGenerator.GenerateFilename(info), info.Name, FormatParameters(info.GetParameters())); writer.WriteLine(""); writer.WriteLine(""); string html = string.Empty; var isInherited = !info.DeclaringType.Equals(_versionType); if (isInherited) { html = string.Format("Inherited from {0}.{1}.", info.DeclaringType.Namespace, info.DeclaringType.Name); } else { var docs = NDocUtilities.FindDocumentation(info); html = NDocUtilities.TransformDocumentationToHTML(docs, "summary", Artifacts.ManifestAssemblyContext.SdkAssembly, this._version); } writer.WriteLine(html); writer.WriteLine(""); writer.WriteLine(""); } void AddFields(TextWriter writer) { var fields = this._versionType.GetFields(); if (!fields.Any()) return; AddMemberTableSectionHeader(writer, "Fields", FieldTableColumnHeaders); foreach (var info in fields.OrderBy(x => x.Name)) { AddField(writer, info); } AddMemberTableSectionClosing(writer); } void AddField(TextWriter writer, FieldInfoWrapper info) { writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine("\"Field\"/", RootRelativePath); if (info.IsStatic) writer.WriteLine("\"Static", RootRelativePath); writer.WriteLine(""); writer.WriteLine("{0}", info.Name); writer.WriteLine(""); writer.Write(ConstructTypeInfoLinkContent(info.FieldType)); writer.WriteLine(""); writer.WriteLine(""); string html = string.Empty; var isInherited = !info.DeclaringType.Equals(_versionType); if (isInherited) { html = string.Format("Inherited from {0}.{1}.", info.DeclaringType.Namespace, info.DeclaringType.Name); } else { var docs = NDocUtilities.FindDocumentation(info); html = NDocUtilities.TransformDocumentationToHTML(docs, "summary", Artifacts.ManifestAssemblyContext.SdkAssembly, this._version); } writer.WriteLine(html); writer.WriteLine(""); writer.WriteLine(""); } void AddEvents(TextWriter writer) { var fields = this._versionType.GetEvents(); if (!fields.Any()) return; AddMemberTableSectionHeader(writer, "Events"); foreach (var info in fields.OrderBy(x => x.Name)) { AddEvent(writer, info); } AddMemberTableSectionClosing(writer); } void AddEvent(TextWriter writer, EventInfoWrapper info) { writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine("\"Event\"/", RootRelativePath); if (info.IsStatic) writer.WriteLine("\"Static", RootRelativePath); writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine("{3}", RootRelativePath, GenerationManifest.OutputSubFolderFromNamespace(info.DeclaringType.Namespace), FilenameGenerator.GenerateFilename(info), info.Name); writer.WriteLine(""); writer.WriteLine(""); string html = string.Empty; var isInherited = !info.DeclaringType.Equals(_versionType); if (isInherited) { html = string.Format("Inherited from {0}.{1}.", info.DeclaringType.Namespace, info.DeclaringType.Name); } else { var docs = NDocUtilities.FindDocumentation(info); html = NDocUtilities.TransformDocumentationToHTML(docs, "summary", Artifacts.ManifestAssemblyContext.SdkAssembly, this._version); } writer.WriteLine(html); writer.WriteLine(""); writer.WriteLine(""); } public void AddEnumMembers(TextWriter writer) { var enumNames = this._versionType.GetEnumNames(); if (!enumNames.Any()) return; AddMemberTableSectionHeader(writer, "Members"); foreach (var name in enumNames.OrderBy(x => x)) { AddEnumMember(writer, name); } AddMemberTableSectionClosing(writer); } void AddEnumMember(TextWriter writer, string enumName) { writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine("\"Enum\"/", RootRelativePath); writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine(enumName); writer.WriteLine(""); writer.WriteLine(""); var docs = NDocUtilities.FindFieldDocumentation(this._versionType, enumName); var html = NDocUtilities.TransformDocumentationToHTML(docs, "summary", Artifacts.ManifestAssemblyContext.SdkAssembly, this._version); writer.WriteLine(html); writer.WriteLine(""); writer.WriteLine(""); } /// /// Constructs href markup, enclosed in a span, to the page containing the details of the /// specified type (this can be external to AWS documentation) as well as in another service. /// /// string ConstructTypeInfoLinkContent(TypeWrapper typeWrapper) { var sb = new StringBuilder(""); sb.Append(typeWrapper.CreateReferenceHtml(fullTypeName: true)); sb.Append(""); return sb.ToString(); } protected void AddSyntax(TextWriter writer) { var csharpSyntax = new CSharpSyntaxGenerator(this._version).GenerateSyntax(this._versionType); base.AddSyntax(writer, csharpSyntax); } protected override string GetTOCID() { return this._versionType.FullName.Replace('.', '_'); } } }