~ubuntu-branches/ubuntu/utopic/monodevelop/utopic

« back to all changes in this revision

Viewing changes to external/nrefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/Synced/CodeQuality/ValueParameterNotUsedIssue.cs

  • Committer: Package Import Robot
  • Author(s): Jo Shields
  • Date: 2013-10-10 14:50:04 UTC
  • mfrom: (10.3.4)
  • Revision ID: package-import@ubuntu.com-20131010145004-80l130sny21b17sb
Tags: 4.0.12+dfsg-1
* [5dcb6e1] Fix debian/watch for new source tarball name format
* [5c68cb5] Refresh list of files removed by get-orig-source to 
  reflect 4.0.12
* [96d60a0] Imported Upstream version 4.0.12+dfsg
* [b989752] Refresh debian/patches/no_appmenu to ensure it applies
* [2a4c351] Ensure every assembly in external/ is cleaned properly
* [92762f7] Add more excluded Mac-specific modulerefs
* [bc698ba] Add symlinks to NUnit assemblies (Closes: #714246)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//
 
2
// SetterDoesNotUseValueParameterTests.cs
 
3
//
 
4
// Author:
 
5
//       Simon Lindgren <simon.n.lindgren@gmail.com>
 
6
//
 
7
// Copyright (c) 2012 Simon Lindgren
 
8
//
 
9
// Permission is hereby granted, free of charge, to any person obtaining a copy
 
10
// of this software and associated documentation files (the "Software"), to deal
 
11
// in the Software without restriction, including without limitation the rights
 
12
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 
13
// copies of the Software, and to permit persons to whom the Software is
 
14
// furnished to do so, subject to the following conditions:
 
15
//
 
16
// The above copyright notice and this permission notice shall be included in
 
17
// all copies or substantial portions of the Software.
 
18
//
 
19
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
20
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
21
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
22
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
23
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 
24
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 
25
// THE SOFTWARE.
 
26
 
 
27
using System;
 
28
using System.Collections.Generic;
 
29
using System.Linq;
 
30
using ICSharpCode.NRefactory.TypeSystem;
 
31
using ICSharpCode.NRefactory.CSharp.Resolver;
 
32
using System.Threading;
 
33
using ICSharpCode.NRefactory.Semantics;
 
34
using ICSharpCode.NRefactory.Refactoring;
 
35
 
 
36
namespace ICSharpCode.NRefactory.CSharp.Refactoring
 
37
{
 
38
        [IssueDescription("'value' parameter not used",
 
39
               Description = "Warns about property or indexer setters and event adders or removers that do not use the value parameter.",
 
40
               Category = IssueCategories.CodeQualityIssues,
 
41
               Severity = Severity.Warning,
 
42
           ResharperDisableKeyword = "ValueParameterNotUsed")]
 
43
        public class ValueParameterNotUsedIssue : ICodeIssueProvider
 
44
        {
 
45
                public IEnumerable<CodeIssue> GetIssues(BaseRefactoringContext context)
 
46
                {
 
47
                        return new GatherVisitor(context, this).GetIssues();
 
48
                }
 
49
                
 
50
                class GatherVisitor : GatherVisitorBase<ValueParameterNotUsedIssue>
 
51
                {
 
52
                        public GatherVisitor(BaseRefactoringContext context, ValueParameterNotUsedIssue inspector) : base (context)
 
53
                        {
 
54
                        }
 
55
 
 
56
            public override void VisitAccessor(Accessor accessor)
 
57
                    {
 
58
                        if (accessor.Role == PropertyDeclaration.SetterRole) {
 
59
                    FindIssuesInAccessor(accessor, ctx.TranslateString("The setter does not use the 'value' parameter"));
 
60
                } else if (accessor.Role == CustomEventDeclaration.AddAccessorRole) {
 
61
                    FindIssuesInAccessor(accessor, ctx.TranslateString("The add accessor does not use the 'value' parameter"));
 
62
                } else if (accessor.Role == CustomEventDeclaration.RemoveAccessorRole) {
 
63
                    FindIssuesInAccessor(accessor, ctx.TranslateString("The remove accessor does not use the 'value' parameter"));
 
64
                }
 
65
                    }
 
66
 
 
67
                    public override void VisitCustomEventDeclaration(CustomEventDeclaration eventDeclaration)
 
68
                    {
 
69
                if (eventDeclaration.AddAccessor.Body.Statements.Count == 0 && eventDeclaration.RemoveAccessor.Body.Statements.Count == 0)
 
70
                    return;
 
71
                        
 
72
                        base.VisitCustomEventDeclaration(eventDeclaration);
 
73
                    }
 
74
 
 
75
                    void FindIssuesInAccessor(Accessor accessor, string accessorName)
 
76
                        {
 
77
                                var body = accessor.Body;
 
78
                                if (!IsEligible(body))
 
79
                                        return;
 
80
 
 
81
                                var localResolveResult = ctx.GetResolverStateBefore(body)
 
82
                                        .LookupSimpleNameOrTypeName("value", new List<IType>(), NameLookupMode.Expression) as LocalResolveResult; 
 
83
                                if (localResolveResult == null)
 
84
                                        return;
 
85
 
 
86
                                bool referenceFound = false;
 
87
                                foreach (var result in ctx.FindReferences (body, localResolveResult.Variable)) {
 
88
                                        var node = result.Node;
 
89
                                        if (node.StartLocation >= body.StartLocation && node.EndLocation <= body.EndLocation) {
 
90
                                                referenceFound = true;
 
91
                                                break;
 
92
                                        }
 
93
                                }
 
94
 
 
95
                                if(!referenceFound)
 
96
                                        AddIssue(accessor.Keyword, accessorName);
 
97
                        }
 
98
 
 
99
                        static bool IsEligible(BlockStatement body)
 
100
                        {
 
101
                                if (body == null || body.IsNull)
 
102
                                        return false;
 
103
                                if (body.Statements.FirstOrNullObject() is ThrowStatement)
 
104
                                        return false;
 
105
                                return true;
 
106
                        }
 
107
                }
 
108
        }
 
109
}