Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
5 changes: 5 additions & 0 deletions src/Analyzers/RoslynExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,11 @@ public static IEnumerable<MethodDeclarationSyntax> GetSyntaxNodes(this IMethodSy
{
LiteralExpressionSyntax? nameLiteralSyntax = argumentOperation.Syntax.DescendantNodes().OfType<LiteralExpressionSyntax>().FirstOrDefault();

if (nameLiteralSyntax is null)
{
return default;
}

return semanticModel.GetConstantValue(nameLiteralSyntax, cancellationToken);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,46 @@ public async Task FuncOrchestratorWithLambdaHasDiag()
await VerifyCS.VerifyDurableTaskCodeFixAsync(code, expected, fix);
}

[Fact]
public async Task FuncOrchestratorInForEachWithVariableNameNoDiag()
{
string code = Wrapper.WrapFuncOrchestrator(@"
string[] names = new[] { ""A"", ""B"" };
foreach (string name in names)
{
tasks.AddOrchestratorFunc<string, string>(
name,
async (ctx, input) =>
{
return await ctx.CallActivityAsync<string>(""Activity"", input);
});
}
");

await VerifyCS.VerifyDurableTaskAnalyzerAsync(code);
}

[Fact]
public async Task FuncOrchestratorInForEachWithVariableNameHasDiag()
{
string code = Wrapper.WrapFuncOrchestrator(@"
string[] names = new[] { ""A"", ""B"" };
foreach (string name in names)
{
tasks.AddOrchestratorFunc(
name,
context =>
{
return {|#0:DateTime.Now|};
});
}
");

DiagnosticResult expected = BuildDiagnostic().WithLocation(0).WithArguments("Main", "System.DateTime.Now", "Main");

await VerifyCS.VerifyDurableTaskAnalyzerAsync(code, expected);
}

[Fact]
public async Task FuncOrchestratorWithMethodReferenceHasDiag()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,46 @@ public async Task FuncOrchestratorUsingThreadSleepHasDiag()
await VerifyCS.VerifyDurableTaskAnalyzerAsync(code, expected);
}

[Fact]
public async Task FuncOrchestratorInForEachWithVariableNameNoDiag()
{
string code = Wrapper.WrapFuncOrchestrator(@"
string[] names = new[] { ""A"", ""B"" };
foreach (string name in names)
{
tasks.AddOrchestratorFunc<string, string>(
name,
async (ctx, input) =>
{
return await ctx.CallActivityAsync<string>(""Activity"", input);
});
}
");

await VerifyCS.VerifyDurableTaskAnalyzerAsync(code);
}

[Fact]
public async Task FuncOrchestratorInForEachWithVariableNameHasDiag()
{
string code = Wrapper.WrapFuncOrchestrator(@"
string[] names = new[] { ""A"", ""B"" };
foreach (string name in names)
{
tasks.AddOrchestratorFunc(
name,
context =>
{
{|#0:Thread.Sleep(1000)|};
});
}
");

DiagnosticResult expected = BuildDiagnostic().WithLocation(0).WithArguments("Main", "Thread.Sleep(int)", "Main");

await VerifyCS.VerifyDurableTaskAnalyzerAsync(code, expected);
}

static DiagnosticResult BuildDiagnostic()
{
return VerifyCS.Diagnostic(DelayOrchestrationAnalyzer.DiagnosticId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,45 @@ public async Task FuncOrchestratorUsingNewGuidHasDiag()
await VerifyCS.VerifyDurableTaskCodeFixAsync(code, expected, fix);
}

[Fact]
public async Task FuncOrchestratorInForEachWithVariableNameNoDiag()
{
string code = Wrapper.WrapFuncOrchestrator(@"
string[] names = new[] { ""A"", ""B"" };
foreach (string name in names)
{
tasks.AddOrchestratorFunc<string, string>(
name,
async (ctx, input) =>
{
return await ctx.CallActivityAsync<string>(""Activity"", input);
});
}
");

await VerifyCS.VerifyDurableTaskAnalyzerAsync(code);
}

Comment thread
YunchuWang marked this conversation as resolved.
[Fact]
public async Task FuncOrchestratorInForEachWithVariableNameHasDiag()
{
string code = Wrapper.WrapFuncOrchestrator(@"
string[] names = new[] { ""A"", ""B"" };
foreach (string name in names)
{
tasks.AddOrchestratorFunc<string, string>(
name,
async (ctx, input) =>
{
return {|#0:Guid.NewGuid()|};
});
}
");

DiagnosticResult expected = BuildDiagnostic().WithLocation(0).WithArguments("Main", "Guid.NewGuid()", "Main");

await VerifyCS.VerifyDurableTaskAnalyzerAsync(code, expected);
}
static DiagnosticResult BuildDiagnostic()
{
return VerifyCS.Diagnostic(GuidOrchestrationAnalyzer.DiagnosticId);
Expand Down
Loading