/// <summary> /// Creates the requested instance as an asynchronous operation. /// </summary> /// <param name="memberSymbol">The memberSymbol to pass to the object creation.</param> /// <param name="cancellationToken">A <see cref="CancellationToken"/> to use for cancelling the object creation.</param> /// <returns>Returns a <see cref="Task{T}"/> which represents the instance creation task.</returns> public Task <ITypeDocumentation> Create(ISymbol memberSymbol, CancellationToken cancellationToken) { var doc = memberSymbol.GetDocumentationCommentXml(); if (string.IsNullOrWhiteSpace(doc)) { return(Task.FromResult <ITypeDocumentation>(null)); } var xmldoc = XDocument.Parse(doc); var docRoot = xmldoc.Root; if (docRoot == null) { return(Task.FromResult <ITypeDocumentation>(null)); } var summaryElement = docRoot.Element("summary"); var summary = summaryElement == null ? string.Empty : summaryElement.Value.Trim(); var codeElement = docRoot.Element("code"); var code = codeElement == null ? string.Empty : codeElement.Value.Trim(); var exampleElement = docRoot.Element("example"); var example = exampleElement == null ? string.Empty : exampleElement.Value.Trim(); var remarksElement = docRoot.Element("remarks"); var remarks = remarksElement == null ? string.Empty : remarksElement.Value.Trim(); var returnsElement = docRoot.Element("returns"); var returns = returnsElement == null ? string.Empty : returnsElement.Value.Trim(); var typeParameterElements = docRoot.Elements("typeparam"); var typeConstraints = GetTypeContraints(memberSymbol); var typeParameters = typeParameterElements.Select( x => { var name = x.Attribute("name").Value.Trim(); return(new TypeParameterDocumentation( name, typeConstraints.ContainsKey(name) ? typeConstraints[name] : null, x.Value.Trim())); }); var documentation = new TypeDocumentation(summary, code, example, remarks, returns, typeParameters); return(Task.FromResult <ITypeDocumentation>(documentation)); }