public ClassGenerator(MemberInfoList memberInfoList, Type interfaceType, NameDefinition nameDefinition, IDefinition[] definitions)
 {
     this.interfaceType   = interfaceType;
     this.nameDefinition  = nameDefinition;
     this.definitions     = definitions;
     constructorGenerator = new ConstructorGenerator(nameDefinition.ClassName);
     propertiesGenerator  = new PropertyGenerators(memberInfoList.PropertyInfos, definitions);
     methodGenerators     = new MethodGenerators(
         memberInfoList.MethodInfos, memberInfoList.MethodIndexes, definitions);
     eventGenerators = new EventGenerators(memberInfoList.EventInfos, definitions);
 }
        public override ISerializerGenerator GetCustomSerializerGenerator(SerializerGenerationConfiguration config, string serializerProviderFullName, SourceFileMetadata generatedCodeMeta)
        {
            var generator = new StaticJsonCustomDeserializerGenerator(
                config.SerializersNameSpace,
                generatedCodeMeta,
                serializerProviderFullName
                );

            PropertyGenerators.Add(new RecursiveStaticSerializerGenerator(generator));

            return(generator);
        }
        /// <summary>
        /// Adds an initialized property generator to the factory.
        /// </summary>
        /// <param name="propertyGeneratorInstance"></param>
        protected void AddPropertyGenerator(BaseHqlGeneratorForProperty propertyGeneratorInstance)
        {
            PropertyGenerators.Add(propertyGeneratorInstance);
            foreach (PropertyInfo supportedSignature in propertyGeneratorInstance.SupportedProperties)
            {
                if (PropertySignatures.Contains(supportedSignature))
                {
                    throw new Exception(String.Format("Property signature {0} loaded by property hql generator {1} has already been added", supportedSignature, propertyGeneratorInstance));
                }

                PropertySignatures.Add(supportedSignature);
            }
        }
        public override IStaticSerializerResolver GetGenerator(
            SerializerGenerationConfiguration config,
            RoslynMetadataHelper metadataHelper,
            SourceFileMetadata generatedCodeMeta)
        {
            var generator = new StaticJsonSerializerGenerator(
                metadataHelper,
                config.SerializersNameSpace,
                config.DisableToUpperConstructor,
                PropertyFinder,
                PropertyGenerators,
                generatedCodeMeta
                );

            PropertyGenerators.Add(new RecursiveStaticSerializerGenerator(generator));

            return(generator);
        }
        /// <summary>
        /// Finds and instantiates all custom HQL generators defined in a given
        /// Assembly.
        /// </summary>
        /// <param name="targetAssembly">
        /// The Assembly that will be searched for any custom HQL generators.
        /// </param>
        public void AddGeneratorsFromAssembly(Assembly targetAssembly)
        {
            try
            {
                Type[] allTypes = targetAssembly.GetTypes();

                // Get all custom HQL generators defined in the target assembly
                var generatorTypes = allTypes.Where(t =>
                                                    (typeof(IHqlGeneratorForMethod).IsAssignableFrom(t) || typeof(IHqlGeneratorForProperty).IsAssignableFrom(t)) &&
                                                    !t.IsAbstract &&
                                                    !t.IsInterface);

                foreach (var generatorType in generatorTypes)
                {
                    var generator = Activator.CreateInstance(generatorType);

                    var methodGeneratorInstance = generator as BaseHqlGeneratorForMethod;
                    if (methodGeneratorInstance != null)
                    {
                        AddMethodGenerator(methodGeneratorInstance);
                    }

                    var propertyGeneratorInstance = generator as BaseHqlGeneratorForProperty;
                    if (propertyGeneratorInstance != null)
                    {
                        PropertyGenerators.Add(propertyGeneratorInstance);
                    }
                }
            }
            catch (ReflectionTypeLoadException ex)
            {
                var sb = new StringBuilder();
                foreach (var loadEx in ex.LoaderExceptions)
                {
                    sb.AppendLine(loadEx.Message);
                    sb.AppendLine(loadEx.ToString());
                }

                throw new HibernationException(string.Format("Error loading types for {0}: {1}", targetAssembly.FullName, sb), ex);
            }
        }