Skip to content

Commit

Permalink
Merge 9a288db into a2fa09b
Browse files Browse the repository at this point in the history
  • Loading branch information
Mike-EEE authored Dec 2, 2019
2 parents a2fa09b + 9a288db commit 0150ddb
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,15 @@
using System.Collections.Immutable;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;

namespace ExtendedXmlSerializer.ContentModel.Collections
{
sealed class MappedArraySerializers : IContents
{
readonly IContents _contents;

public MappedArraySerializers(IContents contents)
{
_contents = contents;
}
public MappedArraySerializers(IContents contents) => _contents = contents;

public ISerializer Get(TypeInfo parameter)
{
Expand Down Expand Up @@ -53,25 +50,12 @@ public void Write(IFormatWriter writer, Array instance)
}
}

sealed class SizeOf<T> : ISource<int>
sealed class SizeOf<T> : DelegatedSource<int>
{
[UsedImplicitly]
public static SizeOf<T> Default { get; } = new SizeOf<T>();

SizeOf() {}

public int Get()
{
var dm = new DynamicMethod("func", typeof(int), Type.EmptyTypes);

ILGenerator il = dm.GetILGenerator();
il.Emit(OpCodes.Sizeof, typeof(T));
il.Emit(OpCodes.Ret);

var factory = (Func<int>)dm.CreateDelegate(typeof(Func<int>));
var result = factory();
return result;
}
SizeOf() : base(Unsafe.SizeOf<T>) {}
}

sealed class Sizes : StructureCache<TypeInfo, int>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,20 @@
using System.Reflection;
using ExtendedXmlSerializer.Core.Specifications;
using ExtendedXmlSerializer.ReflectionModel;

namespace ExtendedXmlSerializer.ContentModel.Collections
{
sealed class MappedArraySpecification : ISpecification<TypeInfo>
{
public static MappedArraySpecification Default { get; } = new MappedArraySpecification();

readonly ISpecification<TypeInfo> _specification;

public MappedArraySpecification() : this(IsValueTypeSpecification.Default) {}

public MappedArraySpecification(ISpecification<TypeInfo> specification)
{
_specification = specification;
}

public bool IsSatisfiedBy(TypeInfo parameter) => parameter.GetArrayRank() > 1 &&
_specification.IsSatisfiedBy(parameter.GetElementType());
}
using System.Reflection;
using ExtendedXmlSerializer.Core.Specifications;
using ExtendedXmlSerializer.ReflectionModel;

namespace ExtendedXmlSerializer.ContentModel.Collections
{
sealed class MappedArraySpecification : ISpecification<TypeInfo>
{
public static MappedArraySpecification Default { get; } = new MappedArraySpecification();

readonly ISpecification<TypeInfo> _specification;

public MappedArraySpecification() : this(IsValueTypeSpecification.Default) {}

public MappedArraySpecification(ISpecification<TypeInfo> specification) => _specification = specification;

public bool IsSatisfiedBy(TypeInfo parameter) => parameter.GetArrayRank() > 1 &&
_specification.IsSatisfiedBy(parameter.GetElementType());
}
}
4 changes: 2 additions & 2 deletions src/ExtendedXmlSerializer/ExtendedXmlSerializer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@
<ItemGroup>
<PackageReference Include="JetBrains.Annotations" Version="2019.1.3" PrivateAssets="All" />
<PackageReference Include="LightInject" Version="6.2.0" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta2-19554-01" PrivateAssets="All" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
<PackageReference Include="NReco.LambdaParser" Version="1.0.10" />
<PackageReference Include="Sprache" Version="2.2.0" />
<PackageReference Include="System.Interactive" Version="4.0.0" />
<PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.6.0" />
<PackageReference Include="System.Collections.Immutable" Version="1.6.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.6.0" />
</ItemGroup>
</Project>
32 changes: 28 additions & 4 deletions src/ExtendedXmlSerializer/ExtensionModel/Xml/DefaultMemberOrder.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
using ExtendedXmlSerializer.Core.Sources;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Xml.Serialization;

namespace ExtendedXmlSerializer.ExtensionModel.Xml
{
{
/// <summary>
/// Default order selector that looks for a <see cref="XmlElementAttribute.Order"/> and if not specified, uses the <see cref="MemberInfo.MetadataToken"/>.
/// </summary>
Expand All @@ -14,10 +16,32 @@ public sealed class DefaultMemberOrder : IParameterizedSource<MemberInfo, int>
/// </summary>
public static DefaultMemberOrder Default { get; } = new DefaultMemberOrder();

DefaultMemberOrder() {}
DefaultMemberOrder() : this(DefaultXmlElementAttribute.Default.Get, Members.Default.Get) {}

readonly Func<MemberInfo, XmlElementAttribute> _attribute;
readonly Func<MemberInfo, List<MemberInfo>> _members;

/// <inheritdoc />
public DefaultMemberOrder(Func<MemberInfo, XmlElementAttribute> attribute,
Func<MemberInfo, List<MemberInfo>> members)
{
_attribute = attribute;
_members = members;
}

/// <inheritdoc />
public int Get(MemberInfo parameter)
=> DefaultXmlElementAttribute.Default.Get(parameter)?.Order ?? parameter.MetadataToken;
public int Get(MemberInfo parameter) => _attribute(parameter)?.Order ?? Resolve(parameter);

int Resolve(MemberInfo parameter)
{
try
{
return parameter.MetadataToken;
}
catch (InvalidOperationException) // UWP Throws, because UWP: https://github.com/ExtendedXmlSerializer/home/issues/269#issuecomment-559485714
{
return _members(parameter).IndexOf(parameter);
}
}
}
}
17 changes: 17 additions & 0 deletions src/ExtendedXmlSerializer/ExtensionModel/Xml/Members.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using ExtendedXmlSerializer.Core.Sources;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace ExtendedXmlSerializer.ExtensionModel.Xml
{
sealed class Members : ReferenceCache<Type, List<MemberInfo>>, IParameterizedSource<MemberInfo, List<MemberInfo>>
{
public static Members Default { get; } = new Members();

Members() : base(x => x.GetMembers().ToList()) {}

public List<MemberInfo> Get(MemberInfo parameter) => base.Get(parameter.ReflectedType);
}
}

0 comments on commit 0150ddb

Please sign in to comment.