public Value(BoundExpression expr, DisposeCheckerPass pass) { Debug.Assert(expr.Kind != HijackedBoundKindForValueHolder); this.creations = new HashSet <BoundExpression>(); expr = SkipReferenceConversions(expr); switch (expr.Kind) { case HijackedBoundKindForValueHolder: { var holder = (BoundValueHolder)expr; var value = holder.value; creations = value.creations; } break; case BoundKind.ObjectCreationExpression: case BoundKind.NewT: HashSet <DiagnosticInfo> useSiteDiagnostics = null; if (Conversions.IsBaseInterface(pass.IDisposableType, expr.Type, ref useSiteDiagnostics)) { creations.Add(expr); } break; case BoundKind.Local: { var local = (BoundLocal)expr; Value value; pass.State.variables.TryGetValue(local.LocalSymbol, out value); if (value != null) { creations = value.creations; } } break; case BoundKind.Parameter: { var parameter = (BoundParameter)expr; Value value; pass.State.variables.TryGetValue(parameter.ParameterSymbol, out value); if (value != null) { creations = value.creations; } } break; default: break; } }
public override BoundNode VisitNewT(BoundNewT node) { base.VisitNewT(node); HashSet <DiagnosticInfo> useSiteDiagnostics = null; if (Conversions.IsBaseInterface(IDisposableType, node.Type, ref useSiteDiagnostics)) { if (!this.State.possiblyUndisposedCreations.Add(node) && reported.Add(node.Syntax)) { Diagnostics.Add(ErrorCode.WRN_CA2000_DisposeObjectsBeforeLosingScope1, node.Syntax.Location, node.Type); } return(node); } return(null); }