public ArrayDataType(DataType itemType)
 {
     this.ItemType = itemType;
 }
 public BodyOperationParameter(DataType dataTypeArgument, bool isRequired)
 {
     dataType = dataTypeArgument;
     IsRequired = isRequired;
 }
 public FormOperationParameter(DataType dataType, bool isRequired)
 {
     operationDataType = dataType;
     IsRequired = isRequired;
 }
 public MapDataType(DataType additionalPropertiesType)
 {
     this.AdditionalPropertiesType = additionalPropertiesType;
 }
        private DataType ResolveType(DataType t)
        {
            if (t is PrimitiveDataType)
            {
                // nothing to do, we're good!
                return t;
            }

            var reference = t as TypeReferenceDataType;
            if (reference != null)
            {
                DataType resolvedType = ResolveType(typesMap[Swagger20Parser.StripDefinitionPrefix(t.Name)]);
                typesMap[Swagger20Parser.StripDefinitionPrefix(t.Name)] = resolvedType;
                return resolvedType;
            }

            var compositeType = t as CompositeDataType;
            if (compositeType != null)
            {
                if (compositeType.Properties.All(p => !(p.Value is TypeReferenceDataType)))
                {
                    // No type refs, we're good!
                    return compositeType;
                }

                var resolvedType = new CompositeDataType(compositeType.Name,
                    compositeType.Properties.Select(p => 
                    {
                        if (p.Value is TypeReferenceDataType && p.Value.Name == compositeType.Name)
                        {
                            return new KeyValuePair<string, DataType>(p.Key, new SelfReferenceDataType());
                        }

                        return new KeyValuePair<string, DataType>(
                            p.Key, ResolveType(p.Value));
                    }), compositeType.Required);
                typesMap[resolvedType.Name] = resolvedType;
                return resolvedType;
            }

            var arrayType = t as ArrayDataType;
            if (arrayType != null)
            {
                if (arrayType.ItemType is TypeReferenceDataType)
                {
                    return new ArrayDataType(ResolveType(arrayType.ItemType));
                }

                return t;
            }

            var mapType = t as MapDataType;
            if (mapType != null)
            {
                if (mapType.AdditionalPropertiesType is TypeReferenceDataType)
                {
                    return new MapDataType(ResolveType(mapType.AdditionalPropertiesType));
                }

                return t;
            }

            throw new InvalidOperationException("Unknown data type, coding error!");
        }