public Type GetType(IOpenApiObjectToTypeService objectService,
                            IOpenApiUmbrellaTypeResolver typeResolver,
                            IObjectsProcessingKeyStore objectKeyStore,
                            OpenApiReferencedType referencedType,
                            IDictionary <string, IOpenApiType> definitions)
        {
            var typeName = _lastTokenService.GetLastToken(referencedType.Type);

            if (!CurrentTypeHolder.Types.TryGetValue(typeName, out var existingType))
            {
                if (!definitions.TryGetValue(typeName, out var definedNotCreated))
                {
                    throw new NotSupportedException($"Referenced type {typeName} is not defined in OpenApi document");
                }

                //handle circular reference
                objectKeyStore.ThrowIfPresent(typeName);

                var createdType = typeResolver.GetType(objectService,
                                                       objectKeyStore,
                                                       definedNotCreated,
                                                       definitions,
                                                       typeName);

                CurrentTypeHolder.Types[typeName] = createdType;

                return(createdType);
            }

            return(existingType);
        }
        public Type GetType(OpenApiObjectType inputObject,
                            IDictionary <string, IOpenApiType> definitions,
                            string name,
                            IObjectsProcessingKeyStore objectsKeyStore)
        {
            objectsKeyStore.ThrowIfPresent(name);

            var typeBuilder = _module.Builder.DefineType(name,
                                                         TypeAttributes.Public);

            objectsKeyStore.AddPresent(name);

            foreach (var property in inputObject.Properties)
            {
                var propName = property.Key;
                var propType = _typeResolver.GetType(this,
                                                     objectsKeyStore,
                                                     property.Value,
                                                     definitions,
                                                     $"{name}_{propName}");

                DefinePublicField(typeBuilder,
                                  propType,
                                  propName);
            }

            if (inputObject.AllOf != null && inputObject.AllOf.Any())
            {
                _fieldStealer.AddFields(this,
                                        objectsKeyStore,
                                        typeBuilder,
                                        inputObject.AllOf,
                                        definitions);
            }

            objectsKeyStore.RemovePresent(name);

            return(typeBuilder.CreateTypeInfo());
        }