Browse Source

Include inherited static members in interop member search (#1275)

Marko Lahma 2 years ago
parent
commit
9e378e8c01

+ 22 - 0
Jint.Tests/Runtime/InteropTests.MemberAccess.cs

@@ -147,6 +147,28 @@ namespace Jint.Tests.Runtime
             Assert.Equal(10, engine.Evaluate("dc.c"));
             Assert.Equal(10, engine.Evaluate("dc.c"));
         }
         }
 
 
+        [Fact]
+        public void CanAccessBaseClassStaticFields()
+        {
+            var engine = new Engine(options =>
+            {
+                options.AllowClr();
+            });
+
+            engine.SetValue("B", TypeReference.CreateTypeReference(engine, typeof(InheritingFromClassWithStatics)));
+            Assert.Equal(42, engine.Evaluate("B.a").AsNumber());
+            Assert.Equal(24, engine.Evaluate("B.a = 24; B.a").AsNumber());
+        }
+
+        private class BaseClassWithStatics
+        {
+            public static int a = 42;
+        }
+
+        private class InheritingFromClassWithStatics : BaseClassWithStatics
+        {
+        }
+
         private static class EchoService
         private static class EchoService
         {
         {
             public static string Echo(string message) => message;
             public static string Echo(string message) => message;

+ 1 - 1
Jint/Runtime/Interop/TypeReference.cs

@@ -195,7 +195,7 @@ namespace Jint.Runtime.Interop
                 return ConstantValueAccessor.NullAccessor;
                 return ConstantValueAccessor.NullAccessor;
             }
             }
 
 
-            const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Static;
+            const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy;
             return typeResolver.TryFindMemberAccessor(engine, type, name, bindingFlags, indexerToTry: null, out var accessor)
             return typeResolver.TryFindMemberAccessor(engine, type, name, bindingFlags, indexerToTry: null, out var accessor)
                 ? accessor
                 ? accessor
                 : ConstantValueAccessor.NullAccessor;
                 : ConstantValueAccessor.NullAccessor;