-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJsVisibleMember.cs
69 lines (57 loc) · 2.48 KB
/
JsVisibleMember.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System.Diagnostics;
using System.Reflection;
using Jint;
using Jint.Native;
using Jint.Runtime.Descriptors;
namespace JintTest
{
[DebuggerDisplay("{GetType().Name,nq} {Name.ToString()}")]
internal abstract class JsVisibleMember
{
private sealed class JsVisibleMethod : JsVisibleMember
{
internal readonly MethodInfo Method;
internal readonly JsValue? Length;
public JsVisibleMethod(Type declaringType, string name, string? symbol, PropertyFlag flags, MethodInfo method, JsValue? length) : base(declaringType, name, symbol, flags)
{
Method = method;
Length = length;
}
internal override PropertyDescriptor Build(Engine engine, object? staticObject)
{
var function = JsInvoker.CreateForMethod(engine, DeclaringType, Method, Name, Length, staticObject);
return JsHelper.CreateDescriptor(function, Flags);
}
}
private sealed class JsVisibleProperty : JsVisibleMember
{
internal readonly PropertyInfo Property;
public JsVisibleProperty(Type declaringType, string name, string? symbol, PropertyFlag flags, PropertyInfo property) : base(declaringType, name, symbol, flags)
{
Property = property;
}
internal override PropertyDescriptor Build(Engine engine, object? staticObject)
{
var getter = Property.CanRead ? JsInvoker.CreateForGetter(engine, DeclaringType, Property, Name, staticObject) : JsValue.Undefined;
var setter = Property.CanWrite ? JsInvoker.CreateForSetter(engine, DeclaringType, Property, Name, staticObject) : JsValue.Undefined;
return JsHelper.CreateDescriptor(getter, setter, Flags);
}
}
internal static JsVisibleMember Create(Type declaringType, string name, string? symbol, PropertyFlag flags, MethodInfo method, int? length)
=> new JsVisibleMethod(declaringType, name, symbol, flags, method, length.HasValue ? (JsValue)length : null);
internal static JsVisibleMember Create(Type declaringType, string name, string? symbol, PropertyFlag flags, PropertyInfo property)
=> new JsVisibleProperty(declaringType, name, symbol, flags, property);
internal readonly Type DeclaringType;
internal readonly JsString Name;
internal readonly JsString? Symbol;
internal readonly PropertyFlag Flags;
private JsVisibleMember(Type declaringType, string name, string? symbol, PropertyFlag flags)
{
DeclaringType = declaringType;
Name = new(name);
Symbol = symbol == null ? null : new(symbol);
Flags = flags;
}
internal abstract PropertyDescriptor Build(Engine engine, object? staticObject);
}
}