Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/DocumentationGenerator/Program.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#pragma warning disable RS1035
#pragma warning disable RS1035
#pragma warning disable CA1849
#pragma warning disable MA0004
#pragma warning disable MA0009
Expand Down
52 changes: 43 additions & 9 deletions src/Meziantou.Analyzer/Internals/ContextExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Immutable;
using System.Data;
using System.Linq;
using Meziantou.Analyzer.Internals;
using Microsoft.CodeAnalysis;
Expand All @@ -11,11 +12,31 @@ namespace Meziantou.Analyzer.Internals;

internal static partial class ContextExtensions
{
private static Diagnostic CreateDiagnostic(DiagnosticDescriptor descriptor, Location location, ImmutableDictionary<string, string?>? properties, string?[]? messageArgs)
private static Diagnostic CreateDiagnostic(DiagnosticDescriptor descriptor, Location? location, ImmutableDictionary<string, string?>? properties, string?[]? messageArgs)
{
return Diagnostic.Create(descriptor, location, properties, messageArgs);
}

public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, IEnumerable<Location> locations, string?[]? messageArgs = null) => ReportDiagnostic(context, descriptor, ImmutableDictionary<string, string?>.Empty, locations, messageArgs);
public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, IEnumerable<Location> locations, params string?[]? messageArgs)
{
var inSource = locations.Where(l => l.IsInSource);
if (!inSource.Any())
{
context.ReportDiagnostic(CreateDiagnostic(descriptor, location: null, properties, messageArgs));
return;
}

var diagnostic = Diagnostic.Create(
descriptor,
location: inSource.First(),
additionalLocations: inSource.Skip(1),
properties: properties,
messageArgs: messageArgs);

context.ReportDiagnostic(diagnostic);
}

public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, SyntaxReference syntaxReference, string?[]? messageArgs = null)
=> ReportDiagnostic(context, descriptor, ImmutableDictionary<string, string?>.Empty, syntaxReference, messageArgs);

Expand All @@ -40,15 +61,13 @@ public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticD
public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, ISymbol symbol, string?[]? messageArgs = null) => ReportDiagnostic(context, descriptor, ImmutableDictionary<string, string?>.Empty, symbol, messageArgs);
public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, ISymbol symbol, string?[]? messageArgs = null)
{
foreach (var location in symbol.Locations)
{
ReportDiagnostic(context, descriptor, properties, location, messageArgs);
}
ReportDiagnostic(context, descriptor, properties, symbol.Locations, messageArgs);
}

public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, IFieldSymbol symbol, DiagnosticFieldReportOptions reportOptions, string?[]? messageArgs = null) => ReportDiagnostic(context, descriptor, ImmutableDictionary<string, string?>.Empty, symbol, reportOptions, messageArgs);
public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, IFieldSymbol symbol, DiagnosticFieldReportOptions reportOptions, string?[]? messageArgs = null)
{
List<Location>? locations = null;
foreach (var location in symbol.Locations)
{
if (reportOptions.HasFlag(DiagnosticFieldReportOptions.ReportOnReturnType))
Expand All @@ -61,13 +80,17 @@ public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticD
}
}

ReportDiagnostic(context, descriptor, properties, location, messageArgs);
locations ??= [];
locations.Add(location);
}

ReportDiagnostic(context, descriptor, properties, locations ?? [], messageArgs);
}

public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, IMethodSymbol symbol, DiagnosticMethodReportOptions reportOptions, string?[]? messageArgs = null) => ReportDiagnostic(context, descriptor, ImmutableDictionary<string, string?>.Empty, symbol, reportOptions, messageArgs);
public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, IMethodSymbol symbol, DiagnosticMethodReportOptions reportOptions, string?[]? messageArgs = null)
{
List<Location>? locations = null;
foreach (var location in symbol.Locations)
{
if (reportOptions.HasFlag(DiagnosticMethodReportOptions.ReportOnReturnType))
Expand All @@ -86,13 +109,17 @@ public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticD
}
}

ReportDiagnostic(context, descriptor, properties, location, messageArgs);
locations ??= [];
locations.Add(location);
}

ReportDiagnostic(context, descriptor, properties, locations ?? [], messageArgs);
}

public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, IParameterSymbol symbol, DiagnosticParameterReportOptions reportOptions, string?[]? messageArgs = null) => ReportDiagnostic(context, descriptor, ImmutableDictionary<string, string?>.Empty, symbol, reportOptions, messageArgs);
public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, IParameterSymbol symbol, DiagnosticParameterReportOptions reportOptions, string?[]? messageArgs = null)
{
List<Location>? locations = null;
foreach (var location in symbol.Locations)
{
if (reportOptions.HasFlag(DiagnosticParameterReportOptions.ReportOnType))
Expand All @@ -105,13 +132,17 @@ public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticD
}
}

ReportDiagnostic(context, descriptor, properties, location, messageArgs);
locations ??= [];
locations.Add(location);
}

ReportDiagnostic(context, descriptor, properties, locations ?? [], messageArgs);
}

public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, IPropertySymbol symbol, DiagnosticPropertyReportOptions reportOptions, string?[]? messageArgs = null) => ReportDiagnostic(context, descriptor, ImmutableDictionary<string, string?>.Empty, symbol, reportOptions, messageArgs);
public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, IPropertySymbol symbol, DiagnosticPropertyReportOptions reportOptions, string?[]? messageArgs = null)
{
List<Location>? locations = null;
foreach (var location in symbol.Locations)
{
if (reportOptions.HasFlag(DiagnosticPropertyReportOptions.ReportOnReturnType))
Expand All @@ -130,8 +161,11 @@ public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticD
}
}

ReportDiagnostic(context, descriptor, properties, location, messageArgs);
locations ??= [];
locations.Add(location);
}

ReportDiagnostic(context, descriptor, properties, locations ?? [], messageArgs);
}

public static void ReportDiagnostic(this DiagnosticReporter context, DiagnosticDescriptor descriptor, IOperation operation, string?[]? messageArgs = null)
Expand Down
25 changes: 25 additions & 0 deletions src/Meziantou.Analyzer/Internals/ContextExtensions.g.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ namespace Meziantou.Analyzer.Internals;

internal static partial class ContextExtensions
{

public static void ReportDiagnostic(this SyntaxNodeAnalysisContext context, DiagnosticDescriptor descriptor, IEnumerable<Location> locations, string?[]? messageArgs = null) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, locations, messageArgs);

public static void ReportDiagnostic(this SyntaxNodeAnalysisContext context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, IEnumerable<Location> locations, params string?[]? messageArgs) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, properties, locations, messageArgs);

public static void ReportDiagnostic(this SyntaxNodeAnalysisContext context, DiagnosticDescriptor descriptor, SyntaxToken syntaxToken, params string?[]? messageArgs)
=> ReportDiagnostic(new DiagnosticReporter(context), descriptor, syntaxToken, messageArgs);

Expand Down Expand Up @@ -83,6 +88,11 @@ public static void ReportDiagnostic(this SyntaxNodeAnalysisContext context, Diag

public static void ReportDiagnostic(this SyntaxNodeAnalysisContext context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, AttributeData attribute, params string?[]? messageArgs)
=> ReportDiagnostic(new DiagnosticReporter(context), descriptor, properties, attribute, messageArgs);

public static void ReportDiagnostic(this SymbolAnalysisContext context, DiagnosticDescriptor descriptor, IEnumerable<Location> locations, string?[]? messageArgs = null) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, locations, messageArgs);

public static void ReportDiagnostic(this SymbolAnalysisContext context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, IEnumerable<Location> locations, params string?[]? messageArgs) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, properties, locations, messageArgs);

public static void ReportDiagnostic(this SymbolAnalysisContext context, DiagnosticDescriptor descriptor, SyntaxToken syntaxToken, params string?[]? messageArgs)
=> ReportDiagnostic(new DiagnosticReporter(context), descriptor, syntaxToken, messageArgs);

Expand Down Expand Up @@ -157,6 +167,11 @@ public static void ReportDiagnostic(this SymbolAnalysisContext context, Diagnost

public static void ReportDiagnostic(this SymbolAnalysisContext context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, AttributeData attribute, params string?[]? messageArgs)
=> ReportDiagnostic(new DiagnosticReporter(context), descriptor, properties, attribute, messageArgs);

public static void ReportDiagnostic(this OperationAnalysisContext context, DiagnosticDescriptor descriptor, IEnumerable<Location> locations, string?[]? messageArgs = null) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, locations, messageArgs);

public static void ReportDiagnostic(this OperationAnalysisContext context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, IEnumerable<Location> locations, params string?[]? messageArgs) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, properties, locations, messageArgs);

public static void ReportDiagnostic(this OperationAnalysisContext context, DiagnosticDescriptor descriptor, SyntaxToken syntaxToken, params string?[]? messageArgs)
=> ReportDiagnostic(new DiagnosticReporter(context), descriptor, syntaxToken, messageArgs);

Expand Down Expand Up @@ -231,6 +246,11 @@ public static void ReportDiagnostic(this OperationAnalysisContext context, Diagn

public static void ReportDiagnostic(this OperationAnalysisContext context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, AttributeData attribute, params string?[]? messageArgs)
=> ReportDiagnostic(new DiagnosticReporter(context), descriptor, properties, attribute, messageArgs);

public static void ReportDiagnostic(this OperationBlockAnalysisContext context, DiagnosticDescriptor descriptor, IEnumerable<Location> locations, string?[]? messageArgs = null) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, locations, messageArgs);

public static void ReportDiagnostic(this OperationBlockAnalysisContext context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, IEnumerable<Location> locations, params string?[]? messageArgs) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, properties, locations, messageArgs);

public static void ReportDiagnostic(this OperationBlockAnalysisContext context, DiagnosticDescriptor descriptor, SyntaxToken syntaxToken, params string?[]? messageArgs)
=> ReportDiagnostic(new DiagnosticReporter(context), descriptor, syntaxToken, messageArgs);

Expand Down Expand Up @@ -305,6 +325,11 @@ public static void ReportDiagnostic(this OperationBlockAnalysisContext context,

public static void ReportDiagnostic(this OperationBlockAnalysisContext context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, AttributeData attribute, params string?[]? messageArgs)
=> ReportDiagnostic(new DiagnosticReporter(context), descriptor, properties, attribute, messageArgs);

public static void ReportDiagnostic(this CompilationAnalysisContext context, DiagnosticDescriptor descriptor, IEnumerable<Location> locations, string?[]? messageArgs = null) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, locations, messageArgs);

public static void ReportDiagnostic(this CompilationAnalysisContext context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, IEnumerable<Location> locations, params string?[]? messageArgs) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, properties, locations, messageArgs);

public static void ReportDiagnostic(this CompilationAnalysisContext context, DiagnosticDescriptor descriptor, SyntaxToken syntaxToken, params string?[]? messageArgs)
=> ReportDiagnostic(new DiagnosticReporter(context), descriptor, syntaxToken, messageArgs);

Expand Down
4 changes: 4 additions & 0 deletions src/Meziantou.Analyzer/Internals/ContextExtensions.tt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ namespace Meziantou.Analyzer.Internals;
internal static partial class ContextExtensions
{
<# foreach (string type in new string[] { "SyntaxNodeAnalysisContext", "SymbolAnalysisContext", "OperationAnalysisContext", "OperationBlockAnalysisContext", "CompilationAnalysisContext" }) { #>
public static void ReportDiagnostic(this <#= type #> context, DiagnosticDescriptor descriptor, IEnumerable<Location> locations, string?[]? messageArgs = null) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, locations, messageArgs);

public static void ReportDiagnostic(this <#= type #> context, DiagnosticDescriptor descriptor, ImmutableDictionary<string, string?>? properties, IEnumerable<Location> locations, params string?[]? messageArgs) => ReportDiagnostic(new DiagnosticReporter(context), descriptor, properties, locations, messageArgs);

public static void ReportDiagnostic(this <#= type #> context, DiagnosticDescriptor descriptor, SyntaxToken syntaxToken, params string?[]? messageArgs)
=> ReportDiagnostic(new DiagnosticReporter(context), descriptor, syntaxToken, messageArgs);

Expand Down