Example #1
0
    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 ();
    }
Example #3
0
    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);
    }
Example #5
0
    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 ();
    }