blob: 2699ccbf03830dc92c940990b6c413ec45fae4cd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 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.debug.ui.actions;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
/**
* Compute the name of field declared at a given position from an JDOM CompilationUnit.
*/
public class BreakpointFieldLocator extends ASTVisitor {
private int fPosition;
private String fTypeName;
private String fFieldName;
private boolean fFound;
/**
* Constructor
* @param position the position in the compilation unit.
*/
public BreakpointFieldLocator(int position) {
fPosition= position;
fFound= false;
}
/**
* Return the name of the field declared at the given position.
* Return <code>null</code> if there is no field declaration at the given position.
*/
public String getFieldName() {
return fFieldName;
}
/**
* Return the name of type in which the field is declared.
* Return <code>null</code> if there is no field declaration at the given position.
*/
public String getTypeName() {
return fTypeName;
}
private boolean containsPosition(ASTNode node) {
int startPosition= node.getStartPosition();
int endPosition = startPosition + node.getLength();
return startPosition <= fPosition && fPosition <= endPosition;
}
/**
* @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.CompilationUnit)
*/
public boolean visit(CompilationUnit node) {
// visit only the type declarations
List types = node.types();
for (Iterator iter = types.iterator(); iter.hasNext() && !fFound;) {
((TypeDeclaration) iter.next()).accept(this);
}
return false;
}
/**
* @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.FieldDeclaration)
*/
public boolean visit(FieldDeclaration node) {
if (containsPosition(node)) {
// visit only the variable declaration fragments
List fragments = node.fragments();
if (fragments.size() == 1) {
fFieldName= ((VariableDeclarationFragment)fragments.get(0)).getName().getIdentifier();
fTypeName= ValidBreakpointLocationLocator.computeTypeName(node);
fFound= true;
return false;
}
for (Iterator iter = fragments.iterator(); iter.hasNext() && !fFound;) {
((VariableDeclarationFragment) iter.next()).accept(this);
}
}
return false;
}
/**
* @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TypeDeclaration)
*/
public boolean visit(TypeDeclaration node) {
if (containsPosition(node)) {
// visit the field declarations
FieldDeclaration[] fields = node.getFields();
for (int i = 0, length = fields.length; i < length && !fFound; i++) {
fields[i].accept(this);
}
if (!fFound) {
// visit inner types
TypeDeclaration[] types = node.getTypes();
for (int i = 0, length = types.length; i < length && !fFound; i++) {
types[i].accept(this);
}
}
}
return false;
}
/**
* @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.VariableDeclarationFragment)
*/
public boolean visit(VariableDeclarationFragment node) {
if (containsPosition(node)) {
fFieldName= node.getName().getIdentifier();
fTypeName= ValidBreakpointLocationLocator.computeTypeName(node);
fFound= true;
}
return false;
}
}