Browse Source

feature: Add AvaloniaNameGeneratorFilterByPath option (#32)

* feature: Add AvaloniaNameGeneratorFilterByPath option
* Extract common interface, introduce pattern groups
pull/10407/head
Artyom V. Gorchakov 6 years ago
committed by GitHub
parent
commit
5917bc35de
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      src/Avalonia.NameGenerator.Sandbox/Views/SignUpView.xaml.cs
  2. 32
      src/Avalonia.NameGenerator.Tests/GlobPatternTests.cs
  3. 1
      src/Avalonia.NameGenerator/AvaloniaNameSourceGenerator.cs
  4. 7
      src/Avalonia.NameGenerator/Domain/IGlobPattern.cs
  5. 2
      src/Avalonia.NameGenerator/Generator.props
  6. 9
      src/Avalonia.NameGenerator/Generator/AvaloniaNameGenerator.cs
  7. 19
      src/Avalonia.NameGenerator/Generator/GlobPattern.cs
  8. 18
      src/Avalonia.NameGenerator/Generator/GlobPatternGroup.cs
  9. 15
      src/Avalonia.NameGenerator/GeneratorOptions.cs

3
src/Avalonia.NameGenerator.Sandbox/Views/SignUpView.xaml.cs

@ -1,7 +1,6 @@
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Avalonia.NameGenerator.Sandbox.Views
{
/// <summary>
@ -16,7 +15,7 @@ namespace Avalonia.NameGenerator.Sandbox.Views
public SignUpView()
{
AvaloniaXamlLoader.Load(this);
UserNameTextBox.Text = "Joseph!";
UserNameValidation.Text = "User name is valid.";
PasswordTextBox.Text = "qwerty";

32
src/Avalonia.NameGenerator.Tests/GlobPatternTests.cs

@ -0,0 +1,32 @@
using Avalonia.NameGenerator.Generator;
using Xunit;
namespace Avalonia.NameGenerator.Tests
{
public class GlobPatternTests
{
[Theory]
[InlineData("*", "anything", true)]
[InlineData("", "anything", false)]
[InlineData("Views/*", "Views/SignUpView.xaml", true)]
[InlineData("Views/*", "Extensions/SignUpView.xaml", false)]
[InlineData("*SignUpView*", "Extensions/SignUpView.xaml", true)]
[InlineData("*SignUpView.paml", "Extensions/SignUpView.xaml", false)]
[InlineData("*.xaml", "Extensions/SignUpView.xaml", true)]
public void Should_Match_Glob_Expressions(string pattern, string value, bool matches)
{
Assert.Equal(matches, new GlobPattern(pattern).Matches(value));
}
[Theory]
[InlineData("Views/SignUpView.xaml", true, new[] { "*.xaml", "Views/*" })]
[InlineData("Views/SignUpView.paml", false, new[] { "*.xaml", "Views/*" })]
[InlineData("Extensions/SignUpView.paml", false, new[] { "*.xaml", "Views/*" })]
[InlineData("anything", true, new[] { "*", "*" })]
[InlineData("anything", false, new[] { "", "" })]
public void Should_Match_Glob_Pattern_Groups(string value, bool matches, string[] patterns)
{
Assert.Equal(matches, new GlobPatternGroup(patterns).Matches(value));
}
}
}

1
src/Avalonia.NameGenerator/AvaloniaNameSourceGenerator.cs

@ -42,6 +42,7 @@ namespace Avalonia.NameGenerator
var types = new RoslynTypeSystem((CSharpCompilation)context.Compilation);
var compiler = MiniCompiler.CreateDefault(types, MiniCompiler.AvaloniaXmlnsDefinitionAttribute);
return new AvaloniaNameGenerator(
new GlobPatternGroup(options.AvaloniaNameGeneratorFilterByPath),
new XamlXViewResolver(types, compiler, true, type => ReportInvalidType(context, type)),
new XamlXNameResolver(defaultFieldModifier),
generator);

7
src/Avalonia.NameGenerator/Domain/IGlobPattern.cs

@ -0,0 +1,7 @@
namespace Avalonia.NameGenerator.Domain
{
public interface IGlobPattern
{
bool Matches(string str);
}
}

2
src/Avalonia.NameGenerator/Generator.props

@ -2,11 +2,13 @@
<PropertyGroup>
<AvaloniaNameGeneratorBehavior Condition="'$(AvaloniaNameGeneratorBehavior)' == ''">OnlyProperties</AvaloniaNameGeneratorBehavior>
<AvaloniaNameGeneratorDefaultFieldModifier Condition="'$(AvaloniaNameGeneratorDefaultFieldModifier)' == ''">internal</AvaloniaNameGeneratorDefaultFieldModifier>
<AvaloniaNameGeneratorFilterByPath Condition="'$(AvaloniaNameGeneratorFilterByPath)' == ''">*</AvaloniaNameGeneratorFilterByPath>
</PropertyGroup>
<ItemGroup>
<CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="SourceItemGroup"/>
<CompilerVisibleProperty Include="AvaloniaNameGeneratorBehavior" />
<CompilerVisibleProperty Include="AvaloniaNameGeneratorDefaultFieldModifier" />
<CompilerVisibleProperty Include="AvaloniaNameGeneratorFilterByPath" />
</ItemGroup>
<Target Name="_InjectAdditionalFiles" BeforeTargets="GenerateMSBuildEditorConfigFileShouldRun">
<ItemGroup>

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

@ -7,12 +7,18 @@ namespace Avalonia.NameGenerator.Generator
{
internal class AvaloniaNameGenerator : INameGenerator
{
private readonly IGlobPattern _pathPattern;
private readonly IViewResolver _classes;
private readonly INameResolver _names;
private readonly ICodeGenerator _code;
public AvaloniaNameGenerator(IViewResolver classes, INameResolver names, ICodeGenerator code)
public AvaloniaNameGenerator(
IGlobPattern pathPattern,
IViewResolver classes,
INameResolver names,
ICodeGenerator code)
{
_pathPattern = pathPattern;
_classes = classes;
_names = names;
_code = code;
@ -22,6 +28,7 @@ namespace Avalonia.NameGenerator.Generator
{
var resolveViewsQuery =
from file in additionalFiles
where _pathPattern.Matches(file.Path)
where file.Path.EndsWith(".xaml") ||
file.Path.EndsWith(".paml") ||
file.Path.EndsWith(".axaml")

19
src/Avalonia.NameGenerator/Generator/GlobPattern.cs

@ -0,0 +1,19 @@
using System.Text.RegularExpressions;
using Avalonia.NameGenerator.Domain;
namespace Avalonia.NameGenerator.Generator
{
public class GlobPattern : IGlobPattern
{
private const RegexOptions GlobOptions = RegexOptions.IgnoreCase | RegexOptions.Singleline;
private readonly Regex _regex;
public GlobPattern(string pattern)
{
var expression = "^" + Regex.Escape(pattern).Replace(@"\*", ".*").Replace(@"\?", ".") + "$";
_regex = new Regex(expression, GlobOptions);
}
public bool Matches(string str) => _regex.IsMatch(str);
}
}

18
src/Avalonia.NameGenerator/Generator/GlobPatternGroup.cs

@ -0,0 +1,18 @@
using System.Collections.Generic;
using System.Linq;
using Avalonia.NameGenerator.Domain;
namespace Avalonia.NameGenerator.Generator
{
public class GlobPatternGroup : IGlobPattern
{
private readonly GlobPattern[] _patterns;
public GlobPatternGroup(IEnumerable<string> patterns) =>
_patterns = patterns
.Select(pattern => new GlobPattern(pattern))
.ToArray();
public bool Matches(string str) => _patterns.All(pattern => pattern.Matches(str));
}
}

15
src/Avalonia.NameGenerator/GeneratorOptions.cs

@ -7,6 +7,7 @@ namespace Avalonia.NameGenerator
{
AvaloniaNameGeneratorBehavior = 0,
AvaloniaNameGeneratorDefaultFieldModifier = 1,
AvaloniaNameGeneratorFilterByPath = 2,
}
public enum DefaultFieldModifier
@ -58,5 +59,19 @@ namespace Avalonia.NameGenerator
return modifier;
}
}
public string[] AvaloniaNameGeneratorFilterByPath
{
get
{
var propertyValue = _context.GetMSBuildProperty(
nameof(BuildProperties.AvaloniaNameGeneratorFilterByPath),
"*");
if (propertyValue.Contains(";"))
return propertyValue.Split(';');
return new[] {propertyValue};
}
}
}
}
Loading…
Cancel
Save