/*******************************************************************************
* Copyright (c) 2007, 2008 Intel 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:
* Intel Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.utils.cdtvariables;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.cdtvariables.ICdtVariable;
public class SupplierBasedCdtVariableManager {
static public ICdtVariable getVariable(String macroName, IVariableContextInfo contextInfo, boolean includeParentContexts) {
if(contextInfo == null || macroName == null)
return null;
do{
ICdtVariableSupplier suppliers[] = contextInfo.getSuppliers();
if(suppliers != null){
for (ICdtVariableSupplier supplier : suppliers) {
ICdtVariable macro = supplier.getVariable(macroName, contextInfo);
if(macro != null)
return macro;
}
}
}while(includeParentContexts && (contextInfo = contextInfo.getNext()) != null);
return null;
}
static public ICdtVariable[] getVariables(IVariableContextInfo contextInfo,
boolean includeParentContexts) {
if(contextInfo == null)
return new ICdtVariable[0];
Map<String, ICdtVariable> map = new HashMap<String, ICdtVariable>();
IVariableContextInfo infos[] = includeParentContexts ?
getAllVariableContextInfos(contextInfo) :
new IVariableContextInfo[]{contextInfo};
for(int k = infos.length - 1; k >= 0; k--){
contextInfo = infos[k];
ICdtVariableSupplier suppliers[] = contextInfo.getSuppliers();
if(suppliers != null){
for(int i = suppliers.length - 1; i >= 0; i--){
ICdtVariable macros[] = suppliers[i].getVariables(contextInfo);
if(macros != null){
for (ICdtVariable macro : macros) {
map.put(macro.getName(),macro);
}
}
}
}
}
Collection<ICdtVariable> values = map.values();
return values.toArray(new ICdtVariable[values.size()]);
}
/*
* returns an array of the IMacroContextInfo that holds the context informations
* starting from the one passed to this method and including all subsequent parents
*/
private static IVariableContextInfo[] getAllVariableContextInfos(IVariableContextInfo contextInfo){
if(contextInfo == null)
return null;
List<IVariableContextInfo> list = new ArrayList<IVariableContextInfo>();
list.add(contextInfo);
while((contextInfo = contextInfo.getNext()) != null)
list.add(contextInfo);
return list.toArray(new IVariableContextInfo[list.size()]);
}
/*
* returns true if the first passed contextInfo is the child of the second one
*/
public static boolean checkParentContextRelation(IVariableContextInfo child, IVariableContextInfo parent){
if(child == null || parent == null)
return false;
IVariableContextInfo enumInfo = child;
do{
if(parent.equals(enumInfo))
return true;
}while((enumInfo = enumInfo.getNext()) != null);
return false;
}
}