// Value public Expr BindValue(Expr exprSrc) { Debug.Assert(exprSrc != null && exprSrc.Type is NullableType); // For new T?(x), the answer is x. if (IsNullableConstructor(exprSrc, out ExprCall call)) { var args = call.OptionalArguments; Debug.Assert(args != null && !(args is ExprList)); return(args); } NullableType nubSrc = (NullableType)exprSrc.Type; CType typeBase = nubSrc.GetUnderlyingType(); AggregateType ats = nubSrc.GetAts(GetErrorContext()); if (ats == null) { ExprProperty rval = GetExprFactory().CreateProperty(typeBase, exprSrc); rval.SetError(); return(rval); } PropertySymbol prop = GetSymbolLoader().getBSymmgr().propNubValue; if (prop == null) { prop = GetSymbolLoader().getPredefinedMembers().GetProperty(PREDEFPROP.PP_G_OPTIONAL_VALUE); GetSymbolLoader().getBSymmgr().propNubValue = prop; } PropWithType pwt = new PropWithType(prop, ats); MethPropWithInst mpwi = new MethPropWithInst(prop, ats); ExprMemberGroup pMemGroup = GetExprFactory().CreateMemGroup(exprSrc, mpwi); ExprProperty exprRes = GetExprFactory().CreateProperty(typeBase, null, null, pMemGroup, pwt, null); if (prop == null) { exprRes.SetError(); } return(exprRes); }
// Value public Expr BindValue(Expr exprSrc) { Debug.Assert(exprSrc != null && exprSrc.Type.IsNullableType()); // For new T?(x), the answer is x. if (IsNullableConstructor(exprSrc)) { Debug.Assert(exprSrc.asCALL().OptionalArguments != null && !exprSrc.asCALL().OptionalArguments.isLIST()); return(exprSrc.asCALL().OptionalArguments); } CType typeBase = exprSrc.Type.AsNullableType().GetUnderlyingType(); AggregateType ats = exprSrc.Type.AsNullableType().GetAts(GetErrorContext()); if (ats == null) { ExprProperty rval = GetExprFactory().CreateProperty(typeBase, exprSrc); rval.SetError(); return(rval); } PropertySymbol prop = GetSymbolLoader().getBSymmgr().propNubValue; if (prop == null) { prop = GetSymbolLoader().getPredefinedMembers().GetProperty(PREDEFPROP.PP_G_OPTIONAL_VALUE); GetSymbolLoader().getBSymmgr().propNubValue = prop; } PropWithType pwt = new PropWithType(prop, ats); MethWithType mwt = new MethWithType(prop?.methGet, ats); MethPropWithInst mpwi = new MethPropWithInst(prop, ats); ExprMemberGroup pMemGroup = GetExprFactory().CreateMemGroup(exprSrc, mpwi); ExprProperty exprRes = GetExprFactory().CreateProperty(typeBase, null, null, pMemGroup, pwt, mwt, null); if (prop == null) { exprRes.SetError(); } return(exprRes); }