public void DecorateClass(CodeTypeDeclaration typeDeclaration, ISchema schema, IDictionary<JsonSchema, SchemaImplementationDetails> implDetails, INestedClassProvider internalClassProvider) { typeDeclaration.ThrowIfNull("typeDeclaration"); schema.ThrowIfNull("schema"); implDetails.ThrowIfNull("implDetails"); internalClassProvider.ThrowIfNull("internalClassProvider"); JsonSchema details = schema.SchemaDetails; details.ThrowIfNull("schemaDetails"); // Check if this decorator can be applied to the schema); if (details.Type != JsonSchemaType.Array) { return; } if (details.Items == null || details.Items.Count != 1) { logger.Warning("Found array scheme of unhandled type. {0}", details); return; // not supported } // Generate or find the nested type JsonSchema itemScheme = details.Items[0]; SchemaImplementationDetails implDetail = implDetails[itemScheme]; implDetail.ProposedName = "Entry"; // Change the name to a custom one. CodeTypeReference item = SchemaDecoratorUtil.GetCodeType(itemScheme, implDetail, internalClassProvider); // Insert the base type before any interface declaration var baseType = string.Format("List<{0}>", item.BaseType); typeDeclaration.BaseTypes.Insert(0, new CodeTypeReference(baseType)); }
public void DecorateClass(IService service, CodeTypeDeclaration serviceClass) { serviceClass.ThrowIfNull("serviceClass"); serviceClass.Members.Add(CreateRegisterSerializer()); serviceClass.Members.Add(CreateObjectToJson()); serviceClass.Members.Add(CreateResponseToObject()); }
public void DecorateClass(IResource resource, string className, CodeTypeDeclaration resourceClass, ResourceClassGenerator generator, string serviceClassName, IEnumerable<IResourceDecorator> allDecorators) { resource.ThrowIfNull("resource"); className.ThrowIfNull("className"); resourceClass.ThrowIfNull("resourceClass"); generator.ThrowIfNull("generator"); serviceClassName.ThrowIfNull("serviceClassName"); allDecorators.ThrowIfNull("allDecorators"); if (!resource.IsServiceResource) // Only add subresources of normal resources, not the root resource. { // Add all subresources. foreach (IResource subresource in resource.Resources.Values) { // Consider all members in the current class as invalid names. var forbiddenWords = from CodeTypeMember m in resourceClass.Members select m.Name; // Generate and add the subresource. CodeTypeDeclaration decl = GenerateSubresource( subresource, serviceClassName, allDecorators, generator.RequestGenerator, generator.ContainerGenerator, forbiddenWords); resourceClass.Members.Add(decl); } } }
public void DecorateClass(CodeTypeDeclaration typeDeclaration, ISchema schema, IDictionary<JsonSchema, SchemaImplementationDetails> implDetails, INestedClassProvider internalClassProvider) { typeDeclaration.ThrowIfNull("typeDeclaration"); schema.ThrowIfNull("schema"); implDetails.ThrowIfNull("details"); internalClassProvider.ThrowIfNull("internalClassProvider"); typeDeclaration.Members.AddRange( GenerateAllFields(schema.Name, schema.SchemaDetails, implDetails, internalClassProvider).ToArray()); }
public void DecorateInternalClass(CodeTypeDeclaration typeDeclaration, string name, JsonSchema schema, IDictionary<JsonSchema, SchemaImplementationDetails> implDetails, INestedClassProvider internalClassProvider) { typeDeclaration.ThrowIfNull("typeDeclaration"); schema.ThrowIfNull("schema"); implDetails.ThrowIfNull("details"); internalClassProvider.ThrowIfNull("internalClassProvider"); typeDeclaration.Comments.AddRange(CreateComment(schema)); }
public void DecorateClass(CodeTypeDeclaration typeDeclaration, ISchema schema, IDictionary<JsonSchema, SchemaImplementationDetails> implDetails, INestedClassProvider internalClassProvider) { typeDeclaration.ThrowIfNull("typeDeclaration"); schema.ThrowIfNull("schema"); implDetails.ThrowIfNull("implDetails"); internalClassProvider.ThrowIfNull("internalClassProvider"); schema.SchemaDetails.ThrowIfNull("schema.SchemaDetails"); typeDeclaration.Comments.AddRange(CreateComment(schema.SchemaDetails)); AddCommentsToAllProperties(schema.Name, schema.SchemaDetails, typeDeclaration); }
public void DecorateInternalClass(CodeTypeDeclaration typeDeclaration, string name, JsonSchema schema, IDictionary<JsonSchema, SchemaImplementationDetails> implDetails, INestedClassProvider internalClassProvider) { typeDeclaration.ThrowIfNull("typeDeclatation"); schema.ThrowIfNull("schema"); implDetails.ThrowIfNull("details"); internalClassProvider.ThrowIfNull("internalClassProvider"); typeDeclaration.Members.AddRange( GenerateAllProperties(name, schema, implDetails, internalClassProvider, typeDeclaration.Name).ToArray( )); }
public void DecorateClass(CodeTypeDeclaration typeDeclaration, ISchema schema, IDictionary<JsonSchema, SchemaImplementationDetails> implDetails, INestedClassProvider internalClassProvider) { typeDeclaration.ThrowIfNull("typeDeclaration"); schema.ThrowIfNull("schema"); implDetails.ThrowIfNull("implDetails"); SchemaImplementationDetails details = implDetails[schema.SchemaDetails]; // If this method is refered as a result directly, add an inheritance to IResponse and implement // the interface if (details.IsMethodResult) { logger.Debug("Applying decorator to schema "+schema.Name); typeDeclaration.BaseTypes.Add(GetIResponseBaseType()); typeDeclaration.Members.AddRange(CreateETagProperty(typeDeclaration)); } }
internal void ImplementAdditionalProperties(CodeTypeDeclaration type, JsonSchema schema, IDictionary<JsonSchema, SchemaImplementationDetails> implDetails, INestedClassProvider internalClassProvider) { // Validate the input parameters. type.ThrowIfNull("type"); schema.ThrowIfNull("schema"); implDetails.ThrowIfNull("implDetails"); internalClassProvider.ThrowIfNull("internalClassProvider"); // Check if this decorator applies to the specified json schema. if (schema.AdditionalProperties == null) { return; } // Note/ToDo: Currently we only support AdditionalProperties for schemas // specifiying no normal properties, as these won't be used // by the newtonsoft json library if a dictionary is specified. if (schema.Properties != null && schema.Properties.Count > 0) { type.Comments.Add(new CodeCommentStatement("TODO: Add support for additionalProperties on schemas")); type.Comments.Add(new CodeCommentStatement(" which have normal properties defined.")); return; } // Generate the underlying type. SchemaImplementationDetails details = implDetails[schema]; CodeTypeReference underlyingTypeRef = SchemaDecoratorUtil.GetCodeType( schema.AdditionalProperties, details, internalClassProvider); // Add the base type reference. CodeTypeReference dictionaryRef = new CodeTypeReference(typeof(Dictionary<,>)); dictionaryRef.TypeArguments.Add(typeof(string)); dictionaryRef.TypeArguments.Add(underlyingTypeRef); type.BaseTypes.Add(dictionaryRef); }
internal void AddCommentsToAllProperties(string name, JsonSchema schema, CodeTypeDeclaration typeDeclaration) { schema.ThrowIfNull("schema"); name.ThrowIfNullOrEmpty("name"); typeDeclaration.ThrowIfNull("typeDeclaration"); logger.Debug("Adding attributes to properties for {0}", name); if (schema.Properties.IsNullOrEmpty()) { logger.Debug("No properties found for schema " + name); return; } int index = 0; foreach (var propertyPair in schema.Properties) { var schemaFieldName = propertyPair.Key; var propertyDefinition = SchemaUtil.FindCodePropertyForName( typeDeclaration, schemaFieldName, index++, schema.Properties.Keys); propertyDefinition.Comments.AddRange(CreateComment(propertyPair.Value)); } }
internal static CodeTypeDeclaration GenerateEnum(CodeTypeDeclaration typeDeclaration, string proposedName, string description, IEnumerable<KeyValuePair<string, string>> entries) { typeDeclaration.ThrowIfNull("typeDeclaration"); proposedName.ThrowIfNullOrEmpty("proposedName"); entries.ThrowIfNull("entries"); // Create a safe enum name by avoiding the names of all members which are already in this type. IEnumerable<string> memberNames = from CodeTypeMember m in typeDeclaration.Members select m.Name; string name = GeneratorUtils.GetEnumName(proposedName, memberNames); // Create the enum type. var decl = new CodeTypeDeclaration(name); decl.IsEnum = true; // Get the EnumStringValueTypeConverter type. Type converterType = typeof(EnumStringValueTypeConverter); // [TypeConverter(..)] var typeConvAttribute = new CodeAttributeDeclaration( new CodeTypeReference(typeof(TypeConverterAttribute))); // .. typeof(EnumStringValueTypeConverter) .. typeConvAttribute.Arguments.Add(new CodeAttributeArgument(new CodeTypeOfExpression(converterType))); decl.CustomAttributes.Add(typeConvAttribute); foreach (KeyValuePair<string, string> enumEntry in entries) { // Consider the names of all members in the current type as used words. IEnumerable<string> usedNames = from CodeTypeMember m in decl.Members select m.Name; string safeName = GeneratorUtils.GetEnumValueName(enumEntry.Key, usedNames); var member = new CodeMemberField(typeof(int), safeName); // Attribute: var valueAttribute = new CodeAttributeDeclaration(); valueAttribute.Name = typeof(StringValueAttribute).FullName; valueAttribute.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(enumEntry.Key))); member.CustomAttributes.Add(valueAttribute); // Comments: member.Comments.AddRange(DecoratorUtil.CreateSummaryComment(enumEntry.Value)); // Add member to enum. decl.Members.Add(member); } // Class comment: decl.Comments.AddRange(DecoratorUtil.CreateSummaryComment(description)); return decl; }
public void DecorateClass(CodeTypeDeclaration typeDeclaration, ISchema schema, IDictionary<JsonSchema, SchemaImplementationDetails> implDetails, INestedClassProvider internalClassProvider) { typeDeclaration.ThrowIfNull("typeDeclaration"); schema.ThrowIfNull("schema"); internalClassProvider.ThrowIfNull("internalClassProvider"); Count++; }