Skip to content

Commit adccd74

Browse files
Merge c275c54 into c1f19d6
2 parents c1f19d6 + c275c54 commit adccd74

File tree

11 files changed

+150
-23
lines changed

11 files changed

+150
-23
lines changed

src/ExtendedXmlSerializer/ContentModel/Collections/CollectionSpecification.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace ExtendedXmlSerializer.ContentModel.Collections
66
{
77
class CollectionSpecification : DecoratedSpecification<TypeInfo>
88
{
9-
public CollectionSpecification(ISpecification<TypeInfo> specification)
9+
protected CollectionSpecification(ISpecification<TypeInfo> specification)
1010
: base(IsCollectionTypeSpecification.Default.And(specification)) {}
1111
}
1212
}

src/ExtendedXmlSerializer/ContentModel/Identification/Identities.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,14 @@ namespace ExtendedXmlSerializer.ContentModel.Identification
77
{
88
sealed class Identities : CacheBase<TypeInfo, IIdentity>, IIdentities
99
{
10-
readonly static TypeNameFormatter TypeNameFormatter = TypeNameFormatter.Default;
11-
1210
readonly IIdentityStore _source;
1311
readonly INames _alias;
1412
readonly ITypeFormatter _formatter;
1513
readonly IIdentifiers _identifiers;
1614

1715
[UsedImplicitly]
1816
public Identities(IIdentifiers identifiers, IIdentityStore source, INames names)
19-
: this(source, names, TypeNameFormatter, identifiers) {}
17+
: this(source, names, TypeNameFormatter.Default, identifiers) {}
2018

2119
// ReSharper disable once TooManyDependencies
2220
public Identities(IIdentityStore source, INames alias, ITypeFormatter formatter, IIdentifiers identifiers)

src/ExtendedXmlSerializer/ContentModel/Reflection/GenericNameParser.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,7 @@ sealed class GenericNameParser : Parsing<string>
1010

1111
GenericNameParser() : this(CodeIdentifier.Default, Parse.Char(DefaultClrDelimiters.Default.Generic)) {}
1212

13-
public GenericNameParser(Parser<string> identifier, Parser<char> delimiter) : base(
14-
identifier
15-
.SelectMany(delimiter
16-
.Optional()
17-
.Accept,
18-
(name, _)
19-
=> name)
20-
) {}
13+
public GenericNameParser(Parser<string> identifier, Parser<char> delimiter)
14+
: base(identifier.SelectMany(delimiter.Optional().Accept, (name, _) => name)) {}
2115
}
2216
}

src/ExtendedXmlSerializer/ExtensionModel/DefaultExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public override IEnumerator<ISerializerExtension> GetEnumerator()
5858
yield return new AllowedMembersExtension(_metadata);
5959
yield return new AllowedMemberValuesExtension();
6060
yield return new MemberFormatExtension();
61+
yield return GeneratedListAwareExtension.Default;
6162
yield return ImmutableArrayExtension.Default;
6263
yield return SerializationExtension.Default;
6364
yield return RecursionAwareExtension.Default;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using ExtendedXmlSerializer.ContentModel.Conversion;
2+
using ExtendedXmlSerializer.ContentModel.Reflection;
3+
using ExtendedXmlSerializer.Core.Sources;
4+
using ExtendedXmlSerializer.Core.Specifications;
5+
using System;
6+
using System.Reflection;
7+
8+
namespace ExtendedXmlSerializer.ExtensionModel;
9+
10+
sealed class GeneratedListAwareExtension : ISerializerExtension
11+
{
12+
public static GeneratedListAwareExtension Default { get; } = new();
13+
14+
GeneratedListAwareExtension() {}
15+
16+
public IServiceRepository Get(IServiceRepository parameter)
17+
=> parameter.Decorate<ITypePartResolver, TypePartResolver>();
18+
19+
public void Execute(IServices parameter) {}
20+
21+
sealed class TypePartResolver : ITypePartResolver
22+
{
23+
readonly ITypePartResolver _previous;
24+
readonly ISpecification<TypeInfo> _specification;
25+
readonly IAlteration<Type> _alter;
26+
27+
public TypePartResolver(ITypePartResolver previous)
28+
: this(previous, IsGeneratedList.Default, GeneratedSubstitute.Default) {}
29+
30+
public TypePartResolver(ITypePartResolver previous, ISpecification<TypeInfo> specification,
31+
IAlteration<Type> alter)
32+
{
33+
_previous = previous;
34+
_specification = specification;
35+
_alter = alter;
36+
}
37+
38+
public TypeParts Get(TypeInfo parameter)
39+
{
40+
var type = _specification.IsSatisfiedBy(parameter) ? _alter.Get(parameter) : parameter;
41+
var result = _previous.Get(type);
42+
return result;
43+
}
44+
}
45+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using ExtendedXmlSerializer.Core.Sources;
2+
using ExtendedXmlSerializer.ReflectionModel;
3+
using System;
4+
using System.Collections.Generic;
5+
6+
namespace ExtendedXmlSerializer.ExtensionModel;
7+
8+
sealed class GeneratedSubstitute : IAlteration<Type>
9+
{
10+
public static GeneratedSubstitute Default { get; } = new();
11+
12+
GeneratedSubstitute() : this(typeof(List<>), CollectionItemTypeLocator.Default) {}
13+
14+
readonly Type _definition;
15+
readonly ICollectionItemTypeLocator _locator;
16+
17+
public GeneratedSubstitute(Type definition, ICollectionItemTypeLocator locator)
18+
{
19+
_definition = definition;
20+
_locator = locator;
21+
}
22+
23+
public Type Get(Type parameter)
24+
{
25+
var arguments = _locator.Get(parameter);
26+
var result = _definition.MakeGenericType(arguments);
27+
return result;
28+
}
29+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using ExtendedXmlSerializer.Core.Specifications;
2+
using System.Reflection;
3+
4+
namespace ExtendedXmlSerializer.ExtensionModel;
5+
6+
sealed class IsGeneratedList : DelegatedSpecification<TypeInfo>
7+
{
8+
public static IsGeneratedList Default { get; } = new();
9+
10+
IsGeneratedList()
11+
: base(x => x.FullName != null &&
12+
(x.FullName.StartsWith("<>z__ReadOnlySingleElementList") ||
13+
x.FullName.StartsWith("<>z__ReadOnlyArray"))) {}
14+
}
Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,14 @@
11
using ExtendedXmlSerializer.Core.Specifications;
2-
using System.Collections.Generic;
2+
using ExtendedXmlSerializer.ExtensionModel;
33
using System.Reflection;
44

55
namespace ExtendedXmlSerializer.ReflectionModel
66
{
77
sealed class CollectionAwareConstructorLocator : ListConstructorLocator, IConstructorLocator
88
{
9-
readonly static ISpecification<TypeInfo> Specification = IsInterface.Default.And(IsCollectionType.Instance);
9+
readonly static ISpecification<TypeInfo> Specification
10+
= IsInterface.Default.Or(IsGeneratedList.Default).And(IsCollectionTypeExpandedSpecification.Default);
1011

1112
public CollectionAwareConstructorLocator(IConstructorLocator previous) : base(Specification, previous) {}
12-
13-
sealed class IsCollectionType : AnySpecification<TypeInfo>
14-
{
15-
public static IsCollectionType Instance { get; } = new IsCollectionType();
16-
17-
IsCollectionType() : base(IsCollectionTypeSpecification.Default,
18-
new IsAssignableGenericSpecification(typeof(IReadOnlyCollection<>))) {}
19-
}
2013
}
2114
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using ExtendedXmlSerializer.Core.Specifications;
2+
using System.Collections.Generic;
3+
using System.Reflection;
4+
5+
namespace ExtendedXmlSerializer.ReflectionModel;
6+
7+
sealed class IsCollectionTypeExpandedSpecification : AnySpecification<TypeInfo>
8+
{
9+
public static IsCollectionTypeExpandedSpecification Default { get; } = new();
10+
11+
IsCollectionTypeExpandedSpecification()
12+
: base(IsCollectionTypeSpecification.Default,
13+
new IsAssignableGenericSpecification(typeof(IReadOnlyList<>)),
14+
new IsAssignableGenericSpecification(typeof(IReadOnlyCollection<>))) {}
15+
}

src/ExtendedXmlSerializer/ReflectionModel/IsUnspeakable.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ sealed class IsUnspeakable : DelegatedSpecification<TypeInfo>
1010
{
1111
public static IsUnspeakable Default { get; } = new IsUnspeakable();
1212

13-
IsUnspeakable() : base(x => x.Name.StartsWith("<")) {}
13+
IsUnspeakable() : base(x => x.Name.StartsWith("<") || (x.FullName is not null && x.FullName.StartsWith("<"))) {}
1414
}
1515
}

0 commit comments

Comments
 (0)