Skip to content

Commit

Permalink
nino v2.0.6
Browse files Browse the repository at this point in the history
Nino.Serialization v2.0.6
- [Fix] Fix compilation error for cross project types
  • Loading branch information
JasonXuDeveloper committed Sep 15, 2024
1 parent ffe5ebe commit 4eb8473
Show file tree
Hide file tree
Showing 11 changed files with 119 additions and 65 deletions.
Binary file modified Nino.unitypackage
Binary file not shown.
Binary file modified Nino_Unity/Assets/Test/Nino/Nino.Core.dll
Binary file not shown.
Binary file modified Nino_Unity/Assets/Test/Nino/Nino.Generator.dll
Binary file not shown.
7 changes: 3 additions & 4 deletions src/Nino.Core/Nino.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,16 @@
<LangVersion>9</LangVersion>
<PackageId>Nino.Serialization</PackageId>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2.0.5</Version>
<Version>2.0.6</Version>
<Title>Nino.Serialization</Title>
<Authors>JasonXuDeveloper</Authors>
<Description>High performance and low size binary serialization solution, especially for Unity.</Description>
<Copyright>JasonXuDeveloper</Copyright>
<RepositoryUrl>https://github.com/JasonXuDeveloper/Nino</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>Nino;Serialization;Binary</PackageTags>
<PackageReleaseNotes>Nino.Serialization v2.0.5
- [Fix] Fix complilation error for abstract class
- [Optimisation] Optimise struct performance</PackageReleaseNotes>
<PackageReleaseNotes>Nino.Serialization v2.0.6
- [Fix] Fix complilation error for cross project types</PackageReleaseNotes>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://nino.xgamedev.net/</PackageProjectUrl>
</PropertyGroup>
Expand Down
4 changes: 2 additions & 2 deletions src/Nino.Generator/DeserializerGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ int GetId(string typeFullName)

sb.AppendLine($$"""
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Deserialize(out {{typeFullName}} value, ref Reader reader)
public static void Deserialize(out {{typeFullName}} value, ref Reader reader)
{
""");

Expand Down Expand Up @@ -331,7 +331,7 @@ private static string GeneratePrivateDeserializeImplMethodBody(string typeName,
{
var ret = $$"""
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Deserialize{{typeParam}}(out {{typeName}} value, ref Reader reader) {{genericConstraint}}
public static void Deserialize{{typeParam}}(out {{typeName}} value, ref Reader reader) {{genericConstraint}}
{
reader.Read(out value);
}
Expand Down
60 changes: 34 additions & 26 deletions src/Nino.Generator/EmbedTypeDeserializerGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,10 @@ bool IsTypeParameter(ITypeSymbol ts)

return false;
}

if (s.TypeArguments.Any(IsTypeParameter)) return false;
}

//we dont want IList of unmanaged
var i = ts.AllInterfaces.FirstOrDefault(namedTypeSymbol =>
namedTypeSymbol.Name == "IList" && namedTypeSymbol.TypeArguments.Length == 1);
Expand Down Expand Up @@ -208,7 +209,7 @@ bool IsTypeParameter(ITypeSymbol ts)
if (type is INamedTypeSymbol { TypeArguments.Length: 1 } namedTypeSymbol)
{
var fullName = namedTypeSymbol.TypeArguments[0].ToDisplayString();
GenerateNullableStructMethods(sb, fullName);
GenerateNullableStructMethods(sb, namedTypeSymbol.TypeArguments[0].GetDeserializePrefix(), fullName);
sb.GenerateClassDeserializeMethods(typeFullName);
continue;
}
Expand All @@ -221,7 +222,8 @@ bool IsTypeParameter(ITypeSymbol ts)
{
var type1 = namedTypeSymbol.TypeArguments[0].ToDisplayString();
var type2 = namedTypeSymbol.TypeArguments[1].ToDisplayString();
GenerateKvpStructMethods(sb, type1, type2);
GenerateKvpStructMethods(sb, namedTypeSymbol.TypeArguments[0].GetDeserializePrefix(), type1,
namedTypeSymbol.TypeArguments[1].GetDeserializePrefix(), type2);
sb.GenerateClassDeserializeMethods(typeFullName);
continue;
}
Expand All @@ -247,7 +249,8 @@ bool IsTypeParameter(ITypeSymbol ts)
{
var elemType = ((IArrayTypeSymbol)type).ElementType.ToDisplayString();
if (addedElemType.Add(elemType))
sb.AppendLine(GenerateArrayCollectionSerialization(elemType, " "));
sb.AppendLine(GenerateArrayCollectionSerialization(((IArrayTypeSymbol)type).ElementType.GetDeserializePrefix(),
elemType, " "));
sb.GenerateClassDeserializeMethods(typeFullName);
continue;
}
Expand All @@ -257,15 +260,18 @@ bool IsTypeParameter(ITypeSymbol ts)
{
var elemType = s.TypeArguments[0].ToDisplayString();
if (addedElemType.Add(elemType))
sb.AppendLine(GenerateArrayCollectionSerialization(elemType, " "));
sb.AppendLine(GenerateArrayCollectionSerialization(s.TypeArguments[0].GetDeserializePrefix(), elemType,
" "));
if (type.TypeKind != TypeKind.Interface)
{
sb.AppendLine(GenerateCollectionSerialization(elemType, typeFullName,typeFullName, " "));
sb.AppendLine(GenerateCollectionSerialization(s.TypeArguments[0].GetDeserializePrefix(), elemType,
typeFullName, typeFullName, " "));
}
else
{
var newFullName = $"List<{elemType}>";
sb.AppendLine(GenerateCollectionSerialization(elemType, typeFullName, newFullName, " "));
sb.AppendLine(GenerateCollectionSerialization(s.TypeArguments[0].GetDeserializePrefix(), elemType,
typeFullName, newFullName, " "));
}

sb.GenerateClassDeserializeMethods(typeFullName);
Expand All @@ -284,7 +290,7 @@ bool IsTypeParameter(ITypeSymbol ts)
//replace special characters with _
curNamespace = new string(curNamespace.Select(c => char.IsLetterOrDigit(c) ? c : '_').ToArray());
curNamespace += "Nino";

// generate code
var code = $$"""
// <auto-generated/>
Expand All @@ -308,14 +314,14 @@ public static partial class Deserializer
context.AddSource("NinoDeserializerExtension.Ext.g.cs", code);
}

private static string GenerateArrayCollectionSerialization(string elemType, string indent = "")
private static string GenerateArrayCollectionSerialization(string prefix, string elemType, string indent)
{
var creationDecl = elemType.EndsWith("[]") ?
elemType.Insert(elemType.IndexOf("[]", StringComparison.Ordinal), "[length]") :
$"{elemType}[length]";
var creationDecl = elemType.EndsWith("[]")
? elemType.Insert(elemType.IndexOf("[]", StringComparison.Ordinal), "[length]")
: $"{elemType}[length]";
var ret = $$"""
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Deserialize(out {{elemType}}[] value, ref Reader reader)
public static void Deserialize(out {{elemType}}[] value, ref Reader reader)
{
reader.Read(out ushort typeId);
Expand All @@ -329,7 +335,7 @@ private static void Deserialize(out {{elemType}}[] value, ref Reader reader)
value = new {{creationDecl}};
for (int i = 0; i < length; i++)
{
Deserialize(out value[i], ref reader);
{{prefix}}(out value[i], ref reader);
}
break;
default:
Expand All @@ -348,7 +354,7 @@ private static string GenerateDictionarySerialization(string type1, string type2
{
var ret = $$"""
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Deserialize(out {{typeFullName}} value, ref Reader reader)
public static void Deserialize(out {{typeFullName}} value, ref Reader reader)
{
reader.Read(out ushort typeId);
Expand Down Expand Up @@ -377,15 +383,16 @@ private static void Deserialize(out {{typeFullName}} value, ref Reader reader)
return $"{indent}{ret}";
}

private static string GenerateCollectionSerialization(string elemType, string sigTypeFullname, string typeFullname,
string indent = "")
private static string GenerateCollectionSerialization(string prefix, string elemType, string sigTypeFullname,
string typeFullname,
string indent)
{
var ret = $$"""
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Deserialize(out {{sigTypeFullname}} value, ref Reader reader)
public static void Deserialize(out {{sigTypeFullname}} value, ref Reader reader)
{
{{elemType}}[] arr;
Deserialize(out arr, ref reader);
{{prefix}}(out arr, ref reader);
if (arr == null)
{
value = default;
Expand All @@ -401,11 +408,11 @@ private static void Deserialize(out {{sigTypeFullname}} value, ref Reader reader
return $"{indent}{ret}";
}

private static void GenerateNullableStructMethods(StringBuilder sb, string typeFullName)
private static void GenerateNullableStructMethods(StringBuilder sb, string prefix, string typeFullName)
{
sb.AppendLine($$"""
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Deserialize(out {{typeFullName}}? value, ref Reader reader)
public static void Deserialize(out {{typeFullName}}? value, ref Reader reader)
{
reader.Read(out ushort typeId);
Expand All @@ -415,7 +422,7 @@ private static void Deserialize(out {{typeFullName}}? value, ref Reader reader)
value = null;
return;
case TypeCollector.NullableTypeId:
Deserialize(out {{typeFullName}} ret, ref reader);
{{prefix}}(out {{typeFullName}} ret, ref reader);
value = ret;
return;
default:
Expand All @@ -426,16 +433,17 @@ private static void Deserialize(out {{typeFullName}}? value, ref Reader reader)
""");
}

private static void GenerateKvpStructMethods(StringBuilder sb, string type1, string type2)
private static void GenerateKvpStructMethods(StringBuilder sb, string prefix1, string type1, string prefix2,
string type2)
{
sb.AppendLine($$"""
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Deserialize(out KeyValuePair<{{type1}}, {{type2}}> value, ref Reader reader)
public static void Deserialize(out KeyValuePair<{{type1}}, {{type2}}> value, ref Reader reader)
{
{{type1}} key;
{{type2}} val;
Deserialize(out key, ref reader);
Deserialize(out val, ref reader);
{{prefix1}}(out key, ref reader);
{{prefix2}}(out val, ref reader);
value = new KeyValuePair<{{type1}}, {{type2}}>(key, val);
}
Expand Down
43 changes: 25 additions & 18 deletions src/Nino.Generator/EmbedTypeSerializerGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,8 @@ bool IsSerializableType(ITypeSymbol ts)
if (type is INamedTypeSymbol { TypeArguments.Length: 1 } namedTypeSymbol)
{
var fullName = namedTypeSymbol.TypeArguments[0].ToDisplayString();
GenerateNullableStructMethods(sb, fullName);
GenerateNullableStructMethods(sb,
namedTypeSymbol.TypeArguments[0].GetSerializePrefix(), fullName);
continue;
}
}
Expand All @@ -203,15 +204,17 @@ bool IsSerializableType(ITypeSymbol ts)
{
var type1 = namedTypeSymbol.TypeArguments[0].ToDisplayString();
var type2 = namedTypeSymbol.TypeArguments[1].ToDisplayString();
GenerateKvpStructMethods(sb, type1, type2);
GenerateKvpStructMethods(sb, namedTypeSymbol.TypeArguments[0].GetSerializePrefix(), type1,
namedTypeSymbol.TypeArguments[0].GetSerializePrefix(), type2);
continue;
}
}

//if type is array
if (type is IArrayTypeSymbol)
{
sb.AppendLine(GenerateCollectionSerialization(typeFullName, "Length", " "));
sb.AppendLine(GenerateCollectionSerialization(((IArrayTypeSymbol)type).ElementType.GetSerializePrefix(),
typeFullName, "Length", " "));
continue;
}

Expand All @@ -220,7 +223,8 @@ bool IsSerializableType(ITypeSymbol ts)
namedTypeSymbol.Name == "ICollection" && namedTypeSymbol.TypeArguments.Length == 1);
if (i != null)
{
sb.AppendLine(GenerateCollectionSerialization(typeFullName, "Count", " "));
sb.AppendLine(GenerateCollectionSerialization(i.TypeArguments[0].GetSerializePrefix(), typeFullName,
"Count", " "));
continue;
}

Expand All @@ -229,7 +233,8 @@ bool IsSerializableType(ITypeSymbol ts)
{
if (type is INamedTypeSymbol { TypeArguments.Length: 1 })
{
sb.AppendLine(GenerateCollectionSerialization(typeFullName, "Length", " "));
sb.AppendLine(GenerateCollectionSerialization(i.TypeArguments[0].GetSerializePrefix(), typeFullName,

Check warning on line 236 in src/Nino.Generator/EmbedTypeSerializerGenerator.cs

View workflow job for this annotation

GitHub Actions / build

Dereference of a possibly null reference.
"Length", " "));
continue;
}
}
Expand All @@ -246,7 +251,7 @@ bool IsSerializableType(ITypeSymbol ts)
//replace special characters with _
curNamespace = new string(curNamespace.Select(c => char.IsLetterOrDigit(c) ? c : '_').ToArray());
curNamespace += "Nino";

// generate code
var code = $$"""
// <auto-generated/>
Expand All @@ -267,15 +272,16 @@ public static partial class Serializer
}
""";

context.AddSource("NinoSerialiserExtension.Ext.g.cs", code);
context.AddSource("NinoSerializerExtension.Ext.g.cs", code);
}

private static string GenerateCollectionSerialization(string collectionType, string lengthName, string indent = "",
private static string GenerateCollectionSerialization(string prefix, string collectionType, string lengthName,
string indent,
string typeParam = "", string genericConstraint = "")
{
var ret = $$"""
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Serialize{{typeParam}}(this {{collectionType}} value, ref Writer writer) {{genericConstraint}}
public static void Serialize{{typeParam}}(this {{collectionType}} value, ref Writer writer) {{genericConstraint}}
{
if (value == null)
{
Expand All @@ -286,42 +292,43 @@ private static string GenerateCollectionSerialization(string collectionType, str
writer.Write(value.{{lengthName}});
foreach (var item in value)
{
item.Serialize(ref writer);
{{prefix}}(item, ref writer);
}
}
""";
// indent
ret = ret.Replace("\n", $"\n{indent}");
return $"{indent}{ret}";
}

private static void GenerateNullableStructMethods(StringBuilder sb, string typeFullName)
private static void GenerateNullableStructMethods(StringBuilder sb, string prefix, string typeFullName)
{
sb.AppendLine($$"""
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Serialize(this {{typeFullName}}? value, ref Writer writer)
public static void Serialize(this {{typeFullName}}? value, ref Writer writer)
{
if (!value.HasValue)
{
writer.Write(TypeCollector.NullTypeId);
return;
}
writer.Write(TypeCollector.NullableTypeId);
value.Value.Serialize(ref writer);
{{prefix}}(value.Value, ref writer);
}
""");
}

private static void GenerateKvpStructMethods(StringBuilder sb, string type1, string type2)
private static void GenerateKvpStructMethods(StringBuilder sb, string prefix1, string type1, string prefix2,
string type2)
{
sb.AppendLine($$"""
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void Serialize(this KeyValuePair<{{type1}}, {{type2}}> value, ref Writer writer)
public static void Serialize(this KeyValuePair<{{type1}}, {{type2}}> value, ref Writer writer)
{
value.Key.Serialize(ref writer);
value.Value.Serialize(ref writer);
{{prefix1}}(value.Key, ref writer);
{{prefix2}}(value.Value, ref writer);
}
""");
Expand Down
7 changes: 3 additions & 4 deletions src/Nino.Generator/Nino.Generator.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,16 @@
<RootNamespace>Nino.Generator</RootNamespace>
<PackageId>Nino.Generator</PackageId>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2.0.5</Version>
<Version>2.0.6</Version>
<Title>Nino.Generator</Title>
<Authors>JasonXuDeveloper</Authors>
<Description>Source Generator for the high performance and low size binary serialization solution, especially for Unity.</Description>
<Copyright>JasonXuDeveloper</Copyright>
<RepositoryUrl>https://github.com/JasonXuDeveloper/Nino</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>Nino;Serialization;Binary;Generator</PackageTags>
<PackageReleaseNotes>Nino.Serialization v2.0.5
- [Fix] Fix complilation error for abstract class
- [Optimisation] Optimise struct performance</PackageReleaseNotes>
<PackageReleaseNotes>Nino.Serialization v2.0.6
- [Fix] Fix complilation error for cross project types</PackageReleaseNotes>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<AnalyzerLanguage>cs</AnalyzerLanguage>
<IncludeBuildOutput>false</IncludeBuildOutput>
Expand Down
Loading

0 comments on commit 4eb8473

Please sign in to comment.