public static async Task <Document> RefactorAsync(
            Document document,
            MemberDeclarationSyntax memberDeclaration,
            bool copyCommentFromBaseIfAvailable,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            MemberDeclarationSyntax newNode = null;

            if (copyCommentFromBaseIfAvailable &&
                DocumentationCommentGenerator.CanGenerateFromBase(memberDeclaration.Kind()))
            {
                SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);

                DocumentationCommentData data = DocumentationCommentGenerator.GenerateFromBase(memberDeclaration, semanticModel, cancellationToken);

                if (data.Success)
                {
                    SyntaxTrivia comment = data.GetDocumentationCommentTrivia(semanticModel, memberDeclaration.SpanStart);

                    newNode = memberDeclaration.WithDocumentationComment(comment, indent: true);
                }
            }

            newNode = newNode ?? memberDeclaration.WithNewSingleLineDocumentationComment();

            return(await document.ReplaceNodeAsync(memberDeclaration, newNode, cancellationToken).ConfigureAwait(false));
        }
        public static void ComputeRefactoring(RefactoringContext context, ConstructorDeclarationSyntax constructorDeclaration, SemanticModel semanticModel)
        {
            DocumentationCommentData data = GenerateFromBase(constructorDeclaration, semanticModel, context.CancellationToken);

            if (!data.Success)
            {
                return;
            }

            RegisterRefactoring(context, constructorDeclaration, data, semanticModel);
        }
        public static async Task ComputeRefactoringAsync(RefactoringContext context, EventFieldDeclarationSyntax eventFieldDeclaration)
        {
            if (eventFieldDeclaration.HasDocumentationComment())
            {
                return;
            }

            SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false);

            DocumentationCommentData data = DocumentationCommentGenerator.GenerateFromBase(eventFieldDeclaration, semanticModel, context.CancellationToken);

            if (!data.Success)
            {
                return;
            }

            RegisterRefactoring(context, eventFieldDeclaration, data);
        }
        public static async Task <Document> RefactorAsync(
            Document document,
            MemberDeclarationSyntax memberDeclaration,
            bool copyCommentFromBaseIfAvailable,
            CancellationToken cancellationToken = default)
        {
            MemberDeclarationSyntax newNode = null;

            if (copyCommentFromBaseIfAvailable &&
                DocumentationCommentGenerator.CanGenerateFromBase(memberDeclaration.Kind()))
            {
                SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);

                DocumentationCommentData data = DocumentationCommentGenerator.GenerateFromBase(memberDeclaration, semanticModel, cancellationToken);

                if (data.Success)
                {
                    SyntaxTrivia comment = DocumentationCommentTriviaFactory.Parse(data.RawXml, semanticModel, memberDeclaration.SpanStart);

                    newNode = memberDeclaration.WithDocumentationComment(comment, indent: true);
                }
            }

            DocumentationCommentGeneratorSettings settings = DocumentationCommentGeneratorSettings.Default;

            if (document.TryGetAnalyzerOptionValue(
                    memberDeclaration,
                    CodeFixOptions.CS1591_MissingXmlCommentForPubliclyVisibleTypeOrMember_IgnoredTags,
                    out string value))
            {
                ImmutableArray <string> ignoredTags = value
                                                      .Split(_tagSeparator, StringSplitOptions.RemoveEmptyEntries)
                                                      .Select(f => f.Trim())
                                                      .Where(f => f.Length > 0)
                                                      .ToImmutableArray();

                settings = new DocumentationCommentGeneratorSettings(ignoredTags: ignoredTags);
            }

            newNode ??= memberDeclaration.WithNewSingleLineDocumentationComment(settings);

            return(await document.ReplaceNodeAsync(memberDeclaration, newNode, cancellationToken).ConfigureAwait(false));
        }
        private static void RegisterRefactoring(RefactoringContext context, MemberDeclarationSyntax memberDeclaration, DocumentationCommentData data, SemanticModel semanticModel)
        {
            context.RegisterRefactoring(
                GetTitle(),
                ct => RefactorAsync(context.Document, memberDeclaration, data, semanticModel, ct),
                RefactoringDescriptors.CopyDocumentationCommentFromBaseMember);

            string GetTitle()
            {
                string s;
                DocumentationCommentOrigin origin = data.Origin;

                if (origin == DocumentationCommentOrigin.BaseMember)
                {
                    s = "base";
                }
                else if (origin == DocumentationCommentOrigin.InterfaceMember)
                {
                    s = "interface";
                }
                else
                {
                    Debug.Fail(origin.ToString());
                    s = "base";
                }

                return($"Add comment from {s} {CSharpFacts.GetTitle(memberDeclaration)}");
            }
        }
 private static void RegisterRefactoring(RefactoringContext context, MemberDeclarationSyntax memberDeclaration, DocumentationCommentData data)
 {
     context.RegisterRefactoring(
         GetTitle(memberDeclaration, data.Origin),
         cancellationToken => RefactorAsync(context.Document, memberDeclaration, data.Comment, cancellationToken));
 }