private void Visit(PackageDefNode node, CodegenContext context) { var packageType = types.GetType(node.Name) as PackageType; var packageBuilder = builder.BuildPackage(packageType); foreach (var item in node.Defs) { Visit(item, packageBuilder, context); } }
private TypeDescriptor Visit(PackageDefNode node, Context context) { var type = context.GetType(node.Name) as PackageType; if (type == null) { Log(string.Format("Пакет {0} определяет тело, но не определяет интерфейс", node.Name), node); return(null); } if (!context.NotImplementedTypes.Contains(type)) { Log(String.Format("Пакет {0} уже определил тело", node.Name), node); return(null); } context.NotImplementedTypes.Remove(type); List <MethodInfo> allMethods = new List <MethodInfo>(type.Methods); foreach (var item in node.Defs) { var method = Visit(item, type, context); if (method != null) { allMethods.RemoveAll(x => x.Name == method.Name && TypeInfo.Compare(x.ArgTypes, method.ArgTypes) && x.IsStatic == method.IsStatic); } } if (allMethods.Count != 0) { string methods = allMethods .Aggregate("", (current, item) => current + (item.Name + " ")); Log(string.Format("В пакете {0} методы {1} объявлены, но не реализованы", node.Name, methods), node); } return(null); }