/// <summary> /// Register the method code fix. /// </summary> /// <param name="methodDeclarationSyntax">the method declaration syntax.</param> /// <param name="root">the syntax root.</param> /// <param name="context">the complilation context.</param> /// <param name="diagnostic">the diagnostic result.</param> private void RegisterMethodCodeFix(MethodDeclarationSyntax methodDeclarationSyntax, SyntaxNode root, CodeFixContext context, Diagnostic diagnostic) { var documentationStructure = methodDeclarationSyntax.GetDocumentationCommentTriviaSyntax(); var action = CodeAction.Create( "Generate method documentation.", c => this.AddDocumentationAsync( context, root, methodDeclarationSyntax, documentationStructure), "SA1612D"); context.RegisterCodeFix( action, diagnostic); }
/// <summary> /// Check if the existing documentation is invalid. /// </summary> /// <param name="declaration">the declaration.</param> /// <returns>true if the documentation is invalid.</returns> private bool ValidateTypeParameters(MethodDeclarationSyntax declaration) { var commentSyntax = declaration.GetDocumentationCommentTriviaSyntax(); if (declaration.TypeParameterList == null || !declaration.TypeParameterList.Parameters.Any()) return true; // valid if there are none. var parameters = declaration .TypeParameterList .Parameters .Select(_ => _.Identifier.Text); var documentedParameter = commentSyntax .GetTypeParameterDocumentationElements() .Where(_ => _.GetXmlTextSyntaxLines().Any()) .ToArray() .GetParameterNames(); // not certain this is the best way, I will tweak it later. return parameters.SequenceEqual(documentedParameter); }
/// <summary> /// return the list of undocumented types. /// </summary> /// <param name="declaration">the method declaration.</param> /// <returns>a string containing the missing parameters.</returns> private string GetUndocumentedTypes(MethodDeclarationSyntax declaration) { var commentSyntax = declaration.GetDocumentationCommentTriviaSyntax(); var parameters = declaration .TypeParameterList ?.Parameters .Select(_ => _.Identifier.Text) .ToArray(); var documentedParameter = commentSyntax .GetTypeParameterDocumentationElements() .Where(_ => _.GetXmlTextSyntaxLines().Any()) .ToArray() .GetParameterNames(); // check missing parameters. var missing = parameters .Except(documentedParameter) .Select(_ => $"'{_}'") .ToArray(); if (missing.Any()) return $"missing {string.Join(", ", missing)}"; // check extra parameters. var extra = documentedParameter .Except(parameters) .Select(_ => $"'{_}'") .ToArray(); if (extra.Any()) return $"additional {string.Join(", ", extra)}"; if (!declaration.HasVoidReturnType() && commentSyntax.GetReturnDocumentationElement() == null) return "missing return value documentation"; return null; }
/// <summary> /// Validate that the return value is present if necessary. /// </summary> /// <param name="declaration">the method declaration syntax.</param> /// <returns>true if the return value is correctly documented.</returns> private bool ValidateReturnValue(MethodDeclarationSyntax declaration) { if (declaration.HasVoidReturnType()) return true; // void is valid regardless, return declaration .GetDocumentationCommentTriviaSyntax() .GetReturnDocumentationElement() != null; }