示例#1
0
 public virtual bool GetIsObject(CRflTyp aTyp) => this.GetIsEnum(aTyp)
                                                ? false
                                                : this.GetBase(aTyp).Length > 0
                                                ? true
                                                : this.GetIsBlop(aTyp)
                                                ? true
                                                : false
 ;
示例#2
0
        private CodeTypeDeclaration NewCodeEnumTypeDecl(CRflTyp aEnumTyp)
        {
            var aEnumTypName = aEnumTyp.Name;
            var aCdTypeDecl  = new CodeTypeDeclaration(aEnumTypName);

            aCdTypeDecl.IsEnum = true;
            var aFields = from aProperty in aEnumTyp.NamedProperties select new CodeMemberField(aEnumTypName, aProperty.Name);

            aCdTypeDecl.Members.AddRange(aFields.ToArray());
            return(aCdTypeDecl);
        }
示例#3
0
        internal CRflProperty(CRflTyp aRflClass, string aName, CRflRow[] aRows)
        {
            this.DeclaringTyp = aRflClass;
            this.Name         = aName;

            var aAttributesDic = new Dictionary <string, IEnumerable <CRflAttribute> >(aRows.Length);
            var aGroups        = aRows.GroupBy(aRow => aRow.AttributeName);
            var aDic           = aGroups.ToDictionary(aForKey => aForKey.Key, aForVal => (from aRow in aForVal select new CRflAttribute(this, aRow)).ToArray().AsEnumerable());

            this.AttributesDic = aDic;
        }
示例#4
0
 private CodeStatement NewAddPrototypeStatement(CRflTyp aTyp) =>
 new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), CSchema.AddTyp_Name, this.CodeDomBuilder.NewTypMetaInfoFieldRefExp(this.ModelInterpreter.GetTypName(aTyp, false))));
示例#5
0
        private CodeTypeDeclaration NewCodeEntityObjectTypeDecl(CRflTyp aRflTyp)
        {
            var aModel           = aRflTyp.Model;
            var aSchemaClsNme    = this.Tok.GetSchemaClassName(this.ModelInterpreter.GetSchema(aModel));
            var aGetSchemaMthNme = this.Tok.GetGetSchemaFuncName();

            // Class
            var aClassName   = this.ModelInterpreter.GetTypName(aRflTyp, false);
            var aCdTypDecl   = new CodeTypeDeclaration(aClassName);
            var aCdTypRef    = new CodeTypeReference(aClassName);
            var aCdTypRefExp = new CodeTypeReferenceExpression(aCdTypRef);

            aCdTypDecl.BaseTypes.Add(this.NewCodeTypeReference(this.Tok.Trg_C_Eno_Nme));

            var aGetPrpsMthdNme         = this.Tok.Trg_N_GetPrps_Nme;
            var aGetPrpsMthActionArgNme = "aAddProperty";
            var aCdGetPrpsMthdRefExp    = new CodeMethodReferenceExpression(aCdTypRefExp, aGetPrpsMthdNme);

            // Typ.Field
            var aTypTypRef        = this.CodeDomBuilder.NewCodeTypeRef <CTyp>();
            var aTypFldNme        = this.CodeDomBuilder.GetTypMetaInfoFieldName(aClassName);
            var aCdTypFldDcl      = new CodeMemberField(aTypTypRef, aTypFldNme);
            var aCdTypeOfExp      = this.CodeDomBuilder.NewTypeOfExpression(aClassName);
            var aCdNameOfExp      = this.CodeDomBuilder.NewNameOTypeExpression(aClassName);
            var aGuid             = this.ModelInterpreter.GetGuid(aRflTyp);
            var aCdGuidTypeRef    = new CodeTypeReference(typeof(Guid));
            var aCdGuidExp        = new CodeObjectCreateExpression(aCdGuidTypeRef, new CodePrimitiveExpression(aGuid.ToString()));
            var aCdPrototypeExp   = new CodeObjectCreateExpression(aCdTypRef, new CodePrimitiveExpression(null));
            var aCdAddPrpsMthdRef = new CodeMethodReferenceExpression(aCdTypRefExp, aGetPrpsMthdNme);

            aCdTypFldDcl.Attributes = MemberAttributes.Public
                                      | MemberAttributes.Static
            ;
            aCdTypFldDcl.InitExpression = new CodeObjectCreateExpression(aTypTypRef, aCdTypeOfExp, aCdGuidExp, aCdGetPrpsMthdRefExp);
            aCdTypDecl.Members.Add(aCdTypFldDcl);

            var aTypFldRefExp = new CodeFieldReferenceExpression(aCdTypRefExp, aTypFldNme);

            // Typ.Property._Static
            var aTypPrpNme = this.CodeDomBuilder.GetTypMetaInfoPropName(aClassName);
            var aCdTypPrp  = new CodeMemberProperty();

            aCdTypPrp.Name       = aTypPrpNme;
            aCdTypPrp.Attributes = MemberAttributes.Static
                                   | MemberAttributes.Public
            ;
            aCdTypPrp.Type = aTypTypRef;
            aCdTypPrp.GetStatements.Add(new CodeMethodReturnStatement(aTypFldRefExp));
            aCdTypPrp.HasGet = true;
            aCdTypDecl.Members.Add(aCdTypPrp);

            var aCdTypPrpRefExp = new CodePropertyReferenceExpression(aCdTypRefExp, aTypPrpNme);

            // Typ.Property.Get.Override
            var aOverrideTypPrpName = nameof(CObject.Typ);
            var aCdOverrideTypPrp   = new CodeMemberProperty();

            aCdOverrideTypPrp.Attributes = MemberAttributes.Public
                                           | MemberAttributes.Override
            ;
            aCdOverrideTypPrp.Type = aTypTypRef;
            aCdOverrideTypPrp.Name = aOverrideTypPrpName;
            aCdOverrideTypPrp.GetStatements.Add(new CodeMethodReturnStatement(aCdTypPrpRefExp));
            aCdOverrideTypPrp.HasGet = true;
            aCdTypDecl.Members.Add(aCdOverrideTypPrp);

            // Constructor
            var aCodeConstructor = new CodeConstructor();

            aCodeConstructor.Attributes = MemberAttributes.Public;
            var aStorageArgName = "aStorage";

            aCodeConstructor.Parameters.Add(new CodeParameterDeclarationExpression(this.NewCodeTypeReference(this.Tok.Trg_C_Str_Nme), aStorageArgName));
            aCodeConstructor.BaseConstructorArgs.Add(new CodeVariableReferenceExpression(aStorageArgName));
            aCdTypDecl.Members.Add(aCodeConstructor);



            // Properties
            var aNmePrps = aRflTyp.NamedProperties;

            foreach (var aPrp in aNmePrps)
            {
                this.AddMembers(aRflTyp, aCdTypDecl, aPrp);
            }

            // CObject.GetProperties
            var aActionOfPropertyType     = typeof(Action <CRefMetaInfo>);
            var aCdActionOfPropertyTypRef = new CodeTypeReference(aActionOfPropertyType);
            var aCdGetPrpsMth             = new CodeMemberMethod();

            aCdGetPrpsMth.Name       = aGetPrpsMthdNme;
            aCdGetPrpsMth.Attributes = MemberAttributes.Static
                                       | MemberAttributes.Private
            ;
            aCdGetPrpsMth.Parameters.Add(new CodeParameterDeclarationExpression(aCdActionOfPropertyTypRef, aGetPrpsMthActionArgNme));
            foreach (var aNmePrp in aNmePrps)
            {
                var aPrpNme       = aNmePrp.Name;
                var aMtaPrpNme    = this.Tok.GetRelationyMetaInfoPropertyName(aPrpNme);
                var aMtaPrpRefExp = new CodePropertyReferenceExpression(aCdTypRefExp, aMtaPrpNme);
                var aArgRefExp    = new CodeArgumentReferenceExpression(aGetPrpsMthActionArgNme);
                var aCdCallExpnew = new CodeMethodInvokeExpression(aArgRefExp, nameof(Action.Invoke), aMtaPrpRefExp);
                aCdGetPrpsMth.Statements.Add(aCdCallExpnew);
            }
            aCdTypDecl.Members.Add(aCdGetPrpsMth);

            return(aCdTypDecl);
        }
示例#6
0
        private void AddMembers(CRflTyp aPTyp, CodeTypeDeclaration aCdTypDcl, CRflProperty aProperty)
        {
            var    aModel            = aProperty.Model;
            var    aModelInterpreter = this.ModelInterpreter;
            var    aCodeDomBuilder   = this.CodeDomBuilder;
            var    aPTypNme          = this.ModelInterpreter.GetTypName(aPTyp, true);
            var    aCdPTypRef        = new CodeTypeReference(aPTypNme);
            var    aCdPTypRefExp     = new CodeTypeReferenceExpression(aCdPTypRef);
            var    aCTyp             = this.ModelInterpreter.GetReturnTyp(aProperty);
            var    aPrpNme           = aProperty.Name;
            string aMtaFldTypNme;
            var    aMtaPrpNme    = this.Tok.GetRelationyMetaInfoPropertyName(aPrpNme);
            var    aMtaPrpRefExp = new CodePropertyReferenceExpression(aCdPTypRefExp, aMtaPrpNme);
            var    aCTypRef      = this.CodeDomBuilder.NewCodeTypeRef(aCTyp);

            // Relations-Objects
            var aCrd           = this.ModelInterpreter.GetCardinality(aProperty);
            var aRelTypName    = this.ModelInterpreter.GetClassName(aCrd);
            var aRelSystemType = CRef.GetRefClass(aCrd);
            var aCdRTypRef     = new CodeTypeReference(aRelTypName, this.CodeDomBuilder.NewCodeTypeRef(aPTyp), aCTypRef);
            var aCtorArgs1     = new CodeExpression[] { new CodeThisReferenceExpression(), aMtaPrpRefExp };
            var aCtorArgsBuildAttribIsDefined = aRelSystemType.IsNullRef() ? false : aRelSystemType.IsDefined(typeof(CGenCtorArgsBuilderAttribute), true);
            var aWriteOnlyBySystem            = aProperty.Interpret(() => bool.Parse(aProperty.GetAttributeValue(this.Tok.Trg_P_A_WriteOnlyBySystem, false.ToString)));
            var aCtorArgs2            = aWriteOnlyBySystem ? new CodeExpression[] { new CodeObjectCreateExpression(typeof(CAccessKey)) } : new CodeExpression[] { };
            var aCtorArgBuilderAttrib = aCtorArgsBuildAttribIsDefined ? aRelSystemType.GetCustomAttribute <CGenCtorArgsBuilderAttribute>(true) : default(CGenCtorArgsBuilderAttribute);
            var aCtorArgs3            = aCtorArgBuilderAttrib.IsNullRef() ? new CodeExpression[] { } : aCtorArgBuilderAttrib.NewCtorArgs(aModelInterpreter, aCodeDomBuilder, aProperty);
            var aCtorArgs             = aCtorArgs1.Concat(aCtorArgs2).Concat(aCtorArgs3);
            var aNewExp  = new CodeObjectCreateExpression(aCdRTypRef, aCtorArgs.ToArray());
            var aIsClass = true;
            var aLazyPrp = this.CodeDomBuilder.NewLazyLoadPrperty(aCdRTypRef, aIsClass, this.ModelInterpreter.GetEntityRefPropertyName(aProperty), aNewExp, MemberAttributes.Public | MemberAttributes.Final);

            aCdTypDcl.Members.Add(aLazyPrp.Item1);
            aCdTypDcl.Members.Add(aLazyPrp.Item2);
            var aCdPrp = aLazyPrp.Item1;

            aMtaFldTypNme = this.Tok.GeRelationMetaInfoTypName(aRelTypName);

            // Property.Attributes from System
            aCdPrp.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(CTargetTypeAttribute)), new CodeAttributeArgument(new CodeTypeOfExpression(aCTypRef))));


            // Property.Attributes from Model
            var aCdAs = this.CodeDomBuilder.NewCodeAttributeDecls(aProperty, this.ModelInterpreter);

            aCdPrp.CustomAttributes.AddRange(aCdAs.ToArray());



            // Property.NetaInfo.Field
            var aMtaFldNme = this.Tok.GetRelationMetaInfoFieldName(aPrpNme);
            //aMtaFldTypNme = this.Tok.Trg_C_Mta_P_Fld_Nme;
            var aCdMtaFldTypRef  = new CodeTypeReference(aMtaFldTypNme);
            var aCdMtaPrpFldDcl  = new CodeMemberField(aMtaFldTypNme, aMtaFldNme);
            var aCdMtaPrpInitExp = new CodeObjectCreateExpression(aCdMtaFldTypRef,
                                                                  this.CodeDomBuilder.NewTypeOfExpression(aPTypNme),
                                                                  this.CodeDomBuilder.NewNameOfPrpertyExpression(aPrpNme)
                                                                  );

            aCdMtaPrpFldDcl.Type       = aCdMtaFldTypRef;
            aCdMtaPrpFldDcl.Attributes = MemberAttributes.Static
                                         | MemberAttributes.Private
            ;
            aCdMtaPrpFldDcl.InitExpression = aCdMtaPrpInitExp;
            aCdTypDcl.Members.Add(aCdMtaPrpFldDcl);

            var aCdMtaFldRefExp = new CodeFieldReferenceExpression(aCdPTypRefExp, aMtaFldNme);

            // Property.MetaInfo.Property
            var aCdMtaPrp = new CodeMemberProperty();

            aCdMtaPrp.Name       = aMtaPrpNme;
            aCdMtaPrp.Type       = aCdMtaFldTypRef;
            aCdMtaPrp.Attributes = MemberAttributes.Static
                                   | MemberAttributes.Public
            ;
            aCdMtaPrp.HasGet = true;
            aCdMtaPrp.GetStatements.Add(new CodeMethodReturnStatement(aCdMtaFldRefExp));
            aCdTypDcl.Members.Add(aCdMtaPrp);
        }
示例#7
0
 public virtual CodeTypeReference NewCodeTypeRef(CRflTyp aTyp) => this.NewCodeTypeRefFromModel(this.Idl.GetTypName(aTyp, true));
示例#8
0
 public virtual Guid GetGuid(CRflTyp aTyp) => aTyp.GetAttributeValue(this.Tok.Mdl_T_A_Guid_Nme).DefaultIfEmpty <Guid>(s => new Guid(s), () => default(Guid));
示例#9
0
 public virtual string GetInit(CRflTyp aTyo) => aTyo.GetAttributeValue(this.Tok.Mdl_T_A_Nme_Init);
示例#10
0
 public virtual bool GetIsBlop(CRflTyp aTyp) => aTyp.Name == nameof(CBlop);
示例#11
0
 public virtual bool GetGenerate(CRflTyp aTyp) => aTyp.Interpret(() => bool.Parse(aTyp.GetAttributeValue(this.Tok.Mdl_T_A_Generate, () => true.ToString())));
示例#12
0
 public virtual bool GetIsEnum(CRflTyp aTyp) => this.GetBase(aTyp).Equals(nameof(Enum));
示例#13
0
 public virtual string GetBase(CRflTyp aRflClass) => aRflClass.GetAttributeValue(this.Tok.Mdl_T_A_Nme_Base);
示例#14
0
 public virtual string GetTypName(CRflTyp aRflClass, bool aWithNamespace) => aWithNamespace
                                                                          ? this.GetClrNamespace(aRflClass) + "." + aRflClass.Name
                                                                          : aRflClass.Name;
示例#15
0
 public virtual string GetClrNamespace(CRflTyp aTyp) => aTyp.GetAttributeValue(this.Tok.Mdl_T_A_Nme_ClrNs, () => this.GetClrNamespace(aTyp.Model));