Browse Source

feature: Support Inlines, sync XamlX, use Avalonia 11 (#106)

* feature: Support Inlines, sync XamlX, use Avalonia 11
* chore: Bump version
* chore: Update docs
pull/10407/head 1.6.1
Artyom V. Gorchakov 3 years ago
committed by GitHub
parent
commit
59056ab95a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 34
      README.md
  2. 2
      external/XamlX
  3. 2
      src/Avalonia.NameGenerator.Sandbox/App.xaml
  4. 7
      src/Avalonia.NameGenerator.Sandbox/Avalonia.NameGenerator.Sandbox.csproj
  5. 7
      src/Avalonia.NameGenerator.Sandbox/Controls/SignUpView.xaml
  6. 1
      src/Avalonia.NameGenerator.Sandbox/Controls/SignUpView.xaml.cs
  7. 2
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedProps.txt
  8. 2
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedPropsWithDevTools.txt
  9. 2
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/ControlWithoutWindow.txt
  10. 6
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/CustomControls.txt
  11. 4
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/DataTemplates.txt
  12. 12
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/FieldModifier.txt
  13. 2
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControl.txt
  14. 6
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControls.txt
  15. 20
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/SignUpView.txt
  16. 2
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControl.txt
  17. 6
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControls.txt
  18. 2
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/AttachedProps.txt
  19. 2
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/ControlWithoutWindow.txt
  20. 6
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/CustomControls.txt
  21. 4
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/DataTemplates.txt
  22. 12
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/FieldModifier.txt
  23. 2
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/NamedControl.txt
  24. 6
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/NamedControls.txt
  25. 19
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/SignUpView.txt
  26. 2
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/xNamedControl.txt
  27. 6
      src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/xNamedControls.txt
  28. 7
      src/Avalonia.NameGenerator.Tests/Views/SignUpView.xml
  29. 7
      src/Avalonia.NameGenerator.Tests/XamlXNameResolverTests.cs
  30. 12
      src/Avalonia.NameGenerator/Compiler/MiniCompiler.cs
  31. 2
      src/Avalonia.NameGenerator/Compiler/RoslynTypeSystem.cs
  32. 2
      src/Avalonia.NameGenerator/Generator/InitializeComponentCodeGenerator.cs
  33. 2
      src/Avalonia.NameGenerator/Generator/OnlyPropertiesCodeGenerator.cs
  34. 56
      src/Avalonia.NameGenerator/Generator/ResolverExtensions.cs
  35. 3
      src/Avalonia.NameGenerator/Generator/XamlXNameResolver.cs
  36. 3
      src/Avalonia.NameGenerator/Generator/XamlXViewResolver.cs
  37. 9
      src/Directory.Build.props
  38. 2
      version.json

34
README.md

@ -171,15 +171,15 @@ namespace Sample.App
} }
#endif #endif
UserNameTextBox = this.FindControl<global::Avalonia.NameGenerator.Sandbox.Controls.CustomTextBox>("UserNameTextBox"); UserNameTextBox = this.FindNameScope()?.Find<global::Avalonia.NameGenerator.Sandbox.Controls.CustomTextBox>("UserNameTextBox");
UserNameValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("UserNameValidation"); UserNameValidation = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("UserNameValidation");
PasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); PasswordTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("PasswordTextBox");
PasswordValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("PasswordValidation"); PasswordValidation = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("PasswordValidation");
AwesomeListView = this.FindControl<global::Avalonia.Controls.ListBox>("AwesomeListView"); AwesomeListView = this.FindNameScope()?.Find<global::Avalonia.Controls.ListBox>("AwesomeListView");
ConfirmPasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox"); ConfirmPasswordTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox");
ConfirmPasswordValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("ConfirmPasswordValidation"); ConfirmPasswordValidation = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("ConfirmPasswordValidation");
SignUpButton = this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); SignUpButton = this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("SignUpButton");
CompoundValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("CompoundValidation"); CompoundValidation = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("CompoundValidation");
} }
} }
} }
@ -196,14 +196,14 @@ namespace Avalonia.NameGenerator.Sandbox.Views
{ {
partial class SignUpView partial class SignUpView
{ {
internal global::Avalonia.NameGenerator.Sandbox.Controls.CustomTextBox UserNameTextBox => this.FindControl<global::Avalonia.NameGenerator.Sandbox.Controls.CustomTextBox>("UserNameTextBox"); internal global::Avalonia.NameGenerator.Sandbox.Controls.CustomTextBox UserNameTextBox => this.FindNameScope()?.Find<global::Avalonia.NameGenerator.Sandbox.Controls.CustomTextBox>("UserNameTextBox");
public global::Avalonia.Controls.TextBlock UserNameValidation => this.FindControl<global::Avalonia.Controls.TextBlock>("UserNameValidation"); public global::Avalonia.Controls.TextBlock UserNameValidation => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("UserNameValidation");
private global::Avalonia.Controls.TextBox PasswordTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); private global::Avalonia.Controls.TextBox PasswordTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("PasswordTextBox");
internal global::Avalonia.Controls.TextBlock PasswordValidation => this.FindControl<global::Avalonia.Controls.TextBlock>("PasswordValidation"); internal global::Avalonia.Controls.TextBlock PasswordValidation => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("PasswordValidation");
internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox"); internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox");
internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation => this.FindControl<global::Avalonia.Controls.TextBlock>("ConfirmPasswordValidation"); internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("ConfirmPasswordValidation");
internal global::Avalonia.Controls.Button SignUpButton => this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); internal global::Avalonia.Controls.Button SignUpButton => this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("SignUpButton");
internal global::Avalonia.Controls.TextBlock CompoundValidation => this.FindControl<global::Avalonia.Controls.TextBlock>("CompoundValidation"); internal global::Avalonia.Controls.TextBlock CompoundValidation => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("CompoundValidation");
} }
} }
``` ```

2
external/XamlX

@ -1 +1 @@
Subproject commit 5420df861ce6f2be5ead9efa078fe7242ce88f18 Subproject commit 5e498f8bcca403a34aff5efc825cbb4e12b7fa8e

2
src/Avalonia.NameGenerator.Sandbox/App.xaml

@ -2,6 +2,6 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Avalonia.NameGenerator.Sandbox.App"> x:Class="Avalonia.NameGenerator.Sandbox.App">
<Application.Styles> <Application.Styles>
<FluentTheme Mode="Dark" /> <FluentTheme />
</Application.Styles> </Application.Styles>
</Application> </Application>

7
src/Avalonia.NameGenerator.Sandbox/Avalonia.NameGenerator.Sandbox.csproj

@ -7,12 +7,7 @@
<InstallAvalonia>true</InstallAvalonia> <InstallAvalonia>true</InstallAvalonia>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Update="**\*.xaml.cs"> <AvaloniaResource Include="**\*.xaml" />
<DependentUpon>%(Filename)</DependentUpon>
</Compile>
<EmbeddedResource Include="**\*.xaml">
<SubType>Designer</SubType>
</EmbeddedResource>
<!-- Note this AdditionalFiles directive. --> <!-- Note this AdditionalFiles directive. -->
<AdditionalFiles Include="**\*.xaml" /> <AdditionalFiles Include="**\*.xaml" />
</ItemGroup> </ItemGroup>

7
src/Avalonia.NameGenerator.Sandbox/Controls/SignUpView.xaml

@ -27,6 +27,13 @@
TextWrapping="Wrap" TextWrapping="Wrap"
Foreground="Red" Foreground="Red"
FontSize="12" /> FontSize="12" />
<TextBlock>
<TextBlock.Inlines>
<InlineCollection>
<Run x:Name="SignUpButtonDescription" />
</InlineCollection>
</TextBlock.Inlines>
</TextBlock>
<Button Margin="0 10 0 5" <Button Margin="0 10 0 5"
Content="Sign up" Content="Sign up"
x:Name="SignUpButton" /> x:Name="SignUpButton" />

1
src/Avalonia.NameGenerator.Sandbox/Controls/SignUpView.xaml.cs

@ -48,6 +48,7 @@ public partial class SignUpView : ReactiveUserControl<SignUpViewModel>
UserNameTextBox.Text = "Joseph!"; UserNameTextBox.Text = "Joseph!";
PasswordTextBox.Text = "1234"; PasswordTextBox.Text = "1234";
ConfirmPasswordTextBox.Text = "1234"; ConfirmPasswordTextBox.Text = "1234";
SignUpButtonDescription.Text = "Press the button below to sign up.";
}); });
} }
} }

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

@ -22,7 +22,7 @@ namespace Sample.App
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); UserNameTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
} }
} }
} }

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

@ -30,7 +30,7 @@ namespace Sample.App
} }
#endif #endif
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); UserNameTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
} }
} }
} }

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

@ -22,7 +22,7 @@ namespace Sample.App
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); UserNameTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
} }
} }
} }

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

@ -24,9 +24,9 @@ namespace Sample.App
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
ClrNamespaceRoutedViewHost = this.FindControl<global::Avalonia.ReactiveUI.RoutedViewHost>("ClrNamespaceRoutedViewHost"); ClrNamespaceRoutedViewHost = this.FindNameScope()?.Find<global::Avalonia.ReactiveUI.RoutedViewHost>("ClrNamespaceRoutedViewHost");
UriRoutedViewHost = this.FindControl<global::Avalonia.ReactiveUI.RoutedViewHost>("UriRoutedViewHost"); UriRoutedViewHost = this.FindNameScope()?.Find<global::Avalonia.ReactiveUI.RoutedViewHost>("UriRoutedViewHost");
UserNameTextBox = this.FindControl<global::Controls.CustomTextBox>("UserNameTextBox"); UserNameTextBox = this.FindNameScope()?.Find<global::Controls.CustomTextBox>("UserNameTextBox");
} }
} }
} }

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

@ -23,8 +23,8 @@ namespace Sample.App
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); UserNameTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
NamedListBox = this.FindControl<global::Avalonia.Controls.ListBox>("NamedListBox"); NamedListBox = this.FindNameScope()?.Find<global::Avalonia.Controls.ListBox>("NamedListBox");
} }
} }
} }

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

@ -27,12 +27,12 @@ namespace Sample.App
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
FirstNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("FirstNameTextBox"); FirstNameTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("FirstNameTextBox");
LastNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("LastNameTextBox"); LastNameTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("LastNameTextBox");
PasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); PasswordTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("PasswordTextBox");
ConfirmPasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox"); ConfirmPasswordTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox");
SignUpButton = this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); SignUpButton = this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("SignUpButton");
RegisterButton = this.FindControl<global::Avalonia.Controls.Button>("RegisterButton"); RegisterButton = this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("RegisterButton");
} }
} }
} }

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

@ -22,7 +22,7 @@ namespace Sample.App
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); UserNameTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
} }
} }
} }

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

@ -24,9 +24,9 @@ namespace Sample.App
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); UserNameTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
PasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); PasswordTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("PasswordTextBox");
SignUpButton = this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); SignUpButton = this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("SignUpButton");
} }
} }
} }

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

@ -15,6 +15,7 @@ namespace Sample.App
internal global::Avalonia.Controls.ListBox AwesomeListView; internal global::Avalonia.Controls.ListBox AwesomeListView;
internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox; internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox;
internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation; internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation;
internal global::Avalonia.Controls.Documents.Run SignUpButtonDescription;
internal global::Avalonia.Controls.Button SignUpButton; internal global::Avalonia.Controls.Button SignUpButton;
internal global::Avalonia.Controls.TextBlock CompoundValidation; internal global::Avalonia.Controls.TextBlock CompoundValidation;
@ -30,15 +31,16 @@ namespace Sample.App
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
UserNameTextBox = this.FindControl<global::Controls.CustomTextBox>("UserNameTextBox"); UserNameTextBox = this.FindNameScope()?.Find<global::Controls.CustomTextBox>("UserNameTextBox");
UserNameValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("UserNameValidation"); UserNameValidation = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("UserNameValidation");
PasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); PasswordTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("PasswordTextBox");
PasswordValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("PasswordValidation"); PasswordValidation = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("PasswordValidation");
AwesomeListView = this.FindControl<global::Avalonia.Controls.ListBox>("AwesomeListView"); AwesomeListView = this.FindNameScope()?.Find<global::Avalonia.Controls.ListBox>("AwesomeListView");
ConfirmPasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox"); ConfirmPasswordTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox");
ConfirmPasswordValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("ConfirmPasswordValidation"); ConfirmPasswordValidation = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("ConfirmPasswordValidation");
SignUpButton = this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); SignUpButtonDescription = this.FindNameScope()?.Find<global::Avalonia.Controls.Documents.Run>("SignUpButtonDescription");
CompoundValidation = this.FindControl<global::Avalonia.Controls.TextBlock>("CompoundValidation"); SignUpButton = this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("SignUpButton");
CompoundValidation = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("CompoundValidation");
} }
} }
} }

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

@ -22,7 +22,7 @@ namespace Sample.App
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); UserNameTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
} }
} }
} }

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

@ -24,9 +24,9 @@ namespace Sample.App
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
UserNameTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); UserNameTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
PasswordTextBox = this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); PasswordTextBox = this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("PasswordTextBox");
SignUpButton = this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); SignUpButton = this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("SignUpButton");
} }
} }
} }

2
src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/AttachedProps.txt

@ -6,6 +6,6 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
} }
} }

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

@ -6,6 +6,6 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
} }
} }

6
src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/CustomControls.txt

@ -6,8 +6,8 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.ReactiveUI.RoutedViewHost ClrNamespaceRoutedViewHost => this.FindControl<global::Avalonia.ReactiveUI.RoutedViewHost>("ClrNamespaceRoutedViewHost"); internal global::Avalonia.ReactiveUI.RoutedViewHost ClrNamespaceRoutedViewHost => this.FindNameScope()?.Find<global::Avalonia.ReactiveUI.RoutedViewHost>("ClrNamespaceRoutedViewHost");
internal global::Avalonia.ReactiveUI.RoutedViewHost UriRoutedViewHost => this.FindControl<global::Avalonia.ReactiveUI.RoutedViewHost>("UriRoutedViewHost"); internal global::Avalonia.ReactiveUI.RoutedViewHost UriRoutedViewHost => this.FindNameScope()?.Find<global::Avalonia.ReactiveUI.RoutedViewHost>("UriRoutedViewHost");
internal global::Controls.CustomTextBox UserNameTextBox => this.FindControl<global::Controls.CustomTextBox>("UserNameTextBox"); internal global::Controls.CustomTextBox UserNameTextBox => this.FindNameScope()?.Find<global::Controls.CustomTextBox>("UserNameTextBox");
} }
} }

4
src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/DataTemplates.txt

@ -6,7 +6,7 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
internal global::Avalonia.Controls.ListBox NamedListBox => this.FindControl<global::Avalonia.Controls.ListBox>("NamedListBox"); internal global::Avalonia.Controls.ListBox NamedListBox => this.FindNameScope()?.Find<global::Avalonia.Controls.ListBox>("NamedListBox");
} }
} }

12
src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/FieldModifier.txt

@ -6,11 +6,11 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
public global::Avalonia.Controls.TextBox FirstNameTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("FirstNameTextBox"); public global::Avalonia.Controls.TextBox FirstNameTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("FirstNameTextBox");
public global::Avalonia.Controls.TextBox LastNameTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("LastNameTextBox"); public global::Avalonia.Controls.TextBox LastNameTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("LastNameTextBox");
protected global::Avalonia.Controls.TextBox PasswordTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); protected global::Avalonia.Controls.TextBox PasswordTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("PasswordTextBox");
private global::Avalonia.Controls.TextBox ConfirmPasswordTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox"); private global::Avalonia.Controls.TextBox ConfirmPasswordTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox");
internal global::Avalonia.Controls.Button SignUpButton => this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); internal global::Avalonia.Controls.Button SignUpButton => this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("SignUpButton");
internal global::Avalonia.Controls.Button RegisterButton => this.FindControl<global::Avalonia.Controls.Button>("RegisterButton"); internal global::Avalonia.Controls.Button RegisterButton => this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("RegisterButton");
} }
} }

2
src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/NamedControl.txt

@ -6,6 +6,6 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
} }
} }

6
src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/NamedControls.txt

@ -6,8 +6,8 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
internal global::Avalonia.Controls.TextBox PasswordTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); internal global::Avalonia.Controls.TextBox PasswordTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("PasswordTextBox");
internal global::Avalonia.Controls.Button SignUpButton => this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); internal global::Avalonia.Controls.Button SignUpButton => this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("SignUpButton");
} }
} }

19
src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/SignUpView.txt

@ -6,14 +6,15 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Controls.CustomTextBox UserNameTextBox => this.FindControl<global::Controls.CustomTextBox>("UserNameTextBox"); internal global::Controls.CustomTextBox UserNameTextBox => this.FindNameScope()?.Find<global::Controls.CustomTextBox>("UserNameTextBox");
internal global::Avalonia.Controls.TextBlock UserNameValidation => this.FindControl<global::Avalonia.Controls.TextBlock>("UserNameValidation"); internal global::Avalonia.Controls.TextBlock UserNameValidation => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("UserNameValidation");
internal global::Avalonia.Controls.TextBox PasswordTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); internal global::Avalonia.Controls.TextBox PasswordTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("PasswordTextBox");
internal global::Avalonia.Controls.TextBlock PasswordValidation => this.FindControl<global::Avalonia.Controls.TextBlock>("PasswordValidation"); internal global::Avalonia.Controls.TextBlock PasswordValidation => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("PasswordValidation");
internal global::Avalonia.Controls.ListBox AwesomeListView => this.FindControl<global::Avalonia.Controls.ListBox>("AwesomeListView"); internal global::Avalonia.Controls.ListBox AwesomeListView => this.FindNameScope()?.Find<global::Avalonia.Controls.ListBox>("AwesomeListView");
internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox"); internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("ConfirmPasswordTextBox");
internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation => this.FindControl<global::Avalonia.Controls.TextBlock>("ConfirmPasswordValidation"); internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("ConfirmPasswordValidation");
internal global::Avalonia.Controls.Button SignUpButton => this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); internal global::Avalonia.Controls.Documents.Run SignUpButtonDescription => this.FindNameScope()?.Find<global::Avalonia.Controls.Documents.Run>("SignUpButtonDescription");
internal global::Avalonia.Controls.TextBlock CompoundValidation => this.FindControl<global::Avalonia.Controls.TextBlock>("CompoundValidation"); internal global::Avalonia.Controls.Button SignUpButton => this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("SignUpButton");
internal global::Avalonia.Controls.TextBlock CompoundValidation => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBlock>("CompoundValidation");
} }
} }

2
src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/xNamedControl.txt

@ -6,6 +6,6 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
} }
} }

6
src/Avalonia.NameGenerator.Tests/OnlyProperties/GeneratedCode/xNamedControls.txt

@ -6,8 +6,8 @@ namespace Sample.App
{ {
partial class SampleView partial class SampleView
{ {
internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("UserNameTextBox"); internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("UserNameTextBox");
internal global::Avalonia.Controls.TextBox PasswordTextBox => this.FindControl<global::Avalonia.Controls.TextBox>("PasswordTextBox"); internal global::Avalonia.Controls.TextBox PasswordTextBox => this.FindNameScope()?.Find<global::Avalonia.Controls.TextBox>("PasswordTextBox");
internal global::Avalonia.Controls.Button SignUpButton => this.FindControl<global::Avalonia.Controls.Button>("SignUpButton"); internal global::Avalonia.Controls.Button SignUpButton => this.FindNameScope()?.Find<global::Avalonia.Controls.Button>("SignUpButton");
} }
} }

7
src/Avalonia.NameGenerator.Tests/Views/SignUpView.xml

@ -34,6 +34,13 @@
TextWrapping="Wrap" TextWrapping="Wrap"
Foreground="Red" Foreground="Red"
FontSize="12" /> FontSize="12" />
<TextBlock>
<TextBlock.Inlines>
<InlineCollection>
<Run x:Name="SignUpButtonDescription" />
</InlineCollection>
</TextBlock.Inlines>
</TextBlock>
<Button Margin="0 10 0 5" <Button Margin="0 10 0 5"
Content="Sign up" Content="Sign up"
x:Name="SignUpButton" /> x:Name="SignUpButton" />

7
src/Avalonia.NameGenerator.Tests/XamlXNameResolverTests.cs

@ -108,7 +108,7 @@ public class XamlXNameResolverTests
var controls = ResolveNames(xaml); var controls = ResolveNames(xaml);
Assert.NotEmpty(controls); Assert.NotEmpty(controls);
Assert.Equal(9, controls.Count); Assert.Equal(10, controls.Count);
Assert.Equal("UserNameTextBox", controls[0].Name); Assert.Equal("UserNameTextBox", controls[0].Name);
Assert.Equal("UserNameValidation", controls[1].Name); Assert.Equal("UserNameValidation", controls[1].Name);
Assert.Equal("PasswordTextBox", controls[2].Name); Assert.Equal("PasswordTextBox", controls[2].Name);
@ -116,8 +116,9 @@ public class XamlXNameResolverTests
Assert.Equal("AwesomeListView", controls[4].Name); Assert.Equal("AwesomeListView", controls[4].Name);
Assert.Equal("ConfirmPasswordTextBox", controls[5].Name); Assert.Equal("ConfirmPasswordTextBox", controls[5].Name);
Assert.Equal("ConfirmPasswordValidation", controls[6].Name); Assert.Equal("ConfirmPasswordValidation", controls[6].Name);
Assert.Equal("SignUpButton", controls[7].Name); Assert.Equal("SignUpButtonDescription", controls[7].Name);
Assert.Equal("CompoundValidation", controls[8].Name); Assert.Equal("SignUpButton", controls[8].Name);
Assert.Equal("CompoundValidation", controls[9].Name);
} }
private static IReadOnlyList<ResolvedName> ResolveNames(string xaml) private static IReadOnlyList<ResolvedName> ResolveNames(string xaml)

12
src/Avalonia.NameGenerator/Compiler/MiniCompiler.cs

@ -1,4 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using XamlX.Compiler; using XamlX.Compiler;
using XamlX.Emit; using XamlX.Emit;
using XamlX.Transform; using XamlX.Transform;
@ -19,7 +21,7 @@ internal sealed class MiniCompiler : XamlCompiler<object, IXamlEmitResult>
var configuration = new TransformerConfiguration( var configuration = new TransformerConfiguration(
typeSystem, typeSystem,
typeSystem.Assemblies[0], typeSystem.Assemblies.First(),
mappings); mappings);
return new MiniCompiler(configuration); return new MiniCompiler(configuration);
} }
@ -37,8 +39,12 @@ internal sealed class MiniCompiler : XamlCompiler<object, IXamlEmitResult>
protected override XamlEmitContext<object, IXamlEmitResult> InitCodeGen( protected override XamlEmitContext<object, IXamlEmitResult> InitCodeGen(
IFileSource file, IFileSource file,
Func<string, IXamlType, IXamlTypeBuilder<object>> createSubType, Func<string, IXamlType,
object codeGen, XamlRuntimeContext<object, IXamlEmitResult> context, IXamlTypeBuilder<object>> createSubType,
Func<string, IXamlType, IEnumerable<IXamlType>,
IXamlTypeBuilder<object>> createDelegateType,
object codeGen,
XamlRuntimeContext<object, IXamlEmitResult> context,
bool needContextLocal) => bool needContextLocal) =>
throw new NotSupportedException(); throw new NotSupportedException();
} }

2
src/Avalonia.NameGenerator/Compiler/RoslynTypeSystem.cs

@ -25,7 +25,7 @@ public class RoslynTypeSystem : IXamlTypeSystem
_assemblies.AddRange(assemblySymbols); _assemblies.AddRange(assemblySymbols);
} }
public IReadOnlyList<IXamlAssembly> Assemblies => _assemblies; public IEnumerable<IXamlAssembly> Assemblies => _assemblies;
public IXamlAssembly FindAssembly(string name) => public IXamlAssembly FindAssembly(string name) =>
Assemblies Assemblies

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

@ -34,7 +34,7 @@ internal class InitializeComponentCodeGenerator: ICodeGenerator
{ {
var (typeName, name, fieldModifier) = resolvedName; var (typeName, name, fieldModifier) = resolvedName;
properties.Add($" {fieldModifier} {typeName} {name};"); properties.Add($" {fieldModifier} {typeName} {name};");
initializations.Add($" {name} = this.FindControl<{typeName}>(\"{name}\");"); initializations.Add($" {name} = this.FindNameScope()?.Find<{typeName}>(\"{name}\");");
} }
var attachDevTools = _diagnosticsAreConnected && IsWindow(xamlType); var attachDevTools = _diagnosticsAreConnected && IsWindow(xamlType);

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

@ -12,7 +12,7 @@ internal class OnlyPropertiesCodeGenerator : ICodeGenerator
var namedControls = names var namedControls = names
.Select(info => " " + .Select(info => " " +
$"{info.FieldModifier} {info.TypeName} {info.Name} => " + $"{info.FieldModifier} {info.TypeName} {info.Name} => " +
$"this.FindControl<{info.TypeName}>(\"{info.Name}\");") $"this.FindNameScope()?.Find<{info.TypeName}>(\"{info.Name}\");")
.ToList(); .ToList();
var lines = string.Join("\n", namedControls); var lines = string.Join("\n", namedControls);
return $@"// <auto-generated /> return $@"// <auto-generated />

56
src/Avalonia.NameGenerator/Generator/ResolverExtensions.cs

@ -1,33 +1,25 @@
using System.Linq; using System.Linq;
using XamlX.TypeSystem; using XamlX.TypeSystem;
namespace Avalonia.NameGenerator.Generator; namespace Avalonia.NameGenerator.Generator;
internal static class ResolverExtensions internal static class ResolverExtensions
{ {
public static bool IsAvaloniaControl(this IXamlType clrType) public static bool IsAvaloniaStyledElement(this IXamlType clrType) =>
{ clrType.HasStyledElementBaseType() ||
return clrType.HasControlBaseType() || clrType.HasIControlInterface(); clrType.HasIStyledElementInterface();
}
private static bool HasStyledElementBaseType(this IXamlType clrType)
private static bool HasControlBaseType(this IXamlType clrType) {
{ // Check for the base type since IStyledElement interface is removed.
// Check for the base type since IControl interface is removed. // https://github.com/AvaloniaUI/Avalonia/pull/9553
// https://github.com/AvaloniaUI/Avalonia/pull/9553 if (clrType.FullName == "Avalonia.StyledElement")
if (clrType.FullName == "Avalonia.Controls.Control") return true;
return true; return clrType.BaseType != null && IsAvaloniaStyledElement(clrType.BaseType);
}
if (clrType.BaseType != null)
return IsAvaloniaControl(clrType.BaseType); private static bool HasIStyledElementInterface(this IXamlType clrType) =>
clrType.Interfaces.Any(abstraction =>
return false; abstraction.IsInterface &&
} abstraction.FullName == "Avalonia.IStyledElement");
private static bool HasIControlInterface(this IXamlType clrType)
{
return clrType
.Interfaces
.Any(abstraction => abstraction.IsInterface &&
abstraction.FullName == "Avalonia.Controls.IControl");
}
} }

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

@ -31,8 +31,7 @@ internal class XamlXNameResolver : INameResolver, IXamlAstVisitor
return node; return node;
var clrType = objectNode.Type.GetClrType(); var clrType = objectNode.Type.GetClrType();
if (!clrType.IsAvaloniaStyledElement())
if (!clrType.IsAvaloniaControl())
return node; return node;
foreach (var child in objectNode.Children) foreach (var child in objectNode.Children)

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

@ -63,8 +63,7 @@ internal class XamlXViewResolver : IViewResolver, IXamlAstVisitor
return node; return node;
var clrType = objectNode.Type.GetClrType(); var clrType = objectNode.Type.GetClrType();
if (!clrType.IsAvaloniaStyledElement())
if (!clrType.IsAvaloniaControl())
return node; return node;
foreach (var child in objectNode.Children) foreach (var child in objectNode.Children)

9
src/Directory.Build.props

@ -18,10 +18,11 @@
<PackageReference Include="Nerdbank.GitVersioning" Version="3.5.119" PrivateAssets="all" /> <PackageReference Include="Nerdbank.GitVersioning" Version="3.5.119" PrivateAssets="all" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(InstallAvalonia)' == 'true'"> <ItemGroup Condition="'$(InstallAvalonia)' == 'true'">
<PackageReference Include="Avalonia" Version="0.10.999-cibuild0012810-beta" /> <PackageReference Include="Avalonia" Version="11.0.0-preview5" />
<PackageReference Include="Avalonia.Desktop" Version="0.10.999-cibuild0012810-beta" /> <PackageReference Include="Avalonia.Desktop" Version="11.0.0-preview5" />
<PackageReference Include="Avalonia.ReactiveUI" Version="0.10.999-cibuild0012810-beta" /> <PackageReference Include="Avalonia.ReactiveUI" Version="11.0.0-preview5" />
<PackageReference Include="Avalonia.Diagnostics" Version="0.10.999-cibuild0012810-beta" /> <PackageReference Include="Avalonia.Diagnostics" Version="11.0.0-preview5" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.0-preview5" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="$(MSBuildThisFileDirectory)..\LICENSE" Pack="true" PackagePath="LICENSE" /> <None Include="$(MSBuildThisFileDirectory)..\LICENSE" Pack="true" PackagePath="LICENSE" />

2
version.json

@ -1,6 +1,6 @@
{ {
"$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json",
"version": "1.5", "version": "1.6",
"assemblyVersion": { "assemblyVersion": {
"precision": "revision" "precision": "revision"
}, },

Loading…
Cancel
Save