/******************************************************************************* * Copyright (c) 2005, 2011 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 - Initial API and implementation * Anton Leherbauer (Wind River Systems) * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.c; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator; /** * A K&R C function declarator. * * @author dsteffle */ public class CASTKnRFunctionDeclarator extends CASTDeclarator implements ICASTKnRFunctionDeclarator { IASTName[] parameterNames = IASTName.EMPTY_NAME_ARRAY; IASTDeclaration[] parameterDeclarations = IASTDeclaration.EMPTY_DECLARATION_ARRAY; public CASTKnRFunctionDeclarator() { } public CASTKnRFunctionDeclarator(IASTName[] parameterNames, IASTDeclaration[] parameterDeclarations) { setParameterNames(parameterNames); setParameterDeclarations(parameterDeclarations); } @Override public CASTKnRFunctionDeclarator copy() { return copy(CopyStyle.withoutLocations); } @Override public CASTKnRFunctionDeclarator copy(CopyStyle style) { CASTKnRFunctionDeclarator copy = new CASTKnRFunctionDeclarator(); copyBaseDeclarator(copy, style); copy.parameterNames = new IASTName[parameterNames.length]; for (int i = 0; i < parameterNames.length; i++) { if (parameterNames[i] != null) { copy.parameterNames[i] = parameterNames[i].copy(style); copy.parameterNames[i].setParent(copy); copy.parameterNames[i].setPropertyInParent(PARAMETER_NAME); } } copy.parameterDeclarations = new IASTDeclaration[parameterDeclarations.length]; for (int i = 0; i < parameterDeclarations.length; i++) { if (parameterDeclarations[i] != null) { copy.parameterDeclarations[i] = parameterDeclarations[i].copy(style); copy.parameterDeclarations[i].setParent(copy); copy.parameterDeclarations[i].setPropertyInParent(FUNCTION_PARAMETER); } } if (style == CopyStyle.withLocations) { copy.setCopyLocation(this); } return copy; } public void setParameterNames(IASTName[] names) { assertNotFrozen(); parameterNames = names; if(names != null) { for(IASTName name : names) { if (name != null) { name.setParent(this); name.setPropertyInParent(PARAMETER_NAME); } } } } public IASTName[] getParameterNames() { return parameterNames; } public void setParameterDeclarations(IASTDeclaration[] decls) { assertNotFrozen(); parameterDeclarations = decls; if(decls != null) { for(IASTDeclaration decl : decls) { if (decl != null) { decl.setParent(this); decl.setPropertyInParent(FUNCTION_PARAMETER); } } } } public IASTDeclaration[] getParameterDeclarations() { return parameterDeclarations; } @Override protected boolean postAccept(ASTVisitor action) { IASTName[] ns = getParameterNames(); for (int i = 0; i < ns.length; i++) { if (!ns[i].accept(action)) return false; } IASTDeclaration[] params = getParameterDeclarations(); for (int i = 0; i < params.length; i++) { if (!params[i].accept(action)) return false; } return super.postAccept(action); } public IASTDeclarator getDeclaratorForParameterName(IASTName name) { boolean found=false; for(int i=0; i<parameterNames.length; i++) { if (parameterNames[i] == name) found = true; } if(!found) return null; for(int i=0; i<parameterDeclarations.length; i++) { if (parameterDeclarations[i] instanceof IASTSimpleDeclaration) { IASTDeclarator[] decltors = ((IASTSimpleDeclaration)parameterDeclarations[i]).getDeclarators(); for(int j=0; j<decltors.length; j++) { if(decltors[j].getName().toString().equals(name.toString())) return decltors[j]; } } } return null; } @Override public int getRoleForName(IASTName name) { IASTName [] n = getParameterNames(); for( int i = 0; i < n.length; ++i ) if( n[i] == name ) return r_unclear; return super.getRoleForName(name); } }