1
- using System . Collections . Generic ;
1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Linq ;
2
4
using NetArchTest . Assemblies ;
3
5
using NetArchTest . Dependencies . DataStructures ;
4
6
using NetArchTest . Rules ;
@@ -13,63 +15,93 @@ internal class DependencySearch
13
15
private readonly bool explainYourself ;
14
16
private readonly IDependencyFilter dependencyFilter ;
15
17
18
+
16
19
public DependencySearch ( bool explainYourself , IDependencyFilter dependencyFilter = null )
17
20
{
18
21
this . explainYourself = explainYourself ;
19
22
this . dependencyFilter = dependencyFilter ;
20
23
}
21
24
25
+
22
26
/// <summary>
23
27
/// Finds types that have a dependency on any item in the given list of dependencies.
24
28
/// </summary>
25
29
public IEnumerable < TypeSpec > FindTypesThatHaveDependencyOnAny ( IEnumerable < TypeSpec > input , IEnumerable < string > dependencies )
26
30
{
27
- return FindTypes ( input , TypeDefinitionCheckingResult . SearchType . HaveDependencyOnAny , dependencies , true ) ;
31
+ return FindTypes ( input , HaveDependency_CheckingStrategy . TypeOfCheck . HaveDependencyOnAny , dependencies , true ) ;
28
32
}
29
33
30
34
/// <summary>
31
35
/// Finds types that have a dependency on every item in the given list of dependencies.
32
36
/// </summary>
33
37
public IEnumerable < TypeSpec > FindTypesThatHaveDependencyOnAll ( IEnumerable < TypeSpec > input , IEnumerable < string > dependencies )
34
38
{
35
- return FindTypes ( input , TypeDefinitionCheckingResult . SearchType . HaveDependencyOnAll , dependencies , true ) ;
39
+ return FindTypes ( input , HaveDependency_CheckingStrategy . TypeOfCheck . HaveDependencyOnAll , dependencies , true ) ;
36
40
}
37
41
38
42
/// <summary>
39
43
/// Finds types that may have a dependency on any item in the given list of dependencies, but cannot have a dependency that is not in the list.
40
44
/// </summary>
41
45
public IEnumerable < TypeSpec > FindTypesThatOnlyHaveDependencyOnAnyOrNone ( IEnumerable < TypeSpec > input , IEnumerable < string > dependencies )
42
46
{
43
- return FindTypes ( input , TypeDefinitionCheckingResult . SearchType . OnlyHaveDependenciesOnAnyOrNone , dependencies , false ) ;
47
+ return FindTypes ( input , HaveDependency_CheckingStrategy . TypeOfCheck . OnlyHaveDependenciesOnAnyOrNone , dependencies , false ) ;
44
48
}
45
49
46
50
/// <summary>
47
51
/// Finds types that have a dependency on any item in the given list of dependencies, but cannot have a dependency that is not in the list.
48
52
/// </summary>
49
53
public IEnumerable < TypeSpec > FindTypesThatOnlyHaveDependencyOnAny ( IEnumerable < TypeSpec > input , IEnumerable < string > dependencies )
50
54
{
51
- return FindTypes ( input , TypeDefinitionCheckingResult . SearchType . OnlyHaveDependenciesOnAny , dependencies , false ) ;
55
+ return FindTypes ( input , HaveDependency_CheckingStrategy . TypeOfCheck . OnlyHaveDependenciesOnAny , dependencies , false ) ;
52
56
}
53
57
54
58
/// <summary>
55
59
/// Finds types that have a dependency on every item in the given list of dependencies, but cannot have a dependency that is not in the list.
56
60
/// </summary>
57
61
public IEnumerable < TypeSpec > FindTypesThatOnlyOnlyHaveDependencyOnAll ( IEnumerable < TypeSpec > input , IEnumerable < string > dependencies )
58
62
{
59
- return FindTypes ( input , TypeDefinitionCheckingResult . SearchType . OnlyHaveDependenciesOnAll , dependencies , false ) ;
63
+ return FindTypes ( input , HaveDependency_CheckingStrategy . TypeOfCheck . OnlyHaveDependenciesOnAll , dependencies , false ) ;
60
64
}
61
65
62
- private IEnumerable < TypeSpec > FindTypes ( IEnumerable < TypeSpec > input , TypeDefinitionCheckingResult . SearchType searchType , IEnumerable < string > dependencies , bool serachForDependencyInFieldConstant )
66
+ private IEnumerable < TypeSpec > FindTypes ( IEnumerable < TypeSpec > input , HaveDependency_CheckingStrategy . TypeOfCheck typeOfCheck , IEnumerable < string > dependencies , bool serachForDependencyInFieldConstant )
63
67
{
64
- var searchTree = new CachedNamespaceTree ( dependencies ) ;
68
+ var searchTree = new CachedNamespaceTree ( dependencies ) ;
69
+ var context = new TypeCheckingContext ( serachForDependencyInFieldConstant , explainYourself , dependencyFilter ) ;
65
70
66
71
foreach ( var type in input )
67
72
{
68
- var context = new TypeDefinitionCheckingContext ( type , searchType , searchTree , serachForDependencyInFieldConstant , explainYourself , dependencyFilter ) ;
69
- type . IsPassing = context . IsTypeFound ( ) ;
73
+ var strategy = new HaveDependency_CheckingStrategy ( typeOfCheck , searchTree ) ;
74
+ context . PerformCheck ( type , strategy ) ;
75
+ type . IsPassing = strategy . DoesTypePassCheck ( ) ;
76
+ }
77
+
78
+ return input ;
79
+ }
80
+
81
+
82
+ public IEnumerable < TypeSpec > FindTypesThatAreUsedByAny ( IEnumerable < TypeSpec > input , IEnumerable < string > users , IEnumerable < TypeSpec > allTypes )
83
+ {
84
+ var filterTree = new CachedNamespaceTree ( users ) ;
85
+ var context = new TypeCheckingContext ( false , explainYourself , dependencyFilter ) ;
86
+ var strategy = new AreUsedBy_CheckingStrategy ( ) ;
87
+
88
+
89
+ foreach ( var type in allTypes )
90
+ {
91
+ bool shouldBeChecked = filterTree . GetAllMatchingNames ( type . Definition ) . Any ( ) ;
92
+
93
+ if ( shouldBeChecked )
94
+ {
95
+ context . PerformCheck ( type , strategy ) ;
96
+ }
97
+ }
98
+
99
+ foreach ( var type in input )
100
+ {
101
+ type . IsPassing = strategy . IsTypeUsed ( type . Definition ) ;
70
102
}
71
103
72
104
return input ;
73
- }
105
+ }
74
106
}
75
107
}
0 commit comments