diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/projectmodel/tests/CProjectDescriptionSerializationTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/projectmodel/tests/CProjectDescriptionSerializationTests.java index 9274031de4e..093b80f7561 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/projectmodel/tests/CProjectDescriptionSerializationTests.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/projectmodel/tests/CProjectDescriptionSerializationTests.java @@ -18,8 +18,10 @@ import junit.framework.TestSuite; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICFolderDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager; +import org.eclipse.cdt.core.settings.model.ICResourceDescription; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.managedbuilder.core.IConfiguration; @@ -30,12 +32,15 @@ import org.eclipse.cdt.managedbuilder.internal.core.Configuration; import org.eclipse.cdt.managedbuilder.internal.core.ManagedBuildInfo; import org.eclipse.cdt.managedbuilder.internal.core.ManagedProject; import org.eclipse.cdt.managedbuilder.testplugin.BuildSystemTestHelper; +import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceDescription; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.QualifiedName; /** * Creates a project in a loop and checks that it is created with appropriate number @@ -206,4 +211,60 @@ public class CProjectDescriptionSerializationTests extends TestCase { } } + public void testResetDefaultSetings_Bug298590() throws Exception { + String pluginProjectTypeId = "cdt.managedbuild.target.gnu.cygwin.exe"; + + CoreModel coreModel = CoreModel.getDefault(); + ICProjectDescriptionManager mngr = coreModel.getProjectDescriptionManager(); + + String projectName = getName(); + String folderName = "Folder"; + + // Create a managed project and a folder + IProject project = ManagedBuildTestHelper.createProject(projectName, pluginProjectTypeId); + IFolder folder = ManagedBuildTestHelper.createFolder(project, folderName); + IPath folderPath = folder.getProjectRelativePath(); + + // Initial project description after creating the project + ICProjectDescription initialProjectDescription = mngr.getProjectDescription(project); + assertNotNull("createDescription returned null!", initialProjectDescription); + assertEquals(2, initialProjectDescription.getConfigurations().length); + + { + // No folder description initially as it does not have any custom settings + ICConfigurationDescription cfgDescription = initialProjectDescription.getConfigurations()[0]; + ICResourceDescription rcDescription = cfgDescription.getResourceDescription(folderPath, true); + assertNull(rcDescription); + } + + // Properties window: get project description: prjd + ICProjectDescription propertyProjectDescription = CoreModel.getDefault().getProjectDescription(project); + { + // Still no folder description + ICConfigurationDescription cfgDescription = propertyProjectDescription.getConfigurations()[0]; + ICResourceDescription rcDescription = cfgDescription.getResourceDescription(folderPath, true); + assertNull(rcDescription); + + // getResDesc() creates default folder description + ICFolderDescription parentDescription = (ICFolderDescription)cfgDescription.getResourceDescription(folderPath, false); + assertEquals("/", parentDescription.toString()); + ICFolderDescription folderDescription = cfgDescription.createFolderDescription(folderPath, parentDescription); + assertEquals(folderPath,folderDescription.getPath()); + } + + // OK button, persist the property project description prjd. + coreModel.setProjectDescription(project, propertyProjectDescription); + + { + // Folder description should be null as no custom settings were defined + ICProjectDescription prjDescription = mngr.getProjectDescription(project); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + ICResourceDescription rcDescription = cfgDescription.getResourceDescription(folderPath, true); + assertNull(rcDescription); + } + + // Close project + project.close(null); + } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java index 7e34793fd05..e63b7e1576a 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java @@ -2493,7 +2493,7 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { parent = parent.getParentContainer()) { // no body, this loop is to find the parent } - if(!settingsCustomized(project, (CFolderData)parentRcData, (CFolderData)childRcData)){ + if(!settingsCustomized(project, (CFolderData)parentRcData, (CFolderData)childRcData, parent.isRoot())){ try { data.removeResourceData(childRcData); child.remove(); @@ -2519,35 +2519,33 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { return modified; } - static boolean settingsCustomized(IProject project, CFolderData parent, CFolderData child){ + static private boolean settingsCustomized(IProject project, CFolderData parent, CFolderData child, boolean isParentRoot){ if(baseSettingsCustomized(parent, child)) return true; CLanguageData[] childLDatas = child.getLanguageDatas(); CLanguageData[] parentLDatas = parent.getLanguageDatas(); - if(childLDatas.length != parentLDatas.length) + // Note that parent-root can define more languages than regular folder where tools are filtered + if(!isParentRoot && childLDatas.length != parentLDatas.length) return true; - if(childLDatas.length != 0){ - HashMap, CLanguageData> parentMap = createExtSetToLDataMap(project, parentLDatas); - HashMap, CLanguageData> childMap = createExtSetToLDataMap(project, childLDatas); - CLanguageData parentLData, childLData; - for (Map.Entry, CLanguageData> entry : parentMap.entrySet()) { - childLData = childMap.get(entry.getKey()); - if(childLData == null) - return true; + HashMap, CLanguageData> parentMap = createExtSetToLDataMap(project, parentLDatas); + HashMap, CLanguageData> childMap = createExtSetToLDataMap(project, childLDatas); + for (Map.Entry, CLanguageData> childEntry : childMap.entrySet()) { + CLanguageData parentLData = parentMap.get(childEntry.getKey()); + if(parentLData == null) + return true; - parentLData = entry.getValue(); - if(!langDatasEqual(parentLData, childLData)) - return true; - } + CLanguageData childLData = childEntry.getValue(); + if(!langDatasEqual(parentLData, childLData)) + return true; } - + return false; } - static boolean settingsCustomized(IProject project, CResourceData parent, CFileData child){ + static private boolean settingsCustomized(IProject project, CResourceData parent, CFileData child){ if(baseSettingsCustomized(parent, child)) return true;