PropertyEmitterBase.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntityDesign / Design / System / Data / EntityModel / Emitters / PropertyEmitterBase.cs / 1305376 / PropertyEmitterBase.cs

                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner       [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 

using System; 
using System.CodeDom;
using System.Collections.Generic;
using System.Data.Metadata.Edm;
using System.Diagnostics; 
using System.Data.Entity.Design.SsdlGenerator;
using System.Data.Entity.Design.Common; 
 
namespace System.Data.EntityModel.Emitters
{ 
    internal abstract class PropertyEmitterBase : MetadataItemEmitter
    {
        private bool _declaringTypeUsesStandardBaseType;
        protected PropertyEmitterBase(ClientApiGenerator generator, MetadataItem item, bool declaringTypeUsesStandardBaseType) 
            :base(generator, item)
        { 
            Debug.Assert(item != null, "item is null"); 
            _declaringTypeUsesStandardBaseType = declaringTypeUsesStandardBaseType;
        } 

        /// 
        /// This is where the derived classes supply their emit logic.
        ///  
        /// The CodeDom representation of the type that the property is being added to.
        protected abstract void EmitProperty(CodeTypeDeclaration typeDecl); 
 
        /// 
        /// Validation logic specific to property emitters 
        /// 
        protected override void Validate()
        {
            VerifyGetterAndSetterAccessibilityCompatability(); 
            Generator.VerifyLanguageCaseSensitiveCompatibilityForProperty(Item as EdmMember);
        } 
 
        /// 
        /// The compiler ensures accessibility on a Setter/Getter is more restrictive than on the Property. 
        /// However accessibility modifiers are not well ordered. Internal and Protected don't go well together
        /// because neither is more restrictive than others.
        /// 
        private void VerifyGetterAndSetterAccessibilityCompatability() 
        {
            if (PropertyEmitter.GetGetterAccessibility(Item) == MemberAttributes.Assembly 
                        && PropertyEmitter.GetSetterAccessibility(Item) == MemberAttributes.Family) 
            {
                Generator.AddError(System.Data.Entity.Design.Strings.GeneratedPropertyAccessibilityConflict(Item.Name, "Internal", "Protected"), 
                        ModelBuilderErrorCode.GeneratedPropertyAccessibilityConflict,
                        EdmSchemaErrorSeverity.Error, Item.DeclaringType.FullName, Item.Name);
            }
            else if (PropertyEmitter.GetGetterAccessibility(Item) == MemberAttributes.Family 
                        && PropertyEmitter.GetSetterAccessibility(Item) == MemberAttributes.Assembly)
            { 
                Generator.AddError(System.Data.Entity.Design.Strings.GeneratedPropertyAccessibilityConflict(Item.Name, "Protected", "Internal"), 
                        ModelBuilderErrorCode.GeneratedPropertyAccessibilityConflict,
                        EdmSchemaErrorSeverity.Error, Item.DeclaringType.FullName, Item.Name); 
            }
        }

 

        ///  
        /// Main method for Emitting property code. 
        /// 
        /// The CodeDom representation of the type that the property is being added to. 
        public void Emit(CodeTypeDeclaration typeDecl)
        {
            Validate();
            EmitProperty(typeDecl); 
        }
 
        protected bool AncestorClassDefinesName(string name) 
        {
            if (_declaringTypeUsesStandardBaseType && Utils.DoesTypeReserveMemberName(Item.DeclaringType, name, Generator.LanguageAppropriateStringComparer)) 
            {
                return true;
            }
 
            StructuralType baseType = Item.DeclaringType.BaseType as StructuralType;
            if (baseType != null && baseType.Members.Contains(name)) 
            { 
                return true;
            } 

            return false;
        }
 
        public new EdmMember Item
        { 
            get 
            {
                return base.Item as EdmMember; 
            }
        }

    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner       [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 

using System; 
using System.CodeDom;
using System.Collections.Generic;
using System.Data.Metadata.Edm;
using System.Diagnostics; 
using System.Data.Entity.Design.SsdlGenerator;
using System.Data.Entity.Design.Common; 
 
namespace System.Data.EntityModel.Emitters
{ 
    internal abstract class PropertyEmitterBase : MetadataItemEmitter
    {
        private bool _declaringTypeUsesStandardBaseType;
        protected PropertyEmitterBase(ClientApiGenerator generator, MetadataItem item, bool declaringTypeUsesStandardBaseType) 
            :base(generator, item)
        { 
            Debug.Assert(item != null, "item is null"); 
            _declaringTypeUsesStandardBaseType = declaringTypeUsesStandardBaseType;
        } 

        /// 
        /// This is where the derived classes supply their emit logic.
        ///  
        /// The CodeDom representation of the type that the property is being added to.
        protected abstract void EmitProperty(CodeTypeDeclaration typeDecl); 
 
        /// 
        /// Validation logic specific to property emitters 
        /// 
        protected override void Validate()
        {
            VerifyGetterAndSetterAccessibilityCompatability(); 
            Generator.VerifyLanguageCaseSensitiveCompatibilityForProperty(Item as EdmMember);
        } 
 
        /// 
        /// The compiler ensures accessibility on a Setter/Getter is more restrictive than on the Property. 
        /// However accessibility modifiers are not well ordered. Internal and Protected don't go well together
        /// because neither is more restrictive than others.
        /// 
        private void VerifyGetterAndSetterAccessibilityCompatability() 
        {
            if (PropertyEmitter.GetGetterAccessibility(Item) == MemberAttributes.Assembly 
                        && PropertyEmitter.GetSetterAccessibility(Item) == MemberAttributes.Family) 
            {
                Generator.AddError(System.Data.Entity.Design.Strings.GeneratedPropertyAccessibilityConflict(Item.Name, "Internal", "Protected"), 
                        ModelBuilderErrorCode.GeneratedPropertyAccessibilityConflict,
                        EdmSchemaErrorSeverity.Error, Item.DeclaringType.FullName, Item.Name);
            }
            else if (PropertyEmitter.GetGetterAccessibility(Item) == MemberAttributes.Family 
                        && PropertyEmitter.GetSetterAccessibility(Item) == MemberAttributes.Assembly)
            { 
                Generator.AddError(System.Data.Entity.Design.Strings.GeneratedPropertyAccessibilityConflict(Item.Name, "Protected", "Internal"), 
                        ModelBuilderErrorCode.GeneratedPropertyAccessibilityConflict,
                        EdmSchemaErrorSeverity.Error, Item.DeclaringType.FullName, Item.Name); 
            }
        }

 

        ///  
        /// Main method for Emitting property code. 
        /// 
        /// The CodeDom representation of the type that the property is being added to. 
        public void Emit(CodeTypeDeclaration typeDecl)
        {
            Validate();
            EmitProperty(typeDecl); 
        }
 
        protected bool AncestorClassDefinesName(string name) 
        {
            if (_declaringTypeUsesStandardBaseType && Utils.DoesTypeReserveMemberName(Item.DeclaringType, name, Generator.LanguageAppropriateStringComparer)) 
            {
                return true;
            }
 
            StructuralType baseType = Item.DeclaringType.BaseType as StructuralType;
            if (baseType != null && baseType.Members.Contains(name)) 
            { 
                return true;
            } 

            return false;
        }
 
        public new EdmMember Item
        { 
            get 
            {
                return base.Item as EdmMember; 
            }
        }

    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK