1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-01 21:35:40 +02:00

bug 298509: Project description delta is not created for some events

Added ability to create multiple configurations while creating CDT project
This commit is contained in:
Andrew Gvozdev 2009-12-24 22:05:02 +00:00
parent 0ef32519a1
commit 474bd757db

View file

@ -27,8 +27,11 @@ import junit.framework.Assert;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager;
import org.eclipse.cdt.core.settings.model.TestCfgDataProvider;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IFolder;
@ -66,37 +69,62 @@ public class ResourceHelper {
private final static Set<IResource> resourcesCreated = new HashSet<IResource>(); private final static Set<IResource> resourcesCreated = new HashSet<IResource>();
/** /**
* Creates CDT project in a specific location and opens it. * Creates CDT project in a specific path in workspace and opens it.
* *
* @param projectName - project name. * @param projectName - project name.
* @param locationInWorkspace - location relative to workspace root. * @param pathInWorkspace - path relative to workspace root.
* @return - new {@link IProject}. * @return - new {@link IProject}.
* @throws CoreException - if the project can't be created. * @throws CoreException - if the project can't be created.
* @throws OperationCanceledException... * @throws OperationCanceledException...
*/ */
public static IProject createCDTProject(String projectName, String locationInWorkspace) throws OperationCanceledException, CoreException { public static IProject createCDTProject(String projectName, String pathInWorkspace) throws OperationCanceledException, CoreException {
return createCDTProject(projectName, pathInWorkspace, null);
}
/**
* Creates CDT project in a specific path in workspace adding specified configurations and opens it.
*
* @param projectName - project name.
* @param pathInWorkspace - path relative to workspace root.
* @param configurationIds - array of configuration IDs.
* @return - new {@link IProject}.
* @throws CoreException - if the project can't be created.
* @throws OperationCanceledException...
*/
public static IProject createCDTProject(String projectName, String pathInWorkspace, String[] configurationIds) throws OperationCanceledException, CoreException {
CCorePlugin cdtCorePlugin = CCorePlugin.getDefault();
IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot(); IWorkspaceRoot root = workspace.getRoot();
IProject project = root.getProject(projectName); IProject project = root.getProject(projectName);
IndexerPreferences.set(project, IndexerPreferences.KEY_INDEXER_ID, IPDOMManager.ID_NO_INDEXER);
resourcesCreated.add(project); resourcesCreated.add(project);
IProjectDescription description = workspace.newProjectDescription(projectName);
if(locationInWorkspace != null) { IProjectDescription prjDescription = workspace.newProjectDescription(projectName);
IPath absoluteLocation = root.getLocation().append(locationInWorkspace); if(pathInWorkspace != null) {
description.setLocation(absoluteLocation); IPath absoluteLocation = root.getLocation().append(pathInWorkspace);
prjDescription.setLocation(absoluteLocation);
} }
project = CCorePlugin.getDefault().createCDTProject(description, project, NULL_MONITOR);
if (configurationIds!=null && configurationIds.length>0) {
ICProjectDescriptionManager prjDescManager = cdtCorePlugin.getProjectDescriptionManager();
project.create(NULL_MONITOR);
project.open(NULL_MONITOR);
ICProjectDescription icPrjDescription = prjDescManager.createProjectDescription(project, false);
ICConfigurationDescription baseConfiguration = cdtCorePlugin.getPreferenceConfiguration(TestCfgDataProvider.PROVIDER_ID);
for (String cfgId : configurationIds) {
icPrjDescription.createConfiguration(cfgId, cfgId+" Name", baseConfiguration);
}
prjDescManager.setProjectDescription(project, icPrjDescription);
}
project = cdtCorePlugin.createCDTProject(prjDescription, project, NULL_MONITOR);
waitForProjectRefreshToFinish();
Assert.assertNotNull(project); Assert.assertNotNull(project);
project.open(null); project.open(null);
try {
// CDT opens the Project with BACKGROUND_REFRESH enabled which causes the
// refresh manager to refresh the project 200ms later. This Job interferes
// with the resource change handler firing see: bug 271264
Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_REFRESH, null);
} catch (Exception e) {
// Ignore
}
Assert.assertTrue(project.isOpen()); Assert.assertTrue(project.isOpen());
return project; return project;
@ -114,23 +142,18 @@ public class ResourceHelper {
public static IProject createCDTProject(String projectName, URI locationURI) throws OperationCanceledException, CoreException { public static IProject createCDTProject(String projectName, URI locationURI) throws OperationCanceledException, CoreException {
IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot(); IWorkspaceRoot root = workspace.getRoot();
IProject project = root.getProject(projectName); IProject project = root.getProject(projectName);
IndexerPreferences.set(project, IndexerPreferences.KEY_INDEXER_ID, IPDOMManager.ID_NO_INDEXER);
resourcesCreated.add(project); resourcesCreated.add(project);
IProjectDescription description = workspace.newProjectDescription(projectName); IProjectDescription description = workspace.newProjectDescription(projectName);
description.setLocationURI(locationURI); description.setLocationURI(locationURI);
project = CCorePlugin.getDefault().createCDTProject(description, project, NULL_MONITOR); project = CCorePlugin.getDefault().createCDTProject(description, project, NULL_MONITOR);
waitForProjectRefreshToFinish();
Assert.assertNotNull(project); Assert.assertNotNull(project);
project.open(null); project.open(null);
try {
// CDT opens the Project with BACKGROUND_REFRESH enabled which causes the
// refresh manager to refresh the project 200ms later. This Job interferes
// with the resource change handler firing see: bug 271264
Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_REFRESH, null);
} catch (Exception e) {
// Ignore
}
Assert.assertTrue(project.isOpen()); Assert.assertTrue(project.isOpen());
return project; return project;
@ -145,19 +168,22 @@ public class ResourceHelper {
* @throws OperationCanceledException... * @throws OperationCanceledException...
*/ */
public static IProject createCDTProject(String projectName) throws OperationCanceledException, CoreException { public static IProject createCDTProject(String projectName) throws OperationCanceledException, CoreException {
return createCDTProject(projectName, (String)null); return createCDTProject(projectName, null, null);
} }
/** /**
* Create a new style cdt project with an 1 project description * Creates a project with 1 test configuration and opens it.
* @param projectName *
* @return IProject * @param projectName - project name.
* @throws Exception * @return - new {@link IProject}.
* @throws CoreException - if the project can't be created.
* @throws OperationCanceledException...
*/ */
public static IProject createCDTProjectWithConfig(String projectName) throws Exception { public static IProject createCDTProjectWithConfig(String projectName) throws Exception {
ICProject proj = CProjectHelper.createNewStileCProject(projectName, IPDOMManager.ID_FAST_INDEXER); IProject project = createCDTProject(projectName, null,
resourcesCreated.add(proj.getProject()); new String[] {"org.eclipse.cdt.core.tests.configuration"});
return proj.getProject(); resourcesCreated.add(project);
return project;
} }
/** /**
@ -530,7 +556,7 @@ public class ResourceHelper {
public static void cleanUp() throws CoreException, IOException { public static void cleanUp() throws CoreException, IOException {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
root.refreshLocal(IResource.DEPTH_INFINITE, NULL_MONITOR); root.refreshLocal(IResource.DEPTH_INFINITE, NULL_MONITOR);
// Delete all external files & folders created using ResourceHelper // Delete all external files & folders created using ResourceHelper
for (String loc : externalFilesCreated) { for (String loc : externalFilesCreated) {
File f = new File(loc); File f = new File(loc);
@ -538,7 +564,7 @@ public class ResourceHelper {
deleteRecursive(f); deleteRecursive(f);
} }
externalFilesCreated.clear(); externalFilesCreated.clear();
// Remove IResources created by this helper // Remove IResources created by this helper
for (IResource r : resourcesCreated) { for (IResource r : resourcesCreated) {
if (r.exists()) if (r.exists())
@ -551,6 +577,17 @@ public class ResourceHelper {
resourcesCreated.clear(); resourcesCreated.clear();
} }
private static void waitForProjectRefreshToFinish() {
try {
// CDT opens the Project with BACKGROUND_REFRESH enabled which causes the
// refresh manager to refresh the project 200ms later. This Job interferes
// with the resource change handler firing see: bug 271264
Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_REFRESH, null);
} catch (Exception e) {
// Ignore
}
}
/** /**
* Recursively delete a directory / file * Recursively delete a directory / file
* *