1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-08 18:26:01 +02:00

Open Declaration shows macros twice, bug 222597.

This commit is contained in:
Markus Schorn 2008-03-14 13:05:35 +00:00
parent e5b6fb457b
commit 7b37526690

View file

@ -535,44 +535,37 @@ public class CIndex implements IIndex {
} }
private IIndexMacro[] findMacros(char[] name, boolean isPrefix, boolean caseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException { private IIndexMacro[] findMacros(char[] name, boolean isPrefix, boolean caseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
if (SPECIALCASE_SINGLES && fFragments.length==1) { // macros can be represented multiple times when a header is parsed in c- and c++ context,
// so there is no special case for indexes with single fragments.
if (monitor == null) {
monitor= new NullProgressMonitor();
}
List<IIndexMacro> result = new ArrayList<IIndexMacro>();
HashSet<IIndexFileLocation> handledIFLs= new HashSet<IIndexFileLocation>();
monitor.beginTask(Messages.CIndex_FindBindingsTask_label, fFragments.length);
for (int i = 0; i < fPrimaryFragmentCount; i++) {
HashSet<IIndexFile> allowedFiles= new HashSet<IIndexFile>();
try { try {
return fFragments[0].findMacros(name, isPrefix, caseSensitive, filter, monitor); IIndexMacro[] macros= fFragments[i].findMacros(name, isPrefix, caseSensitive, filter, new SubProgressMonitor(monitor, 1));
for (int k = 0; k < macros.length; k++) {
IIndexMacro indexMacro = macros[k];
IIndexFile file= indexMacro.getFile();
if (!allowedFiles.contains(file)) {
if (handledIFLs.add(file.getLocation())) {
allowedFiles.add(file);
}
else {
continue;
}
}
result.add(indexMacro);
}
} catch (CoreException e) { } catch (CoreException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
return IIndexMacro.EMPTY_INDEX_MACRO_ARRAY;
} }
} else {
if (monitor == null) {
monitor= new NullProgressMonitor();
}
List<IIndexMacro> result = new ArrayList<IIndexMacro>();
HashSet<IIndexFileLocation> handledIFLs= new HashSet<IIndexFileLocation>();
monitor.beginTask(Messages.CIndex_FindBindingsTask_label, fFragments.length);
for (int i = 0; i < fPrimaryFragmentCount; i++) {
HashSet<IIndexFile> allowedFiles= new HashSet<IIndexFile>();
try {
IIndexMacro[] macros= fFragments[i].findMacros(name, isPrefix, caseSensitive, filter, new SubProgressMonitor(monitor, 1));
for (int k = 0; k < macros.length; k++) {
IIndexMacro indexMacro = macros[k];
IIndexFile file= indexMacro.getFile();
if (!allowedFiles.contains(file)) {
if (handledIFLs.add(file.getLocation())) {
allowedFiles.add(file);
}
else {
continue;
}
}
result.add(indexMacro);
}
} catch (CoreException e) {
CCorePlugin.log(e);
}
}
monitor.done();
return result.toArray(new IIndexMacro[result.size()]);
} }
monitor.done();
return result.toArray(new IIndexMacro[result.size()]);
} }
public long getCacheHits() { public long getCacheHits() {