/*******************************************************************************
 * Copyright (c) 2008 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.cdt.core.dom.ast;

import java.util.ArrayList;

import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.core.runtime.Assert;

/**
 * A convenience visitor that collects names.
 * @since 5.1
 */
public final class ASTNameCollector extends ASTVisitor {
	
	private char[] fName;
	private ArrayList<IASTName> fFound= new ArrayList<IASTName>(4);

	/**
	 * Construct a name collector for the given name.
	 */
	public ASTNameCollector(char[] name) {
		Assert.isNotNull(name);
		fName= name;
		shouldVisitNames = true;
	}
	
	/**
	 * Construct a name collector for the given name.
	 */
	public ASTNameCollector(String name) {
		this(name.toCharArray());
	}
	
	@Override
	public int visit(IASTName name) {
		if (name != null && !(name instanceof ICPPASTQualifiedName) && !(name instanceof ICPPASTTemplateId)) {
			if (CharArrayUtils.equals(fName, name.getSimpleID())) {
				fFound.add(name);
			}
		}
		return PROCESS_CONTINUE;
	}

	/**
	 * Return the array of matching names.
	 */
	public IASTName[] getNames() {
		return fFound.toArray(new IASTName[fFound.size()]);
	}

	/**
	 * Clear the names found, such that the collector can be reused.
	 */
	public void clear() {
		fFound.clear();
	}
}
