//------------------------------------------------------------ // FUNCBREC.CreateAutoImplementedGetAccessor // /// <summary></summary> /// <param name="methodSym"></param> /// <returns></returns> //------------------------------------------------------------ internal EXPR CreateAutoImplementedGetAccessor(METHSYM methodSym) { CreateNewScope(); SCOPESYM scopeSym = this.currentScopeSym; this.currentScopeSym.ScopeFlags = SCOPEFLAGS.NONE; this.currentBlockExpr = NewExprBlock(treeNode); this.currentBlockExpr.ScopeSym = this.currentScopeSym; SymWithType symWithType = new SymWithType(); AGGTYPESYM parentAts = methodSym.ParentAggSym.GetThisType(); symWithType.Set( methodSym.PropertySym.BackFieldSym, parentAts); EXPR fieldExpr = BindToField( null, BindThisImplicit(null), FieldWithType.Convert(symWithType), BindFlagsEnum.RValueRequired); //TYPESYM retTypeSym = methodSym.ReturnTypeSym; EXPRRETURN returnExpr = NewExpr(null, EXPRKIND.RETURN, null) as EXPRRETURN; returnExpr.ObjectExpr = fieldExpr; this.currentBlockExpr.StatementsExpr = returnExpr; EXPRBLOCK blockExpr = this.currentBlockExpr; this.currentBlockExpr = blockExpr.OwingBlockExpr; CloseScope(); CorrectAnonMethScope(blockExpr.ScopeSym); return(blockExpr); }
//------------------------------------------------------------ // FUNCBREC.CreateAutoImplementedSetAccessor // /// <summary></summary> /// <param name="methodSym"></param> /// <returns></returns> //------------------------------------------------------------ internal EXPR CreateAutoImplementedSetAccessor(METHSYM methodSym) { CreateNewScope(); SCOPESYM scopeSym = this.currentScopeSym; this.currentScopeSym.ScopeFlags = SCOPEFLAGS.NONE; this.currentBlockExpr = NewExprBlock(treeNode); this.currentBlockExpr.ScopeSym = this.currentScopeSym; //-------------------------------------------------------- // Back filed //-------------------------------------------------------- SymWithType fieldSwt = new SymWithType(); AGGTYPESYM parentAts = methodSym.ParentAggSym.GetThisType(); fieldSwt.Set( methodSym.PropertySym.BackFieldSym, parentAts); EXPR fieldExpr = BindToField( null, BindThisImplicit(null), FieldWithType.Convert(fieldSwt), BindFlagsEnum.RValueRequired); //-------------------------------------------------------- // Parameter "value" //-------------------------------------------------------- // The SYM instance of parameter "value" is a LOCVARSYM instance, // and is created in CLSDREC.FillMethInfoCommon. LOCVARSYM locSym = Compiler.LocalSymbolManager.LookupLocalSym( Compiler.NameManager.GetPredefinedName(PREDEFNAME.VALUE), this.OuterScopeSym, SYMBMASK.LOCVARSYM) as LOCVARSYM; DebugUtil.Assert(locSym != null); SymWithType valueSwt = new SymWithType(); valueSwt.Set(locSym, null); EXPR valueExpr = BindToLocal(null, locSym, BindFlagsEnum.RValueRequired); //-------------------------------------------------------- // BackField = value //-------------------------------------------------------- EXPR assignExpr = NewExprBinop( null, EXPRKIND.ASSG, fieldExpr.TypeSym, fieldExpr, valueExpr); //-------------------------------------------------------- // Statement //-------------------------------------------------------- EXPRSTMTAS stmt = NewExpr(null, EXPRKIND.STMTAS, null) as EXPRSTMTAS; stmt.Expr = assignExpr; //-------------------------------------------------------- // Block //-------------------------------------------------------- this.currentBlockExpr.StatementsExpr = stmt; EXPRBLOCK blockExpr = this.currentBlockExpr; this.currentBlockExpr = blockExpr.OwingBlockExpr; CloseScope(); CorrectAnonMethScope(blockExpr.ScopeSym); return(blockExpr); }