@@ -36,7 +36,7 @@ internal GeneratorDriver(GeneratorDriverState state)
3636 internal GeneratorDriver ( ParseOptions parseOptions , ImmutableArray < ISourceGenerator > generators , AnalyzerConfigOptionsProvider optionsProvider , ImmutableArray < AdditionalText > additionalTexts , GeneratorDriverOptions driverOptions )
3737 {
3838 ( var filteredGenerators , var incrementalGenerators ) = GetIncrementalGenerators ( generators , SourceExtension ) ;
39- _state = new GeneratorDriverState ( parseOptions , optionsProvider , filteredGenerators , incrementalGenerators , additionalTexts , ImmutableArray . Create ( new GeneratorState [ filteredGenerators . Length ] ) , DriverStateTable . Empty , driverOptions . DisabledOutputs ) ;
39+ _state = new GeneratorDriverState ( parseOptions , optionsProvider , filteredGenerators , incrementalGenerators , additionalTexts , ImmutableArray . Create ( new GeneratorState [ filteredGenerators . Length ] ) , DriverStateTable . Empty , driverOptions . DisabledOutputs , runtime : TimeSpan . Zero ) ;
4040 }
4141
4242 public GeneratorDriver RunGenerators ( Compilation compilation , CancellationToken cancellationToken = default )
@@ -135,8 +135,9 @@ public GeneratorDriverRunResult GetRunResult()
135135 => new GeneratorRunResult ( generator ,
136136 diagnostics : generatorState . Diagnostics ,
137137 exception : generatorState . Exception ,
138- generatedSources : getGeneratorSources ( generatorState ) ) ) ;
139- return new GeneratorDriverRunResult ( results ) ;
138+ generatedSources : getGeneratorSources ( generatorState ) ,
139+ elapsedTime : generatorState . ElapsedTime ) ) ;
140+ return new GeneratorDriverRunResult ( results , _state . RunTime ) ;
140141
141142 static ImmutableArray < GeneratedSourceResult > getGeneratorSources ( GeneratorState generatorState )
142143 {
@@ -158,10 +159,11 @@ internal GeneratorDriverState RunGeneratorsCore(Compilation compilation, Diagnos
158159 // with no generators, there is no work to do
159160 if ( _state . Generators . IsEmpty )
160161 {
161- return _state . With ( stateTable : DriverStateTable . Empty ) ;
162+ return _state . With ( stateTable : DriverStateTable . Empty , runTime : TimeSpan . Zero ) ;
162163 }
163164
164165 // run the actual generation
166+ using var timer = CodeAnalysisEventSource . Log . CreateGeneratorDriverRunTimer ( ) ;
165167 var state = _state ;
166168 var stateBuilder = ArrayBuilder < GeneratorState > . GetInstance ( state . Generators . Length ) ;
167169 var constantSourcesBuilder = ArrayBuilder < SyntaxTree > . GetInstance ( ) ;
@@ -244,21 +246,22 @@ internal GeneratorDriverState RunGeneratorsCore(Compilation compilation, Diagnos
244246 continue ;
245247 }
246248
249+ using var generatorTimer = CodeAnalysisEventSource . Log . CreateSingleGeneratorRunTimer ( state . Generators [ i ] ) ;
247250 try
248251 {
249252 var context = UpdateOutputs ( generatorState . OutputNodes , IncrementalGeneratorOutputKind . Source | IncrementalGeneratorOutputKind . Implementation , cancellationToken , driverStateBuilder ) ;
250253 ( var sources , var generatorDiagnostics ) = context . ToImmutableAndFree ( ) ;
251254 generatorDiagnostics = FilterDiagnostics ( compilation , generatorDiagnostics , driverDiagnostics : diagnosticsBag , cancellationToken ) ;
252255
253- stateBuilder [ i ] = new GeneratorState ( generatorState . Info , generatorState . PostInitTrees , generatorState . InputNodes , generatorState . OutputNodes , ParseAdditionalSources ( state . Generators [ i ] , sources , cancellationToken ) , generatorDiagnostics ) ;
256+ stateBuilder [ i ] = new GeneratorState ( generatorState . Info , generatorState . PostInitTrees , generatorState . InputNodes , generatorState . OutputNodes , ParseAdditionalSources ( state . Generators [ i ] , sources , cancellationToken ) , generatorDiagnostics , generatorTimer . Elapsed ) ;
254257 }
255258 catch ( UserFunctionException ufe )
256259 {
257- stateBuilder [ i ] = SetGeneratorException ( MessageProvider , stateBuilder [ i ] , state . Generators [ i ] , ufe . InnerException , diagnosticsBag ) ;
260+ stateBuilder [ i ] = SetGeneratorException ( MessageProvider , stateBuilder [ i ] , state . Generators [ i ] , ufe . InnerException , diagnosticsBag , generatorTimer . Elapsed ) ;
258261 }
259262 }
260263
261- state = state . With ( stateTable : driverStateBuilder . ToImmutable ( ) , generatorStates : stateBuilder . ToImmutableAndFree ( ) ) ;
264+ state = state . With ( stateTable : driverStateBuilder . ToImmutable ( ) , generatorStates : stateBuilder . ToImmutableAndFree ( ) , runTime : timer . Elapsed ) ;
262265 return state ;
263266 }
264267
@@ -290,7 +293,7 @@ private ImmutableArray<GeneratedSyntaxTree> ParseAdditionalSources(ISourceGenera
290293 return trees . ToImmutableAndFree ( ) ;
291294 }
292295
293- private static GeneratorState SetGeneratorException ( CommonMessageProvider provider , GeneratorState generatorState , ISourceGenerator generator , Exception e , DiagnosticBag ? diagnosticBag , bool isInit = false )
296+ private static GeneratorState SetGeneratorException ( CommonMessageProvider provider , GeneratorState generatorState , ISourceGenerator generator , Exception e , DiagnosticBag ? diagnosticBag , TimeSpan ? runTime = null , bool isInit = false )
294297 {
295298 var errorCode = isInit ? provider . WRN_GeneratorFailedDuringInitialization : provider . WRN_GeneratorFailedDuringGeneration ;
296299
@@ -313,7 +316,7 @@ private static GeneratorState SetGeneratorException(CommonMessageProvider provid
313316 var diagnostic = Diagnostic . Create ( descriptor , Location . None , generator . GetGeneratorType ( ) . Name , e . GetType ( ) . Name , e . Message ) ;
314317
315318 diagnosticBag ? . Add ( diagnostic ) ;
316- return new GeneratorState ( generatorState . Info , e , diagnostic ) ;
319+ return new GeneratorState ( generatorState . Info , e , diagnostic , runTime ?? TimeSpan . Zero ) ;
317320 }
318321
319322 private static ImmutableArray < Diagnostic > FilterDiagnostics ( Compilation compilation , ImmutableArray < Diagnostic > generatorDiagnostics , DiagnosticBag ? driverDiagnostics , CancellationToken cancellationToken )
0 commit comments