diff --git a/src/Avalonia.NameGenerator.Tests/GlobPatternTests.cs b/src/Avalonia.NameGenerator.Tests/GlobPatternTests.cs index b21e659f30..68ee4267c0 100644 --- a/src/Avalonia.NameGenerator.Tests/GlobPatternTests.cs +++ b/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[] { "", "" })] diff --git a/src/Avalonia.NameGenerator.Tests/XamlXClassResolverTests.cs b/src/Avalonia.NameGenerator.Tests/XamlXClassResolverTests.cs index 510eb62a8a..a0d9ec4459 100644 --- a/src/Avalonia.NameGenerator.Tests/XamlXClassResolverTests.cs +++ b/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); } } } \ No newline at end of file diff --git a/src/Avalonia.NameGenerator/AvaloniaNameSourceGenerator.cs b/src/Avalonia.NameGenerator/AvaloniaNameSourceGenerator.cs index 81a54ef412..e9decf6c71 100644 --- a/src/Avalonia.NameGenerator/AvaloniaNameSourceGenerator.cs +++ b/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); diff --git a/src/Avalonia.NameGenerator/Domain/IViewResolver.cs b/src/Avalonia.NameGenerator/Domain/IViewResolver.cs index 11492c880f..9d619e759c 100644 --- a/src/Avalonia.NameGenerator/Domain/IViewResolver.cs +++ b/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; } } diff --git a/src/Avalonia.NameGenerator/Generator.props b/src/Avalonia.NameGenerator/Generator.props index d853dedc0d..91883faf5c 100644 --- a/src/Avalonia.NameGenerator/Generator.props +++ b/src/Avalonia.NameGenerator/Generator.props @@ -3,12 +3,14 @@ OnlyProperties internal * + * + diff --git a/src/Avalonia.NameGenerator/Generator/AvaloniaNameGenerator.cs b/src/Avalonia.NameGenerator/Generator/AvaloniaNameGenerator.cs index aaa3955c29..1eceaf33f8 100644 --- a/src/Avalonia.NameGenerator/Generator/AvaloniaNameGenerator.cs +++ b/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 GenerateNameReferences(IEnumerable 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); diff --git a/src/Avalonia.NameGenerator/Generator/GlobPatternGroup.cs b/src/Avalonia.NameGenerator/Generator/GlobPatternGroup.cs index dedc966435..c3d5755166 100644 --- a/src/Avalonia.NameGenerator/Generator/GlobPatternGroup.cs +++ b/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)); } } \ No newline at end of file diff --git a/src/Avalonia.NameGenerator/GeneratorOptions.cs b/src/Avalonia.NameGenerator/GeneratorOptions.cs index 9966905aef..dd4d8834f8 100644 --- a/src/Avalonia.NameGenerator/GeneratorOptions.cs +++ b/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}; + } + } } } \ No newline at end of file