/******************************************************************************* * Copyright (c) 2005, 2012 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) * Sergey Prigogin (Google) *******************************************************************************/ 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(); 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); } } return copy(copy, style); } @Override 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); } } } } @Override public IASTName[] getParameterNames() { return parameterNames; } @Override 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); } } } } @Override 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); } @Override 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); } }