private (string code, CodeDependencies dependencies) GeneratePropertyDefinitions(Type type, ITemplatingEngine templatingEngine)
        {
            var propertyCodeSnippets = new List <string>();
            var deps = CodeDependencies.Empty;

            foreach (var property in GetPropertiesForTranspilation(type))
            {
                Logger.WriteInformation($"Translating property {property.Name} on type {type}.");

                var typeReferenceTranslation = TypeReferenceTranslator.Translate(property.PropertyType);
                var decorators = DecoratorTranslator.GenerateDecorators(property);
                deps = deps
                       .Merge(typeReferenceTranslation.Dependencies)
                       .Merge(decorators.Dependencies);

                propertyCodeSnippets.Add(templatingEngine.UseTemplate("ClassPropertyDefinition", new Dictionary <string, string>
                {
                    { "Decorators", decorators.DecoratorCode },
                    { "PropertyName", GetTypeScriptPropertyName(property) },
                    { "Documentation", GenerateDocumentationComment(property) },
                    { "PropertyType", typeReferenceTranslation.ReferencedTypeName },
                    { "Assignment", _defaultValueProvider.Assignment(property) }
                }));
            }

            var properties = string.Join(Environment.NewLine, propertyCodeSnippets);

            return(properties, deps);
        }