diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-05-09 14:55:00 +0300 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-05-09 14:55:00 +0300 |
| commit | 2a459c79e90a2ade3f1dac1ae4541c0f4d74965c (patch) | |
| tree | 969943c6a06d99ff472f24bb1d37e7fe2913bfdf /Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs | |
| parent | 67255998056910f53640e11e634cfdbbd7f6880c (diff) | |
| download | Tango-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.cs | 80 |
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. |
