public void Compile(Action <Assembly> onAssemblyCompiled) { string sourceCode = string.Concat(csharpSources.ToArray()); //UnityEngine.GameObject.Find ("SourceCode").GetComponent<Text> ().text = sourceCode; System.IO.File.WriteAllText((BasicLoader.IsInEditor ? "Assets/" : BasicLoader.ProjectPrefix + "_Data/") + "StreamingAssets/Code/SourceCode.cs", sourceCode); onAssemblyCompiled(loader.Load(csharpSources.ToArray(), "Content")); }
public void Setup(Action onCompiled) { this.onCompiled = onCompiled; CodeTypeDeclaration decl = new CodeTypeDeclaration("External"); CodeMemberMethod init = new CodeMemberMethod(); init.Attributes = MemberAttributes.Public | MemberAttributes.Static; init.Name = "Init"; init.Statements.Add(new CodeSnippetStatement("UnityEngine.Debug.LogWarning(\"External functions class initialization\");")); decl.Members.Add(init); decl.Members.Add(new CodeSnippetTypeMember("static External(){UnityEngine.Debug.LogWarning(\"CTOR\" + BasicLoader0);}")); // CodeConstructor ctor = new CodeConstructor (); // ctor.Attributes = MemberAttributes.Static; // ctor.Statements.Add (new CodeSnippetStatement ("")); // decl.Members.Add (ctor); decl.Attributes = MemberAttributes.Public | MemberAttributes.Static; MaxProgress = (from p in providers select p.Members.Length).Sum(); foreach (var provider in providers) { if (!Engine.Working) { Thread.CurrentThread.Abort(); } var providerType = provider.Instance.GetType(); var providerName = provider.Name; var field = new CodeMemberField(providerType, providerName); field.Attributes = MemberAttributes.Private | MemberAttributes.Static; decl.Members.Add(field); foreach (var member in provider.Members) { CurProgress++; var methodInfo = providerType.GetMethod(member, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); if (methodInfo != null) { CodeMemberMethod method = new CodeMemberMethod(); method.Name = member; method.Attributes = MemberAttributes.Public | MemberAttributes.Static; method.ReturnType = new CodeTypeReference(methodInfo.ReturnType); var args = methodInfo.GetParameters(); builder.Length = 0; if (methodInfo.ReturnType != null && methodInfo.ReturnType != typeof(void)) { builder.Append("return "); } if (methodInfo.IsStatic) { builder.Append(methodInfo.DeclaringType).Append('.'); provider.Instance = null; } else { builder.Append(providerName).Append('.'); } builder.Append(member).Append('('); foreach (var arg in args) { builder.Append(arg.Name).Append(','); method.Parameters.Add(new CodeParameterDeclarationExpression(arg.ParameterType, arg.Name)); } if (args.Length > 0) { builder.Length -= 1; } builder.Append(");"); method.Statements.Add(new CodeSnippetStatement(builder.ToString())); decl.Members.Add(method); } else { var propInfo = providerType.GetProperty(member); if (propInfo != null) { CodeMemberProperty prop = new CodeMemberProperty(); prop.Attributes = MemberAttributes.Public | MemberAttributes.Static; prop.Name = member; prop.Type = new CodeTypeReference(propInfo.PropertyType); prop.GetStatements.Add(new CodeSnippetStatement(String.Format("return {0}.{1};", providerName, member))); if (propInfo.CanWrite && propInfo.GetSetMethod() != null && propInfo.GetSetMethod().IsPublic) { prop.SetStatements.Add(new CodeSnippetStatement(String.Format(" {0}.{1} = value;", providerName, member))); } decl.Members.Add(prop); } else { Debug.LogFormat("No such member {0} in {1}", member, providerType); } } } } CurProgress = MaxProgress; CSharpCodeProvider codeProvider = new CSharpCodeProvider(); CodeGeneratorOptions options = new CodeGeneratorOptions(); var writer = new StringWriter(); codeProvider.GenerateCodeFromType(decl, writer, options); Debug.Log(writer.ToString()); OnCompiled(loader.Load(new string[] { writer.ToString() }, "ExternalCode")); //onCompiled (); }
public override void Interpret(Script script) { foreach (var entry in script.Entries) { CodeTypeDeclaration bbType = null; if (!codeTypes.TryGetValue(entry.Identifier as string, out bbType)) { bbType = new CodeTypeDeclaration(entry.Identifier as string); if (entry.Args.Count == 1) { bbType.BaseTypes.Add(new CodeTypeReference(typeof(ScriptableObject))); } else { bbType.BaseTypes.Add(new CodeTypeReference(typeof(MonoBehaviour))); } cNamespace.Types.Add(bbType); codeTypes.Add(entry.Identifier as string, bbType); } if (entry.Context is Context) { foreach (var fieldOp in (entry.Context as Context).Entries) { var op = fieldOp as Operator; var typeName = (((op.Context as Expression).Operands[0] as ExprAtom).Content as Scope).Parts[0] as string; CodeMemberField field = null; CodeMemberProperty prop = new CodeMemberProperty(); prop.HasGet = true; prop.HasSet = true; prop.GetStatements.Add(new CodeSnippetStatement(String.Format("return {0}; ", op.Identifier))); if ((typeName == "float" || typeName == "int") && op.Args.Count == 2) { var clampMin = op.Args[0].ToString(); var clampMax = op.Args[1].ToString(); prop.SetStatements.Add(new CodeSnippetStatement(String.Format("{0} = ({3})UnityEngine.Mathf.Clamp(value, {1}, {2}); ", op.Identifier, clampMin, clampMax, typeName))); } else { prop.SetStatements.Add(new CodeSnippetStatement(String.Format("{0} = value; ", op.Identifier))); } prop.Name = NameTranslator.CSharpNameFromScript(op.Identifier as string); bbType.Members.Add(prop); if (typeName == null) { var listFunc = (((op.Context as Expression).Operands [0] as ExprAtom).Content as Scope).Parts [0] as FunctionCall; typeName = ((listFunc.Args [0].Operands [0] as ExprAtom).Content as Scope).Parts [0] as string; if (ScriptEngine.AnalyzeDebug) { Debug.Log("LIST: " + typeName); } var listType = String.Format("System.Collections.Generic.List<{0}>", types [typeName]); field = new CodeMemberField(new CodeTypeReference(listType), op.Identifier as string); field.InitExpression = new CodeSnippetExpression(String.Format("new {0}()", listType)); } else { if (ScriptEngine.AnalyzeDebug) { Debug.Log(typeName); } field = new CodeMemberField(types [typeName], op.Identifier as string); } field.Attributes = MemberAttributes.Public; prop.Type = field.Type; prop.Attributes = MemberAttributes.Public; bbType.Members.Add(field); } } } CSharpCodeProvider codeProvider = new CSharpCodeProvider(); CodeGeneratorOptions options = new CodeGeneratorOptions(); var writer = new StringWriter(); codeProvider.GenerateCodeFromNamespace(cNamespace, writer, options); Debug.Log(writer.ToString()); OnCompiled(loader.Load(new string[] { writer.ToString() }, "BlackboardsData")); //onCompiled (); }
public override void Interpret(Script script) { MaxProgress = script.Entries.Count; for (int i = 0; i < script.Entries.Count; i++) { if (!Engine.Working) { Thread.CurrentThread.Abort(); } CurProgress = i; var entry = script.Entries [i]; CodeTypeDeclaration codeType = new CodeTypeDeclaration(); //codeType.CustomAttributes. codeType.BaseTypes.Add(new CodeTypeReference(typeof(LocalisationTag))); codeType.Name = entry.Identifier as string + i; codeTypes.Add(codeType); if (ScriptEngine.AnalyzeDebug) { Debug.LogWarning((entry.Identifier as string).ToUpper()); } var ctx = entry.Context as Context; bool hasValue = false; var utMethod = typeof(LocalisationTag).GetMethod("Utility"); var scopeMethod = typeof(LocalisationTag).GetMethod("Filter"); var valMethod = typeof(LocalisationTag).GetMethod("Value"); CodeAttributeDeclaration attr = new CodeAttributeDeclaration("LocalisationTagAttribute"); codeType.CustomAttributes.Add(attr); CodeAttributeArgument typeArg = new CodeAttributeArgument("Type", new CodeSnippetExpression("\"{0}\"".Fmt(entry.Identifier as string))); attr.Arguments.Add(typeArg); FunctionBlock dependenciesBlock = new FunctionBlock(null, null, codeType); if (ctx != null) { for (int j = 0; j < ctx.Entries.Count; j++) { var op = ctx.Entries[j] as Operator; if (op != null) { if (op.Identifier as string == "scope") { //It's a filter function // Debug.Log (op.Context.GetType ()); if (ScriptEngine.AnalyzeDebug) { Debug.Log((op.Context as Expression).Operands[0].GetType()); } (((op.Context as Expression).Operands[0] as ExprAtom).Content as Scope).Parts.Add("true"); DeclareVariableStatement retVal = new DeclareVariableStatement(); retVal.IsReturn = true; retVal.Name = "applicable"; retVal.Type = typeof(bool); retVal.InitExpression = "false"; CreateEventFunction("Filter", op.Context, codeType, scopeMethod, retVal); //CreateFilterFunction (op.Context as Expression, codeType); } else if (op.Identifier as string == "value") { hasValue = true; DeclareVariableStatement utVal = new DeclareVariableStatement(); utVal.IsReturn = true; utVal.Name = "val"; utVal.Type = typeof(string); utVal.InitExpression = "\"\""; CreateEventFunction(op.Identifier as string, op.Context, codeType, valMethod, utVal); } else if (op.Identifier as string == "utility") { DeclareVariableStatement utVal = new DeclareVariableStatement(); utVal.IsReturn = true; utVal.Name = "ut"; utVal.Type = typeof(float); utVal.InitExpression = "0"; CreateEventFunction(op.Identifier as string, op.Context, codeType, utMethod, utVal); } else { //No idea } } } } else { (((entry.Context as Expression).Operands[0] as ExprAtom).Content as Scope).Parts.Add("true"); DeclareVariableStatement retVal = new DeclareVariableStatement(); retVal.IsReturn = true; retVal.Name = "applicable"; retVal.Type = typeof(bool); retVal.InitExpression = "false"; CreateEventFunction("Filter", entry.Context, codeType, scopeMethod, retVal); } if (!hasValue) { CodeMemberMethod method = new CodeMemberMethod(); method.Name = "Value"; method.Attributes = MemberAttributes.Override | MemberAttributes.Public; method.ReturnType = new CodeTypeReference(typeof(string)); method.Statements.Add(new CodeSnippetStatement("return \"" + entry.Args[0].ToString().ClearFromBraces().Trim(' ') + "\";")); codeType.Members.Add(method); } } CurProgress = MaxProgress; foreach (var type in codeTypes) { cNamespace.Types.Add(type); } CSharpCodeProvider provider = new CSharpCodeProvider(); CodeGeneratorOptions options = new CodeGeneratorOptions(); var writer = new StringWriter(); provider.GenerateCodeFromNamespace(cNamespace, writer, options); Debug.Log(writer.ToString()); var asm = loader.Load(new string[] { writer.ToString() }, "LocalisationTags"); if (ScriptEngine.AnalyzeDebug) { Debug.LogWarning(asm.FullName); } Engine.AddAssembly(asm); }
public override void Interpret(Script script) { List <string> listExtensions = new List <string>(); foreach (var entry in script.Entries) { CodeTypeDeclaration dbElement = null; if (!codeTypes.TryGetValue(entry.Identifier as string, out dbElement)) { dbElement = new CodeTypeDeclaration(entry.Identifier as string); cNamespace.Types.Add(dbElement); dbElement.BaseTypes.Add(baseType); codeTypes.Add(entry.Identifier as string, dbElement); } var props = baseType.GetProperties(); foreach (var propInfo in props) { var prop = new CodeMemberProperty(); prop.HasGet = true; prop.HasSet = true; prop.Name = propInfo.Name; prop.Type = new CodeTypeReference(propInfo.PropertyType); var fieldName = NameTranslator.ScriptNameFromCSharp(prop.Name); prop.GetStatements.Add(new CodeSnippetStatement(String.Format("return {0}; ", fieldName))); prop.SetStatements.Add(new CodeSnippetStatement(String.Format("{0} = value; ", fieldName))); prop.PrivateImplementationType = new CodeTypeReference(baseType); if (!dbElement.UserData.Contains(fieldName)) { var field = new CodeMemberField(); field.Name = fieldName; field.Type = new CodeTypeReference(propInfo.PropertyType); dbElement.Members.Add(field); dbElement.UserData.Add(fieldName, field); field.UserData.Add("type", propInfo.PropertyType); } dbElement.Members.Add(prop); } if (entry.Context is Context) { foreach (var fieldOp in (entry.Context as Context).Entries) { var op = fieldOp as Operator; var typeName = (((op.Context as Expression).Operands[0] as ExprAtom).Content as Scope).Parts[0] as string; CodeMemberField field = null; CodeMemberProperty prop = new CodeMemberProperty(); prop.HasGet = true; prop.HasSet = true; prop.GetStatements.Add(new CodeSnippetStatement(String.Format("return {0}; ", op.Identifier))); if ((typeName == "float" || typeName == "int") && op.Args.Count == 2) { var clampMin = op.Args[0].ToString(); var clampMax = op.Args[1].ToString(); prop.SetStatements.Add(new CodeSnippetStatement(String.Format("{0} = ({3})UnityEngine.Mathf.Clamp(value, {1}, {2}); ", op.Identifier, clampMin, clampMax, typeName))); } else { prop.SetStatements.Add(new CodeSnippetStatement(String.Format("{0} = value; ", op.Identifier))); } prop.Name = NameTranslator.CSharpNameFromScript(op.Identifier as string); if (typeName == null) { var listFunc = (((op.Context as Expression).Operands[0] as ExprAtom).Content as Scope).Parts[0] as FunctionCall; typeName = ((listFunc.Args[0].Operands[0] as ExprAtom).Content as Scope).Parts[0] as string; if (ScriptEngine.AnalyzeDebug) { Debug.Log("LIST: " + typeName); } var listType = String.Format("System.Collections.Generic.List<{0}>", types[typeName]); field = new CodeMemberField(new CodeTypeReference(listType), op.Identifier as string); field.InitExpression = new CodeSnippetExpression(String.Format("new {0}()", listType)); } else { if (ScriptEngine.AnalyzeDebug) { Debug.Log(typeName); } field = new CodeMemberField(types[typeName], op.Identifier as string); } field.Attributes = MemberAttributes.Public; prop.Type = field.Type; prop.Attributes = MemberAttributes.Public | MemberAttributes.Final; dbElement.Members.Add(prop); dbElement.Members.Add(field); } } //OnAdd, OnRemove var elementName = (entry.Identifier as string).CSharp(); var onAddEvent = new CodeTypeDeclaration(elementName + "Added"); onAddEvent.BaseTypes.Add(new CodeTypeReference(typeof(DelayedEvent))); var onRemoveEvent = new CodeTypeDeclaration(elementName + "Removed"); onRemoveEvent.BaseTypes.Add(new CodeTypeReference(typeof(DelayedEvent))); var elementProp = new CodeMemberProperty(); elementProp.Name = "Fact"; elementProp.Attributes = MemberAttributes.Public | MemberAttributes.Final; elementProp.Type = new CodeTypeReference(dbElement.Name); var elementField = new CodeMemberField(); elementField.Name = "fact"; elementField.Type = new CodeTypeReference(dbElement.Name); elementProp.HasGet = true; elementProp.HasSet = true; elementProp.SetStatements.Add(new CodeSnippetStatement("fact = value;")); elementProp.GetStatements.Add(new CodeSnippetStatement("return fact;")); onAddEvent.Members.Add(elementProp); onAddEvent.Members.Add(elementField); onRemoveEvent.Members.Add(elementProp); onRemoveEvent.Members.Add(elementField); cNamespace.Types.Add(onAddEvent); cNamespace.Types.Add(onRemoveEvent); //Get\Query[Type], Add[Type], Remove[Type], Remove[Type]Where, Has[Type], Has[Type]Where var getThisTypeMethod = new CodeMemberProperty(); getThisTypeMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final; getThisTypeMethod.Name = "Get" + NameTranslator.CSharpNameFromScript(dbElement.Name); getThisTypeMethod.HasGet = true; getThisTypeMethod.HasSet = false; getThisTypeMethod.Type = new CodeTypeReference(string.Format("System.Collections.Generic.List<ScriptedTypes.{0}>", dbElement.Name)); getThisTypeMethod.GetStatements.Add(new CodeSnippetStatement( string.Format("var list = this.Get<ScriptedTypes.{0}>(); return list;", dbElement.Name))); dbComponentType.Members.Add(getThisTypeMethod); if (returnedLists.Add(dbElement.Name)) { var listExt = string.Format("public static class {0} {{ static ObjectPool<System.Collections.Generic.List<ScriptedTypes.{1}>> pool = new ObjectPool<System.Collections.Generic.List<ScriptedTypes.{1}>>(); {2} }}", dbElement.Name + "ListExt", dbElement.Name, string.Format("public static System.Collections.Generic.List<ScriptedTypes.{0}> Get() {{ var list = pool.Get(); list.Clear(); return list; }} public static void Return(this System.Collections.Generic.List<ScriptedTypes.{0}> list){{pool.Return(list);}}", dbElement.Name)); listExtensions.Add(listExt); } var queryThisTypeMethod = new CodeMemberMethod(); queryThisTypeMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final; queryThisTypeMethod.Name = "Query" + NameTranslator.CSharpNameFromScript(dbElement.Name); CodeTypeDelegate del = new CodeTypeDelegate(dbElement.Name + "_queryDelegate"); del.ReturnType = new CodeTypeReference(typeof(bool)); del.Parameters.Add(new CodeParameterDeclarationExpression("ScriptedTypes." + dbElement.Name, NameTranslator.ScriptNameFromCSharp(baseType.Name))); cNamespace.Types.Add(del); queryThisTypeMethod.Parameters.Add(new CodeParameterDeclarationExpression(dbElement.Name + "_queryDelegate", "queryDel")); queryThisTypeMethod.ReturnType = new CodeTypeReference(string.Format("System.Collections.Generic.List<ScriptedTypes.{0}>", dbElement.Name)); queryThisTypeMethod.Statements.Add(new CodeSnippetStatement( string.Format("var list = this.Get<ScriptedTypes.{0}>(); if(list == null) return list; var queryList = {1}.Get(); foreach(var e in list) if (queryDel(e)) queryList.Add(e); return queryList;", dbElement.Name, dbElement.Name + "ListExt"))); dbComponentType.Members.Add(queryThisTypeMethod); var deleteWhere = new CodeMemberMethod(); deleteWhere.Attributes = MemberAttributes.Public | MemberAttributes.Final; deleteWhere.Name = "Delete" + NameTranslator.CSharpNameFromScript(dbElement.Name) + "Where"; deleteWhere.Parameters.Add(new CodeParameterDeclarationExpression(dbElement.Name + "_queryDelegate", "queryDel")); deleteWhere.Statements.Add(new CodeSnippetStatement( string.Format("var list = this.Get<ScriptedTypes.{0}>(); if(list == null) return; for(int i =0; i < list.Count; i++) if(queryDel(list[i])) {{ var e = EventsManager.Instance.GetEvent<ScriptedTypes.{1}>(); e.Root = gameObject; e.Fact = list[i]; EventsManager.Instance.FireEvent(e); list.RemoveAt(i); i--; }}", dbElement.Name, onRemoveEvent.Name))); dbComponentType.Members.Add(deleteWhere); var delete = new CodeMemberMethod(); delete.Attributes = MemberAttributes.Public | MemberAttributes.Final; delete.Name = "Delete" + NameTranslator.CSharpNameFromScript(dbElement.Name); delete.Parameters.Add(new CodeParameterDeclarationExpression(dbElement.Name, "obj")); delete.Statements.Add(new CodeSnippetStatement( string.Format("var list = this.Get<ScriptedTypes.{0}>(); if(list != null) {{ list.Remove(obj); var e = EventsManager.Instance.GetEvent<ScriptedTypes.{1}>(); e.Root = gameObject; e.Fact = obj; EventsManager.Instance.FireEvent(e);}} ", dbElement.Name, onRemoveEvent.Name))); dbComponentType.Members.Add(delete); var add = new CodeMemberMethod(); add.Attributes = MemberAttributes.Public | MemberAttributes.Final; add.Name = "Add" + NameTranslator.CSharpNameFromScript(dbElement.Name); add.ReturnType = new CodeTypeReference("ScriptedTypes." + dbElement.Name); add.Statements.Add(new CodeSnippetStatement( string.Format("var list = this.Get<ScriptedTypes.{0}>(); if(list == null) {{ list = ScriptedTypes.{0}ListExt.Get(); data.Add(typeof(ScriptedTypes.{0}), list); }} var e = new ScriptedTypes.{0}(); list.Add(e); var ev = EventsManager.Instance.GetEvent<ScriptedTypes.{1}>(); ev.Root = gameObject; ev.Fact = e; EventsManager.Instance.FireEvent(ev); return e;", dbElement.Name, onAddEvent.Name))); dbComponentType.Members.Add(add); var has = new CodeMemberMethod(); has.Attributes = MemberAttributes.Public | MemberAttributes.Final; has.Name = "Has" + NameTranslator.CSharpNameFromScript(dbElement.Name); has.ReturnType = new CodeTypeReference(typeof(bool)); has.Statements.Add(new CodeSnippetStatement( string.Format("var list = this.Get<ScriptedTypes.{0}>(); return list != null;", dbElement.Name))); dbComponentType.Members.Add(has); var hasWhere = new CodeMemberMethod(); hasWhere.Attributes = MemberAttributes.Public | MemberAttributes.Final; hasWhere.Name = "Has" + NameTranslator.CSharpNameFromScript(dbElement.Name) + "Where"; hasWhere.ReturnType = new CodeTypeReference(typeof(bool)); hasWhere.Parameters.Add(new CodeParameterDeclarationExpression(dbElement.Name + "_queryDelegate", "queryDel")); hasWhere.Statements.Add(new CodeSnippetStatement( string.Format("var list = this.Get<ScriptedTypes.{0}>(); if(list == null) return false; for(int i =0; i < list.Count; i++) if(queryDel(list[i])) return true; return false;", dbElement.Name))); dbComponentType.Members.Add(hasWhere); } CSharpCodeProvider codeProvider = new CSharpCodeProvider(); CodeGeneratorOptions options = new CodeGeneratorOptions(); var writer = new StringWriter(); codeProvider.GenerateCodeFromNamespace(cNamespace, writer, options); if (listExtensions.Count > 0) { writer.WriteLine("namespace ScriptedTypes {"); foreach (var listExt in listExtensions) { writer.WriteLine(listExt); } writer.WriteLine("}"); } Debug.Log(writer.ToString()); OnCompiled(loader.Load(new string[] { writer.ToString() }, "AgentsDatabases_" + baseType.Name)); //onCompiled (); }