aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting.Basic
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Basic')
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Basic/GlobalObject.cs4
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs63
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectManager.cs18
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectSession.cs6
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs76
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Tango.Scripting.Basic.csproj1
6 files changed, 106 insertions, 62 deletions
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/GlobalObject.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/GlobalObject.cs
index fc48bb2a2..c76fba8e2 100644
--- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/GlobalObject.cs
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/GlobalObject.cs
@@ -6,8 +6,8 @@ using System.Threading.Tasks;
namespace Tango.Scripting.Basic
{
- public class GlobalObject
+ public class GlobalObject<T> where T : IContext
{
- public IContext GlobalContext { get; set; }
+ public T GlobalContext { get; set; }
}
}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs
index 31be3a714..446e5b529 100644
--- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs
@@ -15,10 +15,11 @@ using Tango.Core;
using Tango.Core.IO;
using Tango.Scripting.Core;
using System.IO;
+using Tango.Core.Helpers;
namespace Tango.Scripting.Basic
{
- public class Project : ExtendedObject
+ public class Project<T> : ExtendedObject where T : IContext
{
private String _name;
public String Name
@@ -38,11 +39,9 @@ namespace Tango.Scripting.Basic
public ObservableCollection<ReferenceAssembly> ReferenceAssemblies { get; set; }
- [JsonIgnore]
- public ObservableCollection<Assembly> ReferenceAssembliesLoaded { get; set; }
-
public ObservableCollection<Script> Scripts { get; set; }
+ [JsonIgnore]
public ObservableCollection<IScriptSource> AdditionalScripts
{
get
@@ -56,38 +55,20 @@ namespace Tango.Scripting.Basic
ApartmentState = ApartmentState.MTA;
ReferenceAssemblies = new ObservableCollection<ReferenceAssembly>();
- ReferenceAssemblies.CollectionChanged += ReferenceAssemblies_CollectionChanged;
- ReferenceAssembliesLoaded = new ObservableCollection<Assembly>();
Scripts = new ObservableCollection<Script>();
Scripts.CollectionChanged += (x, e) => { RaisePropertyChanged(nameof(AdditionalScripts)); };
}
- private void ReferenceAssemblies_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
- {
- LoadReferenceAssemblies();
- }
-
- private void LoadReferenceAssemblies()
+ public static TProject New<TProject, TContext>(String name) where TProject : Project<TContext> where TContext : IContext
{
- ReferenceAssembliesLoaded.Clear();
-
- foreach (var type in ReferenceAssemblies)
- {
- ReferenceAssembliesLoaded.Add(type.FromType.Assembly);
- }
- }
-
- public static Project New(String name)
- {
- Project p = new Project();
+ TProject p = Activator.CreateInstance<TProject>();
p.Name = name;
- p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(String) });
- p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(Enumerable) });
- p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(Form) });
- p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(Project) });
+ p.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(String)));
+ p.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(Enumerable)));
+ p.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(Form)));
return p;
}
@@ -140,14 +121,14 @@ namespace Tango.Scripting.Basic
}
else
{
- code += Environment.NewLine + Environment.NewLine + "return new Program().OnExecute(GlobalContext);";
+ code += Environment.NewLine + Environment.NewLine + "new Program().OnExecute(GlobalContext);";
mainScriptCode = code;
}
}
- var scriptOptions = ScriptOptions.Default.WithReferences(ReferenceAssembliesLoaded);
+ var scriptOptions = ScriptOptions.Default.WithReferences(LoadReferenceAssemblies());
- var s = CSharpScript.Create<object>(mainScriptCode, scriptOptions, typeof(GlobalObject));
+ var s = CSharpScript.Create<object>(mainScriptCode, scriptOptions, typeof(GlobalObject<T>));
result.Script = s;
var compileResults = s.Compile();
@@ -164,7 +145,7 @@ namespace Tango.Scripting.Basic
cError.Message = error.GetMessage();
cError.Severity = error.Severity;
var line = error.Location.GetMappedLineSpan();
- cError.Line = line.StartLinePosition.Line + 1 + (errorScript != null ? errorScript.LoadCount : 0);
+ cError.Line = line.StartLinePosition.Line + 1 - (errorScript != null ? errorScript.LoadCount : 0);
cError.Column = line.StartLinePosition.Character + 1;
cError.Length = line.EndLinePosition.Character - line.StartLinePosition.Character;
result.Errors.Add(cError);
@@ -174,7 +155,7 @@ namespace Tango.Scripting.Basic
});
}
- public async Task<ProjectSession> Run(IContext context)
+ public async Task<ProjectSession<T>> Run(T context)
{
var result = await Compile();
@@ -184,9 +165,9 @@ namespace Tango.Scripting.Basic
}
Thread scriptThread = null;
- ProjectSession session = null;
+ ProjectSession<T> session = null;
- session = new ProjectSession(this, () =>
+ session = new ProjectSession<T>(this, () =>
{
scriptThread.Abort();
});
@@ -195,7 +176,7 @@ namespace Tango.Scripting.Basic
{
try
{
- var runResult = result.Script.RunAsync(globals: new GlobalObject() { GlobalContext = context }).Result;
+ var runResult = result.Script.RunAsync(globals: new GlobalObject<T>() { GlobalContext = context }).Result;
session.Completed(runResult.ReturnValue);
}
catch (ThreadAbortException)
@@ -214,5 +195,17 @@ namespace Tango.Scripting.Basic
return session;
}
+
+ public List<Assembly> LoadReferenceAssemblies()
+ {
+ List<Assembly> loadedAssemblies = new List<Assembly>();
+
+ foreach (var asm in ReferenceAssemblies)
+ {
+ loadedAssemblies.Add(asm.Load());
+ }
+
+ return loadedAssemblies;
+ }
}
}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectManager.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectManager.cs
deleted file mode 100644
index 3af7530bc..000000000
--- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectManager.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Tango.Scripting.Basic
-{
- public class ProjectManager
- {
- public Project Project { get; set; }
-
- public ProjectManager(Project project)
- {
- Project = project;
- }
- }
-}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectSession.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectSession.cs
index 565949402..6bd3d44b9 100644
--- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectSession.cs
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectSession.cs
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace Tango.Scripting.Basic
{
- public class ProjectSession
+ public class ProjectSession<T> where T : IContext
{
private Action _abortAction;
private TaskCompletionSource<object> _completion;
@@ -15,9 +15,9 @@ namespace Tango.Scripting.Basic
public ProjectSessionState State { get; set; }
- public Project Project { get; set; }
+ public Project<T> Project { get; set; }
- public ProjectSession(Project project, Action abortAction)
+ public ProjectSession(Project<T> project, Action abortAction)
{
_completion = new TaskCompletionSource<object>();
Project = project;
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs
index be66e026b..665bd7ab1 100644
--- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs
@@ -1,18 +1,88 @@
-using System;
+using Newtonsoft.Json;
+using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
+using System.Reflection;
using System.Text;
using System.Threading.Tasks;
+using Tango.Core.Helpers;
namespace Tango.Scripting.Basic
{
public class ReferenceAssembly
{
- public Type FromType { get; set; }
+ private static Dictionary<String, Assembly> _assembliesCache;
+ static ReferenceAssembly()
+ {
+ _assembliesCache = new Dictionary<string, Assembly>();
+ }
+
+ public String File { get; set; }
+
+ public Type HintType { get; set; }
+
+ [JsonIgnore]
public String Name
{
- get { return FromType.Assembly.GetName().Name; }
+ get { return Path.GetFileNameWithoutExtension(File); }
+ }
+
+ public static ReferenceAssembly FromType(Type type)
+ {
+ ReferenceAssembly reference = new ReferenceAssembly();
+ reference.HintType = type;
+ var assembly = type.Assembly;
+ reference.File = assembly.Location;
+ return reference;
+ }
+
+ public static ReferenceAssembly FromFile(String file)
+ {
+ return new ReferenceAssembly() { File = file };
+ }
+
+ public Assembly Load()
+ {
+ Assembly loaded = null;
+ if (!_assembliesCache.TryGetValue(Name, out loaded))
+ {
+ try
+ {
+ if (HintType != null)
+ {
+ loaded = HintType.Assembly;
+ }
+ else
+ {
+ loaded = Assembly.LoadFrom(File);
+ }
+
+ _assembliesCache.Add(Name, loaded);
+ }
+ catch
+ {
+ try
+ {
+ String dotNetPath = AssemblyHelper.GetAssemblyTargetFrameworkFolder(Assembly.GetExecutingAssembly());
+ String dotNetAsm = Path.Combine(dotNetPath, Name + ".dll");
+ loaded = Assembly.LoadFrom(dotNetAsm);
+ _assembliesCache.Add(Name, loaded);
+ }
+ catch (Exception ex)
+ {
+ throw new FileNotFoundException($"Could not load assembly '{Name}'. File not found.", ex);
+ }
+ }
+ }
+
+ return loaded;
+ }
+
+ public override string ToString()
+ {
+ return Name;
}
}
}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Tango.Scripting.Basic.csproj b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Tango.Scripting.Basic.csproj
index 8af52748a..be52ca57a 100644
--- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Tango.Scripting.Basic.csproj
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Tango.Scripting.Basic.csproj
@@ -136,7 +136,6 @@
<Compile Include="CompilationResult.cs" />
<Compile Include="GlobalObject.cs" />
<Compile Include="Project.cs" />
- <Compile Include="ProjectManager.cs" />
<Compile Include="ReferenceAssembly.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>