public ExtractMethodRefactoring(CompilationUnit unit, int selectionStart, int selectionLength) {
   this.unit = unit;
   this.selectionStart = selectionStart;
   this.selectionLength = selectionLength;
   this.selectionRange = SourceRangeFactory.forStartLength(selectionStart, selectionLength);
   this.methodName = "extracted"; // $NON-NLS-1$
 }
 /**
  * Checks if {@link #selectionRange} selects {@link DartExpression} or set of {@link
  * DartStatement}s which can be extracted, and location in AST allows extracting.
  */
 private RefactoringStatus checkSelection(IProgressMonitor pm) throws CoreException {
   Selection selection = Selection.createFromStartLength(selectionStart, selectionLength);
   selectionAnalyzer = new ExtractMethodAnalyzer(unit, selection);
   unitNode.accept(selectionAnalyzer);
   // may be fatal error
   {
     RefactoringStatus status = selectionAnalyzer.getStatus();
     if (status.hasFatalError()) {
       return status;
     }
   }
   // update selection
   selectionLength = selectionAnalyzer.getSelectionExclusiveEnd() - selectionStart;
   selectionRange = SourceRangeFactory.forStartLength(selectionStart, selectionLength);
   // check selected nodes
   DartNode[] selectedNodes = selectionAnalyzer.getSelectedNodes();
   if (selectedNodes.length > 0) {
     parentMember =
         ASTNodes.getParent(selectionAnalyzer.getLastCoveringNode(), DartClassMember.class);
     // single expression selected
     if (selectedNodes.length == 1
         && !utils.rangeIncludesNonWhitespaceOutsideNode(
             selectionRange, selectionAnalyzer.getFirstSelectedNode())) {
       DartNode selectedNode = selectionAnalyzer.getFirstSelectedNode();
       if (selectedNode instanceof DartExpression) {
         selectionExpression = (DartExpression) selectedNode;
         return new RefactoringStatus();
       }
     }
     // statements selected
     {
       List<DartStatement> selectedStatements = Lists.newArrayList();
       for (DartNode selectedNode : selectedNodes) {
         if (selectedNode instanceof DartStatement) {
           selectedStatements.add((DartStatement) selectedNode);
         }
       }
       if (selectedStatements.size() == selectedNodes.length) {
         selectionStatements = selectedStatements;
         return new RefactoringStatus();
       }
     }
   }
   // invalid selection
   return RefactoringStatus.createFatalErrorStatus(
       RefactoringCoreMessages.ExtractMethodAnalyzer_single_expression_or_set);
 }