From df81d1f40ebce30a863b4d02ff8bcc32bb6804ae Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 8 Apr 2010 11:49:24 +0000 Subject: [PATCH] Bug 283080: Updating headers in non-source folders. --- .../internal/index/tests/IndexBugsTests.java | 67 +++++++++++++++++++ .../index/tests/IndexProviderManagerTest.java | 21 +++--- .../core/pdom/indexer/DeltaAnalyzer.java | 49 +++++++++++--- .../indexer/PotentialTranslationUnit.java | 26 +++++++ .../indexer/ProjectIndexerInputAdapter.java | 11 ++- 5 files changed, 153 insertions(+), 21 deletions(-) create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PotentialTranslationUnit.java diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java index a82af57671c..98bf64bb4ad 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java @@ -71,6 +71,10 @@ import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.core.settings.model.CSourceEntry; +import org.eclipse.cdt.core.settings.model.ICProjectDescription; +import org.eclipse.cdt.core.settings.model.ICSettingEntry; +import org.eclipse.cdt.core.settings.model.ICSourceEntry; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.cdt.core.testplugin.TestScannerProvider; @@ -79,10 +83,12 @@ import org.eclipse.cdt.core.testplugin.util.TestSourceReader; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; @@ -2209,4 +2215,65 @@ public class IndexBugsTests extends BaseTestCase { } } + public void testUpdateNonSrcFolderHeader_283080() throws Exception { + IIndexBinding[] r; + + final IProject prj = fCProject.getProject(); + final IFolder src= prj.getFolder("src"); + final IFolder h= prj.getFolder("h"); + src.create(true, false, null); + h.create(true, false, null); + assertTrue(src.exists()); + assertTrue(h.exists()); + + ICProjectDescription desc= CCorePlugin.getDefault().getProjectDescription(prj); + assertNotNull(desc); + desc.getActiveConfiguration().setSourceEntries(new ICSourceEntry[] { + new CSourceEntry(src, new IPath[0], ICSettingEntry.SOURCE_PATH) + }); + CCorePlugin.getDefault().setProjectDescription(prj, desc); + TestSourceReader.createFile(h, "a.h", "int version1;"); + waitForIndexer(fCProject); + + final IIndex index= CCorePlugin.getIndexManager().getIndex(fCProject); + index.acquireReadLock(); + try { + r = index.findBindings("version1".toCharArray(), IndexFilter.ALL_DECLARED, null); + assertEquals(0, r.length); + } finally { + index.releaseReadLock(); + } + + IFile s= TestSourceReader.createFile(h, "a.h", "int version2;"); + waitForIndexer(fCProject); + index.acquireReadLock(); + try { + r = index.findBindings("version2".toCharArray(), IndexFilter.ALL_DECLARED, null); + assertEquals(0, r.length); + } finally { + index.releaseReadLock(); + } + + s= TestSourceReader.createFile(src, "source.cpp", "#include \"../h/a.h\""); + waitUntilFileIsIndexed(s, INDEX_WAIT_TIME); + index.acquireReadLock(); + try { + r = index.findBindings("version2".toCharArray(), IndexFilter.ALL_DECLARED, null); + assertEquals(1, r.length); + } finally { + index.releaseReadLock(); + } + + s= TestSourceReader.createFile(h, "a.h", "int version3;"); + waitUntilFileIsIndexed(s, INDEX_WAIT_TIME); + index.acquireReadLock(); + try { + r = index.findBindings("version2".toCharArray(), IndexFilter.ALL_DECLARED, null); + assertEquals(0, r.length); + r = index.findBindings("version3".toCharArray(), IndexFilter.ALL_DECLARED, null); + assertEquals(1, r.length); + } finally { + index.releaseReadLock(); + } + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexProviderManagerTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexProviderManagerTest.java index d821e93ff7c..28a587a59bf 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexProviderManagerTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexProviderManagerTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2008 Symbian Software Systems and others. + * Copyright (c) 2007, 2010 Symbian Software Systems 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 @@ -54,6 +54,7 @@ import org.eclipse.cdt.internal.core.index.provider.IIndexFragmentProvider; import org.eclipse.cdt.internal.core.index.provider.IndexProviderManager; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.PDOMManager; +import org.eclipse.cdt.internal.core.pdom.indexer.DeltaAnalyzer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; @@ -100,8 +101,8 @@ public class IndexProviderManagerTest extends IndexTestBase { } public void testProvider_SimpleLifeCycle_200958() throws Exception { - for(int i=0; i fForce= new ArrayList(); - private List fChanged= new ArrayList(); - private List fRemoved= new ArrayList(); + private final List fForce= new ArrayList(); + private final List fChanged= new ArrayList(); + private final List fRemoved= new ArrayList(); + // For testing purposes, only. + public static boolean sSuppressPotentialTUs= false; public DeltaAnalyzer() { } public void analyzeDelta(ICElementDelta delta) throws CoreException { - processDelta(delta); + processDelta(delta, new HashSet()); } - private void processDelta(ICElementDelta delta) throws CoreException { - int flags = delta.getFlags(); + private void processDelta(ICElementDelta delta, Set handled) throws CoreException { + final int flags = delta.getFlags(); if ((flags & ICElementDelta.F_CHILDREN) != 0) { - ICElementDelta[] children = delta.getAffectedChildren(); - for (int i = 0; i < children.length; ++i) { - processDelta(children[i]); + for (ICElementDelta child : delta.getAffectedChildren()) { + processDelta(child, handled); } } - ICElement element = delta.getElement(); + final ICElement element = delta.getElement(); + handled.add(element.getResource()); switch (element.getElementType()) { case ICElement.C_UNIT: ITranslationUnit tu = (ITranslationUnit)element; @@ -70,6 +77,28 @@ public class DeltaAnalyzer { } break; } + + final IResourceDelta[] rDeltas= delta.getResourceDeltas(); + if (rDeltas != null && !sSuppressPotentialTUs) { + for (IResourceDelta rd: rDeltas) { + final int rdkind = rd.getKind(); + if (rdkind != IResourceDelta.ADDED) { + IResource res= rd.getResource(); + if (res instanceof IFile && handled.add(res)) { + switch (rdkind) { + case IResourceDelta.CHANGED: + if ((rd.getFlags() & IResourceDelta.CONTENT) != 0) { + fChanged.add(new PotentialTranslationUnit(element, (IFile) res)); + } + break; + case IResourceDelta.REMOVED: + fRemoved.add(new PotentialTranslationUnit(element, (IFile) res)); + break; + } + } + } + } + } } private void collectSources(ICContainer container, Collection sources) throws CoreException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PotentialTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PotentialTranslationUnit.java new file mode 100644 index 00000000000..41add9ce031 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PotentialTranslationUnit.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2010 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.indexer; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.internal.core.model.TranslationUnit; +import org.eclipse.core.resources.IFile; + +/** + * Used for modified files that are not below a source root. In case such a file + * is part of the index it needs to be updated, otherwise it shall be ignored. + */ +public class PotentialTranslationUnit extends TranslationUnit { + public PotentialTranslationUnit(ICElement parent, IFile file) { + super(parent, file, CCorePlugin.CONTENT_TYPE_CHEADER); + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java index 14746ba49a7..6ad553c9b70 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2009 Wind River Systems, Inc. and others. + * Copyright (c) 2007, 2010 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 @@ -42,6 +42,10 @@ import org.eclipse.core.runtime.content.IContentType; * @since 5.0 */ public class ProjectIndexerInputAdapter extends IndexerInputAdapter { + /** + * mstodo + */ + private static final AbstractLanguage[] NO_LANGUAGE = new AbstractLanguage[0]; private final ICProject fCProject; private final HashMap fIflCache; private final FileExistsCache fExistsCache; @@ -163,6 +167,9 @@ public class ProjectIndexerInputAdapter extends IndexerInputAdapter { @Override public AbstractLanguage[] getLanguages(Object tuo, boolean bothForHeaders) { + if (tuo instanceof PotentialTranslationUnit) + return NO_LANGUAGE; + ITranslationUnit tu= (ITranslationUnit) tuo; try { ILanguage lang= tu.getLanguage(); @@ -184,7 +191,7 @@ public class ProjectIndexerInputAdapter extends IndexerInputAdapter { catch (CoreException e) { CCorePlugin.log(e); } - return new AbstractLanguage[0]; + return NO_LANGUAGE; } @Override