public CreateReferenceExpression ( |
||
rc | ||
loc | Mono.CSharp.Location | |
Результат | Mono.CSharp.Expression |
protected virtual Statement CreateDisposeCall (BlockContext bc, LocalVariable lv) { var lvr = lv.CreateReferenceExpression (bc, lv.Location); var type = lv.Type; var loc = lv.Location; if (TypeManager.void_dispose_void == null) { TypeManager.void_dispose_void = TypeManager.GetPredefinedMethod ( TypeManager.idisposable_type, "Dispose", loc, TypeSpec.EmptyTypes); } var dispose_mg = MethodGroupExpr.CreatePredefined (TypeManager.void_dispose_void, TypeManager.idisposable_type, loc); dispose_mg.InstanceExpression = TypeManager.IsNullableType (type) ? new Cast (new TypeExpression (TypeManager.idisposable_type, loc), lvr, loc).Resolve (bc) : lvr; Statement dispose = new StatementExpression (new Invocation (dispose_mg, null)); // Add conditional call when disposing possible null variable if (!type.IsStruct || TypeManager.IsNullableType (type)) dispose = new If (new Binary (Binary.Operator.Inequality, lvr, new NullLiteral (loc), loc), dispose, loc); return dispose; }
protected override Statement CreateDisposeCall (BlockContext bc, LocalVariable lv) { if (TypeManager.void_dispose_void == null) { TypeManager.void_dispose_void = TypeManager.GetPredefinedMethod ( TypeManager.idisposable_type, "Dispose", loc, TypeSpec.EmptyTypes); } // // Fabricates code like // // if ((temp = vr as IDisposable) != null) temp.Dispose (); // var dispose_variable = LocalVariable.CreateCompilerGenerated (TypeManager.idisposable_type, bc.CurrentBlock, loc); var idisaposable_test = new Binary (Binary.Operator.Inequality, new CompilerAssign ( dispose_variable.CreateReferenceExpression (bc, loc), new As (lv.CreateReferenceExpression (bc, loc), new TypeExpression (dispose_variable.Type, loc), loc), loc), new NullLiteral (loc), loc); var dispose_mg = MethodGroupExpr.CreatePredefined (TypeManager.void_dispose_void, TypeManager.idisposable_type, loc); dispose_mg.InstanceExpression = dispose_variable.CreateReferenceExpression (bc, loc); Statement dispose = new StatementExpression (new Invocation (dispose_mg, null)); return new If (idisaposable_test, dispose, loc); }
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); }