Пример #1
0
        public Type BuildTypeFromParent(String newTypeName, Type sourceContent, StringBuilder writer, IBuildVisitorDelegate buildVisitorDelegate)
        {
            newTypeName = GetBytecodeTypeName(newTypeName);

            StringBuilder sb = new StringBuilder();

            ClassWriter cw = BeanContext.RegisterWithLifecycle(new ClassWriter(ambethClassLoader, sb)).Finish();

            IClassVisitor visitor = cw;// new SuppressLinesClassVisitor(cw);

            visitor = new LogImplementationsClassVisitor(visitor);
            //visitor = new TraceClassVisitor(visitor, sb);
            IClassVisitor wrappedVisitor    = visitor;
            Type          originalModifiers = BytecodeBehaviorState.State.OriginalType;

            if (originalModifiers.IsInterface || originalModifiers.IsAbstract)
            {
                wrappedVisitor = new InterfaceToClassVisitor(wrappedVisitor);
            }
            if (!PublicConstructorVisitor.HasValidConstructor())
            {
                wrappedVisitor = new PublicConstructorVisitor(wrappedVisitor);
            }
            wrappedVisitor = buildVisitorDelegate.Invoke(wrappedVisitor);

            if (Object.ReferenceEquals(wrappedVisitor, visitor))
            {
                // there seem to be no custom action to be done with the new type. So we skip type enhancement
                return(null);
            }
            visitor = wrappedVisitor;

            visitor.Visit(sourceContent.Attributes, newTypeName, sourceContent, new Type[0]);

            Type content = null;

            try
            {
                visitor.VisitEnd();
                content = cw.GetCreatedType();
            }
            catch (Exception)
            {
                Log.Error(sb.ToString());
                throw;
            }
            if (content == null)
            {
                throw new Exception("A visitor did not correctly call its cascaded visitor with VisitEnd()");
            }
            //Verify(content);
            return(content);
        }