protected virtual Expression ResolveInitializer (BlockContext bc, LocalVariable li, Expression initializer) { var a = new SimpleAssign (li.CreateReferenceExpression (bc, li.Location), initializer, li.Location); return a.ResolveStatement (bc); }
protected override Expression ResolveInitializer (BlockContext bc, LocalVariable li, Expression initializer) { Assign assign; if (li.Type == InternalType.Dynamic) { initializer = initializer.Resolve (bc); if (initializer == null) return null; initializer = Convert.ImplicitConversionRequired (bc, initializer, TypeManager.idisposable_type, loc); if (initializer == null) return null; var var = LocalVariable.CreateCompilerGenerated (TypeManager.idisposable_type, bc.CurrentBlock, loc); assign = new SimpleAssign (var.CreateReferenceExpression (bc, loc), initializer, loc); assign.ResolveStatement (bc); dispose_call = CreateDisposeCall (bc, var); dispose_call.Resolve (bc); return assign; } if (li == Variable) { CheckIDiposableConversion (bc, li, initializer); dispose_call = CreateDisposeCall (bc, li); dispose_call.Resolve (bc); } return base.ResolveInitializer (bc, li, initializer); }
bool ResolveVariable (EmitContext ec) { ExpressionStatement a = new SimpleAssign (var, init, loc); a = a.ResolveStatement (ec); if (a == null) return false; assign = a; if (TypeManager.ImplementsInterface (a.Type, TypeManager.idisposable_type)) { converted_var = var; return true; } Expression e = Convert.ImplicitConversionStandard (ec, a, TypeManager.idisposable_type, var.Location); if (e == null) { Error_IsNotConvertibleToIDisposable (var); return false; } converted_var = e; return true; }