public Module ConvertModule(Module module, CompilerContext context) {
            var dir = Path.GetDirectoryName(module.LexicalInfo.FileName);
            
            var clsname = Path.GetFileNameWithoutExtension(module.LexicalInfo.FileName).Replace("-", "_").Replace(".",
                                                                                                                  "__");
            var prefix = "L0_";
            if(dir.like(@"(?ix)[\\/]sys[\\/]?(extensions[\\/]?)$")) {
                prefix = "L1_";
            }
            else if(dir.like(@"(?ix)[\\/]mod[\\/]?(extensions[\\/]?)$")) {
                prefix = "L2_";
            }
            else if(dir.like(@"(?ix)[\\/]usr[\\/]?(extensions[\\/]?)$")) {
                prefix = "L3_";
            }
            prefix += Path.GetFileName(dir) + "_";
            clsname = prefix + clsname;
            //clsname - имя класса, который инкапсулирует в себе тело модуля и является настройщиком реестра
            var methodbody = (Block) module.Globals.Clone();
            //method body - участок модуля с выполняемым кодом
            module.Globals = new Block();
            foreach (var n in getmacronamespaces(context))
            {
                module.Imports.Add(new Import(n.Item2, new ReferenceExpression(n.Item1.GetName().Name), null));
            }
            //зачищаем глобальную область модуля
            module.Imports.Add(new Import("Comdiv.Extensibility.IRegistryLoader", new ReferenceExpression("Comdiv.Core"),
                                          new ReferenceExpression("_IRL_")));
            module.Imports.Add(new Import("System.Collections.Generic",
                                          new ReferenceExpression("System"), null));
            //гарантируем присутствие интерфейса IRegistryLoader в импорте и IDictionary<string,string>
            var newclass = new ClassDefinition();
            newclass.Name = clsname;
            newclass.BaseTypes.Add(new SimpleTypeReference("_IRL_"));
            //класс реализует интерфейс IRegistryLoader
            var method = new Method("Load");
            var dictref = new GenericTypeReference();
            dictref.Name = "System.Collections.Generic.IDictionary";
            dictref.GenericArguments.Add(new SimpleTypeReference("string"));
            dictref.GenericArguments.Add(new SimpleTypeReference("object"));
            method.Parameters.Add(new ParameterDeclaration("registry", dictref));
            method.Body = methodbody;
            //формируем соотвествующий метод

            //теперь отправляем все глобальные функции в наш класс
            foreach (var function in module.Members.OfType<Method>().ToArray()) {
                newclass.Members.Add((Method) function.Clone());
                module.Members.Remove(function);
            }


            newclass.Members.Add(method);


            //добавляем его в класс
            module.Members.Add(newclass);
            //отправляем готовый класс обратно в модуль

            module.Annotate("regmethod", method.Body);

            return module;
        }
Esempio n. 2
0
 public static bool TryToEnableOn(Module module, string pragma)
 {
     module.Annotate(pragma, true);
     return !module.ContainsAnnotation(pragma);
 }