forked from AngleSharp/AngleSharp.Js
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExtensibility.cs
More file actions
77 lines (70 loc) · 2.56 KB
/
Copy pathExtensibility.cs
File metadata and controls
77 lines (70 loc) · 2.56 KB
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
70
71
72
73
74
75
76
77
namespace AngleSharp.Js
{
using AngleSharp.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
static class Extensibility
{
public static IDictionary<String, ExtensionEntry> GetExtensions(this IEnumerable<MethodInfo> methods)
{
var entries = new Dictionary<String, ExtensionEntry>();
foreach (var method in methods)
{
var names = method.GetCustomAttributes<DomNameAttribute>()
.Select(m => m.OfficialName);
var accessors = method.GetCustomAttributes<DomAccessorAttribute>()
.Select(m => m.Type);
var forward = method.GetCustomAttribute<DomPutForwardsAttribute>();
foreach (var name in names)
{
if (!entries.TryGetValue(name, out var entry))
{
entry = new ExtensionEntry
{
Forward = forward,
};
entries.Add(name, entry);
}
if (accessors.Any())
{
var accessor = accessors.FirstOrDefault();
switch (accessor)
{
case Accessors.Setter:
entry.Setter = method;
break;
case Accessors.Getter:
entry.Getter = method;
break;
case Accessors.Remover:
entry.Remover = method;
break;
case Accessors.Adder:
entry.Adder = method;
break;
case Accessors.Method:
entry.Other = method;
break;
}
}
else
{
entry.Other = method;
}
}
}
return entries;
}
public class ExtensionEntry
{
public MethodInfo Getter;
public MethodInfo Setter;
public MethodInfo Adder;
public MethodInfo Remover;
public MethodInfo Other;
public DomPutForwardsAttribute Forward;
}
}
}