/******************************************************************************* * Copyright (c) 2010, 2015 Google, 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: * Sergey Prigogin (Google) - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.core.model; import static org.eclipse.cdt.core.model.CoreModelUtil.isExcludedPath; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.IPathEntry; import org.eclipse.cdt.core.model.ISourceEntry; import org.eclipse.cdt.core.settings.model.CSourceEntry; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICSourceEntry; import org.eclipse.cdt.core.settings.model.WriteAccessException; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; /** * Non-API methods for manipulating C/C++ projects. */ public class InternalCoreModelUtil { public static void addSourceEntry(IProject project, IFolder folder, boolean removeProject, IProgressMonitor monitor) throws CoreException { ICSourceEntry newEntry = new CSourceEntry(folder, null, 0); ICProjectDescription des = CCorePlugin.getDefault().getProjectDescription(project, true); addEntryToAllCfgs(des, newEntry, removeProject); CCorePlugin.getDefault().setProjectDescription(project, des, false, monitor); } private static void addEntryToAllCfgs(ICProjectDescription des, ICSourceEntry entry, boolean removeProject) throws WriteAccessException, CoreException { ICConfigurationDescription cfgs[] = des.getConfigurations(); for (ICConfigurationDescription cfg : cfgs) { ICSourceEntry[] entries = cfg.getSourceEntries(); entries = addEntry(entries, entry, removeProject); cfg.setSourceEntries(entries); } } private static ICSourceEntry[] addEntry(ICSourceEntry[] entries, ICSourceEntry sourceEntry, boolean removeProject) { Set<ICSourceEntry> set = new HashSet<>(); for (ICSourceEntry entry : entries) { if (removeProject && new Path(entry.getValue()).segmentCount() == 1) continue; set.add(entry); } set.add(sourceEntry); return set.toArray(new ICSourceEntry[set.size()]); } public static void addExclusionPatterns(IPathEntry newEntry, List<IPathEntry> existing, Set<IPathEntry> modifiedEntries) { IPath entryPath= newEntry.getPath(); for (int i= 0; i < existing.size(); i++) { IPathEntry curr= existing.get(i); IPath currPath= curr.getPath(); if (curr.getEntryKind() == IPathEntry.CDT_SOURCE && currPath.isPrefixOf(entryPath)) { IPath[] exclusionFilters= ((ISourceEntry) curr).getExclusionPatterns(); if (!isExcludedPath(entryPath, exclusionFilters)) { IPath pathToExclude= entryPath.removeFirstSegments(currPath.segmentCount()).addTrailingSeparator(); IPath[] newExclusionFilters= new IPath[exclusionFilters.length + 1]; System.arraycopy(exclusionFilters, 0, newExclusionFilters, 0, exclusionFilters.length); newExclusionFilters[exclusionFilters.length]= pathToExclude; IPathEntry updated= CoreModel.newSourceEntry(currPath, newExclusionFilters); existing.set(i, updated); modifiedEntries.add(updated); } } } } }