Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
        }