Browse Source

feature: Add AvaloniaNameGeneratorFilterByNamespace

pull/10407/head
artyom 5 years ago
parent
commit
b00b699e0c
  1. 4
      src/Avalonia.NameGenerator.Tests/GlobPatternTests.cs
  2. 2
      src/Avalonia.NameGenerator.Tests/XamlXClassResolverTests.cs
  3. 1
      src/Avalonia.NameGenerator/AvaloniaNameSourceGenerator.cs
  4. 4
      src/Avalonia.NameGenerator/Domain/IViewResolver.cs
  5. 2
      src/Avalonia.NameGenerator/Generator.props
  6. 23
      src/Avalonia.NameGenerator/Generator/AvaloniaNameGenerator.cs
  7. 2
      src/Avalonia.NameGenerator/Generator/GlobPatternGroup.cs
  8. 15
      src/Avalonia.NameGenerator/GeneratorOptions.cs

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

@ -19,8 +19,8 @@ namespace Avalonia.NameGenerator.Tests
}
[Theory]
[InlineData("Views/SignUpView.xaml", true, new[] { "*.xaml", "Views/*" })]
[InlineData("Views/SignUpView.paml", false, new[] { "*.xaml", "Views/*" })]
[InlineData("Views/SignUpView.xaml", true, new[] { "*.xaml", "Extensions/*" })]
[InlineData("Extensions/SignUpView.paml", true, new[] { "*.xaml", "Extensions/*" })]
[InlineData("Extensions/SignUpView.paml", false, new[] { "*.xaml", "Views/*" })]
[InlineData("anything", true, new[] { "*", "*" })]
[InlineData("anything", false, new[] { "", "" })]

2
src/Avalonia.NameGenerator.Tests/XamlXClassResolverTests.cs

@ -33,7 +33,7 @@ namespace Avalonia.NameGenerator.Tests
var resolvedClass = resolver.ResolveView(xaml);
Assert.Equal(className, resolvedClass.ClassName);
Assert.Equal(nameSpace, resolvedClass.NameSpace);
Assert.Equal(nameSpace, resolvedClass.Namespace);
}
}
}

1
src/Avalonia.NameGenerator/AvaloniaNameSourceGenerator.cs

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

4
src/Avalonia.NameGenerator/Domain/IViewResolver.cs

@ -11,12 +11,12 @@ namespace Avalonia.NameGenerator.Domain
{
public XamlDocument Xaml { get; }
public string ClassName { get; }
public string NameSpace { get; }
public string Namespace { get; }
public ResolvedView(string className, string nameSpace, XamlDocument xaml)
{
ClassName = className;
NameSpace = nameSpace;
Namespace = nameSpace;
Xaml = xaml;
}
}

2
src/Avalonia.NameGenerator/Generator.props

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

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

@ -8,17 +8,20 @@ namespace Avalonia.NameGenerator.Generator
internal class AvaloniaNameGenerator : INameGenerator
{
private readonly IGlobPattern _pathPattern;
private readonly IGlobPattern _namespacePattern;
private readonly IViewResolver _classes;
private readonly INameResolver _names;
private readonly ICodeGenerator _code;
public AvaloniaNameGenerator(
IGlobPattern pathPattern,
IGlobPattern namespacePattern,
IViewResolver classes,
INameResolver names,
ICodeGenerator code)
{
_pathPattern = pathPattern;
_namespacePattern = namespacePattern;
_classes = classes;
_names = names;
_code = code;
@ -26,21 +29,21 @@ namespace Avalonia.NameGenerator.Generator
public IReadOnlyList<GeneratedPartialClass> GenerateNameReferences(IEnumerable<AdditionalText> additionalFiles)
{
var resolveViewsQuery =
var resolveViews =
from file in additionalFiles
where _pathPattern.Matches(file.Path)
where file.Path.EndsWith(".xaml") ||
file.Path.EndsWith(".paml") ||
file.Path.EndsWith(".axaml")
where (file.Path.EndsWith(".xaml") ||
file.Path.EndsWith(".paml") ||
file.Path.EndsWith(".axaml")) &&
_pathPattern.Matches(file.Path)
let xaml = file.GetText()!.ToString()
let type = _classes.ResolveView(xaml)
where type != null
select type;
let view = _classes.ResolveView(xaml)
where view != null && _namespacePattern.Matches(view.Namespace)
select view;
var query =
from view in resolveViewsQuery
from view in resolveViews
let names = _names.ResolveNames(view.Xaml)
let code = _code.GenerateCode(view.ClassName, view.NameSpace, names)
let code = _code.GenerateCode(view.ClassName, view.Namespace, names)
let fileName = $"{view.ClassName}.g.cs"
select new GeneratedPartialClass(fileName, code);

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

@ -13,6 +13,6 @@ namespace Avalonia.NameGenerator.Generator
.Select(pattern => new GlobPattern(pattern))
.ToArray();
public bool Matches(string str) => _patterns.All(pattern => pattern.Matches(str));
public bool Matches(string str) => _patterns.Any(pattern => pattern.Matches(str));
}
}

15
src/Avalonia.NameGenerator/GeneratorOptions.cs

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