Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/index/QMakeProjectInfo.java52
-rw-r--r--qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtPlugin.java14
2 files changed, 50 insertions, 16 deletions
diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/index/QMakeProjectInfo.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/index/QMakeProjectInfo.java
index 753d16fd973..305c29ccb25 100644
--- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/index/QMakeProjectInfo.java
+++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/index/QMakeProjectInfo.java
@@ -24,7 +24,6 @@ import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICDescriptionDelta;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener;
-import org.eclipse.cdt.qt.core.QtNature;
import org.eclipse.cdt.qt.core.index.IQMakeEnv;
import org.eclipse.cdt.qt.core.index.IQMakeEnvProvider;
import org.eclipse.cdt.qt.core.index.IQMakeProjectInfo;
@@ -66,13 +65,14 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
// called by QtPlugin activator to clean up this class
public static final void stop() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(LISTENER);
+ List<QMakeProjectInfo> infos;
synchronized (SYNC) {
- while (true) {
- Iterator<IProject> iterator = CACHE.keySet().iterator();
- if (!iterator.hasNext()) {
- break;
- }
- removeProjectFromCache(iterator.next());
+ infos = new ArrayList<QMakeProjectInfo>(CACHE.values());
+ CACHE.clear();
+ }
+ for (QMakeProjectInfo info : infos) {
+ if (info != null) {
+ info.destroy();
}
}
}
@@ -84,16 +84,17 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
* @return the QMakeProjectInfo; or null if the project does not have QtNature
*/
public static QMakeProjectInfo getQMakeProjectInfoFor(IProject project) {
+ QMakeProjectInfo info;
synchronized (SYNC) {
- QMakeProjectInfo info = CACHE.get(project);
- if (info == null) {
- if (QtNature.hasNature(project)) {
- info = new QMakeProjectInfo(project);
- CACHE.put(project,info);
- }
+ info = CACHE.get(project);
+ if (info != null) {
+ return info;
}
- return info;
+ info = new QMakeProjectInfo(project);
+ CACHE.put(project,info);
}
+ info.updateActiveConfiguration();
+ return info;
}
// removes the project from the CACHE
@@ -125,7 +126,6 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
private QMakeProjectInfo(IProject project) {
this.project = project;
CoreModel.getDefault().addCProjectDescriptionListener(this, ICDescriptionDelta.ACTIVE_CFG);
- updateActiveConfiguration();
}
// called from removeProjectFromCache only
@@ -141,6 +141,7 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
}
}
+ // must not be called under synchronized (SYNC) or synchronized (sync)
private void updateActiveConfiguration() {
synchronized (sync) {
if (! live) {
@@ -181,6 +182,10 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
listeners.remove(listener);
}
+ private IProject getProject() {
+ return project;
+ }
+
// calculates (if does not exist) and returns actual QMake info
@Override
public IQMakeInfo getActualInfo() {
@@ -356,6 +361,7 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
private static final class RDVisitor implements IResourceDeltaVisitor {
private final Set<IResource> projectsToDelete = new HashSet<IResource>();
+ private final Set<IResource> projectsToUpdate = new HashSet<IResource>();
private final Set<IPath> changedFiles = new HashSet<IPath>();
@Override
@@ -367,7 +373,13 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
addChangedFile(resource);
return false;
case IResource.PROJECT:
- if (delta.getKind() == IResourceDelta.REMOVED) {
+ switch (delta.getKind()) {
+ case IResourceDelta.CHANGED:
+ if ((delta.getFlags() & IResourceDelta.DESCRIPTION) != 0) {
+ addProjectToUpdate(resource);
+ }
+ return true;
+ case IResourceDelta.REMOVED:
addProjectToDelete(resource);
return false;
}
@@ -377,6 +389,10 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
return true;
}
+ private void addProjectToUpdate(IResource project) {
+ projectsToUpdate.add(project);
+ }
+
private void addProjectToDelete(IResource project) {
projectsToDelete.add(project);
}
@@ -399,6 +415,10 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
infos = new ArrayList<QMakeProjectInfo>(CACHE.values());
}
for (QMakeProjectInfo info : infos) {
+ // checking if any project description change affects QMakeProjectInfo
+ if (projectsToUpdate.contains(info.getProject())) {
+ info.updateActiveConfiguration();
+ }
// checking if any of the changed files affects QMakeProjectInfo
if (info.containsAnySensitiveFile(changedFiles)) {
// if so then scheduling update
diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtPlugin.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtPlugin.java
index e6d0988558c..7649685cd21 100644
--- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtPlugin.java
+++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtPlugin.java
@@ -8,11 +8,13 @@
package org.eclipse.cdt.qt.core;
import org.eclipse.cdt.core.model.CModelException;
+import org.eclipse.cdt.internal.qt.core.index.QMakeProjectInfo;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.runtime.Status;
+import org.osgi.framework.BundleContext;
public class QtPlugin extends Plugin {
@@ -43,6 +45,18 @@ public class QtPlugin extends Plugin {
instance = this;
}
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ QMakeProjectInfo.start();
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ QMakeProjectInfo.stop();
+ super.stop(context);
+ }
+
public static CoreException coreException(String msg) {
return new CoreException(new Status(IStatus.INFO, ID, msg));
}

Back to the top