private static void HandleMemberDeclaration(SyntaxNodeAnalysisContext context) { MemberDeclarationSyntax memberSyntax = (MemberDeclarationSyntax)context.Node; var modifiers = memberSyntax.GetModifiers(); if (modifiers.Any(SyntaxKind.OverrideKeyword)) { return; } DocumentationCommentTriviaSyntax documentation = memberSyntax.GetDocumentationCommentTriviaSyntax(); XmlNodeSyntax inheritDocElement = documentation?.Content.GetFirstXmlElement(XmlCommentHelper.InheritdocXmlTag); if (inheritDocElement == null) { return; } if (HasXmlCrefAttribute(inheritDocElement)) { return; } ISymbol declaredSymbol = context.SemanticModel.GetDeclaredSymbol(memberSyntax, context.CancellationToken); if (declaredSymbol == null && memberSyntax.IsKind(SyntaxKind.EventFieldDeclaration)) { var eventFieldDeclarationSyntax = (EventFieldDeclarationSyntax)memberSyntax; VariableDeclaratorSyntax firstVariable = eventFieldDeclarationSyntax.Declaration?.Variables.FirstOrDefault(); if (firstVariable != null) { declaredSymbol = context.SemanticModel.GetDeclaredSymbol(firstVariable, context.CancellationToken); } } // If we don't have a declared symbol we have some kind of field declaration. A field can not override or // implement anything so we want to report a diagnostic. if (declaredSymbol == null || !NamedTypeHelpers.IsImplementingAnInterfaceMember(declaredSymbol)) { context.ReportDiagnostic(Diagnostic.Create(Descriptor, inheritDocElement.GetLocation())); } }
private static void HandleMemberDeclaration(SyntaxNodeAnalysisContext context) { MemberDeclarationSyntax memberSyntax = (MemberDeclarationSyntax)context.Node; var modifiers = memberSyntax.GetModifiers(); if (modifiers.Any(SyntaxKind.OverrideKeyword)) { return; } DocumentationCommentTriviaSyntax documentation = memberSyntax.GetDocumentationCommentTriviaSyntax(); if (documentation == null) { return; } Location location; ISymbol declaredSymbol = context.SemanticModel.GetDeclaredSymbol(memberSyntax, context.CancellationToken); if (declaredSymbol == null && memberSyntax.IsKind(SyntaxKind.EventFieldDeclaration)) { var eventFieldDeclarationSyntax = (EventFieldDeclarationSyntax)memberSyntax; VariableDeclaratorSyntax firstVariable = eventFieldDeclarationSyntax.Declaration?.Variables.FirstOrDefault(); if (firstVariable != null) { declaredSymbol = context.SemanticModel.GetDeclaredSymbol(firstVariable, context.CancellationToken); } } if (documentation.Content.GetFirstXmlElement(XmlCommentHelper.IncludeXmlTag) is XmlEmptyElementSyntax includeElement) { if (declaredSymbol == null) { return; } var rawDocumentation = declaredSymbol.GetDocumentationCommentXml(expandIncludes: true, cancellationToken: context.CancellationToken); var completeDocumentation = XElement.Parse(rawDocumentation, LoadOptions.None); var inheritDocElement = completeDocumentation.Nodes().OfType<XElement>().FirstOrDefault(element => element.Name == XmlCommentHelper.InheritdocXmlTag); if (inheritDocElement == null) { return; } if (HasXmlCrefAttribute(inheritDocElement)) { return; } location = includeElement.GetLocation(); } else { XmlNodeSyntax inheritDocElement = documentation.Content.GetFirstXmlElement(XmlCommentHelper.InheritdocXmlTag); if (inheritDocElement == null) { return; } if (HasXmlCrefAttribute(inheritDocElement)) { return; } location = inheritDocElement.GetLocation(); } // If we don't have a declared symbol we have some kind of field declaration. A field can not override or // implement anything so we want to report a diagnostic. if (declaredSymbol == null || !NamedTypeHelpers.IsImplementingAnInterfaceMember(declaredSymbol)) { context.ReportDiagnostic(Diagnostic.Create(Descriptor, location)); } }