Example #1
0
        public void Add(Type type)
        {
            var foreignClass = new ForeignClass(type);

            classes.Add(foreignClass.Name, foreignClass);

            source.AppendLine(foreignClass.Source);
        }
Example #2
0
        /// <summary>
        /// Automatically maps the given types to make their marked interfaces accessible from Wren.
        /// If the module name is the <see cref="WrenVM.InterpetModule"/>, the code will be interpreted immediately.
        /// </summary>
        /// <param name="vm">The <see cref="WrenVM"/> to make the types available to.</param>
        /// <param name="moduleName">The name of the module to place the types into.</param>
        /// <param name="targets">The types to map.</param>
        public static void AutoMap(this WrenVM vm, string moduleName, params Type[] targets)
        {
            checkInitialization(vm);

            if (moduleName == WrenVM.InterpetModule)
            {
                var classes = mainModuleClasses.GetValue(vm, _ => null);

                foreach (var target in targets)
                {
                    var foreignClass = new ForeignClass(target);

                    classes.Add(foreignClass.Name, foreignClass);

                    vm.Interpret(foreignClass.Source);
                }

                return;
            }

            var modules = generatedModules.GetValue(vm, _ => null);

            ForeignModule module;

            if (modules.ContainsKey(moduleName))
            {
                module = modules[moduleName];

                if (module.Used && TreatModificationAfterLoadAsError)
                {
                    throw new LoadedModuleModifiedException(moduleName);
                }
            }
            else
            {
                module = new ForeignModule();
                modules.Add(moduleName, module);
            }

            foreach (var target in targets)
            {
                module.Add(target);
            }
        }