aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2018-05-13 12:08:20 +0300
committerAvi Levkovich <avi@twine-s.com>2018-05-13 12:08:20 +0300
commit82ea027530fa6e2512b30d1e069a602aed73be5f (patch)
tree6af1d6a41973f0598f063dd0c122ef139a412994 /Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
parente74f4da5899eea9abea143771fa2a950a50da963 (diff)
parentc61415008c418af3d628185efa1fa746aaf0516c (diff)
downloadTango-82ea027530fa6e2512b30d1e069a602aed73be5f.tar.gz
Tango-82ea027530fa6e2512b30d1e069a602aed73be5f.zip
move to one motors id enum + remove AMT_OF_WORDS
Diffstat (limited to 'Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs')
-rw-r--r--Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs85
1 files changed, 79 insertions, 6 deletions
diff --git a/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs b/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
index 745e694b1..23933bf42 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();
@@ -62,10 +81,7 @@ namespace Tango.Scripting
_cancaller = new CancellationTokenSource();
var script = CSharpScript.Create(
- code +
- Environment.NewLine +
- Environment.NewLine +
- "await Task.Factory.StartNew(() => { OnExecute(" + methodParameters + "); });", options: options, globalsType: _onExecuteParameters.GetType());
+ code, options: options, globalsType: _onExecuteParameters.GetType());
var results = script.Compile();
@@ -78,6 +94,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.