Skip to content

Commit

Permalink
Add [GeneratedCode] and [ExcludeFromCodeCoverage] to Name Generator o…
Browse files Browse the repository at this point in the history
…utput members (#15616)
  • Loading branch information
stevemonaco authored May 5, 2024
1 parent 7db46af commit 0ced67f
Show file tree
Hide file tree
Showing 26 changed files with 115 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ namespace Avalonia.Generators.NameGenerator;

internal class InitializeComponentCodeGenerator : ICodeGenerator
{
private string _generatorName = typeof(InitializeComponentCodeGenerator).FullName;
private string _generatorVersion = typeof(InitializeComponentCodeGenerator).Assembly.GetName().Version.ToString();
private readonly bool _diagnosticsAreConnected;
private const string AttachDevToolsCodeBlock = @"
#if DEBUG
Expand All @@ -31,6 +33,7 @@ public string GenerateCode(string className, string nameSpace, IXamlType xamlTyp
var initializations = new List<string>();
const string thisFindNameScopeVariable = " var __thisNameScope__ = this.FindNameScope();";
bool hasNames = false;

foreach (var resolvedName in names)
{
if (!hasNames)
Expand All @@ -39,7 +42,12 @@ public string GenerateCode(string className, string nameSpace, IXamlType xamlTyp
}

var (typeName, name, fieldModifier) = resolvedName;
properties.Add($" {fieldModifier} {typeName} {name};");
var propertySource =
$"""
[global::System.CodeDom.Compiler.GeneratedCode("{_generatorName}", "{_generatorVersion}")]
{fieldModifier} {typeName} {name};
""";
properties.Add(propertySource);
initializations.Add($" {name} = __thisNameScope__?.Find<{typeName}>(\"{name}\");");

hasNames = true;
Expand All @@ -64,6 +72,8 @@ partial class {className}
/// </summary>
/// <param name=""loadXaml"">Should the XAML be loaded into the component.</param>
{(attachDevTools ? AttachDevToolsParameterDocumentation : string.Empty)}
[global::System.CodeDom.Compiler.GeneratedCode(""{_generatorName}"", ""{_generatorVersion}"")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true{(attachDevTools ? ", bool attachDevTools = true" : string.Empty)})
{{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@ namespace Avalonia.Generators.NameGenerator;

internal class OnlyPropertiesCodeGenerator : ICodeGenerator
{
private string _generatorName = typeof(OnlyPropertiesCodeGenerator).FullName;
private string _generatorVersion = typeof(OnlyPropertiesCodeGenerator).Assembly.GetName().Version.ToString();

public string GenerateCode(string className, string nameSpace, IXamlType xamlType, IEnumerable<ResolvedName> names)
{
var namedControls = names
.Select(info => " " +
$"[global::System.CodeDom.Compiler.GeneratedCode(\"{_generatorName}\", \"{_generatorVersion}\")]\n" +
" " +
$"{info.FieldModifier} {info.TypeName} {info.Name} => " +
$"this.FindNameScope()?.Find<{info.TypeName}>(\"{info.Name}\");")
.ToList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox UserNameTextBox;

/// <summary>
/// Wires up the controls and optionally loads XAML markup and attaches dev tools (if Avalonia.Diagnostics package is referenced).
/// </summary>
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox UserNameTextBox;

/// <summary>
Expand All @@ -16,6 +17,8 @@ namespace Sample.App
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>
/// <param name="attachDevTools">Should the dev tools be attached.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true, bool attachDevTools = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox UserNameTextBox;

/// <summary>
/// Wires up the controls and optionally loads XAML markup and attaches dev tools (if Avalonia.Diagnostics package is referenced).
/// </summary>
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,20 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.ReactiveUI.RoutedViewHost ClrNamespaceRoutedViewHost;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.ReactiveUI.RoutedViewHost UriRoutedViewHost;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Controls.CustomTextBox UserNameTextBox;

/// <summary>
/// Wires up the controls and optionally loads XAML markup and attaches dev tools (if Avalonia.Diagnostics package is referenced).
/// </summary>
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,18 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox UserNameTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.ListBox NamedListBox;

/// <summary>
/// Wires up the controls and optionally loads XAML markup and attaches dev tools (if Avalonia.Diagnostics package is referenced).
/// </summary>
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,26 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
public global::Avalonia.Controls.TextBox FirstNameTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
public global::Avalonia.Controls.TextBox LastNameTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
protected global::Avalonia.Controls.TextBox PasswordTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
private global::Avalonia.Controls.TextBox ConfirmPasswordTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.Button SignUpButton;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.Button RegisterButton;

/// <summary>
/// Wires up the controls and optionally loads XAML markup and attaches dev tools (if Avalonia.Diagnostics package is referenced).
/// </summary>
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox UserNameTextBox;

/// <summary>
/// Wires up the controls and optionally loads XAML markup and attaches dev tools (if Avalonia.Diagnostics package is referenced).
/// </summary>
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,20 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox UserNameTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox PasswordTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.Button SignUpButton;

/// <summary>
/// Wires up the controls and optionally loads XAML markup and attaches dev tools (if Avalonia.Diagnostics package is referenced).
/// </summary>
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ namespace Sample.App
/// </summary>
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,34 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Controls.CustomTextBox UserNameTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBlock UserNameValidation;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox PasswordTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBlock PasswordValidation;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.ListBox AwesomeListView;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.Documents.Run SignUpButtonDescription;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.Button SignUpButton;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBlock CompoundValidation;

/// <summary>
/// Wires up the controls and optionally loads XAML markup and attaches dev tools (if Avalonia.Diagnostics package is referenced).
/// </summary>
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox UserNameTextBox;

/// <summary>
/// Wires up the controls and optionally loads XAML markup and attaches dev tools (if Avalonia.Diagnostics package is referenced).
/// </summary>
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,20 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox UserNameTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox PasswordTextBox;
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.Button SignUpButton;

/// <summary>
/// Wires up the controls and optionally loads XAML markup and attaches dev tools (if Avalonia.Diagnostics package is referenced).
/// </summary>
/// <param name="loadXaml">Should the XAML be loaded into the component.</param>

[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,17 @@ public async Task Should_Generate_FindControl_Refs_From_Avalonia_Markup_File(
var names = nameResolver.ResolveNames(classInfo.Xaml);

var generator = new InitializeComponentCodeGenerator(types, devToolsMode);
var generatorVersion = typeof(InitializeComponentCodeGenerator).Assembly.GetName().Version.ToString();

var code = generator
.GenerateCode("SampleView", "Sample.App", classInfo.XamlType, names)
.Replace("\r", string.Empty);

var expected = await InitializeComponentCode.Load(expectation);

var expected = (await InitializeComponentCode.Load(expectation))
.Replace("\r", string.Empty)
.Replace("$GeneratorVersion", generatorVersion);

CSharpSyntaxTree.ParseText(code);
Assert.Equal(expected.Replace("\r", string.Empty), code);
Assert.Equal(expected, code);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ namespace Sample.App
{
partial class SampleView
{
[global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")]
internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
}
}
Loading

0 comments on commit 0ced67f

Please sign in to comment.