From efb96b354a09ba0f58bf49eaacc510161eda7b39 Mon Sep 17 00:00:00 2001 From: Shyju Krishnankutty Date: Mon, 21 Aug 2023 07:44:20 -0700 Subject: [PATCH 1/2] Adding "global::" namespace prefix to avoid namespace conflict. --- .../FunctionExecutorGenerator.Parser.cs | 3 +- .../FunctionExecutorGeneratorTests.cs | 105 +++++++++++++++++- 2 files changed, 101 insertions(+), 7 deletions(-) diff --git a/sdk/Sdk.Generators/FunctionExecutor/FunctionExecutorGenerator.Parser.cs b/sdk/Sdk.Generators/FunctionExecutor/FunctionExecutorGenerator.Parser.cs index bce2c2366..6e7a88872 100644 --- a/sdk/Sdk.Generators/FunctionExecutor/FunctionExecutorGenerator.Parser.cs +++ b/sdk/Sdk.Generators/FunctionExecutor/FunctionExecutorGenerator.Parser.cs @@ -48,7 +48,8 @@ internal ICollection GetFunctions(List MyAsyncStaticMethod([QueueTrigger(""foo"")] string q) => q; } + + public class QueueTriggers + { + private readonly ILogger _logger; + + public QueueTriggers(ILogger logger) + { + _logger = logger; + } + + [Function(nameof(QueueTriggers))] + public void Run([QueueTrigger(""myqueue-items"")] QueueMessage message) + { + _logger.LogInformation($""Queue message: {message.MessageText}""); + } + + [Function(""Run2"")] + public void Run2([QueueTrigger(""myqueue-items"")] string message) + { + _logger.LogInformation($""Queue message: {message}""); + } + } } "; var expectedOutput = $@"// @@ -86,7 +115,8 @@ internal class DirectFunctionExecutor : IFunctionExecutor private readonly Dictionary types = new() {{ {{ ""MyCompany.MyHttpTriggers"", Type.GetType(""MyCompany.MyHttpTriggers"")! }}, - {{ ""MyCompany.MyHttpTriggers2"", Type.GetType(""MyCompany.MyHttpTriggers2"")! }} + {{ ""MyCompany.MyHttpTriggers2"", Type.GetType(""MyCompany.MyHttpTriggers2"")! }}, + {{ ""MyCompany.QueueTriggers"", Type.GetType(""MyCompany.QueueTriggers"")! }} }}; public DirectFunctionExecutor(IFunctionActivator functionActivator) @@ -104,18 +134,30 @@ public async ValueTask ExecuteAsync(FunctionContext context) {{ var instanceType = types[""MyCompany.MyHttpTriggers""]; var i = _functionActivator.CreateInstance(instanceType, context) as MyCompany.MyHttpTriggers; - context.GetInvocationResult().Value = i.Foo((Microsoft.Azure.Functions.Worker.Http.HttpRequestData)inputArguments[0], (Microsoft.Azure.Functions.Worker.FunctionContext)inputArguments[1]); + context.GetInvocationResult().Value = i.Foo((global::Microsoft.Azure.Functions.Worker.Http.HttpRequestData)inputArguments[0], (global::Microsoft.Azure.Functions.Worker.FunctionContext)inputArguments[1]); }} if (string.Equals(context.FunctionDefinition.EntryPoint, ""MyCompany.MyHttpTriggers2.Bar"", StringComparison.OrdinalIgnoreCase)) {{ var instanceType = types[""MyCompany.MyHttpTriggers2""]; var i = _functionActivator.CreateInstance(instanceType, context) as MyCompany.MyHttpTriggers2; - context.GetInvocationResult().Value = i.Bar((Microsoft.Azure.Functions.Worker.Http.HttpRequestData)inputArguments[0]); + context.GetInvocationResult().Value = i.Bar((global::Microsoft.Azure.Functions.Worker.Http.HttpRequestData)inputArguments[0]); }} if (string.Equals(context.FunctionDefinition.EntryPoint, ""MyCompany.Foo.MyAsyncStaticMethod"", StringComparison.OrdinalIgnoreCase)) {{ context.GetInvocationResult().Value = await MyCompany.Foo.MyAsyncStaticMethod((string)inputArguments[0]); }} + if (string.Equals(context.FunctionDefinition.EntryPoint, ""MyCompany.QueueTriggers.Run"", StringComparison.OrdinalIgnoreCase)) + {{ + var instanceType = types[""MyCompany.QueueTriggers""]; + var i = _functionActivator.CreateInstance(instanceType, context) as MyCompany.QueueTriggers; + i.Run((global::Azure.Storage.Queues.Models.QueueMessage)inputArguments[0]); + }} + if (string.Equals(context.FunctionDefinition.EntryPoint, ""MyCompany.QueueTriggers.Run2"", StringComparison.OrdinalIgnoreCase)) + {{ + var instanceType = types[""MyCompany.QueueTriggers""]; + var i = _functionActivator.CreateInstance(instanceType, context) as MyCompany.QueueTriggers; + i.Run2((string)inputArguments[0]); + }} }} }} {GetExpectedExtensionMethodCode()} @@ -196,13 +238,13 @@ public async ValueTask ExecuteAsync(FunctionContext context) {{ var instanceType = types[""MyCompany.MyHttpTriggers""]; var i = _functionActivator.CreateInstance(instanceType, context) as MyCompany.MyHttpTriggers; - context.GetInvocationResult().Value = i.Run1((Microsoft.Azure.Functions.Worker.Http.HttpRequestData)inputArguments[0]); + context.GetInvocationResult().Value = i.Run1((global::Microsoft.Azure.Functions.Worker.Http.HttpRequestData)inputArguments[0]); }} if (string.Equals(context.FunctionDefinition.EntryPoint, ""MyCompany.MyHttpTriggers.Run2"", StringComparison.OrdinalIgnoreCase)) {{ var instanceType = types[""MyCompany.MyHttpTriggers""]; var i = _functionActivator.CreateInstance(instanceType, context) as MyCompany.MyHttpTriggers; - context.GetInvocationResult().Value = i.Run2((Microsoft.Azure.Functions.Worker.Http.HttpRequestData)inputArguments[0], (Microsoft.Azure.Functions.Worker.FunctionContext)inputArguments[1]); + context.GetInvocationResult().Value = i.Run2((global::Microsoft.Azure.Functions.Worker.Http.HttpRequestData)inputArguments[0], (global::Microsoft.Azure.Functions.Worker.FunctionContext)inputArguments[1]); }} }} }} @@ -223,6 +265,8 @@ public async Task StaticMethods() using System; using System.Threading.Tasks; using Microsoft.Azure.Functions.Worker; +using Azure.Messaging.EventHubs; +using System.IO; namespace FunctionApp26 { @@ -258,6 +302,35 @@ public static ValueTask MyValueTaskStaticAsyncMethod2([QueueTrigger(""foo"")] st return ValueTask.CompletedTask; } } + public class BlobTriggers + { + [Function(nameof(BlobTriggers))] + public static async Task Run([BlobTrigger(""items/{name}"", Connection = ""ConStr"")] Stream stream, string name) + { + using var blobStreamReader = new StreamReader(stream); + var content = await blobStreamReader.ReadToEndAsync(); + } + } + public class EventHubTriggers + { + [Function(""Run1"")] + public static void Run1([EventHubTrigger(""items"", Connection = ""EventHubConnection"")] EventData[] data) + { + } + [Function(nameof(Run2))] + [EventHubOutput(""dest"", Connection = ""EHConnection"")] + public static string Run2([EventHubTrigger(""queue"", Connection = ""EventHubConnection"", IsBatched = false)] EventData eventData) + { + return eventData.MessageId; + } + [Function(""RunAsync1"")] + public static Task RunAsync1([EventHubTrigger(""items"", Connection = ""Con"")] EventData[] data) + { + return Task.CompletedTask; + } + [Function(""RunAsync2"")] + public static async Task RunAsync2([EventHubTrigger(""items"", Connection = ""Con"")] EventData[] data) => await Task.Delay(10); + } }".Replace("'", "\""); var expectedOutput = @$"// using System; @@ -308,6 +381,26 @@ public async ValueTask ExecuteAsync(FunctionContext context) {{ await FunctionApp26.MyQTriggers.MyValueTaskStaticAsyncMethod2((string)inputArguments[0]); }} + if (string.Equals(context.FunctionDefinition.EntryPoint, ""FunctionApp26.BlobTriggers.Run"", StringComparison.OrdinalIgnoreCase)) + {{ + await FunctionApp26.BlobTriggers.Run((global::System.IO.Stream)inputArguments[0], (string)inputArguments[1]); + }} + if (string.Equals(context.FunctionDefinition.EntryPoint, ""FunctionApp26.EventHubTriggers.Run1"", StringComparison.OrdinalIgnoreCase)) + {{ + FunctionApp26.EventHubTriggers.Run1((global::Azure.Messaging.EventHubs.EventData[])inputArguments[0]); + }} + if (string.Equals(context.FunctionDefinition.EntryPoint, ""FunctionApp26.EventHubTriggers.Run2"", StringComparison.OrdinalIgnoreCase)) + {{ + context.GetInvocationResult().Value = FunctionApp26.EventHubTriggers.Run2((global::Azure.Messaging.EventHubs.EventData)inputArguments[0]); + }} + if (string.Equals(context.FunctionDefinition.EntryPoint, ""FunctionApp26.EventHubTriggers.RunAsync1"", StringComparison.OrdinalIgnoreCase)) + {{ + await FunctionApp26.EventHubTriggers.RunAsync1((global::Azure.Messaging.EventHubs.EventData[])inputArguments[0]); + }} + if (string.Equals(context.FunctionDefinition.EntryPoint, ""FunctionApp26.EventHubTriggers.RunAsync2"", StringComparison.OrdinalIgnoreCase)) + {{ + await FunctionApp26.EventHubTriggers.RunAsync2((global::Azure.Messaging.EventHubs.EventData[])inputArguments[0]); + }} }} }} {GetExpectedExtensionMethodCode()} @@ -378,7 +471,7 @@ public async ValueTask ExecuteAsync(FunctionContext context) {{ var instanceType = types[""MyCompany.MyHttpTriggers""]; var i = _functionActivator.CreateInstance(instanceType, context) as MyCompany.MyHttpTriggers; - context.GetInvocationResult().Value = i.Run1((Microsoft.Azure.Functions.Worker.Http.HttpRequestData)inputArguments[0]); + context.GetInvocationResult().Value = i.Run1((global::Microsoft.Azure.Functions.Worker.Http.HttpRequestData)inputArguments[0]); }} }} }} From 3a1f0e2bb0c64c92fdfa5108e0b9876c69ffc223 Mon Sep 17 00:00:00 2001 From: Shyju Krishnankutty Date: Mon, 21 Aug 2023 08:22:12 -0700 Subject: [PATCH 2/2] Updated release notes --- sdk/release_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/release_notes.md b/sdk/release_notes.md index 8b1885c82..a87243e5e 100644 --- a/sdk/release_notes.md +++ b/sdk/release_notes.md @@ -14,4 +14,4 @@ ### Microsoft.Azure.Functions.Worker.Sdk.Generators -- \ No newline at end of file +- Updated source generated versions of FunctionExecutor to use `global::` namespace prefix to avoid ambiguity between namespaces.(#1847) \ No newline at end of file