/** * Copyright (c) 2008 Aptana, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl -v10.html. If redistributing this code, * this entire header must remain intact. */ package org.rubypeople.rdt.refactoring.core.extractconstant; import org.jruby.ast.BlockNode; import org.jruby.ast.ClassNode; import org.jruby.ast.ModuleNode; import org.jruby.ast.Node; import org.jruby.ast.SClassNode; import org.rubypeople.rdt.refactoring.core.IRefactoringContext; import org.rubypeople.rdt.refactoring.core.NodeProvider; import org.rubypeople.rdt.refactoring.core.SelectionNodeProvider; import org.rubypeople.rdt.refactoring.editprovider.InsertEditProvider; import org.rubypeople.rdt.refactoring.nodewrapper.RealClassNodeWrapper; import org.rubypeople.rdt.refactoring.nodewrapper.SClassNodeWrapper; import org.rubypeople.rdt.refactoring.offsetprovider.AfterNodeOffsetProvider; import org.rubypeople.rdt.refactoring.offsetprovider.BeforeFirstMethodInClassOffsetProvider; public class ExtractedConstantDef extends InsertEditProvider { private Node insertAfterNode; private ExtractConstantConfig config; public ExtractedConstantDef(ExtractConstantConfig config) { super(true); this.config = config; insertAfterNode = getNodeToInsertAfter(config.getRootNode(), config.getSelection()); if (insertAfterNode == null) { setInsertType(INSERT_AT_BEGIN_OF_LINE); } } private Node getNodeToInsertAfter(Node rootNode, IRefactoringContext selection) { Node enclosingClassNode = SelectionNodeProvider.getEnclosingNode(rootNode, selection, ClassNode.class); if (enclosingClassNode != null) { return enclosingClassNode; } Node enclosingModuleNode = SelectionNodeProvider.getEnclosingNode(rootNode, selection, ModuleNode.class); if (enclosingModuleNode != null) { return enclosingModuleNode; } Node enclosingBlockNode = SelectionNodeProvider.getEnclosingNode(config.getRootNode(), config.getSelection(), BlockNode.class); if (enclosingBlockNode != null) { Node firstSelectedNode = (Node) config.getSelectedNodes(); if (!firstSelectedNode.childNodes().isEmpty()) { firstSelectedNode = (Node) firstSelectedNode.childNodes().toArray()[0]; } return NodeProvider.getNodeBefore(enclosingBlockNode, firstSelectedNode); } return null; } @Override protected Node getInsertNode(int offset, String document) { return config.getConstantDeclNode(); } @Override protected int getOffset(String document) { if (insertAfterNode == null) { return 0; } if (insertAfterNode instanceof ClassNode) { return new BeforeFirstMethodInClassOffsetProvider(new RealClassNodeWrapper((ClassNode)insertAfterNode), config.getDocumentProvider().getActiveFileContent()).getOffset(); } if (insertAfterNode instanceof SClassNode) { return new BeforeFirstMethodInClassOffsetProvider(new SClassNodeWrapper((SClassNode)insertAfterNode, config.getRootNode()), config.getDocumentProvider().getActiveFileContent()).getOffset(); } if (insertAfterNode instanceof ModuleNode) { return new BeforeFirstMethodInClassOffsetProvider((ModuleNode) insertAfterNode, config.getDocumentProvider().getActiveFileContent()).getOffset(); } return new AfterNodeOffsetProvider(insertAfterNode, document).getOffset(); } }