/*******************************************************************************
* Copyright (c) 2012 Google, 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:
* Sergey Prigogin (Google) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.corext.refactoring.code.flow;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
/**
* Index of local variables inside a function. Each variable is assigned an integer index in normal
* code reading order. A variable with a smaller index is declared before a variable with a larger
* one.
*/
public class LocalVariableIndex {
private final Map<IVariable, Integer> variableMap = new HashMap<IVariable, Integer>();
public LocalVariableIndex(IASTFunctionDefinition functionDefinition) {
functionDefinition.accept(new ASTVisitor() {
{
shouldVisitNames = true;
}
@Override
public int visit(IASTName name) {
if (name instanceof ICPPASTQualifiedName || name.isQualified() || !name.isDeclaration()) {
return PROCESS_CONTINUE;
}
IBinding binding = name.resolveBinding();
if (binding instanceof IVariable && !(binding instanceof IField)) {
IVariable variable = (IVariable) binding;
if (!variableMap.containsKey(variable)) {
variableMap.put(variable, variableMap.size());
}
}
return PROCESS_CONTINUE;
}
});
}
/**
* Returns the number of local variables in the index.
*/
public int getNumLocalVariables() {
return variableMap.size();
}
/**
* Returns the index for the given local variable.
* @param variable the local variable
* @return the index of the variable, or -1 if the variable in not contained in the index.
*/
public int getIndexFromLocal(IVariable variable) {
Integer index = variableMap.get(variable);
return index != null ? index.intValue() : -1;
}
}