//------------------------------------------------------------
 // CLSDREC.IsValidAutoImplementedProperty
 //
 /// <summary></summary>
 /// <param name="propNode"></param>
 /// <returns></returns>
 //------------------------------------------------------------
 internal bool IsValidAutoImplementedProperty(PROPERTYNODE propNode)
 {
     if (propNode == null ||
         propNode.GetNode == null ||
         propNode.GetNode.OpenCurlyIndex != propNode.GetNode.CloseCurlyIndex)
     {
         return(false);
     }
     if (propNode.SetNode == null)
     {
         // this message should be added to the resources.
         //Compiler.Controller.ReportError(
         //    ERRORKIND.ERROR,
         //    "Automatically implemented properties must define both get and set accessors.");
         NAMENODE nNode = propNode.NameNode as NAMENODE;
         Compiler.Error(
             propNode,
             CSCERRID.ERR_PropertyAccessorHasNoBody,
             new ErrArg(nNode != null ? nNode.Name : ""));
         return(false);
     }
     if (propNode.SetNode.OpenCurlyIndex == propNode.SetNode.CloseCurlyIndex)
     {
         propNode.GetNode.IsAutoImplemented = true;
         propNode.SetNode.IsAutoImplemented = true;
         return(true);
     }
     return(false);
 }
        //------------------------------------------------------------
        // CLSDREC.CreateBackField
        //
        /// <summary></summary>
        /// <param name="aggSym"></param>
        /// <param name="propName"></param>
        //------------------------------------------------------------
        private MEMBVARSYM CreateBackField(
            PROPERTYNODE propNode,
            string propName,
            TYPESYM propTypeSym,
            AGGSYM aggSym,
            AGGDECLSYM aggDeclSym)
        {
            DebugUtil.Assert(aggSym.IsClass || aggSym.IsStruct);
            string backFieldName = GenerateBackFieldName(propName);

            NODEFLAGS propFlags = propNode.Flags;

            MEMBVARSYM backFieldSym = Compiler.MainSymbolManager.CreateMembVar(
                backFieldName,
                aggSym,
                aggDeclSym);

            backFieldSym.TypeSym       = propTypeSym;
            backFieldSym.ParseTreeNode = null;
            backFieldSym.IsAssigned    = true;

            NODEFLAGS allowableFlags =
                aggSym.AllowableMemberAccess() |
                NODEFLAGS.MOD_UNSAFE |
                NODEFLAGS.MOD_NEW |
                NODEFLAGS.MOD_STATIC;

            backFieldSym.IsUnsafe = (aggDeclSym.IsUnsafe || (propFlags & NODEFLAGS.MOD_UNSAFE) != 0);

            if ((propFlags & NODEFLAGS.MOD_ABSTRACT) != 0)
            {
                DebugUtil.Assert((allowableFlags & NODEFLAGS.MOD_ABSTRACT) == 0);
                Compiler.ErrorRef(null, CSCERRID.ERR_AbstractField, new ErrArgRef(backFieldSym));
                //flags &= ~NODEFLAGS.MOD_ABSTRACT;
            }

            backFieldSym.Access = ACCESS.PRIVATE;   // GetAccessFromFlags(aggSym, allowableFlags, flags);

            if ((propFlags & NODEFLAGS.MOD_STATIC) != 0)
            {
                backFieldSym.IsStatic = true;
            }

            CheckForProtectedInSealed(backFieldSym);

            // Check that the field type is as accessible as the field itself.
            CheckConstituentVisibility(backFieldSym, propTypeSym, CSCERRID.ERR_BadVisFieldType);

            return(backFieldSym);
        }