1- using System . Collections . Generic ;
1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . Linq ;
24using NetArchTest . Assemblies ;
35using NetArchTest . Dependencies . DataStructures ;
46using NetArchTest . Rules ;
@@ -13,63 +15,93 @@ internal class DependencySearch
1315 private readonly bool explainYourself ;
1416 private readonly IDependencyFilter dependencyFilter ;
1517
18+
1619 public DependencySearch ( bool explainYourself , IDependencyFilter dependencyFilter = null )
1720 {
1821 this . explainYourself = explainYourself ;
1922 this . dependencyFilter = dependencyFilter ;
2023 }
2124
25+
2226 /// <summary>
2327 /// Finds types that have a dependency on any item in the given list of dependencies.
2428 /// </summary>
2529 public IEnumerable < TypeSpec > FindTypesThatHaveDependencyOnAny ( IEnumerable < TypeSpec > input , IEnumerable < string > dependencies )
2630 {
27- return FindTypes ( input , TypeDefinitionCheckingResult . SearchType . HaveDependencyOnAny , dependencies , true ) ;
31+ return FindTypes ( input , HaveDependency_CheckingStrategy . TypeOfCheck . HaveDependencyOnAny , dependencies , true ) ;
2832 }
2933
3034 /// <summary>
3135 /// Finds types that have a dependency on every item in the given list of dependencies.
3236 /// </summary>
3337 public IEnumerable < TypeSpec > FindTypesThatHaveDependencyOnAll ( IEnumerable < TypeSpec > input , IEnumerable < string > dependencies )
3438 {
35- return FindTypes ( input , TypeDefinitionCheckingResult . SearchType . HaveDependencyOnAll , dependencies , true ) ;
39+ return FindTypes ( input , HaveDependency_CheckingStrategy . TypeOfCheck . HaveDependencyOnAll , dependencies , true ) ;
3640 }
3741
3842 /// <summary>
3943 /// 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.
4044 /// </summary>
4145 public IEnumerable < TypeSpec > FindTypesThatOnlyHaveDependencyOnAnyOrNone ( IEnumerable < TypeSpec > input , IEnumerable < string > dependencies )
4246 {
43- return FindTypes ( input , TypeDefinitionCheckingResult . SearchType . OnlyHaveDependenciesOnAnyOrNone , dependencies , false ) ;
47+ return FindTypes ( input , HaveDependency_CheckingStrategy . TypeOfCheck . OnlyHaveDependenciesOnAnyOrNone , dependencies , false ) ;
4448 }
4549
4650 /// <summary>
4751 /// 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.
4852 /// </summary>
4953 public IEnumerable < TypeSpec > FindTypesThatOnlyHaveDependencyOnAny ( IEnumerable < TypeSpec > input , IEnumerable < string > dependencies )
5054 {
51- return FindTypes ( input , TypeDefinitionCheckingResult . SearchType . OnlyHaveDependenciesOnAny , dependencies , false ) ;
55+ return FindTypes ( input , HaveDependency_CheckingStrategy . TypeOfCheck . OnlyHaveDependenciesOnAny , dependencies , false ) ;
5256 }
5357
5458 /// <summary>
5559 /// 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.
5660 /// </summary>
5761 public IEnumerable < TypeSpec > FindTypesThatOnlyOnlyHaveDependencyOnAll ( IEnumerable < TypeSpec > input , IEnumerable < string > dependencies )
5862 {
59- return FindTypes ( input , TypeDefinitionCheckingResult . SearchType . OnlyHaveDependenciesOnAll , dependencies , false ) ;
63+ return FindTypes ( input , HaveDependency_CheckingStrategy . TypeOfCheck . OnlyHaveDependenciesOnAll , dependencies , false ) ;
6064 }
6165
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 )
6367 {
64- var searchTree = new CachedNamespaceTree ( dependencies ) ;
68+ var searchTree = new CachedNamespaceTree ( dependencies ) ;
69+ var context = new TypeCheckingContext ( serachForDependencyInFieldConstant , explainYourself , dependencyFilter ) ;
6570
6671 foreach ( var type in input )
6772 {
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 ) ;
70102 }
71103
72104 return input ;
73- }
105+ }
74106 }
75107}
0 commit comments