+ // When site container already exists the inflated version has to be
+ // updated manually to contain newly created field
+ if (gt is InflatedTypeSpec && site_container.Fields.Count > 1) {
+ var tparams = gt.MemberDefinition.TypeParametersCount > 0 ? gt.MemberDefinition.TypeParameters : TypeParameterSpec.EmptyTypes;
+ var inflator = new TypeParameterInflator (module, gt, tparams, gt.TypeArguments);
+ gt.MemberCache.AddMember (field.InflateMember (inflator));
+ }
+
+ FieldExpr site_field_expr = new FieldExpr (MemberCache.GetMember (gt, field), loc);
+
+ BlockContext bc = new BlockContext (ec.MemberContext, null, ec.BuiltinTypes.Void);
+ SymbolWriter.OpenCompilerGeneratedBlock (ec);
+
+ Arguments args = new Arguments (1);
+ args.Add (new Argument (binder));
+ StatementExpression s = new StatementExpression (new SimpleAssign (site_field_expr, new Invocation (new MemberAccess (instanceAccessExprType, "Create"), args)));
+
+ if (s.Resolve (bc)) {
+ Statement init = new If (new Binary (Binary.Operator.Equality, site_field_expr, new NullLiteral (loc), loc), s, loc);
+ init.Emit (ec);
+ }
+
+ args = new Arguments (1 + dyn_args_count);
+ args.Add (new Argument (site_field_expr));
+ if (arguments != null) {
+ int arg_pos = 1;
+ foreach (Argument a in arguments) {
+ if (a is NamedArgument) {
+ // Name is not valid in this context
+ args.Add (new Argument (a.Expr, a.ArgType));
+ } else {
+ args.Add (a);
+ }
+
+ if (inflate_using_mvar && a.Type != targs[arg_pos].Type)
+ a.Expr.Type = targs[arg_pos].Type;
+
+ ++arg_pos;
+ }
+ }
+
+ Expression target = new DelegateInvocation (new MemberAccess (site_field_expr, "Target", loc).Resolve (bc), args, loc).Resolve (bc);
+ if (target != null)
+ target.Emit (ec);
+
+ SymbolWriter.CloseCompilerGeneratedBlock (ec);
+ }
+
+ public static MemberAccess GetBinderNamespace (Location loc)
+ {
+ return new MemberAccess (new MemberAccess (
+ new QualifiedAliasMember (QualifiedAliasMember.GlobalAlias, "Microsoft", loc), "CSharp", loc), "RuntimeBinder", loc);
+ }
+
+ protected MemberAccess GetBinder (string name, Location loc)
+ {
+ return new MemberAccess (new TypeExpression (binder_type, loc), name, loc);