aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2018-05-09 14:55:00 +0300
committerRoy Ben-Shabat <Roy@Twine-s.com>2018-05-09 14:55:00 +0300
commit2a459c79e90a2ade3f1dac1ae4541c0f4d74965c (patch)
tree969943c6a06d99ff472f24bb1d37e7fe2913bfdf /Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
parent67255998056910f53640e11e634cfdbbd7f6880c (diff)
downloadTango-2a459c79e90a2ade3f1dac1ae4541c0f4d74965c.tar.gz
Tango-2a459c79e90a2ade3f1dac1ae4541c0f4d74965c.zip
Stubs UI v1.4
Diffstat (limited to 'Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs')
-rw-r--r--Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs80
1 files changed, 78 insertions, 2 deletions
diff --git a/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs b/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
index 745e694b1..fdd4a0889 100644
--- a/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
+++ b/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
@@ -3,6 +3,7 @@ using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
@@ -36,8 +37,17 @@ namespace Tango.Scripting
/// </summary>
/// <param name="code">The code.</param>
/// <returns></returns>
- public async Task Run(String code)
+ public async Task Run(String code, String workingFolder)
{
+ try
+ {
+ code = ReplaceIncludes(code, workingFolder);
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+
var options = CreateOptions();
String methodParameters = CreateMethodParameters();
@@ -51,10 +61,19 @@ namespace Tango.Scripting
"await Task.Factory.StartNew(() => { OnExecute(" + methodParameters + "); });", options: options, globals: _onExecuteParameters, cancellationToken: _cancaller.Token);
}
- public Task<List<CompilerError>> Compile(String code)
+ public Task<List<CompilerError>> Compile(String code, String workingFolder)
{
return Task.Factory.StartNew<List<CompilerError>>(() =>
{
+ try
+ {
+ code = ReplaceIncludes(code, workingFolder);
+ }
+ catch (Exception ex)
+ {
+ return new List<CompilerError>() { new CompilerError() { Error = ex.Message } };
+ }
+
var options = CreateOptions();
String methodParameters = CreateMethodParameters();
@@ -78,6 +97,63 @@ namespace Tango.Scripting
return String.Join(", ", _onExecuteParameters.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance).Select(x => x.Name));
}
+ private String ReplaceIncludes(String code, String workingFolder)
+ {
+ if (Directory.Exists(workingFolder))
+ {
+ Environment.CurrentDirectory = workingFolder;
+ }
+
+ List<String> lines = code.ToLines();
+
+ for (int i = 0; i < lines.Count; i++)
+ {
+ var line = lines[i];
+
+ if (line.Trim().StartsWith("include"))
+ {
+ String path = line.Replace("include", "").Trim().Replace("\"", "");
+
+ if (!File.Exists(path))
+ {
+ throw new FileNotFoundException("Could not locate include file '" + path + "'.");
+ }
+
+ String content = ReplaceIncludes(File.ReadAllText(path), Path.GetDirectoryName(path));
+
+ if (content.Contains("OnExecute("))
+ {
+ throw new InvalidProgramException(String.Format("Include file '{0}' contains and OnExecute method. Please remove it before trying to compile.", path));
+ }
+
+ lines[i] = content;
+ }
+ }
+
+ code = ClearnUsings(String.Join(Environment.NewLine, lines));
+
+ return code;
+ }
+
+ private String ClearnUsings(String code)
+ {
+ List<String> usings = new List<string>();
+
+ List<String> lines = code.ToLines();
+
+ foreach (var line in lines)
+ {
+ if (line.Trim().StartsWith("using"))
+ {
+ usings.Add(line);
+ }
+ }
+
+ lines.RemoveAll(x => x.Trim().StartsWith("using"));
+
+ return String.Join(Environment.NewLine, usings.Distinct()) + String.Join(Environment.NewLine, lines);
+ }
+
private ScriptOptions CreateOptions()
{
//My References.