コード例 #1
0
ファイル: TypeResolver.cs プロジェクト: PhenTse/virtualRadar
        /// <summary>
        /// Creates a TsCollection from TsType
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        private TsCollection CreateCollectionType(TsType type, TsPropertyVisibilityFormatter propertyVisibilityFormatter)
        {
            var resolved = new TsCollection(type.Type, propertyVisibilityFormatter);

            resolved.ItemsType = this.ResolveType(resolved.ItemsType, propertyVisibilityFormatter, false);
            return(resolved);
        }
コード例 #2
0
        /// <summary>
        /// Initializes a new instance of the TsModelBuilder class.
        /// </summary>
        public TsModelBuilder()
        {
            this.Classes = new Dictionary <Type, TsClass>();
            this.Enums   = new Dictionary <Type, TsEnum>();

            PropertyVisibilityFormatter = (property) => true;
        }
コード例 #3
0
ファイル: TypeResolver.cs プロジェクト: PhenTse/virtualRadar
 /// <summary>
 /// Resolves references in the property.
 /// </summary>
 /// <param name="property"></param>
 public override void VisitProperty(TsProperty property, TsPropertyVisibilityFormatter propertyVisibilityFormatter)
 {
     property.PropertyType = this.ResolveType(property.PropertyType, propertyVisibilityFormatter);
     if (property.GenericArguments != null)
     {
         for (int i = 0; i < property.GenericArguments.Count; i++)
         {
             property.GenericArguments[i] = this.ResolveType(property.GenericArguments[i], propertyVisibilityFormatter);
         }
     }
 }
コード例 #4
0
ファイル: TypeResolver.cs プロジェクト: PhenTse/virtualRadar
        /// <summary>
        /// Resolves references in the class.
        /// </summary>
        /// <param name="classModel"></param>
        public override void VisitClass(TsClass classModel, TsPropertyVisibilityFormatter propertyVisibilityFormatter)
        {
            if (classModel.Module != null)
            {
                classModel.Module = this.ResolveModule(classModel.Module.Name);
            }

            if (classModel.BaseType != null && classModel.BaseType != TsType.Any)
            {
                classModel.BaseType = this.ResolveType(classModel.BaseType, propertyVisibilityFormatter, false);
            }

            for (int i = 0; i < classModel.Interfaces.Count; i++)
            {
                classModel.Interfaces[i] = this.ResolveType(classModel.Interfaces[i], propertyVisibilityFormatter, false);
            }
        }
コード例 #5
0
ファイル: TypeResolver.cs プロジェクト: PhenTse/virtualRadar
        /// <summary>
        /// Resolves TsType to the more specialized type.
        /// </summary>
        /// <param name="toResolve">The type to resolve.</param>
        /// <returns></returns>
        private TsType ResolveType(TsType toResolve, TsPropertyVisibilityFormatter propertyVisibilityFormatter, bool useOpenGenericDefinition = true)
        {
            if (!(toResolve is TsType))
            {
                return(toResolve);
            }

            if (_knownTypes.ContainsKey(toResolve.Type))
            {
                return(_knownTypes[toResolve.Type]);
            }
            else if (toResolve.Type.IsGenericType && useOpenGenericDefinition)
            {
                // We stored its open type definition instead
                TsType openType = null;
                if (_knownTypes.TryGetValue(toResolve.Type.GetGenericTypeDefinition(), out openType))
                {
                    return(openType);
                }
            }
            else if (toResolve.Type.IsGenericType)
            {
                var genericType = TsType.Create(toResolve.Type, propertyVisibilityFormatter);
                _knownTypes[toResolve.Type] = genericType;
                return(genericType);
            }

            var    typeFamily = TsType.GetTypeFamily(toResolve.Type);
            TsType type       = null;

            switch (typeFamily)
            {
            case TsTypeFamily.System: type = new TsSystemType(toResolve.Type); break;

            case TsTypeFamily.Collection: type = this.CreateCollectionType(toResolve, propertyVisibilityFormatter); break;

            case TsTypeFamily.Enum: type = new TsEnum(toResolve.Type); break;

            default: type = TsType.Any; break;
            }

            _knownTypes[toResolve.Type] = type;
            return(type);
        }
コード例 #6
0
ファイル: TsCollection.cs プロジェクト: PhenTse/virtualRadar
        /// <summary>
        /// Initializes a new instance of the TsCollection class with the specific CLR type.
        /// </summary>
        /// <param name="type">The CLR collection represented by this instance of the TsCollection.</param>
        public TsCollection(Type type, TsPropertyVisibilityFormatter propertyVisibilityFormatter)
            : base(type)
        {
            var enumerableType = TsType.GetEnumerableType(this.Type);

            if (enumerableType != null)
            {
                this.ItemsType = TsType.Create(enumerableType, propertyVisibilityFormatter);
            }
            else if (typeof(IEnumerable).IsAssignableFrom(this.Type))
            {
                this.ItemsType = TsType.Any;
            }
            else
            {
                throw new ArgumentException($"The type '{this.Type.FullName}' is not collection.");
            }

            this.Dimension = GetCollectionDimension(type);
        }
コード例 #7
0
ファイル: TsType.cs プロジェクト: PhenTse/virtualRadar
        /// <summary>
        /// Factory method so that the correct TsType can be created for a given CLR type.
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        internal static TsType Create(System.Type type, TsPropertyVisibilityFormatter propertyVisibilityFormatter)
        {
            var family = GetTypeFamily(type);

            switch (family)
            {
            case TsTypeFamily.System:
                return(new TsSystemType(type));

            case TsTypeFamily.Collection:
                return(new TsCollection(type, propertyVisibilityFormatter));

            case TsTypeFamily.Class:
                return(new TsClass(type, propertyVisibilityFormatter));

            case TsTypeFamily.Enum:
                return(new TsEnum(type));

            default:
                return(new TsType(type));
            }
        }
コード例 #8
0
ファイル: TsModel.cs プロジェクト: PhenTse/virtualRadar
        /// <summary>
        /// Runs specific model visitor.
        /// </summary>
        /// <param name="visitor">The model visitor to run.</param>
        public void RunVisitor(ITsModelVisitor visitor, TsPropertyVisibilityFormatter propertyVisibilityFormatter)
        {
            visitor.VisitModel(this);

            foreach (var module in this.Modules)
            {
                visitor.VisitModule(module);
            }

            foreach (var classModel in this.Classes)
            {
                visitor.VisitClass(classModel, propertyVisibilityFormatter);

                foreach (var property in classModel.Properties.Union(classModel.Fields).Union(classModel.Constants))
                {
                    visitor.VisitProperty(property, propertyVisibilityFormatter);
                }
            }

            foreach (var enumModel in this.Enums)
            {
                visitor.VisitEnum(enumModel);
            }
        }
コード例 #9
0
ファイル: TsClass.cs プロジェクト: ts295983632/vrs
        /// <summary>
        /// Initializes a new instance of the TsClass class with the specific CLR type.
        /// </summary>
        /// <param name="type">The CLR type represented by this instance of the TsClass</param>
        /// <param name="propertyVisibilityFormatter"></param>
        public TsClass(Type type, TsPropertyVisibilityFormatter propertyVisibilityFormatter)
            : base(type)
        {
            this.Properties = this.Type
                              .GetProperties()
                              .Where(pi => pi.DeclaringType == this.Type)
                              .Select(pi => new TsProperty(pi))
                              .Where(tp => propertyVisibilityFormatter(tp))
                              .ToList();

            this.Fields = this.Type
                          .GetFields()
                          .Where(fi => fi.DeclaringType == this.Type &&
                                 !(fi.IsLiteral && !fi.IsInitOnly)) // skip constants
                          .Select(fi => new TsProperty(fi))
                          .Where(tp => propertyVisibilityFormatter(tp))
                          .ToList();

            this.Constants = this.Type
                             .GetFields()
                             .Where(fi => fi.DeclaringType == this.Type &&
                                    fi.IsLiteral && !fi.IsInitOnly) // constants only
                             .Select(fi => new TsProperty(fi))
                             .Where(tp => propertyVisibilityFormatter(tp))
                             .ToList();

            if (type.IsGenericType)
            {
                this.Name             = type.Name.Remove(type.Name.IndexOf('`'));
                this.GenericArguments = type
                                        .GetGenericArguments()
                                        .Select(ty => TsType.Create(ty, propertyVisibilityFormatter))
                                        .ToList();
            }
            else
            {
                this.Name             = type.Name;
                this.GenericArguments = new TsType[0];
            }

            if (this.Type.BaseType != null && this.Type.BaseType != typeof(object) && this.Type.BaseType != typeof(ValueType))
            {
                this.BaseType = new TsType(this.Type.BaseType);
            }

            var interfaces = this.Type.GetInterfaces();

            this.Interfaces = interfaces
                              .Where(@interface => @interface.GetCustomAttribute <TsInterfaceAttribute>(false) != null)
                              .Except(interfaces.SelectMany(@interface => @interface.GetInterfaces()))
                              .Select(ty => TsType.Create(ty, propertyVisibilityFormatter)).ToList();

            var attribute = this.Type.GetCustomAttribute <TsClassAttribute>(false);

            if (attribute != null)
            {
                if (!string.IsNullOrEmpty(attribute.Name))
                {
                    this.Name = attribute.Name;
                }

                if (attribute.Module != null)
                {
                    this.Module.Name = attribute.Module;
                }
            }

            var ignoreAttribute = this.Type.GetCustomAttribute <TsIgnoreAttribute>(false);

            if (ignoreAttribute != null)
            {
                this.IsIgnored = true;
            }
        }
コード例 #10
0
ファイル: TypeScript.cs プロジェクト: PhenTse/virtualRadar
 public TypeScriptFluent WithPropertyVisibilityFormatter(TsPropertyVisibilityFormatter formatter)
 {
     _modelBuilder.PropertyVisibilityFormatter = formatter;
     return(this);
 }
コード例 #11
0
 /// <summary>
 /// When overridden in a derived class, it can examine or modify the property model.
 /// </summary>
 /// <param name="property">The model property being visited.</param>
 public virtual void VisitProperty(TsProperty property, TsPropertyVisibilityFormatter propertyVisibilityFormatter)
 {
 }
コード例 #12
0
 /// <summary>
 /// When overridden in a derived class, it can examine or modify the class model.
 /// </summary>
 /// <param name="classModel">The model class being visited.</param>
 public virtual void VisitClass(TsClass classModel, TsPropertyVisibilityFormatter propertyVisibilityFormatter)
 {
 }