public override void CheckCodeIssues(CheckCodeIssuesEventArgs ea)
 {
     IEnumerable<IElement> enumerable = ea.GetEnumerable(ea.Scope, new ElementTypeFilter(LanguageElementType.Class));
       foreach (IElement element in enumerable)
       {
     IClassElement iClassElement = element as IClassElement;
     if (iClassElement == null)
       continue;
     if (!PlugIn1.AlreadyImplementsIDisposable(iClassElement))
       continue;
     // We DO implement IDisposable! Let's make sure all the fields are disposed....
     IIfStatement parentIfDisposing;
     IList<IFieldElement> disposableFields = PlugIn1.GetDisposableFieldsThatHaveNotBeenDisposed(ea.ResolveScope(), ea.Scope as ISourceFile, iClassElement, out parentIfDisposing);
     if (disposableFields.Count > 0)
       foreach (IFieldElement disposableField in disposableFields)
     ea.AddWarning(disposableField.FirstNameRange, "Fields should be disposed");
       }
 }
Пример #2
0
        private void CheckIssuesForReferencedLocalOrField(CheckCodeIssuesEventArgs ea, IForStatement loop, IElement lambda, IElement element)
        {
            if (element.ElementType == LanguageElementType.ElementReferenceExpression)
            {
                IElement declaration = element.GetDeclaration();
                if (declaration.ElementType == LanguageElementType.Variable || declaration.ElementType == LanguageElementType.InitializedVariable)
                {
                    if (loop.Initializers.Contains(declaration) || !declaration.IsParentedBy(loop))
                    {
                        ea.AddWarning(element.ToLanguageElement().Range, "Possible unintended closure scope misuse");
                    }
                }
                return;
            }

            foreach (IElement child in element.Children)
            {
                CheckIssuesForReferencedLocalOrField(ea, loop, lambda, child);
            }
        }
Пример #3
0
        private void CheckIssuesForReferencedLocalOrField(CheckCodeIssuesEventArgs ea, IForEachStatement loop, IAnonymousMethodExpression lambda, IElement element)
        {
            if (element.ElementType == LanguageElementType.ElementReferenceExpression)
            {
                IElement declaration = element.GetDeclaration();
                if (declaration.ElementType == LanguageElementType.Variable || declaration.ElementType == LanguageElementType.InitializedVariable)
                {
                    bool isLoopVariable = loop.LoopVariable == declaration;
                    bool declarationIsParentedByLoop = declaration.IsParentedBy(loop);
                    if (isLoopVariable || !declarationIsParentedByLoop)
                    {
                        ea.AddWarning(element.ToLanguageElement().Range, "Possible unintended closure scope misuse");
                    }
                }
                return;
            }

            foreach (IElement child in element.Children)
            {
                CheckIssuesForReferencedLocalOrField(ea, loop, lambda, child);
            }
        }
Пример #4
0
 private void ipClassShouldImplementIDisposable_CheckCodeIssues(object sender, CheckCodeIssuesEventArgs ea)
 {
     IEnumerable<IElement> enumerable = ea.GetEnumerable(ea.Scope, new ElementTypeFilter(LanguageElementType.Class));
       foreach (IElement element in enumerable)
       {
     IClassElement iClassElement = element as IClassElement;
     if (iClassElement == null)
       continue;
     if (iClassElement.IsStatic)
       continue;
     if (AlreadyImplementsIDisposable(iClassElement))
       continue;
     // We do NOT implement IDisposable! Let's see if any of the fields implement IDisposable....
     foreach (IElement child in iClassElement.AllChildren)
     {
       IFieldElement iBaseVariable = child as IFieldElement;
       if (iBaseVariable == null)
     continue;
       if (iBaseVariable.IsStatic)
     continue;
       if (iBaseVariable.Is("System.IDisposable"))
       {
     TextRange issueRange = GetIssueRange(ea.Scope, iClassElement);
     ea.AddWarning(issueRange, ipClassShouldImplementIDisposable.DisplayName);
     break;
       }
     }
       }
 }