Esempio n. 1
0
            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;
                }
            }
Esempio n. 2
0
        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);
        }