Example #1
0
        public static Type[] GetTypeDependencies(Type type, IReflectiveWriterOptions options)
        {
            // Don't reflect dependencies on statically mapped types
            if (options.TypeConverter.HasStaticMapping(type))
            {
                return(Type.EmptyTypes);
            }
            var propertyDependencies = type
                                       .GetProperties(options.PropertyFlags)
                                       .Select(p => p.PropertyType)
                                       .Distinct()
                                       .ToArray();
            var fieldDependencies = type
                                    .GetFields(options.FieldFlags)
                                    .Select(f => f.FieldType)
                                    .Distinct()
                                    .ToArray();

            var methodDependencies = options.ReflectMethods(type)
                ? type
                                     .GetMethods(options.MethodFlags)
                                     .Where(m => !m.IsSpecialName)
                                     .Where(m => options.ReflectMethod(type, m))
                                     .SelectMany(m => m.GetParameters().Select(p => p.ParameterType).Union(new[] { m.ReturnType }))
                                     .Where(m => m != typeof(void))
                                     .ToArray()
                : Array.Empty <Type>();

            return(propertyDependencies
                   .Union(fieldDependencies)
                   .Union(methodDependencies)
                   .ToArray());
        }
Example #2
0
        public static void Configure(IReflectiveWriterOptions options)
        {
            options.GetTypeDependenciesStrategy = options.GetTypeDependenciesStrategy.ExtendStrategy(original =>
                                                                                                     (type, o) =>
            {
                var uta = type.GetCustomAttribute <UnionTypeAttribute>();
                return(Enumerable.Union(original(type, o), uta?.UnionTypes ?? Array.Empty <Type>()).ToArray());
            });
            options.ComplexTypeStrategy = options.ComplexTypeStrategy.ExtendStrategy(original =>
                                                                                     (writer, typeInfo, type) =>
            {
                var uta = type.GetCustomAttribute <UnionTypeAttribute>();
                if (uta == null)
                {
                    original(writer, typeInfo, type);
                }
                else
                {
                    var unionTypes = String.Join(" | ", uta.UnionTypes
                                                 .Select(t => options.TypeConverter.Convert(t).FullName));

                    writer.WriteLine($"export type {typeInfo.TypeReference.FullName} = {unionTypes};");
                }
            });
            options.TypeConverter.Convert = options.TypeConverter.Convert.ExtendStrategy(original =>
                                                                                         (type, parent, memberInfo) =>
            {
                if (memberInfo is PropertyInfo pi)
                {
                    var constAttr = pi.GetCustomAttribute <AsConstAttribute>();
                    if (constAttr != null)
                    {
                        string literalType;
                        var value = constAttr.ConstValue;
                        if (value is Boolean b)
                        {
                            literalType = b ? "true" : "false";
                        }
                        else if (value is String s)
                        {
                            literalType = $"'{s}'";
                        }
                        else if (value is Enum e)
                        {
                            var enumTypeName   = options.TypeConverter.TypeName(e.GetType());
                            var enumMemberName = options.TypeConverter.EnumName(e.ToString());
                            literalType        = $"{enumTypeName}.{enumMemberName}";
                        }
                        else
                        {
                            literalType = value.ToString() ?? string.Empty;
                        }

                        return(new TypeReference(literalType)
                        {
                            ExistingType = true
                        });
                    }
                }

                return(original(type, parent, memberInfo));
            });
        }
Example #3
0
 public ReflectiveWriter(IReflectiveWriterOptions?options = null)
 {
     _options = options ?? new ReflectiveWriterOptions();
 }
Example #4
0
 public static void ConfigureMobxWriter(IReflectiveWriterOptions options) =>
 ConfigureMobxWriter(new MobxOptions())(options);