-
Notifications
You must be signed in to change notification settings - Fork 119
Expand file tree
/
Copy pathSymbolScope.cs
More file actions
110 lines (88 loc) · 3.25 KB
/
Copy pathSymbolScope.cs
File metadata and controls
110 lines (88 loc) · 3.25 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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*----------------------------------------------------------
This Source Code Form is subject to the terms of the
Mozilla Public License, v.2.0. If a copy of the MPL
was not distributed with this file, You can obtain one
at http://mozilla.org/MPL/2.0/.
----------------------------------------------------------*/
using System.Collections.Generic;
using System.Reflection;
using OneScript.Contexts;
using OneScript.Runtime.Binding;
using OneScript.Values;
namespace OneScript.Compilation.Binding
{
public class SymbolScope
{
public SymbolsCollection<IMethodSymbol> Methods { get; } =
new SymbolsCollection<IMethodSymbol>();
public SymbolsCollection<IVariableSymbol> Variables { get; } =
new SymbolsCollection<IVariableSymbol>();
public int DefineVariable(IVariableSymbol symbol)
{
return Variables.Add(symbol);
}
public int DefineMethod(IMethodSymbol symbol)
{
return Methods.Add(symbol);
}
#region Static part
public static SymbolScope FromObject(BslObjectValue target)
{
var scope = new SymbolScope();
var type = target.GetType();
foreach (var info in type.GetMethods())
{
var attr = info.GetCustomAttribute<ContextMethodAttribute>();
if(attr == null)
continue;
var symbol = new BslMethodSymbol
{
Method = new ContextMethodInfo(info),
};
scope.Methods.Add(symbol);
}
foreach (var info in type.GetProperties())
{
var attr = info.GetCustomAttribute<ContextMethodAttribute>();
if(attr == null)
continue;
var symbol = new BslPropertySymbol
{
Property = new ContextPropertyInfo(info),
};
scope.Variables.Add(symbol);
}
return scope;
}
public static SymbolScope FromContext(IRuntimeContextInstance target)
{
var scope = new SymbolScope();
for (int i = 0; i < target.GetPropCount(); i++)
{
var targetProp = target.GetPropertyInfo(i);
scope.Variables.Add(new BslPropertySymbol { Property = targetProp });
}
for (int i = 0; i < target.GetMethodsCount(); i++)
{
var targetMeth = target.GetMethodInfo(i);
scope.Methods.Add(new BslMethodSymbol { Method = targetMeth });
}
return scope;
}
public static SymbolScope FromMethodsAndProperties(IEnumerable<BslMethodInfo> methods,
IEnumerable<BslPropertyInfo> properties)
{
var scope = new SymbolScope();
foreach (var methodInfo in methods)
{
scope.Methods.Add(methodInfo.ToSymbol());
}
foreach (var propertyInfo in properties)
{
scope.Variables.Add(propertyInfo.ToSymbol());
}
return scope;
}
#endregion
}
}