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
21 changes: 14 additions & 7 deletions src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,25 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
.MetadataReferencesProvider
.Where(r => (r.Display ?? "").Contains("Microsoft.Extensions.DependencyInjection.Abstractions"))
.Collect()
.Select((refs, _) => refs.Any());
.Select((refs, _) => refs.Any())
.WithTrackingName("MsDi");

var assemblyName = context.CompilationProvider
.Select((cp, _) => cp.AssemblyName!
.Replace(".", string.Empty)
.Replace(" ", string.Empty)
.Trim()
);
)
.WithTrackingName("AssemblyName");

var @namespace = context
.AnalyzerConfigOptionsProvider
.Select(
(c, _) => c.GlobalOptions
.TryGetValue("build_property.rootnamespace", out var ns)
? ns : null
);
)
.WithTrackingName("RootNamespace");

var behaviors = context.SyntaxProvider
.ForAttributeWithMetadataName(
Expand All @@ -39,18 +42,21 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
TransformBehaviors.ParseBehaviors
)
.SelectMany((x, _) => x)
.Collect();
.Collect()
.WithTrackingName("Behaviors");

var handlers = context.SyntaxProvider
.ForAttributeWithMetadataName(
"Immediate.Handlers.Shared.HandlerAttribute",
predicate: (node, _) => node is TypeDeclarationSyntax,
TransformHandler.ParseHandler
);
)
.WithTrackingName("Handlers");

var handlerNodes = handlers
.Combine(behaviors)
.Combine(hasMsDi);
.Combine(hasMsDi)
.WithTrackingName("HandlersWithBehaviors");

var template = GetTemplate("Handler");
context.RegisterSourceOutput(
Expand All @@ -71,7 +77,8 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
.Combine(@namespace
.Combine(hasMsDi)
.Combine(assemblyName)
);
)
.WithTrackingName("Registrations");

context.RegisterSourceOutput(
registrationNodes,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using Immediate.Handlers.Generators;
using Immediate.Handlers.Tests.Helpers;
Expand Down Expand Up @@ -28,10 +29,34 @@ .. assemblies.GetAdditionalReferences(),
)
);

var generator = new ImmediateHandlersGenerator();
var clone = compilation.Clone().AddSyntaxTrees(CSharpSyntaxTree.ParseText("// dummy"));

var driver = CSharpGeneratorDriver
.Create(generator)
GeneratorDriver driver = CSharpGeneratorDriver.Create(
generators: [new ImmediateHandlersGenerator().AsSourceGenerator()],
driverOptions: new GeneratorDriverOptions(default, trackIncrementalGeneratorSteps: true)
);

var result1 = RunGenerator(ref driver, compilation);
var result2 = RunGenerator(ref driver, clone);

foreach (var (_, step) in result2.Results[0].TrackedOutputSteps)
AssertSteps(step);

foreach (var step in TrackedSteps)
{
if (result2.Results[0].TrackedSteps.TryGetValue(step, out var outputs))
AssertSteps(outputs);
}

return result1;
}

private static GeneratorDriverRunResult RunGenerator(
ref GeneratorDriver driver,
Compilation compilation
)
{
driver = driver
.RunGeneratorsAndUpdateCompilation(
compilation,
out var outputCompilation,
Expand All @@ -47,4 +72,25 @@ out var diagnostics
Assert.Empty(diagnostics);
return driver.GetRunResult();
}

private static ReadOnlySpan<string> TrackedSteps =>
new string[]
{
"MsDi",
"AssemblyName",
"RootNamespace",
"Behaviors",
"Handlers",
"HandlersWithBehaviors",
"Registrations",
};

private static void AssertSteps(
ImmutableArray<IncrementalGeneratorRunStep> steps
)
{
var outputs = steps.SelectMany(o => o.Outputs);

Assert.All(outputs, o => Assert.True(o.Reason is IncrementalStepRunReason.Unchanged or IncrementalStepRunReason.Cached));
}
}