Browse Source

Reorganize generators code

pull/10407/head
Max Katz 3 years ago
parent
commit
adbbe46aee
  1. 3
      src/tools/Avalonia.Generators/Avalonia.Generators.csproj
  2. 4
      src/tools/Avalonia.Generators/Common/Domain/ICodeGenerator.cs
  3. 4
      src/tools/Avalonia.Generators/Common/Domain/IGlobPattern.cs
  4. 12
      src/tools/Avalonia.Generators/Common/Domain/INameResolver.cs
  5. 4
      src/tools/Avalonia.Generators/Common/Domain/IViewResolver.cs
  6. 6
      src/tools/Avalonia.Generators/Common/GlobPattern.cs
  7. 6
      src/tools/Avalonia.Generators/Common/GlobPatternGroup.cs
  8. 4
      src/tools/Avalonia.Generators/Common/ResolverExtensions.cs
  9. 10
      src/tools/Avalonia.Generators/Common/XamlXNameResolver.cs
  10. 5
      src/tools/Avalonia.Generators/Common/XamlXViewResolver.cs
  11. 4
      src/tools/Avalonia.Generators/Domain/IsExternalInit.cs
  12. 6
      src/tools/Avalonia.Generators/GeneratorContextExtensions.cs
  13. 28
      src/tools/Avalonia.Generators/GeneratorOptions.cs
  14. 6
      src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameGenerator.cs
  15. 15
      src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameSourceGenerator.cs
  16. 4
      src/tools/Avalonia.Generators/NameGenerator/INameGenerator.cs
  17. 8
      src/tools/Avalonia.Generators/NameGenerator/InitializeComponentCodeGenerator.cs
  18. 6
      src/tools/Avalonia.Generators/NameGenerator/OnlyPropertiesCodeGenerator.cs
  19. 21
      src/tools/Avalonia.Generators/NameGenerator/Options.cs
  20. 4
      tests/Avalonia.Generators.Tests/GlobPatternTests.cs
  21. 5
      tests/Avalonia.Generators.Tests/InitializeComponent/InitializeComponentTests.cs
  22. 5
      tests/Avalonia.Generators.Tests/OnlyProperties/OnlyPropertiesTests.cs
  23. 4
      tests/Avalonia.Generators.Tests/XamlXClassResolverTests.cs
  24. 6
      tests/Avalonia.Generators.Tests/XamlXNameResolverTests.cs

3
src/tools/Avalonia.Generators/Avalonia.Generators.csproj

@ -13,8 +13,9 @@
</ItemGroup>
<ItemGroup>
<Compile Link="XamlX\filename" Include="../../Markup/Avalonia.Markup.Xaml.Loader/xamlil.github/src/XamlX/**/*.cs" />
<Compile Link="Compiler\XamlX\filename" Include="../../Markup/Avalonia.Markup.Xaml.Loader/xamlil.github/src/XamlX/**/*.cs" />
<Compile Remove="../../Markup/Avalonia.Markup.Xaml.Loader/xamlil.github/src/XamlX/**/SreTypeSystem.cs" />
<Compile Include="..\..\Shared\IsExternalInit.cs" Link="IsExternalInit.cs" />
</ItemGroup>
<ItemGroup>

4
src/tools/Avalonia.Generators/Domain/ICodeGenerator.cs → src/tools/Avalonia.Generators/Common/Domain/ICodeGenerator.cs

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

4
src/tools/Avalonia.Generators/Domain/IGlobPattern.cs → src/tools/Avalonia.Generators/Common/Domain/IGlobPattern.cs

@ -1,6 +1,6 @@
namespace Avalonia.Generators.Domain;
namespace Avalonia.Generators.Common.Domain;
internal interface IGlobPattern
{
bool Matches(string str);
}
}

12
src/tools/Avalonia.Generators/Domain/INameResolver.cs → src/tools/Avalonia.Generators/Common/Domain/INameResolver.cs

@ -1,11 +1,19 @@
using System.Collections.Generic;
using XamlX.Ast;
namespace Avalonia.Generators.Domain;
namespace Avalonia.Generators.Common.Domain;
internal enum NamedFieldModifier
{
Public = 0,
Private = 1,
Internal = 2,
Protected = 3,
}
internal interface INameResolver
{
IReadOnlyList<ResolvedName> ResolveNames(XamlDocument xaml);
}
internal record ResolvedName(string TypeName, string Name, string FieldModifier);
internal record ResolvedName(string TypeName, string Name, string FieldModifier);

4
src/tools/Avalonia.Generators/Domain/IViewResolver.cs → src/tools/Avalonia.Generators/Common/Domain/IViewResolver.cs

@ -1,11 +1,11 @@
using XamlX.Ast;
using XamlX.TypeSystem;
namespace Avalonia.Generators.Domain;
namespace Avalonia.Generators.Common.Domain;
internal interface IViewResolver
{
ResolvedView ResolveView(string xaml);
}
internal record ResolvedView(string ClassName, IXamlType XamlType, string Namespace, XamlDocument Xaml);
internal record ResolvedView(string ClassName, IXamlType XamlType, string Namespace, XamlDocument Xaml);

6
src/tools/Avalonia.Generators/Generator/GlobPattern.cs → src/tools/Avalonia.Generators/Common/GlobPattern.cs

@ -1,7 +1,7 @@
using System.Text.RegularExpressions;
using Avalonia.Generators.Domain;
using Avalonia.Generators.Common.Domain;
namespace Avalonia.Generators.Generator;
namespace Avalonia.Generators.Common;
internal class GlobPattern : IGlobPattern
{
@ -15,4 +15,4 @@ internal class GlobPattern : IGlobPattern
}
public bool Matches(string str) => _regex.IsMatch(str);
}
}

6
src/tools/Avalonia.Generators/Generator/GlobPatternGroup.cs → src/tools/Avalonia.Generators/Common/GlobPatternGroup.cs

@ -1,8 +1,8 @@
using System.Collections.Generic;
using System.Linq;
using Avalonia.Generators.Domain;
using Avalonia.Generators.Common.Domain;
namespace Avalonia.Generators.Generator;
namespace Avalonia.Generators.Common;
internal class GlobPatternGroup : IGlobPattern
{
@ -14,4 +14,4 @@ internal class GlobPatternGroup : IGlobPattern
.ToArray();
public bool Matches(string str) => _patterns.Any(pattern => pattern.Matches(str));
}
}

4
src/tools/Avalonia.Generators/Generator/ResolverExtensions.cs → src/tools/Avalonia.Generators/Common/ResolverExtensions.cs

@ -1,7 +1,7 @@
using System.Linq;
using XamlX.TypeSystem;
namespace Avalonia.Generators.Generator;
namespace Avalonia.Generators.Common;
internal static class ResolverExtensions
{
@ -22,4 +22,4 @@ internal static class ResolverExtensions
clrType.Interfaces.Any(abstraction =>
abstraction.IsInterface &&
abstraction.FullName == "Avalonia.IStyledElement");
}
}

10
src/tools/Avalonia.Generators/Generator/XamlXNameResolver.cs → src/tools/Avalonia.Generators/Common/XamlXNameResolver.cs

@ -1,20 +1,20 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Avalonia.Generators.Domain;
using Avalonia.Generators.Common.Domain;
using XamlX;
using XamlX.Ast;
namespace Avalonia.Generators.Generator;
namespace Avalonia.Generators.Common;
internal class XamlXNameResolver : INameResolver, IXamlAstVisitor
{
private readonly List<ResolvedName> _items = new();
private readonly string _defaultFieldModifier;
public XamlXNameResolver(DefaultFieldModifier defaultFieldModifier = DefaultFieldModifier.Internal)
public XamlXNameResolver(NamedFieldModifier namedFieldModifier = NamedFieldModifier.Internal)
{
_defaultFieldModifier = defaultFieldModifier.ToString().ToLowerInvariant();
_defaultFieldModifier = namedFieldModifier.ToString().ToLowerInvariant();
}
public IReadOnlyList<ResolvedName> ResolveNames(XamlDocument xaml)
@ -89,4 +89,4 @@ internal class XamlXNameResolver : INameResolver, IXamlAstVisitor
_ => _defaultFieldModifier
};
}
}
}

5
src/tools/Avalonia.Generators/Generator/XamlXViewResolver.cs → src/tools/Avalonia.Generators/Common/XamlXViewResolver.cs

@ -1,14 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia.Generators.Common.Domain;
using Avalonia.Generators.Compiler;
using Avalonia.Generators.Domain;
using XamlX;
using XamlX.Ast;
using XamlX.Parsers;
using XamlX.TypeSystem;
namespace Avalonia.Generators.Generator;
namespace Avalonia.Generators.Common;
internal class XamlXViewResolver : IViewResolver, IXamlAstVisitor
{

4
src/tools/Avalonia.Generators/Domain/IsExternalInit.cs

@ -1,4 +0,0 @@
// ReSharper disable once CheckNamespace
namespace System.Runtime.CompilerServices;
internal static class IsExternalInit { }

6
src/tools/Avalonia.Generators/GeneratorContextExtensions.cs

@ -17,13 +17,13 @@ internal static class GeneratorContextExtensions
return value ?? defaultValue;
}
public static void ReportUnhandledError(this GeneratorExecutionContext context, Exception error) =>
public static void ReportNameGeneratorUnhandledError(this GeneratorExecutionContext context, Exception error) =>
context.Report(UnhandledErrorDescriptorId,
"Unhandled exception occured while generating typed Name references. " +
"Please file an issue: https://github.com/avaloniaui/Avalonia.Generators",
error.ToString());
public static void ReportInvalidType(this GeneratorExecutionContext context, string typeName) =>
public static void ReportNameGeneratorInvalidType(this GeneratorExecutionContext context, string typeName) =>
context.Report(InvalidTypeDescriptorId,
$"Avalonia x:Name generator was unable to generate names for type '{typeName}'. " +
$"The type '{typeName}' does not exist in the assembly.");
@ -33,4 +33,4 @@ internal static class GeneratorContextExtensions
Diagnostic.Create(
new DiagnosticDescriptor(id, title, message ?? title, "Usage", DiagnosticSeverity.Error, true),
Location.None));
}
}

28
src/tools/Avalonia.Generators/GeneratorOptions.cs

@ -1,4 +1,6 @@
using System;
using Avalonia.Generators.Common.Domain;
using Avalonia.Generators.NameGenerator;
using Microsoft.CodeAnalysis;
namespace Avalonia.Generators;
@ -12,26 +14,6 @@ internal enum BuildProperties
AvaloniaNameGeneratorViewFileNamingStrategy = 4,
}
internal enum DefaultFieldModifier
{
Public = 0,
Private = 1,
Internal = 2,
Protected = 3,
}
internal enum Behavior
{
OnlyProperties = 0,
InitializeComponent = 1,
}
internal enum ViewFileNamingStrategy
{
ClassName = 0,
NamespaceAndClassName = 1,
}
internal class GeneratorOptions
{
private readonly GeneratorExecutionContext _context;
@ -42,9 +24,9 @@ internal class GeneratorOptions
BuildProperties.AvaloniaNameGeneratorBehavior,
Behavior.InitializeComponent);
public DefaultFieldModifier AvaloniaNameGeneratorDefaultFieldModifier => GetEnumProperty(
public NamedFieldModifier AvaloniaNameGeneratorClassFieldModifier => GetEnumProperty(
BuildProperties.AvaloniaNameGeneratorDefaultFieldModifier,
DefaultFieldModifier.Internal);
NamedFieldModifier.Internal);
public ViewFileNamingStrategy AvaloniaNameGeneratorViewFileNamingStrategy => GetEnumProperty(
BuildProperties.AvaloniaNameGeneratorViewFileNamingStrategy,
@ -71,4 +53,4 @@ internal class GeneratorOptions
var value = _context.GetMsBuildProperty(key, defaultValue.ToString());
return Enum.TryParse(value, true, out TEnum behavior) ? behavior : defaultValue;
}
}
}

6
src/tools/Avalonia.Generators/Generator/AvaloniaNameGenerator.cs → src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameGenerator.cs

@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia.Generators.Domain;
using Avalonia.Generators.Common.Domain;
using Microsoft.CodeAnalysis;
namespace Avalonia.Generators.Generator;
namespace Avalonia.Generators.NameGenerator;
internal class AvaloniaNameGenerator : INameGenerator
{
@ -60,4 +60,4 @@ internal class AvaloniaNameGenerator : INameGenerator
ViewFileNamingStrategy.NamespaceAndClassName => $"{view.Namespace}.{view.ClassName}.g.cs",
_ => throw new ArgumentOutOfRangeException(nameof(strategy), strategy, "Unknown naming strategy!")
};
}
}

15
src/tools/Avalonia.Generators/Generator.cs → src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameSourceGenerator.cs

@ -1,12 +1,11 @@
using System;
using System.Runtime.CompilerServices;
using Avalonia.Generators.Common;
using Avalonia.Generators.Common.Domain;
using Avalonia.Generators.Compiler;
using Avalonia.Generators.Domain;
using Avalonia.Generators.Generator;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
namespace Avalonia.Generators;
namespace Avalonia.Generators.NameGenerator;
[Generator]
public class AvaloniaNameSourceGenerator : ISourceGenerator
@ -23,7 +22,7 @@ public class AvaloniaNameSourceGenerator : ISourceGenerator
}
catch (Exception exception)
{
context.ReportUnhandledError(exception);
context.ReportNameGeneratorUnhandledError(exception);
}
}
@ -43,9 +42,9 @@ public class AvaloniaNameSourceGenerator : ISourceGenerator
new GlobPatternGroup(options.AvaloniaNameGeneratorFilterByPath),
new GlobPatternGroup(options.AvaloniaNameGeneratorFilterByNamespace),
new XamlXViewResolver(types, compiler, true,
type => context.ReportInvalidType(type),
error => context.ReportUnhandledError(error)),
new XamlXNameResolver(options.AvaloniaNameGeneratorDefaultFieldModifier),
type => context.ReportNameGeneratorInvalidType(type),
error => context.ReportNameGeneratorUnhandledError(error)),
new XamlXNameResolver(options.AvaloniaNameGeneratorClassFieldModifier),
generator);
}
}

4
src/tools/Avalonia.Generators/Domain/INameGenerator.cs → src/tools/Avalonia.Generators/NameGenerator/INameGenerator.cs

@ -1,11 +1,11 @@
using System.Collections.Generic;
using Microsoft.CodeAnalysis;
namespace Avalonia.Generators.Domain;
namespace Avalonia.Generators.NameGenerator;
internal interface INameGenerator
{
IReadOnlyList<GeneratedPartialClass> GenerateNameReferences(IEnumerable<AdditionalText> additionalFiles);
}
internal record GeneratedPartialClass(string FileName, string Content);
internal record GeneratedPartialClass(string FileName, string Content);

8
src/tools/Avalonia.Generators/Generator/InitializeComponentCodeGenerator.cs → src/tools/Avalonia.Generators/NameGenerator/InitializeComponentCodeGenerator.cs

@ -1,10 +1,8 @@
using System.Collections.Generic;
using System.Xml.Linq;
using Avalonia.Generators.Domain;
using Avalonia.Generators.Common.Domain;
using XamlX.TypeSystem;
namespace Avalonia.Generators.Generator;
namespace Avalonia.Generators.NameGenerator;
internal class InitializeComponentCodeGenerator: ICodeGenerator
{
@ -82,4 +80,4 @@ namespace {nameSpace}
return isWindow;
}
}
}

6
src/tools/Avalonia.Generators/Generator/OnlyPropertiesCodeGenerator.cs → src/tools/Avalonia.Generators/NameGenerator/OnlyPropertiesCodeGenerator.cs

@ -1,9 +1,9 @@
using System.Collections.Generic;
using System.Linq;
using Avalonia.Generators.Domain;
using Avalonia.Generators.Common.Domain;
using XamlX.TypeSystem;
namespace Avalonia.Generators.Generator;
namespace Avalonia.Generators.NameGenerator;
internal class OnlyPropertiesCodeGenerator : ICodeGenerator
{
@ -28,4 +28,4 @@ namespace {nameSpace}
}}
";
}
}
}

21
src/tools/Avalonia.Generators/NameGenerator/Options.cs

@ -0,0 +1,21 @@
namespace Avalonia.Generators.NameGenerator;
internal enum Options
{
Public = 0,
Private = 1,
Internal = 2,
Protected = 3,
}
internal enum Behavior
{
OnlyProperties = 0,
InitializeComponent = 1,
}
internal enum ViewFileNamingStrategy
{
ClassName = 0,
NamespaceAndClassName = 1,
}

4
tests/Avalonia.Generators.Tests/GlobPatternTests.cs

@ -1,4 +1,4 @@
using Avalonia.Generators.Generator;
using Avalonia.Generators.Common;
using Xunit;
namespace Avalonia.Generators.Tests;
@ -28,4 +28,4 @@ public class GlobPatternTests
{
Assert.Equal(matches, new GlobPatternGroup(patterns).Matches(value));
}
}
}

5
tests/Avalonia.Generators.Tests/InitializeComponent/InitializeComponentTests.cs

@ -1,6 +1,7 @@
using System.Threading.Tasks;
using Avalonia.Generators.Common;
using Avalonia.Generators.Compiler;
using Avalonia.Generators.Generator;
using Avalonia.Generators.NameGenerator;
using Avalonia.Generators.Tests.InitializeComponent.GeneratedInitializeComponent;
using Avalonia.Generators.Tests.OnlyProperties.GeneratedCode;
using Avalonia.Generators.Tests.Views;
@ -59,4 +60,4 @@ public class InitializeComponentTests
CSharpSyntaxTree.ParseText(code);
Assert.Equal(expected.Replace("\r", string.Empty), code);
}
}
}

5
tests/Avalonia.Generators.Tests/OnlyProperties/OnlyPropertiesTests.cs

@ -1,6 +1,7 @@
using System.Threading.Tasks;
using Avalonia.Generators.Common;
using Avalonia.Generators.Compiler;
using Avalonia.Generators.Generator;
using Avalonia.Generators.NameGenerator;
using Avalonia.Generators.Tests.OnlyProperties.GeneratedCode;
using Avalonia.Generators.Tests.Views;
using Microsoft.CodeAnalysis.CSharp;
@ -48,4 +49,4 @@ public class OnlyPropertiesTests
CSharpSyntaxTree.ParseText(code);
Assert.Equal(expected.Replace("\r", string.Empty), code);
}
}
}

4
tests/Avalonia.Generators.Tests/XamlXClassResolverTests.cs

@ -1,6 +1,6 @@
using System.Threading.Tasks;
using Avalonia.Generators.Common;
using Avalonia.Generators.Compiler;
using Avalonia.Generators.Generator;
using Avalonia.Generators.Tests.Views;
using Xunit;
@ -37,4 +37,4 @@ public class XamlXClassResolverTests
Assert.Equal(className, resolvedClass.ClassName);
Assert.Equal(nameSpace, resolvedClass.Namespace);
}
}
}

6
tests/Avalonia.Generators.Tests/XamlXNameResolverTests.cs

@ -1,9 +1,9 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Generators.Common;
using Avalonia.Generators.Common.Domain;
using Avalonia.Generators.Compiler;
using Avalonia.Generators.Domain;
using Avalonia.Generators.Generator;
using Avalonia.ReactiveUI;
using Avalonia.Generators.Tests.Views;
using Xunit;
@ -138,4 +138,4 @@ public class XamlXNameResolverTests
var nameResolver = new XamlXNameResolver();
return nameResolver.ResolveNames(classInfo.Xaml);
}
}
}

Loading…
Cancel
Save