PropertyEmitterBase.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataWeb / Design / system / Data / EntityModel / Emitters / PropertyEmitterBase.cs / 1 / 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.Data.Services.Design; 
using System.Diagnostics;
 
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(Strings.GeneratedPropertyAccessibilityConflict(Item.Name, "Internal", "Protected"),
                        ModelBuilderErrorCode.GeneratedPropertyAccessibilityConflict, 
                        EdmSchemaErrorSeverity.Error);
            }
            else if (PropertyEmitter.GetGetterAccessibility(Item) == MemberAttributes.Family
                        && PropertyEmitter.GetSetterAccessibility(Item) == MemberAttributes.Assembly) 
            {
                Generator.AddError(Strings.GeneratedPropertyAccessibilityConflict(Item.Name, "Protected", "Internal"), 
                        ModelBuilderErrorCode.GeneratedPropertyAccessibilityConflict, 
                        EdmSchemaErrorSeverity.Error);
            } 
        }

        /// 
        /// 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.Data.Services.Design; 
using System.Diagnostics;
 
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(Strings.GeneratedPropertyAccessibilityConflict(Item.Name, "Internal", "Protected"),
                        ModelBuilderErrorCode.GeneratedPropertyAccessibilityConflict, 
                        EdmSchemaErrorSeverity.Error);
            }
            else if (PropertyEmitter.GetGetterAccessibility(Item) == MemberAttributes.Family
                        && PropertyEmitter.GetSetterAccessibility(Item) == MemberAttributes.Assembly) 
            {
                Generator.AddError(Strings.GeneratedPropertyAccessibilityConflict(Item.Name, "Protected", "Internal"), 
                        ModelBuilderErrorCode.GeneratedPropertyAccessibilityConflict, 
                        EdmSchemaErrorSeverity.Error);
            } 
        }

        /// 
        /// 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