@@ -230,6 +230,25 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
230230 return null ;
231231 }
232232
233+ /// <summary>
234+ /// Determines if code generation should be skipped for Durable Functions scenarios.
235+ /// Returns true if only entities exist, since entities don't generate extension methods
236+ /// and Durable Functions handles their registration natively.
237+ /// </summary>
238+ static bool ShouldSkipGenerationForDurableFunctions (
239+ bool isDurableFunctions ,
240+ List < DurableTaskTypeInfo > orchestrators ,
241+ List < DurableTaskTypeInfo > activities ,
242+ ImmutableArray < DurableEventTypeInfo > allEvents ,
243+ ImmutableArray < DurableFunction > allFunctions )
244+ {
245+ return isDurableFunctions &&
246+ orchestrators . Count == 0 &&
247+ activities . Count == 0 &&
248+ allEvents . Length == 0 &&
249+ allFunctions . Length == 0 ;
250+ }
251+
233252 static void Execute (
234253 SourceProductionContext context ,
235254 Compilation compilation ,
@@ -277,14 +296,10 @@ static void Execute(
277296 // With Durable Functions' native support for class-based invocations (PR #3229),
278297 // we no longer generate [Function] definitions for class-based tasks.
279298 // If we have ONLY entities (no orchestrators, no activities, no events, no method-based functions),
280- // then there's nothing to generate for Durable Functions scenarios.
281- if ( isDurableFunctions &&
282- orchestrators . Count == 0 &&
283- activities . Count == 0 &&
284- allEvents . Length == 0 &&
285- allFunctions . Length == 0 )
299+ // then there's nothing to generate for Durable Functions scenarios since entities don't have
300+ // extension methods.
301+ if ( ShouldSkipGenerationForDurableFunctions ( isDurableFunctions , orchestrators , activities , allEvents , allFunctions ) )
286302 {
287- // Only entities remain, and entities don't generate extension methods
288303 return ;
289304 }
290305
@@ -312,8 +327,10 @@ public static class GeneratedDurableTaskExtensions
312327 {" ) ;
313328
314329 // Note: With Durable Functions' native support for class-based invocations (PR #3229),
315- // we no longer generate [Function] definitions for class-based tasks to avoid duplicates.
316- // The Durable Functions runtime now handles this automatically.
330+ // we no longer generate [Function] attribute definitions for class-based orchestrators,
331+ // activities, and entities (i.e., classes that implement ITaskOrchestrator, ITaskActivity,
332+ // or ITaskEntity and are decorated with [DurableTask] attribute). The Durable Functions
333+ // runtime now handles function registration for these types automatically.
317334 // We continue to generate extension methods for type-safe invocation.
318335
319336 foreach ( DurableTaskTypeInfo orchestrator in orchestrators )
@@ -344,8 +361,10 @@ public static class GeneratedDurableTaskExtensions
344361 AddEventSendMethod ( sourceBuilder , eventInfo ) ;
345362 }
346363
347- // Note: GeneratedActivityContext is no longer needed since Durable Functions
348- // now natively handles class-based invocations without source generation.
364+ // Note: The GeneratedActivityContext class and AddGeneratedActivityContextClass method
365+ // are no longer needed for Durable Functions since the runtime now natively handles
366+ // class-based invocations. These helper methods remain in the codebase but are not
367+ // called in Durable Functions scenarios.
349368
350369 if ( ! isDurableFunctions )
351370 {
0 commit comments