diff --git a/CHANGELOG.md b/CHANGELOG.md index 81e0dbe606..b058c02481 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - References to C# types generated by kiota are prefixed with `global::` to avoid name collisions. [#4796](https://github.com/microsoft/kiota/issues/4796) - Ensures HashSet properties in `KiotaLock` maintain IgnoreCase comparer across runs [#4916](https://github.com/microsoft/kiota/issues/4916) - Dropped `client base url set to` message when generating plugins. [#4905](https://github.com/microsoft/kiota/issues/4905) +- Emit `[GeneratedCode]` attribute for C# types. [#4907](https://github.com/microsoft/kiota/issues/4907) ## [1.15.0] - 2024-06-06 diff --git a/src/Kiota.Builder/Writers/CSharp/CodeClassDeclarationWriter.cs b/src/Kiota.Builder/Writers/CSharp/CodeClassDeclarationWriter.cs index 040381a0fb..411cb9c9f9 100644 --- a/src/Kiota.Builder/Writers/CSharp/CodeClassDeclarationWriter.cs +++ b/src/Kiota.Builder/Writers/CSharp/CodeClassDeclarationWriter.cs @@ -7,6 +7,7 @@ namespace Kiota.Builder.Writers.CSharp; public class CodeClassDeclarationWriter : BaseElementWriter { public static string AutoGenerationHeader => "// "; + public static string GeneratedCodeAttribute { get; } = $"[global::System.CodeDom.Compiler.GeneratedCode(\"Kiota\", \"{typeof(CodeClassDeclarationWriter).Assembly.GetName().Version}\")]"; public CodeClassDeclarationWriter(CSharpConventionService conventionService) : base(conventionService) { } public override void WriteCodeElement(ClassDeclaration codeElement, LanguageWriter writer) { @@ -37,6 +38,7 @@ public override void WriteCodeElement(ClassDeclaration codeElement, LanguageWrit var derivation = derivedTypes.Length != 0 ? ": " + derivedTypes.Aggregate(static (x, y) => $"{x}, {y}") : string.Empty; bool hasDescription = conventions.WriteLongDescription(parentClass, writer); conventions.WriteDeprecationAttribute(parentClass, writer); + writer.WriteLine(GeneratedCodeAttribute); if (!hasDescription) writer.WriteLine("#pragma warning disable CS1591"); writer.WriteLine($"public partial class {codeElement.Name.ToFirstCharacterUpperCase()} {derivation}"); if (!hasDescription) writer.WriteLine("#pragma warning restore CS1591"); diff --git a/src/Kiota.Builder/Writers/CSharp/CodeEnumWriter.cs b/src/Kiota.Builder/Writers/CSharp/CodeEnumWriter.cs index 33a82562ad..e4ba9d61d5 100644 --- a/src/Kiota.Builder/Writers/CSharp/CodeEnumWriter.cs +++ b/src/Kiota.Builder/Writers/CSharp/CodeEnumWriter.cs @@ -9,6 +9,7 @@ namespace Kiota.Builder.Writers.CSharp; public class CodeEnumWriter : BaseElementWriter { public static string AutoGenerationHeader => "// "; + public static string GeneratedCodeAttribute { get; } = $"[global::System.CodeDom.Compiler.GeneratedCode(\"Kiota\", \"{typeof(CodeClassDeclarationWriter).Assembly.GetName().Version}\")]"; public CodeEnumWriter(CSharpConventionService conventionService) : base(conventionService) { } public override void WriteCodeElement(CodeEnum codeElement, LanguageWriter writer) { @@ -30,6 +31,7 @@ public override void WriteCodeElement(CodeEnum codeElement, LanguageWriter write writer.WriteLine($"namespace {codeNamespace.Name}"); writer.StartBlock(); } + writer.WriteLine(GeneratedCodeAttribute); bool hasDescription = conventions.WriteShortDescription(codeElement, writer); if (codeElement.Flags) writer.WriteLine("[Flags]"); diff --git a/tests/Kiota.Builder.Tests/Writers/CSharp/CodeClassDeclarationWriterTests.cs b/tests/Kiota.Builder.Tests/Writers/CSharp/CodeClassDeclarationWriterTests.cs index d9100b9886..8243e6a0a3 100644 --- a/tests/Kiota.Builder.Tests/Writers/CSharp/CodeClassDeclarationWriterTests.cs +++ b/tests/Kiota.Builder.Tests/Writers/CSharp/CodeClassDeclarationWriterTests.cs @@ -107,4 +107,13 @@ public void WritesImports() Assert.Contains("Project.Graph", result); Assert.Contains("System.Util", result); } + + [Fact] + public void WritesGeneratedCodeAttribute() + { + codeElementWriter.WriteCodeElement(parentClass.StartBlock, writer); + var result = tw.ToString(); + var pattern = @"\s+\[global::System\.CodeDom\.Compiler\.GeneratedCode\(""Kiota"", ""[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+""\)\]"; + Assert.Matches(pattern, result); + } } diff --git a/tests/Kiota.Builder.Tests/Writers/CSharp/CodeEnumWriterTests.cs b/tests/Kiota.Builder.Tests/Writers/CSharp/CodeEnumWriterTests.cs index e5e6590f4f..cd7d0e1176 100644 --- a/tests/Kiota.Builder.Tests/Writers/CSharp/CodeEnumWriterTests.cs +++ b/tests/Kiota.Builder.Tests/Writers/CSharp/CodeEnumWriterTests.cs @@ -110,6 +110,7 @@ public void WritesFlagsEnum() Assert.Contains("= 1", result); Assert.Contains("= 2", result); } + [Fact] public void WritesEnumOptionDescription() { @@ -120,6 +121,7 @@ public void WritesEnumOptionDescription() Assert.Contains($"{Option.Documentation.DescriptionTemplate}", result); AssertExtensions.CurlyBracesAreClosed(result, 1); } + [Fact] public void DoesntWriteAnythingOnNoOption() { @@ -127,4 +129,14 @@ public void DoesntWriteAnythingOnNoOption() var result = tw.ToString(); Assert.Empty(result); } + + [Fact] + public void WritesGeneratedCodeAttribute() + { + currentEnum.AddOption(new CodeEnumOption { Name = "option2" }); + writer.Write(currentEnum); + var result = tw.ToString(); + var pattern = @"\s+\[global::System\.CodeDom\.Compiler\.GeneratedCode\(""Kiota"", ""[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+""\)\]"; + Assert.Matches(pattern, result); + } }