Changeset 10401 for trunk/sources/HeuristicLab.HLScript/3.3/Script.cs
- Timestamp:
- 01/27/14 14:13:02 (11 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.HLScript/3.3/Script.cs
r10400 r10401 17 17 18 18 namespace HeuristicLab.HLScript { 19 [Item(" HLScript", "A HeuristicLab script.")]19 [Item("Script", "A HeuristicLab script.")] 20 20 [Creatable("Scripts")] 21 21 [StorableClass] 22 public sealed class HLScript : NamedItem, IStorableContent {22 public sealed class Script : NamedItem, IStorableContent { 23 23 #region Constants 24 private const string ScriptNamespaceName = "HeuristicLab.HLScript";25 24 private const string ExecuteMethodName = "Execute"; 26 25 private const string CodeTemplate = … … 29 28 using System; 30 29 31 public override void Main() { 32 // type your code here 33 } 34 35 // further classes and methods"; 30 namespace UserScripts { 31 public class UserScript : HeuristicLab.HLScript.UserScriptBase { 32 public override void Main() { 33 // type your code here 34 } 35 36 // further classes and methods 37 38 } 39 }"; 36 40 #endregion 37 41 38 42 #region Fields & Properties 39 private HLScriptGeneration compiledHLScript;43 private UserScriptBase compiledScript; 40 44 41 45 public string Filename { get; set; } … … 58 62 if (value == code) return; 59 63 code = value; 60 compiled HLScript = null;64 compiledScript = null; 61 65 OnCodeChanged(); 62 66 } … … 80 84 #region Construction & Initialization 81 85 [StorableConstructor] 82 private HLScript(bool deserializing) : base(deserializing) { }83 private HLScript(HLScript original, Cloner cloner)86 private Script(bool deserializing) : base(deserializing) { } 87 private Script(Script original, Cloner cloner) 84 88 : base(original, cloner) { 85 89 code = original.code; … … 90 94 } 91 95 92 public HLScript()93 : base(" HLScript", "A HeuristicLab script.") {96 public Script() 97 : base("Script", "A HeuristicLab script.") { 94 98 code = CodeTemplate; 95 99 variableStore = new VariableStore(); … … 97 101 98 102 public override IDeepCloneable Clone(Cloner cloner) { 99 return new HLScript(this, cloner);103 return new Script(this, cloner); 100 104 } 101 105 #endregion 102 106 103 107 private void RegisterScriptEvents() { 104 if (compiled HLScript == null) return;105 compiled HLScript.ConsoleOutputChanged += compiledHLScript_ConsoleOutputChanged;108 if (compiledScript == null) return; 109 compiledScript.ConsoleOutputChanged += compiledScript_ConsoleOutputChanged; 106 110 } 107 111 108 112 private void DeregisterScriptEvents() { 109 if (compiled HLScript == null) return;110 compiled HLScript.ConsoleOutputChanged -= compiledHLScript_ConsoleOutputChanged;113 if (compiledScript == null) return; 114 compiledScript.ConsoleOutputChanged -= compiledScript_ConsoleOutputChanged; 111 115 } 112 116 … … 143 147 public void Compile() { 144 148 var results = DoCompile(); 145 compiled HLScript = null;149 compiledScript = null; 146 150 CompileErrors = results.Errors; 147 151 if (results.Errors.HasErrors) { … … 160 164 var types = assembly.GetTypes(); 161 165 DeregisterScriptEvents(); 162 compiled HLScript = (HLScriptGeneration)Activator.CreateInstance(types[0]);166 compiledScript = (UserScriptBase)Activator.CreateInstance(types[0]); 163 167 RegisterScriptEvents(); 164 168 } … … 181 185 } 182 186 183 private readonly Regex LineSplitter = new Regex(@"\r\n|\r|\n");184 187 private readonly Regex SafeTypeNameCharRegex = new Regex("[_a-zA-Z0-9]+"); 185 188 private readonly Regex SafeTypeNameRegex = new Regex("[_a-zA-Z][_a-zA-Z0-9]*"); 186 private readonly Regex NamespaceDeclarationRegex = new Regex(@"using\s+(@?[a-z_A-Z]\w+(?:\s*\.\s*@?[a-z_A-Z]\w*)*)\s*;");187 private readonly Regex NamespaceRegex = new Regex(@"(@?[a-z_A-Z]\w+(?:\s*\.\s*@?[a-z_A-Z]\w*)*)");188 private readonly Regex CommentRegex = new Regex(@"((/\*)[^/]+(\*/))|(//.*)");189 189 190 190 private CodeCompileUnit CreateCompilationUnit() { 191 var ns = new CodeNamespace(ScriptNamespaceName); 192 ns.Types.Add(CreateScriptClass()); 193 ns.Imports.AddRange( 194 GetNamespaces() 195 .Select(n => new CodeNamespaceImport(n)) 196 .ToArray()); 197 var unit = new CodeCompileUnit(); 198 unit.Namespaces.Add(ns); 191 var unit = new CodeSnippetCompileUnit(code); 199 192 return unit; 200 }201 202 private IEnumerable<string> GetNamespaces() {203 var strings = NamespaceDeclarationRegex.Matches(CommentRegex.Replace(code, string.Empty))204 .Cast<Match>()205 .Select(m => m.Value);206 foreach (var s in strings) {207 var match = NamespaceRegex.Match(s.Replace("using", string.Empty));208 yield return match.Value;209 }210 }211 212 private IEnumerable<string> GetCodeLines() {213 var lines = LineSplitter.Split(code);214 foreach (var line in lines) {215 string trimmedLine = line.Trim();216 if (!NamespaceDeclarationRegex.IsMatch(trimmedLine))217 yield return trimmedLine;218 }219 193 } 220 194 … … 230 204 } 231 205 } 232 233 private CodeTypeDeclaration CreateScriptClass() {234 var typeDecl = new CodeTypeDeclaration(CompiledTypeName) {235 IsClass = true,236 TypeAttributes = TypeAttributes.Public,237 };238 typeDecl.BaseTypes.Add(typeof(HLScriptGeneration));239 typeDecl.Members.Add(new CodeSnippetTypeMember(string.Join(Environment.NewLine, GetCodeLines())));240 return typeDecl;241 }242 206 #endregion 243 207 244 208 private Thread scriptThread; 245 209 public void Execute() { 246 if (compiled HLScript == null) return;247 var executeMethod = typeof( HLScriptGeneration).GetMethod(ExecuteMethodName, BindingFlags.NonPublic | BindingFlags.Instance);210 if (compiledScript == null) return; 211 var executeMethod = typeof(UserScriptBase).GetMethod(ExecuteMethodName, BindingFlags.NonPublic | BindingFlags.Instance); 248 212 if (executeMethod != null) { 249 213 scriptThread = new Thread(() => { 250 214 try { 251 215 OnScriptExecutionStarted(); 252 executeMethod.Invoke(compiled HLScript, new[] { VariableStore });216 executeMethod.Invoke(compiledScript, new[] { VariableStore }); 253 217 } finally { 254 218 OnScriptExecutionFinished(); … … 264 228 } 265 229 266 private void compiled HLScript_ConsoleOutputChanged(object sender, EventArgs<string> e) {230 private void compiledScript_ConsoleOutputChanged(object sender, EventArgs<string> e) { 267 231 OnConsoleOutputChanged(e.Value); 268 232 }
Note: See TracChangeset
for help on using the changeset viewer.