private CompositionResult TryPreviewImportsStateMachine(PartManager partManager, ComposablePart part, AtomicComposition atomicComposition) { var result = CompositionResult.SucceededResult; if (partManager.State == ImportState.ImportsPreviewing) { // We shouldn't nomally ever hit this case but if we do // then we should just error with a cycle error. return(new CompositionResult(ErrorBuilder.CreatePartCycle(part))); } // Transition from NoImportsStatisified to ImportsPreviewed if (partManager.State == ImportState.NoImportsSatisfied) { partManager.State = ImportState.ImportsPreviewing; var requiredImports = part.ImportDefinitions.Where(IsRequiredImportForPreview); // If this atomicComposition gets rolledback for any reason we need to reset our state atomicComposition.AddRevertActionAllowNull(() => partManager.State = ImportState.NoImportsSatisfied); result = result.MergeResult( this.TrySatisfyImportSubset(partManager, requiredImports, atomicComposition)); if (!result.Succeeded) { partManager.State = ImportState.NoImportsSatisfied; return(result); } partManager.State = ImportState.ImportsPreviewed; } return(result); }