blob: 51af61f81bd5d528146cac3a77f914dfc41a158d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 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
*******************************************************************************/
package org.eclipse.ptp.rdt.core.remotemake;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.settings.model.CIncludePathEntry;
import org.eclipse.cdt.core.settings.model.CMacroEntry;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICLanguageSetting;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector3;
import org.eclipse.cdt.make.core.scannerconfig.InfoContext;
import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes;
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathInfo;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ptp.rdt.core.RDTLog;
public class ProjectDescriptionCollector implements IScannerInfoCollector3 {
private IProject fProject;
private InfoContext fInfoContext;
@SuppressWarnings("unchecked")
public void contributeToScannerConfig(Object resource, Map/*<ScannerInfoTypes, List<String>>*/ scannerInfo) {
if(!(resource instanceof IResource))
return;
Map<ScannerInfoTypes, List<String>> info = (Map<ScannerInfoTypes, List<String>>)scannerInfo;
// get a writable description
IProject project = ((IResource)resource).getProject();
ICProjectDescription projectDescription = CoreModel.getDefault().getProjectDescription(project, true);
for(ICConfigurationDescription config : projectDescription.getConfigurations()) {
if (config.getRootFolderDescription() != null) {
for (ICLanguageSetting setting : config
.getRootFolderDescription().getLanguageSettings()) {
List<String> paths = info.get(ScannerInfoTypes.INCLUDE_PATHS);
addSettingEntries(setting, ICSettingEntry.INCLUDE_PATH, paths, INCLUDE_PATH_FACTORY);
List<String> macros = info.get(ScannerInfoTypes.SYMBOL_DEFINITIONS);
addSettingEntries(setting, ICSettingEntry.MACRO, macros,
MACRO_FACTORY);
}
}
}
try {
// save to .cproject file
CoreModel.getDefault().setProjectDescription(project, projectDescription);
} catch (CoreException e) {
RDTLog.logError(e);
}
}
private void addSettingEntries(ICLanguageSetting setting, int settingType, List<String> values, SettingFactory factory) {
if(values.isEmpty())
return;
// maintain insertion order and remote duplicates
Set<ICLanguageSettingEntry> entries = new LinkedHashSet<ICLanguageSettingEntry>();
// need to do this or else existing settings will disappear
List<ICLanguageSettingEntry> existingEntries = setting.getSettingEntriesList(settingType);
entries.addAll(existingEntries);
for(String value : values) {
entries.add(factory.createEntry(value));
}
setting.setSettingEntries(settingType, new ArrayList<ICLanguageSettingEntry>(entries));
}
// Abstract Factory pattern
private interface SettingFactory {
ICLanguageSettingEntry createEntry(String value);
}
private static final SettingFactory MACRO_FACTORY = new SettingFactory() {
public ICLanguageSettingEntry createEntry(String value) {
String[] split = value.split("="); //$NON-NLS-1$
switch(split.length) {
case 2 : return new CMacroEntry(split[0], split[1], 0);
default: return new CMacroEntry(value, null, 0);
}
}
};
private static final SettingFactory INCLUDE_PATH_FACTORY = new SettingFactory() {
public ICLanguageSettingEntry createEntry(String value) {
return new CIncludePathEntry(value, 0);
}
};
public List getCollectedScannerInfo(Object resource, ScannerInfoTypes type) {
return null;
}
public void setInfoContext(InfoContext context) {
fInfoContext = context;
fProject = fInfoContext.getProject();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2#createPathInfoObject()
*/
public IDiscoveredPathInfo createPathInfoObject() {
return new DiscoveredPathInfo(fProject);
}
public void setProject(IProject project) {
fProject = project;
}
public void updateScannerConfiguration(IProgressMonitor monitor) throws CoreException {
}
}