private static bool IsValidExtraction(IExtractMethodInput input, SelectionTarget target) { if (target.Parents[target.Parents.Length - 1] is ClassDefinition) { input.CannotExtract("Cannot extract statements from a class definition"); return false; } string invalidExtractMsg = target.InvalidExtractionMessage; if (invalidExtractMsg != null) { input.CannotExtract(invalidExtractMsg); return false; } var breakContinueWalker = new ContinueBreakWalker(); target.Walk(breakContinueWalker); if (breakContinueWalker.ContainsBreak) { input.CannotExtract("The selection contains a \"break\" statement, but not the enclosing loop"); return false; } else if (breakContinueWalker.ContainsContinue) { input.CannotExtract("The selection contains a \"continue\" statement, but not the enclosing loop"); return false; } var yieldWalker = new YieldWalker(); target.Walk(yieldWalker); if (yieldWalker.ContainsYield) { input.CannotExtract("Cannot extract code containing \"yield\" expression"); return false; } var importStarWalker = new ImportStarWalker(); target.Walk(importStarWalker); if (importStarWalker.ContainsImportStar) { input.CannotExtract("Cannot extract method containing from ... import * statement"); return false; } var returnWalker = new ReturnWalker(); target.Walk(returnWalker); if (returnWalker.ContainsReturn && !returnWalker.Returns) { input.CannotExtract("When the selection contains a return statement, all code paths must be terminated by a return statement too."); return false; } target.ContainsReturn = returnWalker.ContainsReturn; return true; }