/******************************************************************************* * Copyright (c) 2008 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences 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: * Institute for Software - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.implementmethod; import java.util.ArrayList; import java.util.Collection; import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; import org.eclipse.cdt.internal.ui.refactoring.utils.NameHelper; import org.eclipse.cdt.internal.ui.refactoring.utils.PseudoNameGenerator; /** * Manages and creates Method Parameter Infos. * * @author Lukas Felber * */ public class ParameterHandler { private boolean needsAditionalArgumentNames; private PseudoNameGenerator pseudoNameGenerator; private ArrayList<ParameterInfo> parameterInfos; private IASTSimpleDeclaration method; public ParameterHandler(IASTSimpleDeclaration method) { this.method = method; initArgumentNames(); } public boolean needsAdditionalArgumentNames() { return needsAditionalArgumentNames; } public void initArgumentNames() { if(parameterInfos != null) { return; } needsAditionalArgumentNames = false; parameterInfos = new ArrayList<ParameterInfo>(); for(IASTParameterDeclaration actParam : getParametersFromMethodNode()) { String actName = actParam.getDeclarator().getName().toString(); boolean isChangable = false; if(actParam.getDeclSpecifier()instanceof IASTSimpleDeclSpecifier && ((IASTSimpleDeclSpecifier)actParam.getDeclSpecifier()).getType() == IASTSimpleDeclSpecifier.t_void) { actName = ""; //$NON-NLS-1$ isChangable = false; }else if(actName.length() == 0) { needsAditionalArgumentNames = true; isChangable = true; actName = findNameForParameter(NameHelper.getTypeName(actParam)); } parameterInfos.add(new ParameterInfo(actParam, actName, isChangable)); } } private String findNameForParameter(String typeName) { if(pseudoNameGenerator == null) { pseudoNameGenerator = new PseudoNameGenerator(); for(IASTParameterDeclaration parameter : getParametersFromMethodNode()) { if(parameter.getDeclarator().getName().toString().length() != 0) { pseudoNameGenerator.addExistingName(parameter.getDeclarator().getName().toString()); } } } return pseudoNameGenerator.generateNewName(typeName); } private IASTParameterDeclaration[] getParametersFromMethodNode() { if(method.getDeclarators().length < 1) { return null; } return ((ICPPASTFunctionDeclarator) method.getDeclarators()[0]).getParameters(); } public Collection<ParameterInfo> getParameterInfos() { return parameterInfos; } }