blob: 06266c31eaad5271a13702ae4dfef396c0474a8e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.corext.refactoring.rename;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.Name;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.VariableDeclaration;
import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.jdt.internal.corext.dom.Selection;
import org.eclipse.jdt.internal.corext.dom.SelectionAnalyzer;
public class TempDeclarationFinder {
//no instances
private TempDeclarationFinder(){}
/**
* @return <code>null</code> if the selection is invalid or does not cover a temp
* declaration or reference.
*/
public static VariableDeclaration findTempDeclaration(CompilationUnit cu, int selectionOffset, int selectionLength) {
TempSelectionAnalyzer analyzer= new TempSelectionAnalyzer(selectionOffset, selectionLength);
cu.accept(analyzer);
ASTNode[] selected= analyzer.getSelectedNodes();
if (selected == null || selected.length != 1)
return null;
ASTNode selectedNode= selected[0];
if (selectedNode instanceof VariableDeclaration)
return (VariableDeclaration)selectedNode;
if (selectedNode instanceof Name){
Name reference= (Name)selectedNode;
IBinding binding= reference.resolveBinding();
if (binding == null)
return null;
ASTNode declaringNode= cu.findDeclaringNode(binding);
if (declaringNode instanceof VariableDeclaration)
return (VariableDeclaration)declaringNode;
else
return null;
} else if (selectedNode instanceof VariableDeclarationStatement){
VariableDeclarationStatement vds= (VariableDeclarationStatement)selectedNode;
if (vds.fragments().size() != 1)
return null;
return (VariableDeclaration)vds.fragments().get(0);
}
return null;
}
/*
* Class used to extract selected nodes from an AST.
* Subclassing <code>SelectionAnalyzer</code> is needed to support activation
* when only a part of the <code>VariableDeclaration</code> node is selected
*/
private static class TempSelectionAnalyzer extends SelectionAnalyzer {
private ASTNode fNode;
TempSelectionAnalyzer(int selectionOffset, int selectionLength){
super(Selection.createFromStartLength(selectionOffset, selectionLength), true);
}
//overridden
public boolean visitNode(ASTNode node) {
if (node instanceof VariableDeclaration)
return visitVariableDeclaration((VariableDeclaration)node);
else if (node instanceof SimpleName)
return visitSimpleName((SimpleName)node);
else
return super.visitNode(node);
}
private boolean addNodeAndStop(ASTNode node){
fNode= node;
return false;
}
private boolean visitSimpleName(SimpleName name) {
if (getSelection().coveredBy(name))
return addNodeAndStop(name);
return super.visitNode(name);
}
private boolean visitVariableDeclaration(VariableDeclaration vd) {
if (vd.getInitializer() != null){
int start= vd.getStartPosition();
IRegion declarationRange= new Region(start, vd.getInitializer().getStartPosition() - start);
if (getSelection().coveredBy(declarationRange))
return addNodeAndStop(vd);
else
return super.visitNode(vd);
} else {
if (getSelection().coveredBy(vd))
return addNodeAndStop(vd);
else
return super.visitNode(vd);
}
}
//overridden
public ASTNode[] getSelectedNodes() {
if (fNode != null)
return new ASTNode[] { fNode };
return super.getSelectedNodes();
}
}
}