mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-11 18:25:40 +02:00
Bug 283080: Updating headers in non-src folders.
This commit is contained in:
parent
658dc0af75
commit
5a013d6320
10 changed files with 73 additions and 34 deletions
|
@ -81,6 +81,7 @@ import org.eclipse.cdt.core.testplugin.TestScannerProvider;
|
||||||
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
|
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
|
||||||
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
|
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.CModelListener;
|
||||||
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;
|
||||||
|
@ -624,6 +625,7 @@ public class IndexBugsTests extends BaseTestCase {
|
||||||
// // header.h
|
// // header.h
|
||||||
// enum E {A,B,C};
|
// enum E {A,B,C};
|
||||||
public void test171834() throws Exception {
|
public void test171834() throws Exception {
|
||||||
|
CModelListener.sSuppressUpdateOfLastRecentlyUsed= false;
|
||||||
waitForIndexer();
|
waitForIndexer();
|
||||||
|
|
||||||
ICProject cproject = CProjectHelper.createCCProject("seq1", "bin", IPDOMManager.ID_FAST_INDEXER);
|
ICProject cproject = CProjectHelper.createCCProject("seq1", "bin", IPDOMManager.ID_FAST_INDEXER);
|
||||||
|
|
|
@ -49,6 +49,7 @@ import org.eclipse.cdt.core.index.IndexFilter;
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
||||||
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
|
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.CModelListener;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||||
import org.eclipse.core.resources.IFile;
|
import org.eclipse.core.resources.IFile;
|
||||||
|
@ -908,6 +909,7 @@ public class IndexUpdateTests extends IndexTestBase {
|
||||||
// globalVar= 1;
|
// globalVar= 1;
|
||||||
// }
|
// }
|
||||||
public void testChangingSourceBeforeHeader_Bug171834() throws Exception {
|
public void testChangingSourceBeforeHeader_Bug171834() throws Exception {
|
||||||
|
CModelListener.sSuppressUpdateOfLastRecentlyUsed= false;
|
||||||
setupHeader(2, true);
|
setupHeader(2, true);
|
||||||
setupFile(0, true);
|
setupFile(0, true);
|
||||||
IBinding binding;
|
IBinding binding;
|
||||||
|
|
|
@ -35,6 +35,7 @@ import org.eclipse.cdt.core.testplugin.ResourceHelper;
|
||||||
import org.eclipse.cdt.core.testplugin.TestScannerProvider;
|
import org.eclipse.cdt.core.testplugin.TestScannerProvider;
|
||||||
import org.eclipse.cdt.internal.core.CCoreInternals;
|
import org.eclipse.cdt.internal.core.CCoreInternals;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.CModelListener;
|
||||||
import org.eclipse.cdt.internal.core.pdom.PDOMManager;
|
import org.eclipse.cdt.internal.core.pdom.PDOMManager;
|
||||||
import org.eclipse.core.resources.IResourceStatus;
|
import org.eclipse.core.resources.IResourceStatus;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
@ -64,6 +65,7 @@ public class BaseTestCase extends TestCase {
|
||||||
protected void setUp() throws Exception {
|
protected void setUp() throws Exception {
|
||||||
CPPASTNameBase.sAllowRecursionBindings= false;
|
CPPASTNameBase.sAllowRecursionBindings= false;
|
||||||
CPPASTNameBase.sAllowNameComputation= false;
|
CPPASTNameBase.sAllowNameComputation= false;
|
||||||
|
CModelListener.sSuppressUpdateOfLastRecentlyUsed= true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -53,6 +53,7 @@ import org.eclipse.cdt.internal.core.index.IndexBasedFileContentProvider;
|
||||||
import org.eclipse.cdt.internal.core.parser.scanner.InternalFileContentProvider;
|
import org.eclipse.cdt.internal.core.parser.scanner.InternalFileContentProvider;
|
||||||
import org.eclipse.cdt.internal.core.parser.scanner.StreamHasher;
|
import org.eclipse.cdt.internal.core.parser.scanner.StreamHasher;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.indexer.PotentialTranslationUnit;
|
||||||
import org.eclipse.cdt.utils.EFSExtensionManager;
|
import org.eclipse.cdt.utils.EFSExtensionManager;
|
||||||
import org.eclipse.core.runtime.Assert;
|
import org.eclipse.core.runtime.Assert;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
@ -71,7 +72,6 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
|
||||||
protected static enum UnusedHeaderStrategy {
|
protected static enum UnusedHeaderStrategy {
|
||||||
skip, useDefaultLanguage, useAlternateLanguage, useBoth
|
skip, useDefaultLanguage, useAlternateLanguage, useBoth
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final int MAX_ERRORS = 500;
|
private static final int MAX_ERRORS = 500;
|
||||||
|
|
||||||
private static class FileKey {
|
private static class FileKey {
|
||||||
|
@ -384,9 +384,10 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
|
||||||
if (ifl == null)
|
if (ifl == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
final IIndexFragmentFile[] indexFiles= fIndex.getWritableFiles(ifl);
|
||||||
|
if (!(tu instanceof PotentialTranslationUnit)) {
|
||||||
final boolean isSourceUnit= fResolver.isSourceUnit(tu);
|
final boolean isSourceUnit= fResolver.isSourceUnit(tu);
|
||||||
final boolean isExcludedSource= isSourceUnit && !fIndexFilesWithoutConfiguration && !fResolver.isFileBuildConfigured(tu);
|
final boolean isExcludedSource= isSourceUnit && !fIndexFilesWithoutConfiguration && !fResolver.isFileBuildConfigured(tu);
|
||||||
final IIndexFragmentFile[] indexFiles= fIndex.getWritableFiles(ifl);
|
|
||||||
|
|
||||||
if ((isSourceUnit && !isExcludedSource) || fIndexHeadersWithoutContext != UnusedHeaderStrategy.skip) {
|
if ((isSourceUnit && !isExcludedSource) || fIndexHeadersWithoutContext != UnusedHeaderStrategy.skip) {
|
||||||
// headers or sources required with a specific linkage
|
// headers or sources required with a specific linkage
|
||||||
|
@ -413,6 +414,7 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// handle other files present in index
|
// handle other files present in index
|
||||||
for (IIndexFragmentFile ifile : indexFiles) {
|
for (IIndexFragmentFile ifile : indexFiles) {
|
||||||
|
@ -729,7 +731,7 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
|
||||||
private void parseFile(Object tu, int linkageID, IIndexFileLocation ifl, IScannerInfo scanInfo,
|
private void parseFile(Object tu, int linkageID, IIndexFileLocation ifl, IScannerInfo scanInfo,
|
||||||
boolean inContext, IProgressMonitor pm) throws CoreException, InterruptedException {
|
boolean inContext, IProgressMonitor pm) throws CoreException, InterruptedException {
|
||||||
IPath path= getPathForLabel(ifl);
|
IPath path= getPathForLabel(ifl);
|
||||||
AbstractLanguage[] langs= fResolver.getLanguages(tu, fIndexHeadersWithoutContext == UnusedHeaderStrategy.useBoth);
|
AbstractLanguage[] langs= fResolver.getLanguages(tu, true);
|
||||||
AbstractLanguage lang= null;
|
AbstractLanguage lang= null;
|
||||||
for (AbstractLanguage lang2 : langs) {
|
for (AbstractLanguage lang2 : langs) {
|
||||||
if (lang2.getLinkageID() == linkageID) {
|
if (lang2.getLinkageID() == linkageID) {
|
||||||
|
|
|
@ -35,6 +35,9 @@ import org.eclipse.core.runtime.CoreException;
|
||||||
public class CModelListener implements IElementChangedListener, IResourceChangeListener {
|
public class CModelListener implements IElementChangedListener, IResourceChangeListener {
|
||||||
private static final int UPDATE_LR_CHANGED_FILES_COUNT = 5;
|
private static final int UPDATE_LR_CHANGED_FILES_COUNT = 5;
|
||||||
|
|
||||||
|
// For testing purposes, only.
|
||||||
|
public static boolean sSuppressUpdateOfLastRecentlyUsed = false;
|
||||||
|
|
||||||
private PDOMManager fManager;
|
private PDOMManager fManager;
|
||||||
private LinkedHashMap<ITranslationUnit, ITranslationUnit> fLRUs= new LinkedHashMap<ITranslationUnit, ITranslationUnit>(UPDATE_LR_CHANGED_FILES_COUNT, 0.75f, true) {
|
private LinkedHashMap<ITranslationUnit, ITranslationUnit> fLRUs= new LinkedHashMap<ITranslationUnit, ITranslationUnit>(UPDATE_LR_CHANGED_FILES_COUNT, 0.75f, true) {
|
||||||
@Override
|
@Override
|
||||||
|
@ -57,7 +60,9 @@ public class CModelListener implements IElementChangedListener, IResourceChangeL
|
||||||
processDelta(event.getDelta(), changeMap);
|
processDelta(event.getDelta(), changeMap);
|
||||||
|
|
||||||
// bug 171834 update last recently changed sources
|
// bug 171834 update last recently changed sources
|
||||||
|
if (!sSuppressUpdateOfLastRecentlyUsed) {
|
||||||
addLastRecentlyUsed(changeMap);
|
addLastRecentlyUsed(changeMap);
|
||||||
|
}
|
||||||
|
|
||||||
for (Map.Entry<ICProject, DeltaAnalyzer> entry : changeMap.entrySet()) {
|
for (Map.Entry<ICProject, DeltaAnalyzer> entry : changeMap.entrySet()) {
|
||||||
ICProject cproject = entry.getKey();
|
ICProject cproject = entry.getKey();
|
||||||
|
|
|
@ -43,7 +43,8 @@ public class DeltaAnalyzer {
|
||||||
private void processDelta(ICElementDelta delta, Set<IResource> handled) throws CoreException {
|
private void processDelta(ICElementDelta delta, Set<IResource> handled) throws CoreException {
|
||||||
final int flags = delta.getFlags();
|
final int flags = delta.getFlags();
|
||||||
|
|
||||||
if ((flags & ICElementDelta.F_CHILDREN) != 0) {
|
final boolean hasChildren = (flags & ICElementDelta.F_CHILDREN) != 0;
|
||||||
|
if (hasChildren) {
|
||||||
for (ICElementDelta child : delta.getAffectedChildren()) {
|
for (ICElementDelta child : delta.getAffectedChildren()) {
|
||||||
processDelta(child, handled);
|
processDelta(child, handled);
|
||||||
}
|
}
|
||||||
|
@ -78,8 +79,18 @@ public class DeltaAnalyzer {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!sSuppressPotentialTUs) {
|
||||||
|
// If the cmodel delta does not have children, also look at the children of the
|
||||||
|
// resource delta.
|
||||||
|
final boolean checkChildren = !hasChildren;
|
||||||
final IResourceDelta[] rDeltas= delta.getResourceDeltas();
|
final IResourceDelta[] rDeltas= delta.getResourceDeltas();
|
||||||
if (rDeltas != null && !sSuppressPotentialTUs) {
|
processResourceDelta(rDeltas, element, handled, checkChildren);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void processResourceDelta(final IResourceDelta[] rDeltas, final ICElement element,
|
||||||
|
Set<IResource> handled, boolean checkChildren) {
|
||||||
|
if (rDeltas != null) {
|
||||||
for (IResourceDelta rd: rDeltas) {
|
for (IResourceDelta rd: rDeltas) {
|
||||||
final int rdkind = rd.getKind();
|
final int rdkind = rd.getKind();
|
||||||
if (rdkind != IResourceDelta.ADDED) {
|
if (rdkind != IResourceDelta.ADDED) {
|
||||||
|
@ -97,6 +108,9 @@ public class DeltaAnalyzer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (rdkind == IResourceDelta.CHANGED && checkChildren) {
|
||||||
|
processResourceDelta(rd.getAffectedChildren(), element, handled, checkChildren);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -172,11 +172,20 @@ public class ProjectIndexerInputAdapter extends IndexerInputAdapter {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AbstractLanguage[] getLanguages(Object tuo, boolean bothForHeaders) {
|
public AbstractLanguage[] getLanguages(Object tuo, boolean bothForHeaders) {
|
||||||
if (tuo instanceof PotentialTranslationUnit)
|
if (tuo instanceof PotentialTranslationUnit) {
|
||||||
|
if (fLangC != null) {
|
||||||
|
if (fLangCpp != null) {
|
||||||
|
return new AbstractLanguage[] {fLangC, fLangCpp};
|
||||||
|
}
|
||||||
|
return new AbstractLanguage[] {fLangC};
|
||||||
|
}
|
||||||
|
if (fLangCpp != null) {
|
||||||
|
return new AbstractLanguage[] {fLangCpp};
|
||||||
|
}
|
||||||
return NO_LANGUAGE;
|
return NO_LANGUAGE;
|
||||||
|
}
|
||||||
|
|
||||||
ITranslationUnit tu= (ITranslationUnit) tuo;
|
ITranslationUnit tu= (ITranslationUnit) tuo;
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -342,6 +342,9 @@ public class BaseUITestCase extends BaseTestCase {
|
||||||
for (int millis=0; millis < 5000; millis= millis==0 ? 1 : millis*2) {
|
for (int millis=0; millis < 5000; millis= millis==0 ? 1 : millis*2) {
|
||||||
runEventQueue(millis);
|
runEventQueue(millis);
|
||||||
TreeItem root= tree.getItem(i0);
|
TreeItem root= tree.getItem(i0);
|
||||||
|
if (!root.getExpanded()) {
|
||||||
|
expandTreeItem(root);
|
||||||
|
}
|
||||||
ex= null;
|
ex= null;
|
||||||
try {
|
try {
|
||||||
TreeItem firstItem= root.getItem(0);
|
TreeItem firstItem= root.getItem(0);
|
||||||
|
|
|
@ -949,8 +949,8 @@ public class CompletionTests extends AbstractContentAssistTest {
|
||||||
public void testExternC_bug191315() throws Exception {
|
public void testExternC_bug191315() throws Exception {
|
||||||
StringBuffer[] content= getContentsForTest(3);
|
StringBuffer[] content= getContentsForTest(3);
|
||||||
createFile(fProject, "header191315.h", content[0].toString());
|
createFile(fProject, "header191315.h", content[0].toString());
|
||||||
createFile(fProject, "source191315.c", content[0].toString());
|
createFile(fProject, "source191315.c", content[1].toString());
|
||||||
createFile(fProject, "source191315.cpp", content[0].toString());
|
createFile(fProject, "source191315.cpp", content[1].toString());
|
||||||
IFile dfile= createFile(fProject, "header191315.h", content[0].toString());
|
IFile dfile= createFile(fProject, "header191315.h", content[0].toString());
|
||||||
TestSourceReader.waitUntilFileIsIndexed(CCorePlugin.getIndexManager().getIndex(fCProject), dfile, 8000);
|
TestSourceReader.waitUntilFileIsIndexed(CCorePlugin.getIndexManager().getIndex(fCProject), dfile, 8000);
|
||||||
final String[] expected= {
|
final String[] expected= {
|
||||||
|
|
|
@ -310,8 +310,8 @@ public class CompletionTests_PlainC extends AbstractContentAssistTest {
|
||||||
public void testExternC_bug191315() throws Exception {
|
public void testExternC_bug191315() throws Exception {
|
||||||
StringBuffer[] content= getContentsForTest(3);
|
StringBuffer[] content= getContentsForTest(3);
|
||||||
createFile(fProject, "header191315.h", content[0].toString());
|
createFile(fProject, "header191315.h", content[0].toString());
|
||||||
createFile(fProject, "source191315.c", content[0].toString());
|
createFile(fProject, "source191315.c", content[1].toString());
|
||||||
createFile(fProject, "source191315.cpp", content[0].toString());
|
createFile(fProject, "source191315.cpp", content[1].toString());
|
||||||
IFile dfile= createFile(fProject, "header191315.h", content[0].toString());
|
IFile dfile= createFile(fProject, "header191315.h", content[0].toString());
|
||||||
TestSourceReader.waitUntilFileIsIndexed(CCorePlugin.getIndexManager().getIndex(fCProject), dfile, 8000);
|
TestSourceReader.waitUntilFileIsIndexed(CCorePlugin.getIndexManager().getIndex(fCProject), dfile, 8000);
|
||||||
final String[] expected= {
|
final String[] expected= {
|
||||||
|
|
Loading…
Add table
Reference in a new issue