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