Skip to content

Commit

Permalink
fix(weaver): Warning for multiple write/read functions for the same t…
Browse files Browse the repository at this point in the history
…ype (#2453)

* fix(weaver): Warning for multiple write/read functions for the same type

Adding warning message when trying to register a write or read function for a type that is already in dictionary. Previously weaver would be silent about this making it hard to know when an extension method overrides another one.

* test for warnings
  • Loading branch information
James-Frowen committed Nov 22, 2020
1 parent fd9a7b0 commit 301e791
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 1 deletion.
6 changes: 6 additions & 0 deletions Assets/Mirror/Editor/Weaver/Readers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ public static void Init()

internal static void Register(TypeReference dataType, MethodReference methodReference)
{
string typeName = dataType.FullName;
if (readFuncs.ContainsKey(typeName))
{
Weaver.Warning($"Registering a Read method for {typeName} when one already exists", methodReference);
}

readFuncs[dataType.FullName] = methodReference;
}

Expand Down
8 changes: 7 additions & 1 deletion Assets/Mirror/Editor/Weaver/Writers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,13 @@ public static void Init()

public static void Register(TypeReference dataType, MethodReference methodReference)
{
writeFuncs[dataType.FullName] = methodReference;
string typeName = dataType.FullName;
if (writeFuncs.ContainsKey(typeName))
{
Weaver.Warning($"Registering a Write method for {typeName} when one already exists", methodReference);
}

writeFuncs[typeName] = methodReference;
}

static void RegisterWriteFunc(TypeReference typeReference, MethodDefinition newWriterFunc)
Expand Down
1 change: 1 addition & 0 deletions Assets/Mirror/Tests/Editor/Weaver/.WeaverTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@
<Compile Include="WeaverCommandTests~\ErrorForOptionalNetworkConnectionThatIsNotSenderConnection.cs" />
<Compile Include="WeaverGeneralTests~\RecursionCount.cs" />
<Compile Include="WeaverGeneralTests~\TestingScriptableObjectArraySerialization.cs" />
<Compile Include="WeaverGeneratedReaderWriterTests~\GivesWarningWhenRegisteringExistingExtensionMethod.cs" />
<Compile Include="WeaverMessageTests~\AbstractMessageMethods.cs" />
<Compile Include="WeaverMessageTests~\MessageMemberGeneric.cs" />
<Compile Include="WeaverMessageTests~\MessageMemberInterface.cs" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,5 +203,16 @@ public void GivesErrorForInvalidListType()
//HasError("Cannot generate reader for List because element MonoBehaviour does not have a reader. Use a supported type or provide a custom reader",
// "System.Collections.Generic.List`1<UnityEngine.MonoBehaviour>");
}

[Test]
public void GivesWarningWhenRegisteringExistingExtensionMethod()
{
const string typeName = "GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod.MyType";
HasNoErrors();
HasWarning($"Registering a Write method for {typeName} when one already exists",
"System.Void GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod.ReadWriteExtension::WriteMyType2(Mirror.NetworkWriter,GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod.MyType)");
HasWarning($"Registering a Read method for {typeName} when one already exists",
"GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod.MyType GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod.ReadWriteExtension::ReadMyType2(Mirror.NetworkReader)");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Mirror;

namespace GeneratedReaderWriter.GivesWarningWhenRegisteringExistingExtensionMethod
{
public struct MyType
{
public int number;
}

public static class ReadWriteExtension
{
public static void WriteMyType(this NetworkWriter writer, MyType data)
{
writer.WriteInt32(data.number);
}

public static void WriteMyType2(this NetworkWriter writer, MyType data)
{
writer.WriteInt32(data.number);
}

public static MyType ReadMyType(this NetworkReader reader)
{
return new MyType { number = reader.ReadInt32() };
}

public static MyType ReadMyType2(this NetworkReader reader)
{
return new MyType { number = reader.ReadInt32() };
}
}
}

0 comments on commit 301e791

Please sign in to comment.