Skip to content

Commit 47c56ff

Browse files
authored
Fix crash in ReflectionManager (#2987)
1 parent dd602fd commit 47c56ff

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

‎Robust.Shared/Reflection/ReflectionManager.cs‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,10 @@ public bool TryParseEnumReference(string reference, [NotNullWhen(true)] out Enum
194194
{
195195
foreach (var type in assembly.DefinedTypes)
196196
{
197-
if (!type.IsEnum || !type.FullName!.EndsWith(typeName))
197+
if (!type.IsEnum || !(
198+
type.FullName!.Equals(typeName) ||
199+
type.FullName!.EndsWith("." + typeName) ||
200+
type.FullName!.EndsWith("+" + typeName)))
198201
{
199202
continue;
200203
}

‎Robust.UnitTesting/Shared/Reflection/ReflectionManager_Test.cs‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Robust.Shared.IoC;
33
using Robust.Shared.Reflection;
44
using System.Collections.Generic;
5+
using JetBrains.Annotations;
56

67
namespace Robust.UnitTesting.Shared.Reflection
78
{
@@ -77,9 +78,36 @@ public void ReflectionManager_TestGetType()
7778
Assert.That(reflectionManager.GetType("Shared.Reflection.ITestGetType3"), Is.EqualTo(typeof(ITestGetType3)));
7879
});
7980
}
81+
82+
[Test]
83+
public void ReflectionManager_TestTryParseEnumReference()
84+
{
85+
IReflectionManager reflectionManager = IoCManager.Resolve<IReflectionManager>();
86+
reflectionManager.TryParseEnumReference("enum.TestParseEnumReferenceType1.Value", out var out1);
87+
reflectionManager.TryParseEnumReference("enum.TestParseEnumReferenceType2.InnerValue", out var out2);
88+
reflectionManager.TryParseEnumReference("enum.TestParseEnumReferenceType3.OuterValue", out var out3);
89+
reflectionManager.TryParseEnumReference("enum.TestParseEnumReferenceTypeClass+TestParseEnumReferenceType2.InnerValue", out var out4);
90+
Assert.Multiple(() =>
91+
{
92+
Assert.That(out1, Is.EqualTo(TestParseEnumReferenceType1.Value));
93+
Assert.That(out2, Is.EqualTo(TestParseEnumReferenceTypeClass.TestParseEnumReferenceType2.InnerValue));
94+
Assert.That(out3, Is.EqualTo(TestParseEnumReferenceType3.OuterValue));
95+
Assert.That(out4, Is.EqualTo(TestParseEnumReferenceTypeClass.TestParseEnumReferenceType2.InnerValue));
96+
});
97+
}
8098
}
8199

82100
public sealed class TestGetType1 { }
83101
public abstract class TestGetType2 { }
84102
public interface ITestGetType3 { }
103+
104+
public enum TestParseEnumReferenceType1 { Value }
105+
106+
[UsedImplicitly]
107+
public sealed class TestParseEnumReferenceTypeClass
108+
{
109+
public enum TestParseEnumReferenceType2 { InnerValue }
110+
}
85111
}
112+
113+
public enum TestParseEnumReferenceType3 { OuterValue }

0 commit comments

Comments
 (0)