Skip to content

Commit 2826db4

Browse files
authored
fix field order attribute (#23)
* fix field order attribute * update version * fix .NET project * fix out of range when reorder fields.
1 parent 29485b6 commit 2826db4

File tree

8 files changed

+31
-30
lines changed

8 files changed

+31
-30
lines changed

Assets/Samples/TestAnySerialize.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,11 @@ public override string ToString()
7676
[Serializable]
7777
public class B<T> : IB<T>
7878
{
79+
[field: AnySerializeFieldOrder(3)]
80+
public float ReadOnlyProperty { get; }
7981
public readonly T ReadOnlyTValue;
8082
public T[] TArray;
8183
public T[][] TArrayArray;
82-
public float ReadOnlyProperty { get; }
8384

8485
public override string ToString()
8586
{

Assets/Tests/AnySerialize/TestFieldTypeSearcher.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public void SetUp()
2020

2121
FieldTypeSearcher CreateSearcher(string fieldDeclaringTypeParameterName, string parameterName, GenericInstanceType genericType)
2222
{
23-
return new FieldTypeSearcher(_logger, _module, fieldDeclaringTypeParameterName, genericType, new GenericParameter(parameterName, genericType.Resolve()));
23+
return new FieldTypeSearcher(_logger, fieldDeclaringTypeParameterName, genericType, new GenericParameter(parameterName, genericType.Resolve()));
2424
}
2525

2626
[Test]

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,15 @@ public class FieldTypeSearcher : ITypeSearcher<AnyFieldTypeAttribute>
1111

1212
public FieldTypeSearcher(
1313
ILPostProcessorLogger logger,
14-
ModuleDefinition module,
1514
[Inject(typeof(AttributeLabel<>))] string fieldDeclaringTypeParameterName,
1615
[Inject(typeof(GenericLabel<>))] GenericInstanceType genericType,
1716
[Inject(typeof(GenericLabel<>))] GenericParameter parameter
1817
)
1918
{
2019
var fieldIndex = -1;
2120
var searcherFieldCount = 0;
22-
var genericTypeDefinition = genericType.Resolve();
23-
foreach (var genericParameter in genericTypeDefinition.GenericParameters)
21+
var genericTypeDefinition = genericType.Resolve()!;
22+
foreach (var genericParameter in genericTypeDefinition.GenericParameters!)
2423
{
2524
if (genericParameter.Name == parameter.Name)
2625
fieldIndex = searcherFieldCount;
@@ -31,7 +30,10 @@ public FieldTypeSearcher(
3130

3231
var declaringGenericIndex = genericTypeDefinition.GenericParameters.FindIndexOf(parameter => parameter.Name == fieldDeclaringTypeParameterName);
3332
var declaringType = genericType.GenericArguments![declaringGenericIndex]!;
34-
var fields = declaringType.Resolve()!.Fields.Where(field => !field.IsStatic).Select(field => field.FieldType).ToArray();
33+
var fields = AnyClassUtility.Reorder(
34+
declaringType.Resolve()!.Fields.Where(field => !field.IsStatic),
35+
field => (int?)field.GetAttributesOf<AnySerializeFieldOrderAttribute>().SingleOrDefault()?.ConstructorArguments[0].Value
36+
).Select(field => field.FieldType).ToArray();
3537
if (searcherFieldCount != fields.Length || fieldIndex < 0) return;
3638

3739
_fieldType = !fields[fieldIndex]!.IsConcreteType() && declaringType is GenericInstanceType genericInstanceType

Packages/com.quabug.any-serialize/Editor/ReadOnlyAnyClassDrawer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
4545
property.serializedObject.Update();
4646

4747
var classType = property.GetFieldsByPath().Last().field.GetType().GenericTypeArguments[0];
48-
var fields = classType.GetFields(AnyClassUtility.DefaultBindingFlags);
48+
var fields = AnyClassUtility.GetOrderedFields(classType);
4949
var fieldIndex = 0;
5050
var end = property.GetEndProperty(includeInvisible: false);
5151
property.NextVisible(enterChildren: true);
Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Linq;
43
using System.Reflection;
54
using JetBrains.Annotations;
65

@@ -14,33 +13,32 @@ public static class AnyClassUtility
1413
{
1514
public static readonly BindingFlags DefaultBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
1615

16+
[Pure]
17+
public static IReadOnlyList<FieldInfo> GetOrderedFields<T>()
18+
{
19+
return GetOrderedFields(typeof(T));
20+
}
21+
1722
[Pure, ItemNotNull]
18-
public static T[] Reorder<T>(this T[] array, IEnumerable<int> newIndices)
23+
public static IReadOnlyList<T> Reorder<T>([ItemNotNull] IEnumerable<T> items, Func<T, int?> getOrder)
1924
{
20-
var newArray = new T[array.Length];
21-
var index = 0;
22-
foreach (var newIndex in newIndices)
25+
var orderedItems = new List<T>();
26+
var sortedCache = new SortedList<int, T>();
27+
foreach (var item in items)
2328
{
24-
if (array[index] == null) throw new ArgumentException($"element of {nameof(array)} cannot be null", nameof(array));
25-
newArray[newIndex] = array[index];
26-
index++;
29+
var order = getOrder(item);
30+
if (order.HasValue) sortedCache.Add(order.Value, item);
31+
else orderedItems.Add(item);
2732
}
28-
if (index != array.Length)
29-
throw new ArgumentException($"{nameof(array)}({array.Length}) and {nameof(newIndices)}({index}) must have same count of elements", nameof(newIndices));
30-
return array;
33+
foreach (var (order, item) in sortedCache) orderedItems.Insert(Math.Min(order, orderedItems.Count), item);
34+
return orderedItems;
3135
}
3236

3337
[Pure]
34-
public static FieldInfo[] GetOrderedFields<T>()
38+
public static IReadOnlyList<FieldInfo> GetOrderedFields(Type type)
3539
{
36-
var fields = typeof(T).GetFields(DefaultBindingFlags);
37-
var newIndices = fields
38-
.Select((f, i) => (index: i, order: f.GetCustomAttribute<AnySerializeFieldOrderAttribute>()?.Order ?? i))
39-
.OrderBy(t => t.order)
40-
.Select(t => t.index)
41-
;
42-
fields = fields.Reorder(newIndices);
43-
return fields;
40+
var fields = type.GetFields(DefaultBindingFlags);
41+
return Reorder(fields, field => field.GetCustomAttribute<AnySerializeFieldOrderAttribute>()?.Order);
4442
}
4543
}
4644
}

Packages/com.quabug.any-serialize/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "com.quabug.any-serialize",
33
"description": "Generate serializable code of any properties for Unity3D serializer",
4-
"version": "0.2.0",
4+
"version": "0.2.1",
55
"unity": "2021.3",
66
"displayName": "AnySerialize",
77
"type": "library",

Standard/AnyProcessor/AnyProcessor.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard2.0</TargetFramework>
4+
<TargetFramework>netstandard2.1</TargetFramework>
55
<LangVersion>9</LangVersion>
66
<Nullable>enable</Nullable>
77
</PropertyGroup>

Standard/AnySerialize/AnySerialize.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard2.0</TargetFramework>
4+
<TargetFramework>netstandard2.1</TargetFramework>
55
<LangVersion>9</LangVersion>
66
<Nullable>enable</Nullable>
77
</PropertyGroup>

0 commit comments

Comments
 (0)