Skip to content

Commit 89f54f4

Browse files
committed
Feedback
1 parent ed6ed96 commit 89f54f4

File tree

3 files changed

+28
-12
lines changed

3 files changed

+28
-12
lines changed

src/Workspaces/Core/Portable/SourceGeneration/SourceGeneratorExtensions.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public static bool IsRequiredGenerator(this ISourceGenerator generator)
2525
// In the future we might want to expand this to e.g. run any generators with open generated files
2626
return generator.GetGeneratorType().FullName == "Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator";
2727
}
28+
2829
/// <summary>
2930
/// Determines the presence and type of source generators in the specified collection.
3031
/// </summary>
@@ -37,7 +38,7 @@ public static SourceGeneratorPresence GetSourceGeneratorPresence(this ImmutableA
3738

3839
var hasRequiredGenerators = generators.Any(g => g.IsRequiredGenerator());
3940
return hasRequiredGenerators
40-
? SourceGeneratorPresence.ContainsRequiredSourceGenerators
41-
: SourceGeneratorPresence.OnlyOptionalSourceGenerators;
41+
? SourceGeneratorPresence.ContainsRequiredSourceGenerators
42+
: SourceGeneratorPresence.OnlyOptionalSourceGenerators;
4243
}
4344
}

src/Workspaces/Core/Portable/Workspace/Solution/SolutionCompilationState.RegularCompilationTracker_Generators.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,7 @@ private sealed partial class RegularCompilationTracker : ICompilationTracker
3636
Compilation? compilationWithStaleGeneratedTrees,
3737
CancellationToken cancellationToken)
3838
{
39-
var canSkipRunningGenerators = creationPolicy.GeneratedDocumentCreationPolicy is GeneratedDocumentCreationPolicy.DoNotCreate
40-
|| (creationPolicy.GeneratedDocumentCreationPolicy is GeneratedDocumentCreationPolicy.CreateOnlyRequired
41-
&& !await HasRequiredGeneratorsAsync(compilationState, cancellationToken).ConfigureAwait(false));
42-
39+
var canSkipRunningGenerators = await CanSkipRunningGeneratorsAsync(creationPolicy, compilationState, cancellationToken).ConfigureAwait(false);
4340
if (canSkipRunningGenerators)
4441
{
4542
// We're either frozen, or we only want required generators and know that there aren't any to run, so we
@@ -78,6 +75,23 @@ private sealed partial class RegularCompilationTracker : ICompilationTracker
7875
cancellationToken).ConfigureAwait(false);
7976
return (compilationWithGeneratedFiles, new(nextGeneratedDocuments, nextGeneratorDriver));
8077
}
78+
79+
async ValueTask<bool> CanSkipRunningGeneratorsAsync(CreationPolicy creationPolicy, SolutionCompilationState compilationState, CancellationToken cancellationToken)
80+
{
81+
// if we don't want to create generated documents, we can skip
82+
if (creationPolicy.GeneratedDocumentCreationPolicy is GeneratedDocumentCreationPolicy.DoNotCreate)
83+
return true;
84+
85+
// if we only want required documents, we can skip if we don't have any required generators
86+
if (creationPolicy.GeneratedDocumentCreationPolicy is GeneratedDocumentCreationPolicy.CreateOnlyRequired)
87+
{
88+
var hasRequiredGenerators = await HasRequiredGeneratorsAsync(compilationState, cancellationToken).ConfigureAwait(false);
89+
return !hasRequiredGenerators;
90+
}
91+
92+
// we need to run generators
93+
return false;
94+
}
8195
}
8296

8397
private async Task<bool> HasRequiredGeneratorsAsync(SolutionCompilationState compilationState, CancellationToken cancellationToken)

src/Workspaces/Remote/ServiceHub/Services/SourceGeneration/RemoteSourceGenerationService.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,21 +123,22 @@ public async ValueTask<SourceGeneratorPresence> GetSourceGeneratorPresenceAsync(
123123
() => assetProvider.GetAssetsArrayAsync<AnalyzerReference>(projectId, checksumCollection, cancellationToken),
124124
cancellationToken).ConfigureAwait(false);
125125

126+
// if we don't have any analyzer references then we don't have any generators
127+
if (isolatedReferences.IsEmpty)
128+
return SourceGeneratorPresence.NoSourceGenerators;
129+
130+
// see if any of the references have a required generator
126131
var (analyzerReferenceMap, callback) = s_languageToAnalyzerReferenceMap[language];
127-
var hasGenerators = false;
128132
foreach (var analyzerReference in isolatedReferences)
129133
{
130134
var generatorPresence = analyzerReferenceMap.GetValue(analyzerReference, callback).Value;
131135

132136
if (generatorPresence is SourceGeneratorPresence.ContainsRequiredSourceGenerators)
133137
return SourceGeneratorPresence.ContainsRequiredSourceGenerators;
134-
135-
if (generatorPresence is SourceGeneratorPresence.OnlyOptionalSourceGenerators)
136-
hasGenerators = true;
137138
}
138139

139-
return hasGenerators ? SourceGeneratorPresence.OnlyOptionalSourceGenerators
140-
: SourceGeneratorPresence.NoSourceGenerators;
140+
// no required generators, all are optional
141+
return SourceGeneratorPresence.OnlyOptionalSourceGenerators;
141142
}
142143

143144
public ValueTask<ImmutableArray<SourceGeneratorIdentity>> GetSourceGeneratorIdentitiesAsync(

0 commit comments

Comments
 (0)