1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-25 01:45:33 +02:00

Fix for bug 172919, automatic reindex when defaultSettingsConfiguration changes.

This commit is contained in:
Markus Schorn 2007-04-24 13:23:11 +00:00
parent d1713fd418
commit 68ee7c7944
5 changed files with 73 additions and 14 deletions

View file

@ -167,7 +167,7 @@ public interface IIndexManager extends IPDOMManager {
* @throws CoreException
* @since 4.0
*/
public void reindex(ICProject project) throws CoreException;
public void reindex(ICProject project);
/**
* Updates the index for the given selection of translation units considering

View file

@ -0,0 +1,54 @@
/*******************************************************************************
* Copyright (c) 2007 Wind River Systems, 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:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom;
import org.eclipse.cdt.core.index.IIndexManager;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener;
import org.eclipse.core.resources.IProject;
public class CProjectDescriptionListener implements ICProjectDescriptionListener {
private IIndexManager fIndexManager;
public CProjectDescriptionListener(IIndexManager manager) {
fIndexManager= manager;
}
public void handleEvent(CProjectDescriptionEvent event) {
ICProjectDescription old= event.getOldCProjectDescription();
ICProjectDescription act= event.getNewCProjectDescription();
if (old != null && act != null) {
ICConfigurationDescription oldConfig= old.getDefaultSettingConfiguration();
ICConfigurationDescription newConfig= act.getDefaultSettingConfiguration();
if (oldConfig != null && newConfig != null) {
String oldID= oldConfig.getId();
String newID= newConfig.getId();
if (oldID != null && newID != null) {
if (!oldID.equals(newID)) {
IProject project= event.getProject();
if (project != null && project.isOpen()) {
ICProject cproject= CoreModel.getDefault().getCModel().getCProject(project.getName());
if (cproject != null) {
fIndexManager.reindex(cproject);
}
}
}
}
}
}
}
}

View file

@ -49,23 +49,18 @@ public class LanguageMappingChangeListener implements
// are potentially unaffected due to project settings
try {
ICProject[] cProjects = manager.getCModel().getCProjects();
fManager.update(cProjects, IIndexManager.UPDATE_ALL);
for (int i = 0; i < cProjects.length; i++) {
ICProject project = cProjects[i];
fManager.reindex(project);
}
} catch (CModelException e) {
CCorePlugin.log(e);
} catch (CoreException e) {
CCorePlugin.log(e);
}
} else if (event.getType() == ILanguageMappingChangeEvent.TYPE_PROJECT) {
// For now, reindex the entire project since we don't know which
// files are affected.
try {
ICProject cProject = manager.getCModel().getCProject(event.getProject());
fManager.reindex(cProject);
} catch (CModelException e) {
CCorePlugin.log(e);
} catch (CoreException e) {
CCorePlugin.log(e);
}
ICProject cProject = manager.getCModel().getCProject(event.getProject());
fManager.reindex(cProject);
} else if (event.getType() == ILanguageMappingChangeEvent.TYPE_FILE) {
// Just reindex the affected file.
IFile file = event.getFile();

View file

@ -47,6 +47,8 @@ import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ILanguageMappingChangeListener;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.index.IIndexFragment;
import org.eclipse.cdt.internal.core.index.IWritableIndex;
@ -148,6 +150,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
private CModelListener fCModelListener= new CModelListener(this);
private ILanguageMappingChangeListener fLanguageChangeListener = new LanguageMappingChangeListener(this);
private ICProjectDescriptionListener fProjectDescriptionListener= new CProjectDescriptionListener(this);
private IndexFactory fIndexFactory= new IndexFactory(this);
private IndexProviderManager fIndexProviderManager = new IndexProviderManager();
@ -173,6 +177,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
ResourcesPlugin.getWorkspace().addResourceChangeListener(fCModelListener, IResourceChangeEvent.POST_BUILD);
model.addElementChangedListener(fCModelListener);
LanguageManager.getInstance().registerLanguageChangeListener(fLanguageChangeListener);
final int types= CProjectDescriptionEvent.DATA_APPLIED;
CCorePlugin.getDefault().getProjectDescriptionManager().addCProjectDescriptionListener(fProjectDescriptionListener, types);
try {
ICProject[] projects= model.getCModel().getCProjects();
@ -185,6 +191,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
public void shutdown() {
CCorePlugin.getDefault().getProjectDescriptionManager().removeCProjectDescriptionListener(fProjectDescriptionListener);
final CoreModel model = CoreModel.getDefault();
model.removeElementChangedListener(fCModelListener);
ResourcesPlugin.getWorkspace().removeResourceChangeListener(fCModelListener);
@ -755,7 +762,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
}
public void reindex(ICProject project) throws CoreException {
public void reindex(ICProject project) {
assert !Thread.holdsLock(fProjectToPDOM);
IPDOMIndexer indexer= null;
synchronized (fUpdatePolicies) {

View file

@ -481,7 +481,10 @@ public class IndexerBlock extends AbstractCOptionPage {
: ICProjectDescriptionPreferences.CONFIGS_INDEPENDENT);
}
if (!useActive) {
prefs.setDefaultSettingConfiguration(prefs.getConfigurationByName(fBuildConfigComboBox.getText()));
final ICConfigurationDescription config= prefs.getConfigurationByName(fBuildConfigComboBox.getText());
if (config != null) {
prefs.setDefaultSettingConfiguration(config);
}
}
prjDescMgr.setProjectDescription(getProject(), prefs);
}