From d0a62e55e7ad6aae3da680af7b5bdd43a5f17291 Mon Sep 17 00:00:00 2001 From: Beck Sebenius Date: Mon, 23 Aug 2021 14:12:19 -0700 Subject: [PATCH 1/3] fix: 2+ inheritance from network behaviour causes compilation exception (#1078) --- .../Editor/CodeGen/NetworkBehaviourILPP.cs | 4 ++-- .../Tests/Editor/NetworkBehaviourTests.cs | 20 +++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs index 9c9c45f586..81acff6fe5 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs @@ -595,8 +595,8 @@ private void ProcessNetworkBehaviour(TypeDefinition typeDefinition, string[] ass // override NetworkBehaviour.__getTypeName() method to return concrete type { - var baseType = typeDefinition.BaseType.Resolve(); - var baseGetTypeNameMethod = baseType.Methods.First(p => p.Name.Equals(nameof(NetworkBehaviour.__getTypeName))); + var networkBehaviourType = m_NetworkBehaviour_TypeRef.Resolve(); + var baseGetTypeNameMethod = networkBehaviourType.Methods.First(p => p.Name.Equals(nameof(NetworkBehaviour.__getTypeName))); var newGetTypeNameMethod = new MethodDefinition( nameof(NetworkBehaviour.__getTypeName), diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs index e6d9607702..58a61cc8f2 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs @@ -47,14 +47,30 @@ public void AccessNetworkObjectTest() } [Test] - public void GetNetworkBehaviourNameTest() + public void GivenClassDerivesFromNetworkBehaviour_GetTypeNameReturnsCorrectValue() { - var gameObject = new GameObject(nameof(GetNetworkBehaviourNameTest)); + var gameObject = new GameObject(nameof(GivenClassDerivesFromNetworkBehaviour_GetTypeNameReturnsCorrectValue)); var networkBehaviour = gameObject.AddComponent(); Assert.AreEqual(nameof(EmptyNetworkBehaviour), networkBehaviour.__getTypeName()); } + [Test] + public void GivenClassDerivesFromNetworkBehaviourDerivedClass_GetTypeNameReturnsCorrectValue() + { + var gameObject = new GameObject(nameof(GivenClassDerivesFromNetworkBehaviourDerivedClass_GetTypeNameReturnsCorrectValue)); + var networkBehaviour = gameObject.AddComponent(); + + Assert.AreEqual(nameof(DerivedNetworkBehaviour), networkBehaviour.__getTypeName()); + } + + // Note: in order to repro https://github.com/Unity-Technologies/com.unity.netcode.gameobjects/issues/1078 + // this class must be defined first in the file so that the most-derived definition is processed first by ILPP + public class DerivedNetworkBehaviour : EmptyNetworkBehaviour + { + + } + public class EmptyNetworkBehaviour : NetworkBehaviour { From 0fce6104bf4c79ed283869f92404b232e47a1ff2 Mon Sep 17 00:00:00 2001 From: becksebenius-unity <74328025+becksebenius-unity@users.noreply.github.com> Date: Mon, 23 Aug 2021 15:25:32 -0700 Subject: [PATCH 2/3] Update com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs Co-authored-by: M. Fatih MAR --- .../Editor/CodeGen/NetworkBehaviourILPP.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs index 81acff6fe5..85943138be 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs @@ -595,8 +595,8 @@ private void ProcessNetworkBehaviour(TypeDefinition typeDefinition, string[] ass // override NetworkBehaviour.__getTypeName() method to return concrete type { - var networkBehaviourType = m_NetworkBehaviour_TypeRef.Resolve(); - var baseGetTypeNameMethod = networkBehaviourType.Methods.First(p => p.Name.Equals(nameof(NetworkBehaviour.__getTypeName))); + var networkBehaviour_TypeDef = m_NetworkBehaviour_TypeRef.Resolve(); + var baseGetTypeNameMethod = networkBehaviour_TypeDef.Methods.First(p => p.Name.Equals(nameof(NetworkBehaviour.__getTypeName))); var newGetTypeNameMethod = new MethodDefinition( nameof(NetworkBehaviour.__getTypeName), From e3554fdc012fd8a4e5af0761919017e140730c6e Mon Sep 17 00:00:00 2001 From: Beck Sebenius Date: Mon, 23 Aug 2021 15:26:26 -0700 Subject: [PATCH 3/3] updated comment based on feedback --- .../Tests/Editor/NetworkBehaviourTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs index 58a61cc8f2..395aa79d95 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs @@ -65,7 +65,7 @@ public void GivenClassDerivesFromNetworkBehaviourDerivedClass_GetTypeNameReturns } // Note: in order to repro https://github.com/Unity-Technologies/com.unity.netcode.gameobjects/issues/1078 - // this class must be defined first in the file so that the most-derived definition is processed first by ILPP + // this child class must be defined before its parent to assure it is processed first by ILPP public class DerivedNetworkBehaviour : EmptyNetworkBehaviour {