package com.redhat.ceylon.eclipse.code.refactor; import static com.redhat.ceylon.eclipse.java2ceylon.Java2CeylonProxies.refactorJ2C; import static com.redhat.ceylon.eclipse.ui.CeylonPlugin.PLUGIN_ID; import static com.redhat.ceylon.model.typechecker.model.ModelUtil.isTypeUnknown; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.text.IDocument; import org.eclipse.ltk.core.refactoring.CompositeChange; import org.eclipse.ltk.ui.refactoring.RefactoringWizard; import org.eclipse.swt.widgets.Shell; import com.redhat.ceylon.compiler.typechecker.tree.Tree; import com.redhat.ceylon.compiler.typechecker.tree.Tree.CompilationUnit; import com.redhat.ceylon.eclipse.code.editor.CeylonEditor; import com.redhat.ceylon.model.typechecker.model.Type; public final class ExtractFunctionLinkedMode extends ExtractLinkedMode { private final EclipseExtractFunctionRefactoring refactoring; public ExtractFunctionLinkedMode(CeylonEditor editor) { super(editor); this.refactoring = refactorJ2C() .newExtractFunctionRefactoring(editor); } public ExtractFunctionLinkedMode(CeylonEditor editor, Tree.Declaration target) { super(editor); this.refactoring = refactorJ2C() .newExtractFunctionRefactoring(editor, target); } @Override protected int performInitialChange(IDocument document) { try { NullProgressMonitor pm = new NullProgressMonitor(); refactoring.createChange(pm).perform(pm); } catch (Exception e) { e.printStackTrace(); } return 0; } @Override protected boolean canStart() { return refactoring.getEnabled(); } @Override protected int getNameOffset() { return refactoring.getDecRegion().getOffset(); } @Override protected int getTypeOffset() { return refactoring.getTypeRegion().getOffset(); } @Override protected int getExitPosition(int selectionOffset, int adjust) { return refactoring.getRefRegion().getOffset(); } @Override protected String[] getNameProposals() { return refactoring.getNameProposals(); } @Override protected void addLinkedPositions(IDocument document, CompilationUnit rootNode, int adjust) { addNamePosition(document, refactoring.getRefRegion().getOffset(), refactoring.getRefRegion().getLength(), refactoring.getDupeRegions()); Type type = refactoring.getType(); if (!isTypeUnknown(type)) { addTypePosition(document, type, refactoring.getTypeRegion().getOffset(), refactoring.getTypeRegion().getLength()); } } @Override protected String getName() { return refactoring.getNewName(); } @Override protected void setName(String name) { refactoring.setNewName(name); } @Override protected boolean forceWizardMode() { try { return refactoring.forceWizardMode() || //yew, truly terrible hack!! ((Refactoring) refactoring) .createChange(null) instanceof CompositeChange; } catch (Exception e) { return false; } } @Override protected String getActionName() { return PLUGIN_ID + ".action.extractFunction"; } @Override protected void openPreview() { new ExtractFunctionRefactoringAction(editor) { @Override public Refactoring createRefactoring() { return (Refactoring) ExtractFunctionLinkedMode.this.refactoring; } @Override public RefactoringWizard createWizard(Refactoring refactoring) { return new ExtractFunctionWizard(refactoring) { @Override protected void addUserInputPages() {} }; } }.run(); } @Override protected void openDialog() { new ExtractFunctionRefactoringAction(editor) { @Override public Refactoring createRefactoring() { return (Refactoring) ExtractFunctionLinkedMode.this.refactoring; } }.run(); } @Override public boolean canBeInferred() { return refactoring.canBeInferred(); } @Override protected String getKind() { return "function"; } public static void selectExpressionAndStart( final CeylonEditor editor) { final Shell shell = editor.getSite().getShell(); if (editor.getSelection().getLength()>0) { new SelectContainerPopup(shell, 0, editor, "Extract Function To") { @Override void finish() { new ExtractFunctionLinkedMode(editor, getResult()).start(); } @Override boolean isEnabled() { return new refactorJ2C().newExtractFunctionRefactoring(editor).getEnabled(); } } .open(); } else { new SelectExpressionPopup(shell, 0, editor, "Extract Function") { @Override void finish() { new SelectContainerPopup(shell, 0, editor, "Extract Function To") { @Override void finish() { new ExtractFunctionLinkedMode(editor, getResult()).start(); } @Override boolean isEnabled() { return new refactorJ2C().newExtractFunctionRefactoring(editor).getEnabled(); } } .open(); } } .open(); } } @Override protected void setReturnType(Type type) { // TODO this.refactoring.setType(type); this.refactoring.setExplicitType(); } }