Skip to content

Commit f3d0fa8

Browse files
authored
compare priority before check type distance (#21)
1 parent d83da2e commit f3d0fa8

File tree

4 files changed

+31
-52
lines changed

4 files changed

+31
-52
lines changed

Packages/com.quabug.any-serialize/CodeGen/ConstraintTypeSearcher.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,21 @@ public ConstraintTypeSearcher(
1616
[Inject(typeof(GenericLabel<>))] GenericParameter parameter
1717
)
1818
{
19-
if (parameter.Constraints.Count != 1)
19+
if (parameter.Constraints!.Count != 1)
2020
throw new ArgumentException($"Must have and only have one constraint of {nameof(parameter)}", nameof(parameter));
21-
var constraint = parameter.Constraints[0].ConstraintType;
21+
var constraint = parameter.Constraints[0]!.ConstraintType;
2222
var constraintType = constraint.FillGenericTypesByReferenceGenericName(genericType);
2323
if (constraintType.IsConcreteType())
2424
{
2525
container = container.CreateChildContainer();
2626
var label = typeof(TargetLabel<>);
27-
container.RegisterInstance(constraintType).AsSelf(label).AsBases(label);
27+
container.RegisterInstance(constraintType)!.AsSelf(label).AsBases(label);
2828
_result = container.Search<SerializeTypeSearcher>();
2929
}
3030
logger.Debug($"[{GetType()}] {parameter.Name}:{constraintType}={_result}");
3131
}
3232

33-
public TypeReference Search()
33+
public TypeReference? Search()
3434
{
3535
return _result;
3636
}

Packages/com.quabug.any-serialize/CodeGen/Extension.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,25 @@ namespace AnySerialize.CodeGen
99
{
1010
public static class Extension
1111
{
12-
public static TypeReference CreateConcreteTypeFrom(this Container container, TypeReference type)
12+
public static TypeReference? CreateConcreteTypeFrom(this Container container, TypeReference type)
1313
{
1414
var def = type.Resolve();
15-
if (def.IsAbstract) return null;
16-
if (def.GetConstructors().FirstOrDefault(ctor => !ctor.HasParameters) == null) return null;
15+
if (def == null || def.IsAbstract || def.GetConstructors()!.FirstOrDefault(ctor => !ctor.HasParameters) == null) return null;
1716
if (type.IsConcreteType()) return type;
1817

19-
if (!(type is GenericInstanceType genericType))
18+
if (type is not GenericInstanceType genericType)
2019
throw new ArgumentException($"{nameof(type)}({type}) must be a {nameof(GenericInstanceType)}", nameof(type));
2120

22-
var anyGenericParameterSearcherAttributeType = type.Module.ImportReference(typeof(IAnyGenericParameterSearcherAttribute));
21+
var anyGenericParameterSearcherAttributeType = type.Module!.ImportReference(typeof(IAnyGenericParameterSearcherAttribute))!;
2322

24-
for (var i = 0; i < genericType.GenericArguments.Count; i++)
23+
for (var i = 0; i < genericType.GenericArguments!.Count; i++)
2524
{
26-
var arg = genericType.GenericArguments[i];
25+
var arg = genericType.GenericArguments[i]!;
2726
if (arg is GenericParameter parameter)
2827
{
2928
if (!parameter.HasCustomAttributes) return null;
30-
var attribute = parameter.CustomAttributes
31-
.FirstOrDefault(attr => attr.AttributeType.IsDerivedFrom(anyGenericParameterSearcherAttributeType))
29+
var attribute = parameter.CustomAttributes!
30+
.FirstOrDefault(attr => attr.AttributeType!.IsDerivedFrom(anyGenericParameterSearcherAttributeType))
3231
;
3332
if (attribute == null) return null;
3433
var genericArgument = container.Search(

Packages/com.quabug.any-serialize/CodeGen/FieldTypeSearcher.cs

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace AnySerialize.CodeGen
77
{
88
public class FieldTypeSearcher : ITypeSearcher<AnyFieldTypeAttribute>
99
{
10-
private readonly TypeReference _fieldType;
10+
private readonly TypeReference? _fieldType;
1111

1212
public FieldTypeSearcher(
1313
ILPostProcessorLogger logger,
@@ -30,38 +30,18 @@ public FieldTypeSearcher(
3030
}
3131

3232
var declaringGenericIndex = genericTypeDefinition.GenericParameters.FindIndexOf(parameter => parameter.Name == fieldDeclaringTypeParameterName);
33-
var declaringType = genericType.GenericArguments[declaringGenericIndex];
34-
//
35-
// #if UNITY_2020
36-
// // HACK: cannot get fields from declaring type on Unity 2020
37-
// var reflectionFields = declaringType.Resolve().ToReflectionType().GetFields(AnyClassUtility.DefaultBindingFlags);
38-
// if (searcherFieldCount != reflectionFields.Length || fieldIndex < 0) return;
39-
//
40-
// var reflectionField = reflectionFields[fieldIndex];
41-
//
42-
// _fieldType = reflectionField.FieldType.IsGenericParameter
43-
// ? new GenericParameter(reflectionField.FieldType.Name, declaringType)
44-
// : module.ImportType(reflectionField.FieldType, logger)
45-
// ;
46-
//
47-
// if (!_fieldType.IsConcreteType() && declaringType is GenericInstanceType genericInstanceType)
48-
// {
49-
// logger.Debug($"[{GetType()}] fill generic type {_fieldType} by {genericInstanceType}");
50-
// _fieldType = _fieldType.FillGenericTypesByReferenceGenericName(genericInstanceType, logger);
51-
// }
52-
// #else
53-
var fields = declaringType.Resolve().Fields.Where(field => !field.IsStatic).Select(field => field.FieldType).ToArray();
33+
var declaringType = genericType.GenericArguments![declaringGenericIndex]!;
34+
var fields = declaringType.Resolve()!.Fields.Where(field => !field.IsStatic).Select(field => field.FieldType).ToArray();
5435
if (searcherFieldCount != fields.Length || fieldIndex < 0) return;
5536

56-
_fieldType = !fields[fieldIndex].IsConcreteType() && declaringType is GenericInstanceType genericInstanceType
57-
? fields[fieldIndex].FillGenericTypesByReferenceGenericName(genericInstanceType)
58-
: fields[fieldIndex]
37+
_fieldType = !fields[fieldIndex]!.IsConcreteType() && declaringType is GenericInstanceType genericInstanceType
38+
? fields[fieldIndex]!.FillGenericTypesByReferenceGenericName(genericInstanceType)
39+
: fields[fieldIndex]!
5940
;
60-
// #endif
6141
logger.Debug($"[{GetType()}] {genericType}: {parameter.Name} = {_fieldType}");
6242
}
6343

64-
public TypeReference Search()
44+
public TypeReference? Search()
6545
{
6646
return _fieldType;
6747
}

Packages/com.quabug.any-serialize/CodeGen/SerializeTypeSearcher.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,23 @@ ILPostProcessorLogger logger
3131
logger.Debug($"[{GetType()}] create search of {_targetType}");
3232
}
3333

34-
public TypeReference Search()
34+
public TypeReference? Search()
3535
{
3636
if (!_targetType.IsGenericInstance || !_targetType.IsConcreteType() || _targetType.GetGenericParametersOrArgumentsCount() != 1)
3737
throw new ArgumentException($"{nameof(_targetType)} must be a concrete generic instance with one and only one arguments.", nameof(_targetType));
3838

3939
_logger.Debug($"[{GetType()}] search {_targetType}");
4040

4141
var propertyType = _targetType.GetGenericParametersOrArguments().First();
42-
TypeReference closestType = null;
43-
TypeReference closestImplementation = null;
42+
TypeReference? closestType = null;
43+
TypeReference? closestImplementation = null;
4444
var closestPriority = int.MaxValue;
45-
foreach (var (type, implementation) in FindTypes(_targetType, ((GenericInstanceType)_targetType).ElementType.GenericParameters[0]))
45+
foreach (var (type, implementation) in FindTypes(_targetType, ((GenericInstanceType)_targetType).ElementType.GenericParameters[0]!))
4646
{
47-
var priorityAttribute = type.Resolve().GetAttributesOf<AnySerializePriorityAttribute>().SingleOrDefault();
48-
var priority = priorityAttribute == null ? 0 : (int)priorityAttribute.ConstructorArguments[0].Value;
47+
var priorityAttribute = type.Resolve()!.GetAttributesOf<AnySerializePriorityAttribute>().SingleOrDefault();
48+
var priority = priorityAttribute == null ? 0 : (int)priorityAttribute.ConstructorArguments![0].Value;
4949
if (priority > closestPriority) continue;
50-
if (!IsCloserImplementation(closestImplementation, implementation, propertyType)) continue;
50+
if (closestPriority == priority && !IsCloserImplementation(closestImplementation, implementation, propertyType)) continue;
5151

5252
var concreteType = _container.CreateConcreteTypeFrom(type);
5353
if (concreteType == null) continue;
@@ -60,18 +60,18 @@ public TypeReference Search()
6060
}
6161
return closestType;
6262

63-
bool IsCloserImplementation(TypeReference previous, TypeReference current, TypeReference target)
63+
bool IsCloserImplementation(TypeReference? previous, TypeReference? current, TypeReference target)
6464
{
6565
if (previous == null || previous.IsGenericParameter) return true;
6666
if (current == null || current.IsGenericParameter) return false;
6767
if (previous.TypeEquals(current)) return true;
6868
if (previous is ArrayType previousArray && current is ArrayType currentArray && target is ArrayType targetArray)
69-
return IsCloserImplementation(previousArray.ElementType, currentArray.ElementType, targetArray.ElementType);
69+
return IsCloserImplementation(previousArray.ElementType, currentArray.ElementType, targetArray.ElementType!);
7070
if (current.IsArray && target.IsArray) return true;
7171

72-
var previousDefinition = previous.Resolve();
73-
var currentDefinition = current.Resolve();
74-
var targetDefinition = target.Resolve();
72+
var previousDefinition = previous.Resolve()!;
73+
var currentDefinition = current.Resolve()!;
74+
var targetDefinition = target.Resolve()!;
7575
var previousDistance = TypeHierarchyDistance(previousDefinition, target) ?? TypeHierarchyDistance(targetDefinition, previous);
7676
var currentDistance = TypeHierarchyDistance(currentDefinition, target) ?? TypeHierarchyDistance(targetDefinition, current);
7777
if (!previousDistance.HasValue && !currentDistance.HasValue) return true;

0 commit comments

Comments
 (0)