Browse Source

Merge branch 'pr/574'

pull/582/head
Steven Kirk 10 years ago
parent
commit
f35b5cb029
  1. 37
      src/Markup/Avalonia.Markup.Xaml/Context/AvaloniaNamespaceRegistry.cs
  2. 1
      tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj
  3. 26
      tests/Avalonia.Markup.Xaml.UnitTests/Context/AvaloniaNamespaceRegistryTest.cs

37
src/Markup/Avalonia.Markup.Xaml/Context/AvaloniaNamespaceRegistry.cs

@ -68,10 +68,14 @@ namespace Avalonia.Markup.Xaml.Context
} }
else else
{ {
result = _clrNamespaces.FirstOrDefault(x => x.Name == name); var nsAndAssembly = ParseClrNameSpace(name);
result = _clrNamespaces.FirstOrDefault(x =>
x.Name == nsAndAssembly.Item1 &&
x.Assembly.GetName().Name == nsAndAssembly.Item2);
if (result == null) if (result == null)
{ {
var clr = CreateClrNamespace(name); var clr = CreateClrNamespace(name);
_clrNamespaces.Add(clr); _clrNamespaces.Add(clr);
result = clr; result = clr;
@ -105,29 +109,34 @@ namespace Avalonia.Markup.Xaml.Context
private static ClrNamespace CreateClrNamespace(string formattedClrString) private static ClrNamespace CreateClrNamespace(string formattedClrString)
{ {
var startOfNamespace = formattedClrString.IndexOf(":", StringComparison.Ordinal) + 1; var nsAndAssembly = ParseClrNameSpace(formattedClrString);
var endOfNamespace = formattedClrString.IndexOf(";", startOfNamespace, StringComparison.Ordinal); var assembly = GetAssembly(nsAndAssembly.Item2);
return new ClrNamespace(assembly, nsAndAssembly.Item1);
}
private static Tuple<string, string> ParseClrNameSpace(string clrNamespace)
{
var startOfNamespace = clrNamespace.IndexOf(":", StringComparison.Ordinal) + 1;
var endOfNamespace = clrNamespace.IndexOf(";", startOfNamespace, StringComparison.Ordinal);
if (endOfNamespace < 0) if (endOfNamespace < 0)
{ {
endOfNamespace = formattedClrString.Length - startOfNamespace; endOfNamespace = clrNamespace.Length - startOfNamespace;
} }
var ns = formattedClrString.Substring(startOfNamespace, endOfNamespace - startOfNamespace); var ns = clrNamespace.Substring(startOfNamespace, endOfNamespace - startOfNamespace);
var remainingPartStart = startOfNamespace + ns.Length + 1; var remainingPartStart = startOfNamespace + ns.Length + 1;
var remainingPartLenght = formattedClrString.Length - remainingPartStart; var remainingPartLenght = clrNamespace.Length - remainingPartStart;
var assemblyPart = formattedClrString.Substring(remainingPartStart, remainingPartLenght); var assemblyPart = clrNamespace.Substring(remainingPartStart, remainingPartLenght);
var assembly = GetAssembly(assemblyPart);
return new ClrNamespace(assembly, ns); return Tuple.Create(ns, assemblyPart.Dicotomize('=').Item2);
} }
private static Assembly GetAssembly(string assemblyPart) private static Assembly GetAssembly(string assemblyName)
{ {
var dicotomize = assemblyPart.Dicotomize('='); return Assembly.Load(new AssemblyName(assemblyName));
return Assembly.Load(new AssemblyName(dicotomize.Item2));
} }
private void ScanAssemblies(IEnumerable<Assembly> assemblies) private void ScanAssemblies(IEnumerable<Assembly> assemblies)

1
tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj

@ -92,6 +92,7 @@
<Otherwise /> <Otherwise />
</Choose> </Choose>
<ItemGroup> <ItemGroup>
<Compile Include="Context\AvaloniaNamespaceRegistryTest.cs" />
<Compile Include="Data\BindingTests_Source.cs" /> <Compile Include="Data\BindingTests_Source.cs" />
<Compile Include="Data\BindingTests_ElementName.cs" /> <Compile Include="Data\BindingTests_ElementName.cs" />
<Compile Include="Data\BindingTests_Validation.cs" /> <Compile Include="Data\BindingTests_Validation.cs" />

26
tests/Avalonia.Markup.Xaml.UnitTests/Context/AvaloniaNamespaceRegistryTest.cs

@ -0,0 +1,26 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Avalonia.Markup.Xaml.Context;
using Xunit;
namespace Avalonia.Markup.Xaml.UnitTests.Context
{
public class AvaloniaNamespaceRegistryTest
{
[Fact]
public void Should_Return_Same_ClrNameSpace()
{
string name = "clr-namespace:Avalonia.Markup.Xaml.UnitTests.Context;assembly=Avalonia.Markup.Xaml.UnitTests";
var target = new AvaloniaNamespaceRegistry();
var ns1 = target.GetNamespace(name);
var ns2 = target.GetNamespace(name);
//AvaloniaNamespaceRegistry should not create new CreateClrNamespace
//for the same namespace
Assert.Same(ns1, ns2);
}
}
}
Loading…
Cancel
Save