Browse Source

Improve the InitializeComponent Code Generator (#39)

* Merger DevTools and InitializeComponent  tests
* Control without windows test
* Properties to fields for InitializeComponent, ControlType for GenerateCode
* DevTools and InitializeComponent tests
* DevTools and InitializeComponent tests
* clrType to GenerateCode method
* refact whitespaces and isWindow method
* AttachedPropsWithDevTools test fix whitespace
pull/10407/head
GMIKE 5 years ago
committed by GitHub
parent
commit
636bb97644
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 30
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/CustomControls.txt
  2. 28
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/DataTemplates.txt
  3. 34
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/DevToolsCode.cs
  4. 36
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/FieldModifier.txt
  5. 26
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/NamedControl.txt
  6. 30
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/NamedControls.txt
  7. 26
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/NoNamedControls.txt
  8. 42
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/SignUpView.txt
  9. 30
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/xNamedControls.txt
  10. 2
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedProps.txt
  11. 9
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedPropsWithDevTools.txt
  12. 6
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/ControlWithoutWindow.txt
  13. 6
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/CustomControls.txt
  14. 4
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/DataTemplates.txt
  15. 12
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/FieldModifier.txt
  16. 6
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/InitializeComponentCode.cs
  17. 2
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControl.txt
  18. 6
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControls.txt
  19. 18
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/SignUpView.txt
  20. 2
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControl.txt
  21. 6
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControls.txt
  22. 26
      src/Avalonia.NameGenerator.Tests/InitializeComponent/InitializeComponentTests.cs
  23. 11
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/ControlWithoutWindow.txt
  24. 3
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/OnlyPropertiesCode.cs
  25. 3
      src/Avalonia.NameGenerator.Tests/OnlyProperties/OnlyPropertiesTests.cs
  26. 10
      src/Avalonia.NameGenerator.Tests/Views/ControlWithoutWindow.xml
  27. 3
      src/Avalonia.NameGenerator.Tests/Views/View.cs
  28. 3
      src/Avalonia.NameGenerator/Domain/ICodeGenerator.cs
  29. 4
      src/Avalonia.NameGenerator/Domain/IViewResolver.cs
  30. 2
      src/Avalonia.NameGenerator/Generator/AvaloniaNameGenerator.cs
  31. 33
      src/Avalonia.NameGenerator/Generator/InitializeComponentCodeGenerator.cs
  32. 3
      src/Avalonia.NameGenerator/Generator/OnlyPropertiesCodeGenerator.cs
  33. 4
      src/Avalonia.NameGenerator/Generator/XamlXViewResolver.cs
  34. 11
      src/Avalonia.NameGenerator/GeneratorOptions.cs

30
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/CustomControls.txt

@ -1,30 +0,0 @@
// <auto-generated />
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Sample.App
{
partial class SampleView
{
internal global::Avalonia.ReactiveUI.RoutedViewHost ClrNamespaceRoutedViewHost { get; set; }
internal global::Avalonia.ReactiveUI.RoutedViewHost UriRoutedViewHost { get; set; }
internal global::Controls.CustomTextBox UserNameTextBox { get; set; }
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
{
AvaloniaXamlLoader.Load(this);
}
#if DEBUG
this.AttachDevTools();
#endif
ClrNamespaceRoutedViewHost = this.FindControl<global::Avalonia.ReactiveUI.RoutedViewHost>("ClrNamespaceRoutedViewHost");
UriRoutedViewHost = this.FindControl<global::Avalonia.ReactiveUI.RoutedViewHost>("UriRoutedViewHost");
UserNameTextBox = this.FindControl<global::Controls.CustomTextBox>("UserNameTextBox");
}
}
}

28
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/DataTemplates.txt

@ -1,28 +0,0 @@
// <auto-generated />
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Sample.App
{
partial class SampleView
{
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; }
internal global::Avalonia.Controls.ListBox NamedListBox { get; set; }
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
{
AvaloniaXamlLoader.Load(this);
}
#if DEBUG
this.AttachDevTools();
#endif
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox");
NamedListBox = this.FindControl<global::Avalonia.Controls.ListBox>("NamedListBox");
}
}
}

34
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/DevToolsCode.cs

@ -1,34 +0,0 @@
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace Avalonia.NameGenerator.Tests.InitializeComponent.GeneratedDevTools
{
public static class DevToolsCode
{
public const string NamedControl = "NamedControl.txt";
public const string NamedControls = "NamedControls.txt";
public const string XNamedControl = "xNamedControl.txt";
public const string XNamedControls = "xNamedControls.txt";
public const string NoNamedControls = "NoNamedControls.txt";
public const string CustomControls = "CustomControls.txt";
public const string DataTemplates = "DataTemplates.txt";
public const string SignUpView = "SignUpView.txt";
public const string AttachedProps = "AttachedProps.txt";
public const string FieldModifier = "FieldModifier.txt";
public static async Task<string> Load(string generatedCodeResourceName)
{
var assembly = typeof(XamlXNameResolverTests).Assembly;
var fullResourceName = assembly
.GetManifestResourceNames()
.First(name => name.Contains("InitializeComponent") &&
name.Contains("GeneratedDevTools") &&
name.EndsWith(generatedCodeResourceName));
await using var stream = assembly.GetManifestResourceStream(fullResourceName);
using var reader = new StreamReader(stream!);
return await reader.ReadToEndAsync();
}
}
}

36
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/FieldModifier.txt

@ -1,36 +0,0 @@
// <auto-generated />
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Sample.App
{
partial class SampleView
{
public global::Avalonia.Controls.TextBox FirstNameTextBox { get; set; }
public global::Avalonia.Controls.TextBox LastNameTextBox { get; set; }
protected global::Avalonia.Controls.TextBox PasswordTextBox { get; set; }
private global::Avalonia.Controls.TextBox ConfirmPasswordTextBox { get; set; }
internal global::Avalonia.Controls.Button SignUpButton { get; set; }
internal global::Avalonia.Controls.Button RegisterButton { get; set; }
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
{
AvaloniaXamlLoader.Load(this);
}
#if DEBUG
this.AttachDevTools();
#endif
FirstNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("FirstNameTextBox");
LastNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("LastNameTextBox");
PasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox");
ConfirmPasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox");
SignUpButton = this.FindControl<global::Avalonia.Controls.Button>("SignUpButton");
RegisterButton = this.FindControl<global::Avalonia.Controls.Button>("RegisterButton");
}
}
}

26
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/NamedControl.txt

@ -1,26 +0,0 @@
// <auto-generated />
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Sample.App
{
partial class SampleView
{
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; }
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
{
AvaloniaXamlLoader.Load(this);
}
#if DEBUG
this.AttachDevTools();
#endif
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox");
}
}
}

30
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/NamedControls.txt

@ -1,30 +0,0 @@
// <auto-generated />
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Sample.App
{
partial class SampleView
{
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; }
internal global::Avalonia.Controls.TextBox PasswordTextBox { get; set; }
internal global::Avalonia.Controls.Button SignUpButton { get; set; }
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
{
AvaloniaXamlLoader.Load(this);
}
#if DEBUG
this.AttachDevTools();
#endif
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox");
PasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox");
SignUpButton = this.FindControl<global::Avalonia.Controls.Button>("SignUpButton");
}
}
}

26
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/NoNamedControls.txt

@ -1,26 +0,0 @@
// <auto-generated />
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Sample.App
{
partial class SampleView
{
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
{
AvaloniaXamlLoader.Load(this);
}
#if DEBUG
this.AttachDevTools();
#endif
}
}
}

42
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/SignUpView.txt

@ -1,42 +0,0 @@
// <auto-generated />
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Sample.App
{
partial class SampleView
{
internal global::Controls.CustomTextBox UserNameTextBox { get; set; }
internal global::Avalonia.Controls.TextBlock UserNameValidation { get; set; }
internal global::Avalonia.Controls.TextBox PasswordTextBox { get; set; }
internal global::Avalonia.Controls.TextBlock PasswordValidation { get; set; }
internal global::Avalonia.Controls.ListBox AwesomeListView { get; set; }
internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox { get; set; }
internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation { get; set; }
internal global::Avalonia.Controls.Button SignUpButton { get; set; }
internal global::Avalonia.Controls.TextBlock CompoundValidation { get; set; }
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
{
AvaloniaXamlLoader.Load(this);
}
#if DEBUG
this.AttachDevTools();
#endif
UserNameTextBox = this.FindControl<global::Controls.CustomTextBox>("UserNameTextBox");
UserNameValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("UserNameValidation");
PasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox");
PasswordValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("PasswordValidation");
AwesomeListView = this.FindControl<global::Avalonia.Controls.ListBox>("AwesomeListView");
ConfirmPasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox");
ConfirmPasswordValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("ConfirmPasswordValidation");
SignUpButton = this.FindControl<global::Avalonia.Controls.Button>("SignUpButton");
CompoundValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("CompoundValidation");
}
}
}

30
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/xNamedControls.txt

@ -1,30 +0,0 @@
// <auto-generated />
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Sample.App
{
partial class SampleView
{
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; }
internal global::Avalonia.Controls.TextBox PasswordTextBox { get; set; }
internal global::Avalonia.Controls.Button SignUpButton { get; set; }
public void InitializeComponent(bool loadXaml = true)
{
if (loadXaml)
{
AvaloniaXamlLoader.Load(this);
}
#if DEBUG
this.AttachDevTools();
#endif
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox");
PasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox");
SignUpButton = this.FindControl<global::Avalonia.Controls.Button>("SignUpButton");
}
}
}

2
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedProps.txt

@ -7,7 +7,7 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; } internal global::Avalonia.Controls.TextBox UserNameTextBox;
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

9
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/xNamedControl.txt → src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedPropsWithDevTools.txt

@ -7,9 +7,9 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; } internal global::Avalonia.Controls.TextBox UserNameTextBox;
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true, bool attachDevTools = true)
{ {
if (loadXaml) if (loadXaml)
{ {
@ -17,7 +17,10 @@ namespace Sample.App
} }
#if DEBUG #if DEBUG
this.AttachDevTools(); if (attachDevTools)
{
this.AttachDevTools();
}
#endif #endif
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox");

6
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedDevTools/AttachedProps.txt → src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/ControlWithoutWindow.txt

@ -7,7 +7,7 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; } internal global::Avalonia.Controls.TextBox UserNameTextBox;
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {
@ -16,10 +16,6 @@ namespace Sample.App
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
#if DEBUG
this.AttachDevTools();
#endif
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox");
} }
} }

6
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/CustomControls.txt

@ -7,9 +7,9 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.ReactiveUI.RoutedViewHost ClrNamespaceRoutedViewHost { get; set; } internal global::Avalonia.ReactiveUI.RoutedViewHost ClrNamespaceRoutedViewHost;
internal global::Avalonia.ReactiveUI.RoutedViewHost UriRoutedViewHost { get; set; } internal global::Avalonia.ReactiveUI.RoutedViewHost UriRoutedViewHost;
internal global::Controls.CustomTextBox UserNameTextBox { get; set; } internal global::Controls.CustomTextBox UserNameTextBox;
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

4
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/DataTemplates.txt

@ -7,8 +7,8 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; } internal global::Avalonia.Controls.TextBox UserNameTextBox;
internal global::Avalonia.Controls.ListBox NamedListBox { get; set; } internal global::Avalonia.Controls.ListBox NamedListBox;
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

12
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/FieldModifier.txt

@ -7,12 +7,12 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
public global::Avalonia.Controls.TextBox FirstNameTextBox { get; set; } public global::Avalonia.Controls.TextBox FirstNameTextBox;
public global::Avalonia.Controls.TextBox LastNameTextBox { get; set; } public global::Avalonia.Controls.TextBox LastNameTextBox;
protected global::Avalonia.Controls.TextBox PasswordTextBox { get; set; } protected global::Avalonia.Controls.TextBox PasswordTextBox;
private global::Avalonia.Controls.TextBox ConfirmPasswordTextBox { get; set; } private global::Avalonia.Controls.TextBox ConfirmPasswordTextBox;
internal global::Avalonia.Controls.Button SignUpButton { get; set; } internal global::Avalonia.Controls.Button SignUpButton;
internal global::Avalonia.Controls.Button RegisterButton { get; set; } internal global::Avalonia.Controls.Button RegisterButton;
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

6
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/InitializeComponentCode.cs

@ -14,9 +14,11 @@ namespace Avalonia.NameGenerator.Tests.InitializeComponent.GeneratedInitializeCo
public const string CustomControls = "CustomControls.txt"; public const string CustomControls = "CustomControls.txt";
public const string DataTemplates = "DataTemplates.txt"; public const string DataTemplates = "DataTemplates.txt";
public const string SignUpView = "SignUpView.txt"; public const string SignUpView = "SignUpView.txt";
public const string AttachedProps = "AttachedProps.txt";
public const string FieldModifier = "FieldModifier.txt"; public const string FieldModifier = "FieldModifier.txt";
public const string AttachedProps = "AttachedProps.txt";
public const string AttachedPropsWithDevTools = "AttachedPropsWithDevTools.txt";
public const string ControlWithoutWindow = "ControlWithoutWindow.txt";
public static async Task<string> Load(string generatedCodeResourceName) public static async Task<string> Load(string generatedCodeResourceName)
{ {
var assembly = typeof(XamlXNameResolverTests).Assembly; var assembly = typeof(XamlXNameResolverTests).Assembly;

2
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControl.txt

@ -7,7 +7,7 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; } internal global::Avalonia.Controls.TextBox UserNameTextBox;
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

6
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControls.txt

@ -7,9 +7,9 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; } internal global::Avalonia.Controls.TextBox UserNameTextBox;
internal global::Avalonia.Controls.TextBox PasswordTextBox { get; set; } internal global::Avalonia.Controls.TextBox PasswordTextBox;
internal global::Avalonia.Controls.Button SignUpButton { get; set; } internal global::Avalonia.Controls.Button SignUpButton;
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

18
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/SignUpView.txt

@ -7,15 +7,15 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Controls.CustomTextBox UserNameTextBox { get; set; } internal global::Controls.CustomTextBox UserNameTextBox;
internal global::Avalonia.Controls.TextBlock UserNameValidation { get; set; } internal global::Avalonia.Controls.TextBlock UserNameValidation;
internal global::Avalonia.Controls.TextBox PasswordTextBox { get; set; } internal global::Avalonia.Controls.TextBox PasswordTextBox;
internal global::Avalonia.Controls.TextBlock PasswordValidation { get; set; } internal global::Avalonia.Controls.TextBlock PasswordValidation;
internal global::Avalonia.Controls.ListBox AwesomeListView { get; set; } internal global::Avalonia.Controls.ListBox AwesomeListView;
internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox { get; set; } internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox;
internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation { get; set; } internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation;
internal global::Avalonia.Controls.Button SignUpButton { get; set; } internal global::Avalonia.Controls.Button SignUpButton;
internal global::Avalonia.Controls.TextBlock CompoundValidation { get; set; } internal global::Avalonia.Controls.TextBlock CompoundValidation;
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

2
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControl.txt

@ -7,7 +7,7 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; } internal global::Avalonia.Controls.TextBox UserNameTextBox;
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

6
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControls.txt

@ -7,9 +7,9 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox { get; set; } internal global::Avalonia.Controls.TextBox UserNameTextBox;
internal global::Avalonia.Controls.TextBox PasswordTextBox { get; set; } internal global::Avalonia.Controls.TextBox PasswordTextBox;
internal global::Avalonia.Controls.Button SignUpButton { get; set; } internal global::Avalonia.Controls.Button SignUpButton;
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

26
src/Avalonia.NameGenerator.Tests/InitializeComponent/InitializeComponentTests.cs

@ -1,7 +1,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Avalonia.NameGenerator.Compiler; using Avalonia.NameGenerator.Compiler;
using Avalonia.NameGenerator.Generator; using Avalonia.NameGenerator.Generator;
using Avalonia.NameGenerator.Tests.InitializeComponent.GeneratedDevTools;
using Avalonia.NameGenerator.Tests.InitializeComponent.GeneratedInitializeComponent; using Avalonia.NameGenerator.Tests.InitializeComponent.GeneratedInitializeComponent;
using Avalonia.NameGenerator.Tests.OnlyProperties.GeneratedCode; using Avalonia.NameGenerator.Tests.OnlyProperties.GeneratedCode;
using Avalonia.NameGenerator.Tests.Views; using Avalonia.NameGenerator.Tests.Views;
@ -21,18 +20,11 @@ namespace Avalonia.NameGenerator.Tests.InitializeComponent
[InlineData(InitializeComponentCode.CustomControls, View.CustomControls, false)] [InlineData(InitializeComponentCode.CustomControls, View.CustomControls, false)]
[InlineData(InitializeComponentCode.DataTemplates, View.DataTemplates, false)] [InlineData(InitializeComponentCode.DataTemplates, View.DataTemplates, false)]
[InlineData(InitializeComponentCode.SignUpView, View.SignUpView, false)] [InlineData(InitializeComponentCode.SignUpView, View.SignUpView, false)]
[InlineData(InitializeComponentCode.AttachedProps, View.AttachedProps, false)]
[InlineData(InitializeComponentCode.FieldModifier, View.FieldModifier, false)] [InlineData(InitializeComponentCode.FieldModifier, View.FieldModifier, false)]
[InlineData(DevToolsCode.NamedControl, View.NamedControl, true)] [InlineData(InitializeComponentCode.AttachedPropsWithDevTools, View.AttachedProps, true)]
[InlineData(DevToolsCode.NamedControls, View.NamedControls, true)] [InlineData(InitializeComponentCode.AttachedProps, View.AttachedProps, false)]
[InlineData(DevToolsCode.XNamedControl, View.XNamedControl, true)] [InlineData(InitializeComponentCode.ControlWithoutWindow, View.ControlWithoutWindow, true)]
[InlineData(DevToolsCode.XNamedControls, View.XNamedControls, true)] [InlineData(InitializeComponentCode.ControlWithoutWindow, View.ControlWithoutWindow, false)]
[InlineData(DevToolsCode.NoNamedControls, View.NoNamedControls, true)]
[InlineData(DevToolsCode.CustomControls, View.CustomControls, true)]
[InlineData(DevToolsCode.DataTemplates, View.DataTemplates, true)]
[InlineData(DevToolsCode.SignUpView, View.SignUpView, true)]
[InlineData(DevToolsCode.AttachedProps, View.AttachedProps, true)]
[InlineData(DevToolsCode.FieldModifier, View.FieldModifier, true)]
public async Task Should_Generate_FindControl_Refs_From_Avalonia_Markup_File( public async Task Should_Generate_FindControl_Refs_From_Avalonia_Markup_File(
string expectation, string expectation,
string markup, string markup,
@ -56,14 +48,14 @@ namespace Avalonia.NameGenerator.Tests.InitializeComponent
var names = nameResolver.ResolveNames(classInfo.Xaml); var names = nameResolver.ResolveNames(classInfo.Xaml);
var generator = new InitializeComponentCodeGenerator(types); var generator = new InitializeComponentCodeGenerator(types);
var code = generator var code = generator
.GenerateCode("SampleView", "Sample.App", names) .GenerateCode("SampleView", "Sample.App", classInfo.XamlType, names)
.Replace("\r", string.Empty); .Replace("\r", string.Empty);
var expected = devToolsMode var expected = await InitializeComponentCode.Load(expectation);
? await DevToolsCode.Load(expectation)
: await InitializeComponentCode.Load(expectation);
CSharpSyntaxTree.ParseText(code); CSharpSyntaxTree.ParseText(code);
Assert.Equal(expected.Replace("\r", string.Empty), code); Assert.Equal(expected.Replace("\r", string.Empty), code);
} }

11
src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/ControlWithoutWindow.txt

@ -0,0 +1,11 @@
// <auto-generated />
using Avalonia.Controls;
namespace Sample.App
{
partial class SampleView
{
internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox");
}
}

3
src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/OnlyPropertiesCode.cs

@ -17,7 +17,8 @@ namespace Avalonia.NameGenerator.Tests.OnlyProperties.GeneratedCode
public const string SignUpView = "SignUpView.txt"; public const string SignUpView = "SignUpView.txt";
public const string AttachedProps = "AttachedProps.txt"; public const string AttachedProps = "AttachedProps.txt";
public const string FieldModifier = "FieldModifier.txt"; public const string FieldModifier = "FieldModifier.txt";
public const string ControlWithoutWindow = "ControlWithoutWindow.txt";
public static async Task<string> Load(string generatedCodeResourceName) public static async Task<string> Load(string generatedCodeResourceName)
{ {
var assembly = typeof(XamlXNameResolverTests).Assembly; var assembly = typeof(XamlXNameResolverTests).Assembly;

3
src/Avalonia.NameGenerator.Tests/OnlyProperties/OnlyPropertiesTests.cs

@ -21,6 +21,7 @@ namespace Avalonia.NameGenerator.Tests.OnlyProperties
[InlineData(OnlyPropertiesCode.SignUpView, View.SignUpView)] [InlineData(OnlyPropertiesCode.SignUpView, View.SignUpView)]
[InlineData(OnlyPropertiesCode.AttachedProps, View.AttachedProps)] [InlineData(OnlyPropertiesCode.AttachedProps, View.AttachedProps)]
[InlineData(OnlyPropertiesCode.FieldModifier, View.FieldModifier)] [InlineData(OnlyPropertiesCode.FieldModifier, View.FieldModifier)]
[InlineData(OnlyPropertiesCode.ControlWithoutWindow, View.ControlWithoutWindow)]
public async Task Should_Generate_FindControl_Refs_From_Avalonia_Markup_File(string expectation, string markup) public async Task Should_Generate_FindControl_Refs_From_Avalonia_Markup_File(string expectation, string markup)
{ {
var compilation = var compilation =
@ -40,7 +41,7 @@ namespace Avalonia.NameGenerator.Tests.OnlyProperties
var generator = new OnlyPropertiesCodeGenerator(); var generator = new OnlyPropertiesCodeGenerator();
var code = generator var code = generator
.GenerateCode("SampleView", "Sample.App", names) .GenerateCode("SampleView", "Sample.App", classInfo.XamlType, names)
.Replace("\r", string.Empty); .Replace("\r", string.Empty);
var expected = await OnlyPropertiesCode.Load(expectation); var expected = await OnlyPropertiesCode.Load(expectation);

10
src/Avalonia.NameGenerator.Tests/Views/ControlWithoutWindow.xml

@ -0,0 +1,10 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:custom="clr-namespace:Avalonia.ReactiveUI;assembly=Avalonia.ReactiveUI"
xmlns:rxui="http://reactiveui.net"
x:Class="Sample.App.ControlWithoutWindow"
Design.Width="300">
<TextBox Name="UserNameTextBox"
Watermark="Username input"
UseFloatingWatermark="True" />
</UserControl>

3
src/Avalonia.NameGenerator.Tests/Views/View.cs

@ -21,7 +21,8 @@ namespace Avalonia.NameGenerator.Tests.Views
public const string SignUpView = "SignUpView.xml"; public const string SignUpView = "SignUpView.xml";
public const string AttachedProps = "AttachedProps.xml"; public const string AttachedProps = "AttachedProps.xml";
public const string FieldModifier = "FieldModifier.xml"; public const string FieldModifier = "FieldModifier.xml";
public const string ControlWithoutWindow = "ControlWithoutWindow.xml";
public static async Task<string> Load(string viewName) public static async Task<string> Load(string viewName)
{ {
var assembly = typeof(XamlXNameResolverTests).Assembly; var assembly = typeof(XamlXNameResolverTests).Assembly;

3
src/Avalonia.NameGenerator/Domain/ICodeGenerator.cs

@ -1,9 +1,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using XamlX.TypeSystem;
namespace Avalonia.NameGenerator.Domain namespace Avalonia.NameGenerator.Domain
{ {
internal interface ICodeGenerator internal interface ICodeGenerator
{ {
string GenerateCode(string className, string nameSpace, IEnumerable<ResolvedName> names); string GenerateCode(string className, string nameSpace, IXamlType XamlType, IEnumerable<ResolvedName> names);
} }
} }

4
src/Avalonia.NameGenerator/Domain/IViewResolver.cs

@ -1,4 +1,6 @@
using System;
using XamlX.Ast; using XamlX.Ast;
using XamlX.TypeSystem;
namespace Avalonia.NameGenerator.Domain namespace Avalonia.NameGenerator.Domain
{ {
@ -7,5 +9,5 @@ namespace Avalonia.NameGenerator.Domain
ResolvedView ResolveView(string xaml); ResolvedView ResolveView(string xaml);
} }
internal record ResolvedView(string ClassName, string Namespace, XamlDocument Xaml); internal record ResolvedView(string ClassName, IXamlType XamlType, string Namespace, XamlDocument Xaml);
} }

2
src/Avalonia.NameGenerator/Generator/AvaloniaNameGenerator.cs

@ -43,7 +43,7 @@ namespace Avalonia.NameGenerator.Generator
var query = var query =
from view in resolveViews from view in resolveViews
let names = _names.ResolveNames(view.Xaml) let names = _names.ResolveNames(view.Xaml)
let code = _code.GenerateCode(view.ClassName, view.Namespace, names) let code = _code.GenerateCode(view.ClassName, view.Namespace, view.XamlType, names)
let fileName = $"{view.ClassName}.g.cs" let fileName = $"{view.ClassName}.g.cs"
select new GeneratedPartialClass(fileName, code); select new GeneratedPartialClass(fileName, code);

33
src/Avalonia.NameGenerator/Generator/InitializeComponentCodeGenerator.cs

@ -6,29 +6,33 @@ namespace Avalonia.NameGenerator.Generator
{ {
internal class InitializeComponentCodeGenerator: ICodeGenerator internal class InitializeComponentCodeGenerator: ICodeGenerator
{ {
private readonly bool _attachDevTools; private readonly bool _diagnosticsAreConnected;
private const string AttachDevToolsCodeBlock = @" private const string AttachDevToolsCodeBlock = @"
#if DEBUG #if DEBUG
this.AttachDevTools(); if (attachDevTools)
{
this.AttachDevTools();
}
#endif #endif
"; ";
public InitializeComponentCodeGenerator(IXamlTypeSystem types) public InitializeComponentCodeGenerator(IXamlTypeSystem types)
{ {
_attachDevTools = types.FindAssembly("Avalonia.Diagnostics") != null; _diagnosticsAreConnected = types.FindAssembly("Avalonia.Diagnostics") != null;
} }
public string GenerateCode(string className, string nameSpace, IEnumerable<ResolvedName> names) public string GenerateCode(string className, string nameSpace, IXamlType XamlType, IEnumerable<ResolvedName> names)
{ {
var properties = new List<string>(); var properties = new List<string>();
var initializations = new List<string>(); var initializations = new List<string>();
foreach (var (typeName, name, fieldModifier) in names) foreach (var (typeName, name, fieldModifier) in names)
{ {
properties.Add($" {fieldModifier} global::{typeName} {name} {{ get; set; }}"); properties.Add($" {fieldModifier} global::{typeName} {name};");
initializations.Add($" {name} = this.FindControl<global::{typeName}>(\"{name}\");"); initializations.Add($" {name} = this.FindControl<global::{typeName}>(\"{name}\");");
} }
var devToolsBlock = _attachDevTools ? AttachDevToolsCodeBlock : string.Empty; var attachDevTools = _diagnosticsAreConnected && IsWindow(XamlType);
return $@"// <auto-generated /> return $@"// <auto-generated />
using Avalonia.Controls; using Avalonia.Controls;
@ -40,18 +44,31 @@ namespace {nameSpace}
{{ {{
{string.Join("\n", properties)} {string.Join("\n", properties)}
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true{(attachDevTools ? ", bool attachDevTools = true" : string.Empty)})
{{ {{
if (loadXaml) if (loadXaml)
{{ {{
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
}} }}
{devToolsBlock} {(attachDevTools ? AttachDevToolsCodeBlock : string.Empty)}
{string.Join("\n", initializations)} {string.Join("\n", initializations)}
}} }}
}} }}
}} }}
"; ";
} }
private bool IsWindow(IXamlType XamlType)
{
var type = XamlType;
bool isWindow;
do
{
isWindow = type.FullName == "Avalonia.Controls.Window";
type = type.BaseType;
} while (!isWindow && type != null);
return isWindow;
}
} }
} }

3
src/Avalonia.NameGenerator/Generator/OnlyPropertiesCodeGenerator.cs

@ -1,12 +1,13 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Avalonia.NameGenerator.Domain; using Avalonia.NameGenerator.Domain;
using XamlX.TypeSystem;
namespace Avalonia.NameGenerator.Generator namespace Avalonia.NameGenerator.Generator
{ {
internal class OnlyPropertiesCodeGenerator : ICodeGenerator internal class OnlyPropertiesCodeGenerator : ICodeGenerator
{ {
public string GenerateCode(string className, string nameSpace, IEnumerable<ResolvedName> names) public string GenerateCode(string className, string nameSpace, IXamlType XamlType, IEnumerable<ResolvedName> names)
{ {
var namedControls = names var namedControls = names
.Select(info => " " + .Select(info => " " +

4
src/Avalonia.NameGenerator/Generator/XamlXViewResolver.cs

@ -79,7 +79,9 @@ namespace Avalonia.NameGenerator.Generator
var split = text.Text.Split('.'); var split = text.Text.Split('.');
var nameSpace = string.Join(".", split.Take(split.Length - 1)); var nameSpace = string.Join(".", split.Take(split.Length - 1));
var className = split.Last(); var className = split.Last();
_resolvedClass = new ResolvedView(className, nameSpace, _xaml);
_resolvedClass = new ResolvedView(className, clrType, nameSpace, _xaml);
return node; return node;
} }
} }

11
src/Avalonia.NameGenerator/GeneratorOptions.cs

@ -35,13 +35,15 @@ namespace Avalonia.NameGenerator
{ {
get get
{ {
var defaultBehavior = Behavior.OnlyProperties;
var propertyValue = _context var propertyValue = _context
.GetMSBuildProperty( .GetMSBuildProperty(
nameof(BuildProperties.AvaloniaNameGeneratorBehavior), nameof(BuildProperties.AvaloniaNameGeneratorBehavior),
nameof(Behavior.OnlyProperties)); defaultBehavior.ToString());
if (!Enum.TryParse(propertyValue, true, out Behavior behavior)) if (!Enum.TryParse(propertyValue, true, out Behavior behavior))
return Behavior.OnlyProperties; return defaultBehavior;
return behavior; return behavior;
} }
} }
@ -50,13 +52,14 @@ namespace Avalonia.NameGenerator
{ {
get get
{ {
var defaultFieldModifier = DefaultFieldModifier.Internal;
var propertyValue = _context var propertyValue = _context
.GetMSBuildProperty( .GetMSBuildProperty(
nameof(BuildProperties.AvaloniaNameGeneratorDefaultFieldModifier), nameof(BuildProperties.AvaloniaNameGeneratorDefaultFieldModifier),
nameof(DefaultFieldModifier.Internal)); defaultFieldModifier.ToString());
if (!Enum.TryParse(propertyValue, true, out DefaultFieldModifier modifier)) if (!Enum.TryParse(propertyValue, true, out DefaultFieldModifier modifier))
return DefaultFieldModifier.Internal; return defaultFieldModifier;
return modifier; return modifier;
} }
} }

Loading…
Cancel
Save