// Path: support/java/src/mclab/ide/common/TextRange.java
// public class TextRange {
//   private int startLine;
//   private int startColumn;
//   private int endLine;
//   private int endColumn;
// 
//   private static Pattern REGEX = Pattern.compile("(\\d+),(\\d+)-(\\d+),(\\d+)");
//   // 1,2-4,5 -> TextRange(startLine=1, startColumn=2, endLine=4, endColumn=5)
//   public static TextRange parse(String range) {
//     Matcher m = REGEX.matcher(range);
//     Preconditions.checkArgument(m.find(), "couldn't parse text range");
//     int startLine = Integer.parseInt(m.group(1));
//     int startColumn = Integer.parseInt(m.group(2));
//     int endLine = Integer.parseInt(m.group(3));
//     int endColumn = Integer.parseInt(m.group(4));
//     return create(startLine, startColumn, endLine, endColumn);
//   }
//   
//   public static TextRange create(int startLine, int startColumn, int endLine, int endColumn) {
//     return new TextRange(startLine, startColumn, endLine, endColumn);
//   }
//   
//   public static TextRange of(ASTNode node) {
//     return create(node.getStartLine(), node.getStartColumn(), node.getEndLine(), node.getEndColumn());
//   }
//   
//   private TextRange(int startLine, int startColumn, int endLine, int endColumn) {
//     this.startLine = startLine;
//     this.startColumn = startColumn;
//     this.endLine = endLine;
//     this.endColumn = endColumn;
//   }
// 
//   public int getStartLine() {
//     return startLine;
//   }
// 
//   public int getStartColumn() {
//     return startColumn;
//   }
// 
//   public int getEndLine() {
//     return endLine;
//   }
// 
//   public int getEndColumn() {
//     return endColumn;
//   }
//   
//   public boolean contains(TextRange range) {
//     return (getStartLine() < range.getStartLine() ||
//         (getStartLine() == range.getStartLine() && getStartColumn() <= range.getStartColumn())) &&
//         (getEndLine() > range.getEndLine() ||
//         (getEndLine() == range.getEndLine() && getEndColumn() >= range.getEndColumn()));
//   }
// 
//   public boolean overlaps(TextRange range) {
//     return startColumn <= range.endColumn &&
//         endColumn >= range.startColumn &&
//         startLine <= range.endLine &&
//         endLine >= range.startLine;
//   }
//   
//   @Override public String toString() {
//     return String.format("%d,%d-%d,%d", getStartLine(), getStartColumn(), getEndLine(), getEndColumn());
//   }
// }


import java.io.IOException;
import java.util.Map;
import mclab.ide.common.TextRange;
import mclint.MatlabProgram;
import mclint.refactoring.Refactoring;
import mclint.refactoring.RefactoringContext;
import mclint.refactoring.Refactorings;
import natlab.utils.NodeFinder;
import ast.Expr;
package mclab.ide.refactoring;



public class ExtractVariableTool extends RefactoringTool {
  protected String[] expectedExtraArguments() {
    return new String[] {"newName"};
  }

// Path: support/java/src/mclab/ide/common/TextRange.java
// public class TextRange {
//   private int startLine;
//   private int startColumn;
//   private int endLine;
//   private int endColumn;
// 
//   private static Pattern REGEX = Pattern.compile("(\\d+),(\\d+)-(\\d+),(\\d+)");
//   // 1,2-4,5 -> TextRange(startLine=1, startColumn=2, endLine=4, endColumn=5)
//   public static TextRange parse(String range) {
//     Matcher m = REGEX.matcher(range);
//     Preconditions.checkArgument(m.find(), "couldn't parse text range");
//     int startLine = Integer.parseInt(m.group(1));
//     int startColumn = Integer.parseInt(m.group(2));
//     int endLine = Integer.parseInt(m.group(3));
//     int endColumn = Integer.parseInt(m.group(4));
//     return create(startLine, startColumn, endLine, endColumn);
//   }
//   
//   public static TextRange create(int startLine, int startColumn, int endLine, int endColumn) {
//     return new TextRange(startLine, startColumn, endLine, endColumn);
//   }
//   
//   public static TextRange of(ASTNode node) {
//     return create(node.getStartLine(), node.getStartColumn(), node.getEndLine(), node.getEndColumn());
//   }
//   
//   private TextRange(int startLine, int startColumn, int endLine, int endColumn) {
//     this.startLine = startLine;
//     this.startColumn = startColumn;
//     this.endLine = endLine;
//     this.endColumn = endColumn;
//   }
// 
//   public int getStartLine() {
//     return startLine;
//   }
// 
//   public int getStartColumn() {
//     return startColumn;
//   }
// 
//   public int getEndLine() {
//     return endLine;
//   }
// 
//   public int getEndColumn() {
//     return endColumn;
//   }
//   
//   public boolean contains(TextRange range) {
//     return (getStartLine() < range.getStartLine() ||
//         (getStartLine() == range.getStartLine() && getStartColumn() <= range.getStartColumn())) &&
//         (getEndLine() > range.getEndLine() ||
//         (getEndLine() == range.getEndLine() && getEndColumn() >= range.getEndColumn()));
//   }
// 
//   public boolean overlaps(TextRange range) {
//     return startColumn <= range.endColumn &&
//         endColumn >= range.startColumn &&
//         startLine <= range.endLine &&
//         endLine >= range.startLine;
//   }
//   
//   @Override public String toString() {
//     return String.format("%d,%d-%d,%d", getStartLine(), getStartColumn(), getEndLine(), getEndColumn());
//   }
// }


// Path: support/java/src/mclab/ide/refactoring/ExtractVariableTool.java
import java.io.IOException;
import java.util.Map;
import mclab.ide.common.TextRange;
import mclint.MatlabProgram;
import mclint.refactoring.Refactoring;
import mclint.refactoring.RefactoringContext;
import mclint.refactoring.Refactorings;
import natlab.utils.NodeFinder;
import ast.Expr;

package mclab.ide.refactoring;



public class ExtractVariableTool extends RefactoringTool {
  protected String[] expectedExtraArguments() {
    return new String[] {"newName"};
  }

  private static Expr findExpressionInSelection(MatlabProgram program, TextRange selection) {