forked from MattRix/UnityDecompiled
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCSharpLanguage.cs
More file actions
130 lines (119 loc) · 3.68 KB
/
Copy pathCSharpLanguage.cs
File metadata and controls
130 lines (119 loc) · 3.68 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
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.NRefactory.Visitors;
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor.Modules;
namespace UnityEditor.Scripting.Compilers
{
internal class CSharpLanguage : SupportedLanguage
{
private class VisitorData
{
public string TargetClassName;
public Stack<string> CurrentNamespaces;
public string DiscoveredNamespace;
public VisitorData()
{
this.CurrentNamespaces = new Stack<string>();
}
}
private class NamespaceVisitor : AbstractAstVisitor
{
public override object VisitNamespaceDeclaration(NamespaceDeclaration namespaceDeclaration, object data)
{
CSharpLanguage.VisitorData visitorData = (CSharpLanguage.VisitorData)data;
visitorData.CurrentNamespaces.Push(namespaceDeclaration.Name);
namespaceDeclaration.AcceptChildren(this, visitorData);
visitorData.CurrentNamespaces.Pop();
return null;
}
public override object VisitTypeDeclaration(TypeDeclaration typeDeclaration, object data)
{
CSharpLanguage.VisitorData visitorData = (CSharpLanguage.VisitorData)data;
if (typeDeclaration.Name == visitorData.TargetClassName)
{
string text = string.Empty;
foreach (string current in visitorData.CurrentNamespaces)
{
if (text == string.Empty)
{
text = current;
}
else
{
text = current + "." + text;
}
}
visitorData.DiscoveredNamespace = text;
}
return null;
}
}
public override string GetExtensionICanCompile()
{
return "cs";
}
public override string GetLanguageName()
{
return "CSharp";
}
internal static CSharpCompiler GetCSharpCompiler(BuildTarget targetPlatform, bool buildingForEditor, string assemblyName)
{
string targetStringFromBuildTarget = ModuleManager.GetTargetStringFromBuildTarget(targetPlatform);
ICompilationExtension compilationExtension = ModuleManager.GetCompilationExtension(targetStringFromBuildTarget);
return compilationExtension.GetCsCompiler(buildingForEditor, assemblyName);
}
public override ScriptCompilerBase CreateCompiler(MonoIsland island, bool buildingForEditor, BuildTarget targetPlatform, bool runUpdater)
{
CSharpCompiler cSharpCompiler = CSharpLanguage.GetCSharpCompiler(targetPlatform, buildingForEditor, island._output);
ScriptCompilerBase result;
if (cSharpCompiler != CSharpCompiler.Microsoft)
{
if (cSharpCompiler != CSharpCompiler.Mono)
{
}
result = new MonoCSharpCompiler(island, runUpdater);
}
else
{
result = new MicrosoftCSharpCompiler(island, runUpdater);
}
return result;
}
public override string GetNamespace(string fileName, string definedSymbols)
{
string result;
using (IParser parser = ParserFactory.CreateParser(fileName))
{
HashSet<string> hashSet = new HashSet<string>(definedSymbols.Split(new char[]
{
','
}, StringSplitOptions.RemoveEmptyEntries));
foreach (string current in hashSet)
{
parser.Lexer.ConditionalCompilationSymbols.Add(current, string.Empty);
}
parser.Lexer.EvaluateConditionalCompilation = true;
parser.Parse();
try
{
CSharpLanguage.NamespaceVisitor visitor = new CSharpLanguage.NamespaceVisitor();
CSharpLanguage.VisitorData visitorData = new CSharpLanguage.VisitorData
{
TargetClassName = Path.GetFileNameWithoutExtension(fileName)
};
parser.CompilationUnit.AcceptVisitor(visitor, visitorData);
result = ((!string.IsNullOrEmpty(visitorData.DiscoveredNamespace)) ? visitorData.DiscoveredNamespace : string.Empty);
return result;
}
catch
{
}
}
result = string.Empty;
return result;
}
}
}