private void FillContext(IEnumerable <IFileInfo> sources, ApplicationModelProviderContext context)
        {
            var reflector = new TypeReflectionEngine();

            MachineInstance.Current.PrepareThread(_fw.Environment);
            foreach (var virtualPath in sources)
            {
                LoadedModule       module;
                FileInfoCodeSource codeSrc;
                string             typeName;
                if (virtualPath.IsDirectory)
                {
                    var info = FindModule(virtualPath.Name, MODULE_FILENAME)
                               ?? FindModule(virtualPath.Name, virtualPath.Name + ".os");

                    if (info == null)
                    {
                        continue;
                    }

                    codeSrc  = new FileInfoCodeSource(info);
                    typeName = virtualPath.Name;
                }
                else
                {
                    codeSrc  = new FileInfoCodeSource(virtualPath);
                    typeName = System.IO.Path.GetFileNameWithoutExtension(virtualPath.Name);
                }

                module = CompileControllerModule(codeSrc);

                var reflectedType = reflector.Reflect <ScriptedController>(module, typeName);
                var attrList      = MapAnnotationsToAttributes(_classAttribResolver.Attributes);
                var cm            = new ControllerModel(typeof(ScriptedController).GetTypeInfo(), attrList.AsReadOnly());
                cm.ControllerName = reflectedType.Name;
                var recompileInfo = new DynamicCompilationInfo()
                {
                    Module     = module,
                    CodeSource = codeSrc,
                    Tag        = cm
                };

                cm.Properties.Add("CompilationInfo", recompileInfo);
                cm.Properties.Add("type", reflectedType);

                ChangeToken.OnChange(() => CreateWatchToken(codeSrc),
                                     RecompileController,
                                     recompileInfo);

                FillActions(cm, reflectedType);
                FillFilters(cm);

                context.Result.Controllers.Add(cm);
            }
        }
Exemplo n.º 2
0
        private void FillContext(IEnumerable <IFileInfo> sources, ApplicationModelProviderContext context)
        {
            var reflector = new TypeReflectionEngine();

            _fw.Environment.LoadMemory(MachineInstance.Current);
            foreach (var virtualPath in sources)
            {
                LoadedModule module;
                ICodeSource  codeSrc;
                string       typeName;
                if (virtualPath.IsDirectory)
                {
                    var info = FindModule(virtualPath.Name, MODULE_FILENAME)
                               ?? FindModule(virtualPath.Name, virtualPath.Name + ".os");

                    if (info == null)
                    {
                        continue;
                    }

                    codeSrc  = new FileInfoCodeSource(info);
                    typeName = virtualPath.Name;
                }
                else
                {
                    codeSrc  = new FileInfoCodeSource(virtualPath);
                    typeName = System.IO.Path.GetFileNameWithoutExtension(virtualPath.Name);
                }

                try
                {
                    _classAttribResolver.BeforeCompilation();
                    module = LoadControllerCode(codeSrc);
                }
                finally
                {
                    _classAttribResolver.AfterCompilation();
                }

                var reflectedType = reflector.Reflect <ScriptedController>(module, typeName);
                var attrList      = MapAnnotationsToAttributes(_classAttribResolver.Attributes);
                var cm            = new ControllerModel(typeof(ScriptedController).GetTypeInfo(), attrList.AsReadOnly());
                cm.ControllerName = reflectedType.Name;
                cm.Properties.Add("module", module);
                cm.Properties.Add("type", reflectedType);

                FillActions(cm, reflectedType);
                FillFilters(cm);

                context.Result.Controllers.Add(cm);
            }
        }
        public void ReflectExportedVariablesAsPublicProperties()
        {
            lock (TestOrderingLock.Lock)
            {
                var  code   = "Перем А; Перем Б Экспорт;";
                var  module = CreateModule(code);
                var  r      = new TypeReflectionEngine();
                Type type   = r.Reflect(module, "MyType");

                var props = type.GetProperties(System.Reflection.BindingFlags.Public);
                Assert.Equal(type.Name, "MyType");
                Assert.Equal(1, props.Length);
                Assert.Equal("Б", props[0].Name);
            }
        }
        public void ReflectExportedVariablesAsPublicFields()
        {
            lock (TestOrderingLock.Lock)
            {
                var  code   = "Перем А; Перем Б Экспорт;";
                var  module = CreateModule(code);
                var  r      = new TypeReflectionEngine();
                Type type   = r.Reflect <UserScriptContextInstance>(module, "MyType");

                var props = type.GetFields();
                Assert.Equal("MyType", type.Name);
                Assert.Single(props);
                Assert.Equal("Б", props[0].Name);
                Assert.True(props[0].IsPublic);
            }
        }
        private void FillContext(IEnumerable <string> sources, ApplicationModelProviderContext context)
        {
            var attrList  = new List <string>();
            var reflector = new TypeReflectionEngine();

            foreach (var virtualPath in sources)
            {
                var codeSrc      = _scriptsProvider.Get(virtualPath);
                var module       = LoadControllerCode(codeSrc);
                var baseFileName = System.IO.Path.GetFileNameWithoutExtension(codeSrc.SourceDescription);
                var type         = reflector.Reflect(module, baseFileName);
                var cm           = new ControllerModel(typeof(ScriptedController).GetTypeInfo(), attrList.AsReadOnly());
                cm.ControllerName = type.Name;
                cm.Properties.Add("module", module);
                cm.Properties.Add("type", type);
                FillActions(cm, type, GetExportedMethods(module));

                context.Result.Controllers.Add(cm);
            }
        }