Browse Source
* Closes https://github.com/AvaloniaUI/Avalonia.NameGenerator/issues/28pull/10407/head
committed by
GitHub
32 changed files with 448 additions and 26 deletions
@ -0,0 +1,22 @@ |
|||
// <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); |
|||
} |
|||
|
|||
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
// <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); |
|||
} |
|||
|
|||
ClrNamespaceRoutedViewHost = this.FindControl<global::Avalonia.ReactiveUI.RoutedViewHost>("ClrNamespaceRoutedViewHost"); |
|||
UriRoutedViewHost = this.FindControl<global::Avalonia.ReactiveUI.RoutedViewHost>("UriRoutedViewHost"); |
|||
UserNameTextBox = this.FindControl<global::Controls.CustomTextBox>("UserNameTextBox"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,24 @@ |
|||
// <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); |
|||
} |
|||
|
|||
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); |
|||
NamedListBox = this.FindControl<global::Avalonia.Controls.ListBox>("NamedListBox"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,32 @@ |
|||
// <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); |
|||
} |
|||
|
|||
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"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
// <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); |
|||
} |
|||
|
|||
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
// <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); |
|||
} |
|||
|
|||
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); |
|||
PasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); |
|||
SignUpButton = this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
// <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); |
|||
} |
|||
|
|||
|
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,38 @@ |
|||
// <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); |
|||
} |
|||
|
|||
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"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
// <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); |
|||
} |
|||
|
|||
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
// <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); |
|||
} |
|||
|
|||
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); |
|||
PasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); |
|||
SignUpButton = this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,52 @@ |
|||
using System.Threading.Tasks; |
|||
using Avalonia.NameGenerator.Compiler; |
|||
using Avalonia.NameGenerator.Generator; |
|||
using Avalonia.NameGenerator.Tests.InitializeComponent.GeneratedCode; |
|||
using Avalonia.NameGenerator.Tests.OnlyProperties.GeneratedCode; |
|||
using Avalonia.NameGenerator.Tests.Views; |
|||
using Microsoft.CodeAnalysis.CSharp; |
|||
using Xunit; |
|||
|
|||
namespace Avalonia.NameGenerator.Tests.InitializeComponent |
|||
{ |
|||
public class InitializeComponentCodeGeneratorTests |
|||
{ |
|||
[Theory] |
|||
[InlineData(InitializeComponentCode.NamedControl, View.NamedControl)] |
|||
[InlineData(InitializeComponentCode.NamedControls, View.NamedControls)] |
|||
[InlineData(InitializeComponentCode.XNamedControl, View.XNamedControl)] |
|||
[InlineData(InitializeComponentCode.XNamedControls, View.XNamedControls)] |
|||
[InlineData(InitializeComponentCode.NoNamedControls, View.NoNamedControls)] |
|||
[InlineData(InitializeComponentCode.CustomControls, View.CustomControls)] |
|||
[InlineData(InitializeComponentCode.DataTemplates, View.DataTemplates)] |
|||
[InlineData(InitializeComponentCode.SignUpView, View.SignUpView)] |
|||
[InlineData(InitializeComponentCode.AttachedProps, View.AttachedProps)] |
|||
[InlineData(InitializeComponentCode.FieldModifier, View.FieldModifier)] |
|||
public async Task Should_Generate_FindControl_Refs_From_Avalonia_Markup_File(string expectation, string markup) |
|||
{ |
|||
var compilation = |
|||
View.CreateAvaloniaCompilation() |
|||
.WithCustomTextBox(); |
|||
|
|||
var classResolver = new XamlXViewResolver( |
|||
new RoslynTypeSystem(compilation), |
|||
MiniCompiler.CreateDefault( |
|||
new RoslynTypeSystem(compilation), |
|||
MiniCompiler.AvaloniaXmlnsDefinitionAttribute)); |
|||
|
|||
var xaml = await View.Load(markup); |
|||
var classInfo = classResolver.ResolveView(xaml); |
|||
var nameResolver = new XamlXNameResolver(); |
|||
var names = nameResolver.ResolveNames(classInfo.Xaml); |
|||
|
|||
var generator = new InitializeComponentCodeGenerator(); |
|||
var code = generator |
|||
.GenerateCode("SampleView", "Sample.App", names) |
|||
.Replace("\r", string.Empty); |
|||
|
|||
var expected = await InitializeComponentCode.Load(expectation); |
|||
CSharpSyntaxTree.ParseText(code); |
|||
Assert.Equal(expected.Replace("\r", string.Empty), code); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,33 @@ |
|||
using System.IO; |
|||
using System.Linq; |
|||
using System.Reflection; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace Avalonia.NameGenerator.Tests.OnlyProperties.GeneratedCode |
|||
{ |
|||
public static class OnlyPropertiesCode |
|||
{ |
|||
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("OnlyProperties") && name.EndsWith(generatedCodeResourceName)); |
|||
|
|||
await using var stream = assembly.GetManifestResourceStream(fullResourceName); |
|||
using var reader = new StreamReader(stream!); |
|||
return await reader.ReadToEndAsync(); |
|||
} |
|||
} |
|||
} |
|||
@ -1,11 +1,14 @@ |
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<ItemGroup> |
|||
<CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="SourceItemGroup"/> |
|||
<CompilerVisibleProperty Include="AvaloniaNameGeneratorBehavior" /> |
|||
</ItemGroup> |
|||
|
|||
<PropertyGroup> |
|||
<AvaloniaNameGeneratorBehavior Condition="'$(AvaloniaNameGeneratorBehavior)' == ''">OnlyProperties</AvaloniaNameGeneratorBehavior> |
|||
</PropertyGroup> |
|||
<Target Name="_InjectAdditionalFiles" BeforeTargets="GenerateMSBuildEditorConfigFileShouldRun"> |
|||
<ItemGroup> |
|||
<AdditionalFiles Include="@(AvaloniaXaml)" SourceItemGroup="AvaloniaXaml" /> |
|||
</ItemGroup> |
|||
</Target> |
|||
</Project> |
|||
</Project> |
|||
|
|||
@ -0,0 +1,44 @@ |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using Avalonia.NameGenerator.Domain; |
|||
|
|||
namespace Avalonia.NameGenerator.Generator |
|||
{ |
|||
internal class InitializeComponentCodeGenerator: ICodeGenerator |
|||
{ |
|||
public string GenerateCode(string className, string nameSpace, IEnumerable<ResolvedName> names) |
|||
{ |
|||
var properties = new List<string>(); |
|||
var initializations = new List<string>(); |
|||
foreach (var info in names) |
|||
{ |
|||
properties.Add($" {info.FieldModifier} global::{info.TypeName} {info.Name} {{get; set;}}"); |
|||
initializations.Add($" {info.Name} = this.FindControl<global::{info.TypeName}>(\"{info.Name}\");"); |
|||
} |
|||
|
|||
return $@"// <auto-generated />
|
|||
|
|||
using Avalonia.Controls; |
|||
using Avalonia.Markup.Xaml; |
|||
|
|||
namespace {nameSpace} |
|||
{{ |
|||
partial class {className} |
|||
{{ |
|||
{string.Join("\n", properties)} |
|||
|
|||
public void InitializeComponent(bool loadXaml = true) |
|||
{{ |
|||
if (loadXaml) |
|||
{{ |
|||
AvaloniaXamlLoader.Load(this); |
|||
}} |
|||
|
|||
{string.Join("\n", initializations)} |
|||
}} |
|||
}} |
|||
}} |
|||
";
|
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue