Browse Source

refactor: Introduce GeneratorOptions (#30)

* refactor: Introduce GeneratorOptions
* nit: White space
pull/10407/head 0.3.1-preview
Artyom V. Gorchakov 6 years ago
committed by GitHub
parent
commit
5bbde81683
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/AttachedProps.txt
  2. 6
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/CustomControls.txt
  3. 4
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/DataTemplates.txt
  4. 12
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/FieldModifier.txt
  5. 2
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/NamedControl.txt
  6. 6
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/NamedControls.txt
  7. 18
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/SignUpView.txt
  8. 2
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/xNamedControl.txt
  9. 6
      src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/xNamedControls.txt
  10. 32
      src/Avalonia.NameGenerator/AvaloniaNameSourceGenerator.cs
  11. 6
      src/Avalonia.NameGenerator/Generator.props
  12. 2
      src/Avalonia.NameGenerator/Generator/InitializeComponentCodeGenerator.cs
  13. 38
      src/Avalonia.NameGenerator/GeneratorOptions.cs

2
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/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 { get; set; }
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

6
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/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 { get; set; }
internal global::Avalonia.ReactiveUI.RoutedViewHost UriRoutedViewHost {get; set;} internal global::Avalonia.ReactiveUI.RoutedViewHost UriRoutedViewHost { get; set; }
internal global::Controls.CustomTextBox UserNameTextBox {get; set;} internal global::Controls.CustomTextBox UserNameTextBox { get; set; }
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

4
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/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 { get; set; }
internal global::Avalonia.Controls.ListBox NamedListBox {get; set;} internal global::Avalonia.Controls.ListBox NamedListBox { get; set; }
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

12
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/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 { get; set; }
public global::Avalonia.Controls.TextBox LastNameTextBox {get; set;} public global::Avalonia.Controls.TextBox LastNameTextBox { get; set; }
protected global::Avalonia.Controls.TextBox PasswordTextBox {get; set;} protected global::Avalonia.Controls.TextBox PasswordTextBox { get; set; }
private global::Avalonia.Controls.TextBox ConfirmPasswordTextBox {get; set;} private global::Avalonia.Controls.TextBox ConfirmPasswordTextBox { get; set; }
internal global::Avalonia.Controls.Button SignUpButton {get; set;} internal global::Avalonia.Controls.Button SignUpButton { get; set; }
internal global::Avalonia.Controls.Button RegisterButton {get; set;} internal global::Avalonia.Controls.Button RegisterButton { get; set; }
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

2
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/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 { get; set; }
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

6
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/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 { get; set; }
internal global::Avalonia.Controls.TextBox PasswordTextBox {get; set;} internal global::Avalonia.Controls.TextBox PasswordTextBox { get; set; }
internal global::Avalonia.Controls.Button SignUpButton {get; set;} internal global::Avalonia.Controls.Button SignUpButton { get; set; }
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

18
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/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 { get; set; }
internal global::Avalonia.Controls.TextBlock UserNameValidation {get; set;} internal global::Avalonia.Controls.TextBlock UserNameValidation { get; set; }
internal global::Avalonia.Controls.TextBox PasswordTextBox {get; set;} internal global::Avalonia.Controls.TextBox PasswordTextBox { get; set; }
internal global::Avalonia.Controls.TextBlock PasswordValidation {get; set;} internal global::Avalonia.Controls.TextBlock PasswordValidation { get; set; }
internal global::Avalonia.Controls.ListBox AwesomeListView {get; set;} internal global::Avalonia.Controls.ListBox AwesomeListView { get; set; }
internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox {get; set;} internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox { get; set; }
internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation {get; set;} internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation { get; set; }
internal global::Avalonia.Controls.Button SignUpButton {get; set;} internal global::Avalonia.Controls.Button SignUpButton { get; set; }
internal global::Avalonia.Controls.TextBlock CompoundValidation {get; set;} internal global::Avalonia.Controls.TextBlock CompoundValidation { get; set; }
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

2
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/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 { get; set; }
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

6
src/Avalonia.NameGenerator.Tests/InitializeComponent/GeneratedCode/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 { get; set; }
internal global::Avalonia.Controls.TextBox PasswordTextBox {get; set;} internal global::Avalonia.Controls.TextBox PasswordTextBox { get; set; }
internal global::Avalonia.Controls.Button SignUpButton {get; set;} internal global::Avalonia.Controls.Button SignUpButton { get; set; }
public void InitializeComponent(bool loadXaml = true) public void InitializeComponent(bool loadXaml = true)
{ {

32
src/Avalonia.NameGenerator/AvaloniaNameSourceGenerator.cs

@ -1,5 +1,4 @@
using System; using System;
using System.Diagnostics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using Avalonia.NameGenerator.Compiler; using Avalonia.NameGenerator.Compiler;
using Avalonia.NameGenerator.Domain; using Avalonia.NameGenerator.Domain;
@ -11,21 +10,9 @@ using Microsoft.CodeAnalysis.CSharp;
namespace Avalonia.NameGenerator namespace Avalonia.NameGenerator
{ {
public enum BuildProperties
{
AvaloniaNameGeneratorBehavior = 0
}
public enum Behaviors
{
OnlyProperties = 0,
InitializeComponent,
}
[Generator] [Generator]
public class AvaloniaNameSourceGenerator : ISourceGenerator public class AvaloniaNameSourceGenerator : ISourceGenerator
{ {
public void Initialize(GeneratorInitializationContext context) { } public void Initialize(GeneratorInitializationContext context) { }
public void Execute(GeneratorExecutionContext context) public void Execute(GeneratorExecutionContext context)
@ -33,21 +20,14 @@ namespace Avalonia.NameGenerator
var compilation = (CSharpCompilation)context.Compilation; var compilation = (CSharpCompilation)context.Compilation;
var types = new RoslynTypeSystem(compilation); var types = new RoslynTypeSystem(compilation);
var compiler = MiniCompiler.CreateDefault(types, MiniCompiler.AvaloniaXmlnsDefinitionAttribute); var compiler = MiniCompiler.CreateDefault(types, MiniCompiler.AvaloniaXmlnsDefinitionAttribute);
var behaviorName = context.GetMSBuildProperty(nameof(BuildProperties.AvaloniaNameGeneratorBehavior), ""); var options = new GeneratorOptions(context);
ICodeGenerator generator = options.AvaloniaNameGeneratorBehavior switch {
if(!Behaviors.TryParse(behaviorName, out Behaviors behavior)) Behavior.OnlyProperties => new OnlyPropertiesCodeGenerator(),
{ Behavior.InitializeComponent => new InitializeComponentCodeGenerator(),
behavior = Behaviors.OnlyProperties;
}
ICodeGenerator generator = behavior switch {
Behaviors.OnlyProperties => new OnlyPropertiesCodeGenerator(),
Behaviors.InitializeComponent => new InitializeComponentCodeGenerator(),
_ => throw new ArgumentOutOfRangeException() _ => throw new ArgumentOutOfRangeException()
}; };
INameGenerator avaloniaNameGenerator = INameGenerator avaloniaNameGenerator =
new AvaloniaNameGenerator( new AvaloniaNameGenerator(
new XamlXViewResolver(types, compiler, true, type => ReportInvalidType(context, type)), new XamlXViewResolver(types, compiler, true, type => ReportInvalidType(context, type)),

6
src/Avalonia.NameGenerator/Generator.props

@ -1,11 +1,11 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AvaloniaNameGeneratorBehavior Condition="'$(AvaloniaNameGeneratorBehavior)' == ''">OnlyProperties</AvaloniaNameGeneratorBehavior>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="SourceItemGroup"/> <CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="SourceItemGroup"/>
<CompilerVisibleProperty Include="AvaloniaNameGeneratorBehavior" /> <CompilerVisibleProperty Include="AvaloniaNameGeneratorBehavior" />
</ItemGroup> </ItemGroup>
<PropertyGroup>
<AvaloniaNameGeneratorBehavior Condition="'$(AvaloniaNameGeneratorBehavior)' == ''">OnlyProperties</AvaloniaNameGeneratorBehavior>
</PropertyGroup>
<Target Name="_InjectAdditionalFiles" BeforeTargets="GenerateMSBuildEditorConfigFileShouldRun"> <Target Name="_InjectAdditionalFiles" BeforeTargets="GenerateMSBuildEditorConfigFileShouldRun">
<ItemGroup> <ItemGroup>
<AdditionalFiles Include="@(AvaloniaXaml)" SourceItemGroup="AvaloniaXaml" /> <AdditionalFiles Include="@(AvaloniaXaml)" SourceItemGroup="AvaloniaXaml" />

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

@ -12,7 +12,7 @@ namespace Avalonia.NameGenerator.Generator
var initializations = new List<string>(); var initializations = new List<string>();
foreach (var info in names) foreach (var info in names)
{ {
properties.Add($" {info.FieldModifier} global::{info.TypeName} {info.Name} {{get; set;}}"); properties.Add($" {info.FieldModifier} global::{info.TypeName} {info.Name} {{ get; set; }}");
initializations.Add($" {info.Name} = this.FindControl<global::{info.TypeName}>(\"{info.Name}\");"); initializations.Add($" {info.Name} = this.FindControl<global::{info.TypeName}>(\"{info.Name}\");");
} }

38
src/Avalonia.NameGenerator/GeneratorOptions.cs

@ -0,0 +1,38 @@
using System;
using Microsoft.CodeAnalysis;
namespace Avalonia.NameGenerator
{
public enum BuildProperties
{
AvaloniaNameGeneratorBehavior = 0
}
public enum Behavior
{
OnlyProperties = 0,
InitializeComponent = 1,
}
public class GeneratorOptions
{
private readonly GeneratorExecutionContext _context;
public GeneratorOptions(GeneratorExecutionContext context) => _context = context;
public Behavior AvaloniaNameGeneratorBehavior
{
get
{
var propertyValue = _context
.GetMSBuildProperty(
nameof(BuildProperties.AvaloniaNameGeneratorBehavior),
nameof(Behavior.OnlyProperties));
if (!Enum.TryParse(propertyValue, out Behavior behavior))
return Behavior.OnlyProperties;
return behavior;
}
}
}
}
Loading…
Cancel
Save