forked from DerivcoIpswich/dsharp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCodeModelProcessor.cs
More file actions
140 lines (118 loc) · 3.58 KB
/
Copy pathCodeModelProcessor.cs
File metadata and controls
140 lines (118 loc) · 3.58 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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// CodeModelProcessor.cs
// Script#/Core/Compiler
// This source code is subject to terms and conditions of the Apache License, Version 2.0.
//
using System;
using System.Reflection;
namespace DSharp.Compiler.CodeModel
{
internal sealed class CodeModelProcessor
{
private readonly object context;
private readonly IParseNodeHandler nodeHandler;
private readonly bool notifyChildren;
public CodeModelProcessor(IParseNodeHandler nodeHandler, object context)
{
this.nodeHandler = nodeHandler;
this.context = context;
notifyChildren = nodeHandler.RequiresChildrenGrouping;
}
private void EndChildren()
{
if (notifyChildren)
{
nodeHandler.EndChildren();
}
}
public void Process(ParseNode node)
{
Visit(node);
}
private bool ProcessNode(ParseNode node)
{
return nodeHandler.HandleNode(node, context);
}
private void StartChildren(string identifier)
{
if (notifyChildren)
{
nodeHandler.StartChildren(identifier);
}
}
private void Visit(ParseNode node)
{
if (!ProcessNode(node))
{
return;
}
StartChildren(string.Empty);
Type nodeType = node.GetType();
foreach (PropertyInfo propertyInfo in nodeType.GetProperties())
{
string propertyName = propertyInfo.Name;
if (propertyName.Equals("NodeType"))
{
continue;
}
if (propertyName.Equals("Parent"))
{
continue;
}
if (propertyName.Equals("Token"))
{
continue;
}
Visit(node, propertyInfo);
}
EndChildren();
}
private void Visit(ParseNode node, PropertyInfo propertyInfo)
{
string name = propertyInfo.Name;
object value = propertyInfo.GetValue(node, null);
string text = name + " (" + propertyInfo.PropertyType.Name + ")";
if (value != null)
{
if (value is ParseNodeList nodeList)
{
if (nodeList.Count == 0)
{
text += " : Empty";
}
else
{
text += " : " + nodeList.Count;
}
StartChildren(text);
foreach (ParseNode nodeItem in nodeList) Visit(nodeItem);
EndChildren();
}
else if (value is ParseNode parseNode)
{
StartChildren(text);
Visit(parseNode);
EndChildren();
}
else
{
if (value is string @string)
{
text += " : \"" + @string + "\"";
}
else
{
text += " : " + value;
}
StartChildren(text);
EndChildren();
}
}
else
{
text += " : null";
StartChildren(text);
EndChildren();
}
}
}
}