Skip to content

Commit c389d78

Browse files
committed
Merge remote-tracking branch 'upstream/next' into Issue5319_Exported_doccls_include_attributes
2 parents 1b69ca4 + dc732ef commit c389d78

File tree

224 files changed

+11734
-4435
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

224 files changed

+11734
-4435
lines changed

README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ If you like this project and would like to thank its contributors, you are welco
2020
[![Chat on stackexchange](https://img.shields.io/badge/chat-on%20stackexchange-blue.svg)](https://chat.stackexchange.com/rooms/14929/vba-rubberducking)
2121
[![License](https://img.shields.io/github/license/rubberduck-vba/Rubberduck.svg)](https://github.com/rubberduck-vba/Rubberduck/blob/next/LICENSE)
2222

23-
> **[rubberduckvba.com](http://rubberduckvba.com)** [Wiki](https://github.com/rubberduck-vba/Rubberduck/wiki) [Rubberduck News](https://rubberduckvba.wordpress.com/)
24-
> devs@rubberduckvba.com
25-
> Follow [@rubberduckvba](https://twitter.com/rubberduckvba) on Twitter
23+
> **[rubberduckvba.com](http://rubberduckvba.com)** | **[Rubberduck News](https://rubberduckvba.wordpress.com/)**
24+
| **[Twitter (@rubberduckvba)](https://twitter.com/rubberduckvba)** | **[Wiki](https://github.com/rubberduck-vba/Rubberduck/wiki)**
2625

2726
---
2827

Rubberduck.CodeAnalysis/CodePathAnalysis/Extensions/NodeExtensions.cs

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22
using System;
33
using System.Collections.Generic;
44
using System.Linq;
5-
using Rubberduck.Parsing.Symbols;
65

76
namespace Rubberduck.Inspections.CodePathAnalysis.Extensions
87
{
98
public static class NodeExtensions
109
{
11-
public static IEnumerable<INode> GetFlattenedNodes(this INode node, IEnumerable<Type> excludedTypes)
10+
public static IEnumerable<INode> FlattenedNodes(this INode node, IEnumerable<Type> excludedTypes)
1211
{
1312
foreach (var child in node.Children)
1413
{
@@ -18,15 +17,15 @@ public static IEnumerable<INode> GetFlattenedNodes(this INode node, IEnumerable<
1817
}
1918
else
2019
{
21-
foreach (var nextChild in GetFlattenedNodes(child, excludedTypes))
20+
foreach (var nextChild in FlattenedNodes(child, excludedTypes))
2221
{
2322
yield return nextChild;
2423
}
2524
}
2625
}
2726
}
2827

29-
public static IEnumerable<INode> GetNodes(this INode node, IEnumerable<Type> types)
28+
public static IEnumerable<INode> Nodes(this INode node, ICollection<Type> types)
3029
{
3130
if (types.Contains(node.GetType()))
3231
{
@@ -35,50 +34,26 @@ public static IEnumerable<INode> GetNodes(this INode node, IEnumerable<Type> typ
3534

3635
foreach (var child in node.Children)
3736
{
38-
foreach (var childNode in GetNodes(child, types))
37+
foreach (var childNode in Nodes(child, types))
3938
{
4039
yield return childNode;
4140
}
4241
}
4342
}
4443

45-
public static INode GetFirstNode(this INode node, IEnumerable<Type> excludedTypes)
44+
public static INode GetFirstNode(this INode node, ICollection<Type> excludedTypes)
4645
{
4746
if (!excludedTypes.Contains(node.GetType()))
4847
{
4948
return node;
5049
}
5150

52-
return GetFirstNode(node.Children[0], excludedTypes);
53-
}
54-
55-
public static List<IdentifierReference> GetIdentifierReferences(this INode node)
56-
{
57-
var nodes = new List<IdentifierReference>();
58-
59-
var blockNodes = node.GetNodes(new[] { typeof(BlockNode) });
60-
foreach (var block in blockNodes)
51+
if (!node.Children.Any())
6152
{
62-
INode lastNode = default;
63-
foreach (var flattenedNode in block.GetFlattenedNodes(new[] { typeof(GenericNode), typeof(BlockNode) }))
64-
{
65-
if (flattenedNode is AssignmentNode &&
66-
lastNode is AssignmentNode)
67-
{
68-
nodes.Add(lastNode.Reference);
69-
}
70-
71-
lastNode = flattenedNode;
72-
}
73-
74-
if (lastNode is AssignmentNode &&
75-
block.Children[0].GetFirstNode(new[] { typeof(GenericNode) }) is DeclarationNode)
76-
{
77-
nodes.Add(lastNode.Reference);
78-
}
53+
return null;
7954
}
8055

81-
return nodes;
56+
return GetFirstNode(node.Children[0], excludedTypes);
8257
}
8358
}
8459
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Rubberduck.Inspections.Abstract;
4+
using Rubberduck.Parsing.Symbols;
5+
using Rubberduck.Parsing.VBA;
6+
using Rubberduck.Parsing.VBA.DeclarationCaching;
7+
8+
namespace Rubberduck.Inspections.Inspections.Abstract
9+
{
10+
public abstract class ArgumentReferenceInspectionFromDeclarationsBase : IdentifierReferenceInspectionFromDeclarationsBase
11+
{
12+
protected ArgumentReferenceInspectionFromDeclarationsBase(RubberduckParserState state)
13+
: base(state) { }
14+
15+
protected abstract bool IsUnsuitableArgument(ArgumentReference reference, DeclarationFinder finder);
16+
17+
protected virtual (bool isResult, object properties) IsUnsuitableArgumentWithAdditionalProperties(ArgumentReference reference, DeclarationFinder finder)
18+
{
19+
return (IsUnsuitableArgument(reference, finder), null);
20+
}
21+
22+
protected override IEnumerable<IdentifierReference> ObjectionableReferences(DeclarationFinder finder)
23+
{
24+
return ObjectionableDeclarations(finder)
25+
.OfType<ParameterDeclaration>()
26+
.SelectMany(parameter => parameter.ArgumentReferences);
27+
}
28+
29+
protected override (bool isResult, object properties) IsResultReferenceWithAdditionalProperties(IdentifierReference reference, DeclarationFinder finder)
30+
{
31+
if (!(reference is ArgumentReference argumentReference))
32+
{
33+
return (false, null);
34+
}
35+
36+
return IsUnsuitableArgumentWithAdditionalProperties(argumentReference, finder);
37+
}
38+
}
39+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Rubberduck.Inspections.Results;
4+
using Rubberduck.Parsing.Inspections.Abstract;
5+
using Rubberduck.Parsing.Symbols;
6+
using Rubberduck.Parsing.VBA;
7+
using Rubberduck.VBEditor;
8+
9+
namespace Rubberduck.Inspections.Abstract
10+
{
11+
public abstract class DeclarationInspectionBase : InspectionBase
12+
{
13+
protected readonly DeclarationType[] RelevantDeclarationTypes;
14+
15+
protected DeclarationInspectionBase(RubberduckParserState state, params DeclarationType[] relevantDeclarationTypes)
16+
: base(state)
17+
{
18+
RelevantDeclarationTypes = relevantDeclarationTypes;
19+
}
20+
21+
protected abstract bool IsResultDeclaration(Declaration declaration);
22+
protected abstract string ResultDescription(Declaration declaration);
23+
24+
protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
25+
{
26+
var results = new List<IInspectionResult>();
27+
foreach (var moduleDeclaration in State.DeclarationFinder.UserDeclarations(DeclarationType.Module))
28+
{
29+
if (moduleDeclaration == null)
30+
{
31+
continue;
32+
}
33+
34+
var module = moduleDeclaration.QualifiedModuleName;
35+
results.AddRange(DoGetInspectionResults(module));
36+
}
37+
38+
return results;
39+
}
40+
41+
private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module)
42+
{
43+
var objectionableDeclarations = RelevantDeclarationsInModule(module)
44+
.Where(IsResultDeclaration);
45+
46+
return objectionableDeclarations
47+
.Select(InspectionResult)
48+
.ToList();
49+
}
50+
51+
protected virtual IEnumerable<Declaration> RelevantDeclarationsInModule(QualifiedModuleName module)
52+
{
53+
return RelevantDeclarationTypes
54+
.SelectMany(declarationType => DeclarationFinderProvider.DeclarationFinder.Members(module, declarationType))
55+
.Distinct();
56+
}
57+
58+
protected virtual IInspectionResult InspectionResult(Declaration declaration)
59+
{
60+
return new DeclarationInspectionResult(
61+
this,
62+
ResultDescription(declaration),
63+
declaration);
64+
}
65+
}
66+
}
Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,32 @@
11
using System.Collections.Generic;
22
using System.Linq;
3-
using Rubberduck.Inspections.Inspections.Extensions;
43
using Rubberduck.Inspections.Results;
54
using Rubberduck.Parsing.Inspections.Abstract;
65
using Rubberduck.Parsing.Symbols;
76
using Rubberduck.Parsing.VBA;
7+
using Rubberduck.Parsing.VBA.DeclarationCaching;
88
using Rubberduck.VBEditor;
99

1010
namespace Rubberduck.Inspections.Abstract
1111
{
1212
public abstract class IdentifierReferenceInspectionBase : InspectionBase
1313
{
14-
protected readonly IDeclarationFinderProvider DeclarationFinderProvider;
15-
16-
public IdentifierReferenceInspectionBase(RubberduckParserState state)
14+
protected IdentifierReferenceInspectionBase(RubberduckParserState state)
1715
: base(state)
16+
{}
17+
18+
protected abstract bool IsResultReference(IdentifierReference reference, DeclarationFinder finder);
19+
protected abstract string ResultDescription(IdentifierReference reference, dynamic properties = null);
20+
21+
protected virtual (bool isResult, object properties) IsResultReferenceWithAdditionalProperties(IdentifierReference reference, DeclarationFinder finder)
1822
{
19-
DeclarationFinderProvider = state;
23+
return (IsResultReference(reference, finder), null);
2024
}
2125

22-
protected abstract bool IsResultReference(IdentifierReference reference);
23-
protected abstract string ResultDescription(IdentifierReference reference);
24-
2526
protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
2627
{
28+
var finder = DeclarationFinderProvider.DeclarationFinder;
29+
2730
var results = new List<IInspectionResult>();
2831
foreach (var moduleDeclaration in State.DeclarationFinder.UserDeclarations(DeclarationType.Module))
2932
{
@@ -33,34 +36,43 @@ protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
3336
}
3437

3538
var module = moduleDeclaration.QualifiedModuleName;
36-
results.AddRange(DoGetInspectionResults(module));
39+
results.AddRange(DoGetInspectionResults(module, finder));
3740
}
3841

3942
return results;
4043
}
4144

42-
private IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module)
45+
protected IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module, DeclarationFinder finder)
4346
{
44-
var objectionableReferences = ReferencesInModule(module)
45-
.Where(IsResultReference);
47+
var objectionableReferencesWithProperties = ReferencesInModule(module, finder)
48+
.Select(reference => (reference, IsResultReferenceWithAdditionalProperties(reference, finder)))
49+
.Where(tpl => tpl.Item2.isResult)
50+
.Select(tpl => (tpl.reference, tpl.Item2.properties));
4651

47-
return objectionableReferences
48-
.Select(reference => InspectionResult(reference, DeclarationFinderProvider))
52+
return objectionableReferencesWithProperties
53+
.Select(tpl => InspectionResult(tpl.reference, DeclarationFinderProvider, tpl.properties))
4954
.ToList();
5055
}
5156

52-
protected virtual IEnumerable<IdentifierReference> ReferencesInModule(QualifiedModuleName module)
57+
protected IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module)
58+
{
59+
var finder = DeclarationFinderProvider.DeclarationFinder;
60+
return DoGetInspectionResults(module, finder);
61+
}
62+
63+
protected virtual IEnumerable<IdentifierReference> ReferencesInModule(QualifiedModuleName module, DeclarationFinder finder)
5364
{
54-
return DeclarationFinderProvider.DeclarationFinder.IdentifierReferences(module);
65+
return finder.IdentifierReferences(module);
5566
}
5667

57-
protected virtual IInspectionResult InspectionResult(IdentifierReference reference, IDeclarationFinderProvider declarationFinderProvider)
68+
protected virtual IInspectionResult InspectionResult(IdentifierReference reference, IDeclarationFinderProvider declarationFinderProvider, dynamic properties = null)
5869
{
5970
return new IdentifierReferenceInspectionResult(
6071
this,
61-
ResultDescription(reference),
72+
ResultDescription(reference, properties),
6273
declarationFinderProvider,
63-
reference);
74+
reference,
75+
properties);
6476
}
6577
}
6678
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Rubberduck.Inspections.Results;
4+
using Rubberduck.Parsing.Inspections.Abstract;
5+
using Rubberduck.Parsing.Symbols;
6+
using Rubberduck.Parsing.VBA;
7+
using Rubberduck.Parsing.VBA.DeclarationCaching;
8+
using Rubberduck.VBEditor;
9+
10+
namespace Rubberduck.Inspections.Abstract
11+
{
12+
public abstract class IdentifierReferenceInspectionFromDeclarationsBase : InspectionBase
13+
{
14+
protected IdentifierReferenceInspectionFromDeclarationsBase(RubberduckParserState state)
15+
: base(state)
16+
{}
17+
18+
protected abstract IEnumerable<Declaration> ObjectionableDeclarations(DeclarationFinder finder);
19+
protected abstract string ResultDescription(IdentifierReference reference, dynamic properties = null);
20+
21+
protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
22+
{
23+
var finder = DeclarationFinderProvider.DeclarationFinder;
24+
var objectionableReferences = ObjectionableReferences(finder);
25+
var resultReferences = ResultReferences(objectionableReferences, finder);
26+
return resultReferences
27+
.Select(tpl => InspectionResult(tpl.reference, DeclarationFinderProvider, tpl.properties))
28+
.ToList();
29+
}
30+
31+
private IEnumerable<(IdentifierReference reference, object properties)> ResultReferences(IEnumerable<IdentifierReference> potentialResultReferences, DeclarationFinder finder)
32+
{
33+
return potentialResultReferences
34+
.Select(reference => (reference, IsResultReferenceWithAdditionalProperties(reference, finder)))
35+
.Where(tpl => tpl.Item2.isResult)
36+
.Select(tpl => (tpl.reference, tpl.Item2.properties));
37+
}
38+
39+
protected virtual IEnumerable<IdentifierReference> ObjectionableReferences(DeclarationFinder finder)
40+
{
41+
var objectionableDeclarations = ObjectionableDeclarations(finder);
42+
return objectionableDeclarations
43+
.SelectMany(declaration => declaration.References);
44+
}
45+
46+
protected virtual bool IsResultReference(IdentifierReference reference, DeclarationFinder finder) => true;
47+
48+
protected virtual (bool isResult, object properties) IsResultReferenceWithAdditionalProperties(IdentifierReference reference, DeclarationFinder finder)
49+
{
50+
return (IsResultReference(reference, finder), null);
51+
}
52+
53+
protected IEnumerable<IInspectionResult> DoGetInspectionResults(QualifiedModuleName module)
54+
{
55+
var finder = DeclarationFinderProvider.DeclarationFinder;
56+
var objectionableReferences = ObjectionableReferences(finder)
57+
.Where(reference => reference.QualifiedModuleName.Equals(module));
58+
var resultReferences = ResultReferences(objectionableReferences, finder);
59+
return resultReferences
60+
.Select(tpl => InspectionResult(tpl.reference, DeclarationFinderProvider, tpl.properties))
61+
.ToList();
62+
}
63+
64+
protected virtual IInspectionResult InspectionResult(IdentifierReference reference, IDeclarationFinderProvider declarationFinderProvider, dynamic properties = null)
65+
{
66+
return new IdentifierReferenceInspectionResult(
67+
this,
68+
ResultDescription(reference, properties),
69+
declarationFinderProvider,
70+
reference,
71+
properties);
72+
}
73+
}
74+
}

0 commit comments

Comments
 (0)