From e8e816e0b0475662c069a40c9bf9cb92d9eea08b Mon Sep 17 00:00:00 2001 From: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> Date: Mon, 5 Aug 2024 13:22:46 -0700 Subject: [PATCH] Add catch snippet (#4094) --- .../src/Snippets/Snippet.DeclarationStatements.cs | 7 +++++++ .../src/Snippets/Snippet.cs | 2 ++ .../SamplePluginMethodProviderCollection.cs | 15 +++++++-------- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.DeclarationStatements.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.DeclarationStatements.cs index bf6b0b08d3..ce95d7cd7a 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.DeclarationStatements.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.DeclarationStatements.cs @@ -59,5 +59,12 @@ public static MethodBodyStatement Declare(string name, ScopedApi value, ou variable = variableExpression.As(); return new DeclarationExpression(variableExpression).Assign(value).Terminate(); } + + public static DeclarationExpression Declare(string name, out ScopedApi variable) + { + var variableExpression = new VariableExpression(typeof(T), name); + variable = variableExpression.As(); + return new DeclarationExpression(variableExpression); + } } } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.cs index 14fe508f2b..360f2f6e92 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.cs @@ -87,6 +87,8 @@ public static ValueExpression ArrayEmpty(CSharpType arrayItemType) public static AssignmentExpression Assign(this FieldProvider to, ValueExpression value, bool nullCoalesce = false) => new AssignmentExpression(to, value, nullCoalesce); public static AssignmentExpression Assign(this PropertyProvider to, ValueExpression value, bool nullCoalesce = false) => new AssignmentExpression(to, value, nullCoalesce); + public static CatchStatement Catch(DeclarationExpression declare, params MethodBodyStatement[] statements) => new CatchStatement(declare) { statements }; + public static MethodBodyStatement InvokeConsoleWriteLine(ValueExpression expression) => Static(typeof(Console)).Invoke(nameof(Console.WriteLine), expression).Terminate(); diff --git a/packages/http-client-csharp/generator/SamplePlugin/src/Providers/SamplePluginMethodProviderCollection.cs b/packages/http-client-csharp/generator/SamplePlugin/src/Providers/SamplePluginMethodProviderCollection.cs index 475c6c1321..c5e10e7527 100644 --- a/packages/http-client-csharp/generator/SamplePlugin/src/Providers/SamplePluginMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/SamplePlugin/src/Providers/SamplePluginMethodProviderCollection.cs @@ -9,6 +9,7 @@ using Microsoft.Generator.CSharp.Input; using Microsoft.Generator.CSharp.Primitives; using Microsoft.Generator.CSharp.Providers; +using Microsoft.Generator.CSharp.Snippets; using Microsoft.Generator.CSharp.Statements; using static Microsoft.Generator.CSharp.Snippets.Snippet; @@ -36,19 +37,17 @@ protected override IReadOnlyList BuildMethods() // Convert to a method with a body statement so we can add tracing. ConvertToBodyStatementMethodProvider(method); - var ex = new VariableExpression(typeof(Exception), "ex"); - var decl = new DeclarationExpression(ex); var statements = new TryCatchFinallyStatement( [ InvokeConsoleWriteLine(Literal($"Entering method {method.Signature.Name}.")), method.BodyStatements! ], - new CatchStatement(decl) - { - InvokeConsoleWriteLine(new FormattableStringExpression( - $"An exception was thrown in method {method.Signature.Name}: {{0}}", new[] { ex })), - Throw() - }, + Catch(Declare("ex", out ScopedApi ex), + [ + InvokeConsoleWriteLine(new FormattableStringExpression( + $"An exception was thrown in method {method.Signature.Name}: {{0}}", new[] { ex })), + Throw() + ]), [InvokeConsoleWriteLine(Literal($"Exiting method {method.Signature.Name}."))]); method.Update(bodyStatements: statements);