private void Visit(ClassDefNode node, CodegenContext context) { var type = types.GetType(node.Name) as ClassType; context.CurrentClass = type; var classBuilder = builder.BuildClass(type); foreach (var item in node.Defs) { Visit(item, classBuilder, context); } }
private TypeDescriptor Visit(ClassDefNode node, Context context) { var type = context.GetType(node.Name) as ClassType; 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); context.Self = 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); }