blob: d47e8b6464d5c464e25493bfd0a0404f5d7f464b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Wind River Systems, Inc. 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:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.ptp.internal.rdt.core.miners;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
/**
* Searches for a name related to the given selection. The first choice will be the
* largest name inside the selection. If it does not exist the smallest name
* surrounding the selection is taken.
* @see IASTNode#accept(ASTVisitor)
* @since 4.0
*/
public class FindNameForSelectionVisitor extends ASTVisitor {
private String fFilePath;
private int fOffset;
private int fEndOffset;
private IASTName fSelectedName;
public FindNameForSelectionVisitor(String filePath, int selectionStart, int selectionLength) {
fFilePath= filePath;
fOffset= selectionStart;
fEndOffset= selectionStart+selectionLength;
shouldVisitDeclarations= true;
shouldVisitNames= true;
}
/**
* After the visitor was accepted by an ast-node you can query the
* selected name.
* @return the name found for the selection, or <code>null</code>.
* @since 4.0
*/
public IASTName getSelectedName() {
return fSelectedName;
}
public int visit(IASTDeclaration declaration) {
IASTFileLocation loc= declaration.getFileLocation();
if (loc == null || !loc.getFileName().equals(fFilePath)) {
return PROCESS_SKIP;
}
int offset= loc.getNodeOffset();
int endoffset= offset + loc.getNodeLength();
if (endoffset < fOffset || fEndOffset < offset) {
return PROCESS_SKIP;
}
return PROCESS_CONTINUE;
}
public int visit(IASTName name) {
IASTFileLocation loc= name.getFileLocation();
if (loc == null) {
return PROCESS_CONTINUE;
}
if (!loc.getFileName().equals(fFilePath)) {
return PROCESS_SKIP;
}
int offset= loc.getNodeOffset();
int endoffset= offset + loc.getNodeLength();
// check if name is inside of selection
if (fOffset <= offset && endoffset <= fEndOffset) {
fSelectedName= name;
return PROCESS_ABORT;
}
// check if name surrounds selection
if (offset <= fOffset && fEndOffset <= endoffset) {
fSelectedName= name;
// continue as we might find a name inside of the selection,
// which is preferred.
return PROCESS_CONTINUE;
}
return PROCESS_CONTINUE;
}
}