@@ -4103,11 +4103,15 @@ internal static PSModuleInfo LoadRequiredModule(ExecutionContext context,
4103
4103
Dictionary < ModuleSpecification , List < ModuleSpecification > > requiredModules = new Dictionary < ModuleSpecification , List < ModuleSpecification > > ( new ModuleSpecificationComparer ( ) ) ;
4104
4104
if ( currentModule != null )
4105
4105
{
4106
- requiredModules . Add ( new ModuleSpecification ( currentModule ) , new List < ModuleSpecification > { requiredModuleSpecification } ) ;
4106
+ requiredModules . Add ( new ModuleSpecification ( currentModule ) , new List < ModuleSpecification > { requiredModuleSpecification } ) ;
4107
+ }
4108
+ if ( requiredModuleSpecification != null )
4109
+ {
4110
+ requiredModules . Add ( requiredModuleSpecification , new List < ModuleSpecification > ( requiredModuleInfo . RequiredModulesSpecification ) ) ;
4107
4111
}
4108
4112
4109
4113
// We always need to check against the module name and not the file name
4110
- hasRequiredModulesCyclicReference = HasRequiredModulesCyclicReference ( requiredModuleInfo . Name ,
4114
+ hasRequiredModulesCyclicReference = HasRequiredModulesCyclicReference ( requiredModuleSpecification ,
4111
4115
new List < ModuleSpecification > ( requiredModuleInfo . RequiredModulesSpecification ) ,
4112
4116
new Collection < PSModuleInfo > { requiredModuleInfo } ,
4113
4117
requiredModules ,
@@ -4426,15 +4430,15 @@ internal static Collection<PSModuleInfo> GetModuleIfAvailable(ModuleSpecificatio
4426
4430
return result ;
4427
4431
}
4428
4432
4429
- private static bool HasRequiredModulesCyclicReference ( string currentModuleName , List < ModuleSpecification > requiredModules , IEnumerable < PSModuleInfo > moduleInfoList , Dictionary < ModuleSpecification , List < ModuleSpecification > > nonCyclicRequiredModules , out ErrorRecord error )
4433
+ private static bool HasRequiredModulesCyclicReference ( ModuleSpecification currentModuleSpecification , List < ModuleSpecification > requiredModules , IEnumerable < PSModuleInfo > moduleInfoList , Dictionary < ModuleSpecification , List < ModuleSpecification > > nonCyclicRequiredModules , out ErrorRecord error )
4430
4434
{
4431
4435
error = null ;
4432
- if ( requiredModules == null || requiredModules . Count == 0 )
4436
+ if ( requiredModules == null || requiredModules . Count == 0 || currentModuleSpecification == null )
4433
4437
{
4434
4438
return false ;
4435
4439
}
4436
4440
4437
- foreach ( var moduleSpecification in requiredModules )
4441
+ foreach ( var requiredModuleSpecification in requiredModules )
4438
4442
{
4439
4443
// The dictionary holds the key-value pair with the following convention
4440
4444
// Key --> Module
@@ -4447,56 +4451,47 @@ private static bool HasRequiredModulesCyclicReference(string currentModuleName,
4447
4451
4448
4452
// Cycle
4449
4453
// 1 --->2---->3---->4---> 2
4450
- if ( nonCyclicRequiredModules . ContainsKey ( moduleSpecification ) )
4454
+ if ( nonCyclicRequiredModules . ContainsKey ( requiredModuleSpecification ) )
4451
4455
{
4452
4456
// Error out saying there is a cyclic reference
4453
4457
PSModuleInfo mo = null ;
4454
4458
foreach ( var i in moduleInfoList )
4455
4459
{
4456
- if ( i . Name . Equals ( currentModuleName , StringComparison . OrdinalIgnoreCase ) )
4460
+ if ( i . Name . Equals ( currentModuleSpecification . Name , StringComparison . OrdinalIgnoreCase ) )
4457
4461
{
4458
4462
mo = i ;
4459
4463
break ;
4460
4464
}
4461
4465
}
4462
4466
Dbg . Assert ( mo != null , "The moduleInfo should be present" ) ;
4463
- string message = StringUtil . Format ( Modules . RequiredModulesCyclicDependency , currentModuleName , moduleSpecification . Name , mo . Path ) ;
4467
+ string message = StringUtil . Format ( Modules . RequiredModulesCyclicDependency , currentModuleSpecification . ToString ( ) , requiredModuleSpecification . ToString ( ) , mo . Path ) ;
4464
4468
MissingMemberException mm = new MissingMemberException ( message ) ;
4465
4469
error = new ErrorRecord ( mm , "Modules_InvalidManifest" , ErrorCategory . ResourceUnavailable , mo . Path ) ;
4466
4470
return true ;
4467
4471
}
4468
- else // Go for the recursive check for the RequiredModules of current module
4472
+ else // Go for recursive check for the RequiredModules of current requiredModuleSpecification
4469
4473
{
4470
- // Add required Modules of m to the list
4471
- Collection < PSModuleInfo > availableModules = GetModuleIfAvailable ( moduleSpecification ) ;
4472
- List < ModuleSpecification > list = new List < ModuleSpecification > ( ) ;
4473
- string moduleName = null ;
4474
+ Collection < PSModuleInfo > availableModules = GetModuleIfAvailable ( requiredModuleSpecification ) ;
4474
4475
if ( availableModules . Count == 1 )
4475
4476
{
4476
- moduleName = availableModules [ 0 ] . Name ;
4477
- foreach ( var rm in availableModules [ 0 ] . RequiredModulesSpecification )
4478
- {
4479
- list . Add ( rm ) ;
4480
- }
4481
- // Only add if this element has a required module (meaning, it could lead to a circular reference)
4477
+ List < ModuleSpecification > list = new List < ModuleSpecification > ( availableModules [ 0 ] . RequiredModulesSpecification ) ;
4478
+ // Only add if this required module has nested required modules (meaning, it could lead to a circular reference)
4482
4479
if ( list . Count > 0 )
4483
4480
{
4484
- nonCyclicRequiredModules . Add ( moduleSpecification , list ) ;
4485
- }
4486
- }
4487
-
4488
- // We always need to check against the module name and not the file name
4489
- if ( HasRequiredModulesCyclicReference ( moduleName , list , availableModules , nonCyclicRequiredModules , out error ) )
4490
- {
4491
- return true ;
4481
+ nonCyclicRequiredModules . Add ( requiredModuleSpecification , list ) ;
4482
+ // We always need to check against the module specification and not the file name
4483
+ if ( HasRequiredModulesCyclicReference ( requiredModuleSpecification , list , availableModules , nonCyclicRequiredModules , out error ) )
4484
+ {
4485
+ return true ;
4486
+ }
4487
+ }
4492
4488
}
4493
4489
}
4494
4490
}
4495
4491
4496
- // Once depth recursive returns a value, we should remove the current module from the CyclicRequiredModules check list.
4497
- // This prevent non related modules get involved in the cycle list.
4498
- ModuleSpecification currentModule = new ModuleSpecification ( currentModuleName ) ;
4499
- nonCyclicRequiredModules . Remove ( currentModule ) ;
4492
+ // Once nested recursive calls are complete, we should remove the current module from the nonCyclicRequiredModules check list.
4493
+ // This prevents non related modules from getting involved in the cycle list.
4494
+ nonCyclicRequiredModules . Remove ( currentModuleSpecification ) ; // this uses ModuleSpecificationComparer equality comparer
4500
4495
return false ;
4501
4496
}
4502
4497
0 commit comments