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
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public override void Initialize(AnalysisContext context)
ctx.RegisterOperationAction(analyzerContext.AnalyzeVariableDeclarator, OperationKind.VariableDeclarator);
ctx.RegisterOperationAction(analyzerContext.AnalyzeConversion, OperationKind.Conversion);
ctx.RegisterOperationAction(analyzerContext.AnalyzeIsPattern, OperationKind.IsPattern);
ctx.RegisterOperationAction(analyzerContext.AnalyzeDelegateCreation, OperationKind.DelegateCreation);
ctx.RegisterCompilationEndAction(analyzerContext.AnalyzeCompilationEnd);
});
}
Expand Down Expand Up @@ -270,6 +271,15 @@ public void AnalyzeIsPattern(OperationAnalysisContext context)
}
}

public void AnalyzeDelegateCreation(OperationAnalysisContext context)
{
var operation = (IDelegateCreationOperation)context.Operation;
if (operation.Type is not null)
{
AddUsedType(operation, operation.Type);
}
}

public void AnalyzeCompilationEnd(CompilationAnalysisContext context)
{
foreach (var type in _potentialUnusedTypes)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1877,4 +1877,72 @@ await CreateProjectBuilder()
.WithSourceCode(SourceCode)
.ValidateAsync();
}

[Fact]
public async Task InternalDelegateUsedInNewExpression_NoDiagnostic()
{
const string SourceCode = """
using System;

internal delegate void MyDelegate(string key, string comment, TimeSpan timeout, out string lockToken);

public class Consumer
{
public void Method()
{
var callback = new MyDelegate((string key, string comment, TimeSpan timeout, out string lockToken) =>
{
lockToken = "42";
});
}
}
""";
await CreateProjectBuilder()
.WithSourceCode(SourceCode)
.ValidateAsync();
}

[Fact]
public async Task PrivateDelegateUsedInNewExpression_NoDiagnostic()
{
const string SourceCode = """
using System;

public class OuterClass
{
private delegate void TryAcquireLockDelegate(string key, string comment, TimeSpan timeout, out string lockToken);

public void Method()
{
var callback = new TryAcquireLockDelegate((string key, string comment, TimeSpan timeout, out string lockToken) =>
{
lockToken = "test";
});
}
}
""";
await CreateProjectBuilder()
.WithSourceCode(SourceCode)
.ValidateAsync();
}

[Fact]
public async Task UnusedInternalDelegate_Diagnostic()
{
const string SourceCode = """
using System;

internal delegate void [|UnusedDelegate|](string message);

public class Consumer
{
public void Method()
{
}
}
""";
await CreateProjectBuilder()
.WithSourceCode(SourceCode)
.ValidateAsync();
}
}