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; }
public static bool TryToEnableOn(Module module, string pragma) { module.Annotate(pragma, true); return !module.ContainsAnnotation(pragma); }