1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Case insensitive searches, bug 293669.

This commit is contained in:
Markus Schorn 2009-10-29 16:05:59 +00:00
parent cee26c6a8f
commit ed2b0017e9
3 changed files with 141 additions and 27 deletions

View file

@ -54,6 +54,7 @@ public class IndexSearchTest extends IndexTestBase {
super(name);
}
@Override
public void setUp() throws Exception {
super.setUp();
if (fProject == null) {
@ -63,6 +64,7 @@ public class IndexSearchTest extends IndexTestBase {
fIndex.acquireReadLock();
}
@Override
public void tearDown() throws Exception {
fIndex.releaseReadLock();
super.tearDown();
@ -235,6 +237,39 @@ public class IndexSearchTest extends IndexTestBase {
assertEquals(1, bindings.length);
checkIsEnumeration(bindings[0]);
}
public void testCaseInsensitivePatternSearch_239669() throws CoreException {
IIndexBinding[] bindings;
Pattern pEnumAndEnumeration= Pattern.compile("E20061017", Pattern.CASE_INSENSITIVE);
Pattern pEnumeration= Pattern.compile("E20061017");
bindings= fIndex.findBindings(pEnumAndEnumeration, true, INDEX_FILTER, NPM);
assertEquals(2, bindings.length);
bindings= fIndex.findBindings(pEnumeration, true, INDEX_FILTER, NPM);
assertEquals(1, bindings.length);
pEnumAndEnumeration= Pattern.compile("E2006101.*", Pattern.CASE_INSENSITIVE);
pEnumeration= Pattern.compile("E2006101.*");
bindings= fIndex.findBindings(pEnumAndEnumeration, true, INDEX_FILTER, NPM);
assertEquals(2, bindings.length);
bindings= fIndex.findBindings(pEnumeration, true, INDEX_FILTER, NPM);
assertEquals(1, bindings.length);
Pattern macro1= Pattern.compile("Foo", Pattern.CASE_INSENSITIVE);
Pattern macro2= Pattern.compile("Foo");
bindings= fIndex.findMacroContainers(macro1, INDEX_FILTER, NPM);
assertEquals(2, bindings.length);
bindings= fIndex.findMacroContainers(macro2, INDEX_FILTER, NPM);
assertEquals(1, bindings.length);
macro1= Pattern.compile("Foo.*", Pattern.CASE_INSENSITIVE);
macro2= Pattern.compile("Foo.*");
bindings= fIndex.findMacroContainers(macro1, INDEX_FILTER, NPM);
assertEquals(2, bindings.length);
bindings= fIndex.findMacroContainers(macro2, INDEX_FILTER, NPM);
assertEquals(1, bindings.length);
}
public void testFindStatic_161216() throws CoreException {
Pattern pFunc= Pattern.compile("staticFunc20061017");

View file

@ -0,0 +1,2 @@
#define FOO 1
#define Foo(x) 2

View file

@ -567,26 +567,29 @@ public class PDOM extends PlatformObject implements IPDOM {
return findBindings(new Pattern[] { pattern }, isFullyQualified, filter, monitor);
}
public IIndexFragmentBinding[] findBindings(Pattern[] pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
public IIndexFragmentBinding[] findBindings(Pattern[] patterns, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
if (monitor == null) {
monitor= new NullProgressMonitor();
}
// check for some easy cases
char[][] simpleNames= extractSimpleNames(pattern);
if (simpleNames != null) {
if (simpleNames.length == 1) {
return findBindings(simpleNames[0], isFullyQualified, filter, monitor);
} else if (isFullyQualified) {
return findBindings(simpleNames, filter, monitor);
Boolean caseSensitive= getCaseSensitive(patterns);
if (caseSensitive != null) {
char[][] simpleNames= extractSimpleNames(patterns);
if (simpleNames != null) {
if (simpleNames.length == 1) {
return findBindings(simpleNames[0], isFullyQualified, caseSensitive, filter, monitor);
} else if (isFullyQualified) {
return findBindings(simpleNames, caseSensitive, filter, monitor);
}
}
char[] prefix= extractPrefix(patterns);
if (prefix != null) {
return findBindingsForPrefix(prefix, isFullyQualified, caseSensitive, filter, monitor);
}
}
char[] prefix= extractPrefix(pattern);
if (prefix != null) {
return findBindingsForPrefix(prefix, isFullyQualified, filter, monitor);
}
BindingFinder finder = new BindingFinder(pattern, isFullyQualified, filter, monitor);
BindingFinder finder = new BindingFinder(patterns, isFullyQualified, filter, monitor);
for (PDOMLinkage linkage : getLinkageList()) {
if (filter.acceptLinkage(linkage)) {
try {
@ -602,6 +605,29 @@ public class PDOM extends PlatformObject implements IPDOM {
return finder.getBindings();
}
private Boolean getCaseSensitive(Pattern[] patterns) {
Boolean caseSensitive= null;
for (Pattern p : patterns) {
switch(p.flags()) {
case 0:
if (caseSensitive == Boolean.FALSE) {
return null;
}
caseSensitive= Boolean.TRUE;
break;
case Pattern.CASE_INSENSITIVE:
if (caseSensitive == Boolean.TRUE) {
return null;
}
caseSensitive= Boolean.FALSE;
break;
default:
return null;
}
}
return caseSensitive;
}
private char[][] extractSimpleNames(Pattern[] pattern) {
char[][] result= new char[pattern.length][];
int i= 0;
@ -638,6 +664,20 @@ public class PDOM extends PlatformObject implements IPDOM {
if (monitor == null) {
monitor= new NullProgressMonitor();
}
Pattern[] patterns= new Pattern[]{pattern};
Boolean caseSensitive= getCaseSensitive(patterns);
if (caseSensitive != null) {
char[][] simpleNames= extractSimpleNames(patterns);
if (simpleNames != null && simpleNames.length == 1) {
return findMacroContainers(simpleNames[0], false, caseSensitive, filter, monitor);
}
char[] prefix= extractPrefix(patterns);
if (prefix != null) {
return findMacroContainers(prefix, true, caseSensitive, filter, monitor);
}
}
List<IIndexFragmentBinding> result= new ArrayList<IIndexFragmentBinding>();
for (PDOMLinkage linkage : getLinkageList()) {
if (filter.acceptLinkage(linkage)) {
@ -657,6 +697,10 @@ public class PDOM extends PlatformObject implements IPDOM {
}
public IIndexFragmentBinding[] findBindings(char[][] names, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
return findBindings(names, true, filter, monitor);
}
public IIndexFragmentBinding[] findBindings(char[][] names, boolean caseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
if (names.length == 0) {
return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
}
@ -667,7 +711,7 @@ public class PDOM extends PlatformObject implements IPDOM {
nodes.add(linkage);
for (int i=0; i < names.length-1; i++) {
char[] name= names[i];
NamedNodeCollector collector= new NamedNodeCollector(linkage, name, false, true);
NamedNodeCollector collector= new NamedNodeCollector(linkage, name, false, caseSensitive);
for (Iterator<PDOMNamedNode> in = nodes.iterator(); in.hasNext();) {
PDOMNode node= in.next();
node.accept(collector);
@ -676,7 +720,7 @@ public class PDOM extends PlatformObject implements IPDOM {
nodes.addAll(Arrays.asList(collector.getNodes()));
}
char[] name= names[names.length-1];
BindingCollector collector= new BindingCollector(linkage, name, filter, false, true);
BindingCollector collector= new BindingCollector(linkage, name, filter, false, caseSensitive);
for (Iterator<PDOMNamedNode> in = nodes.iterator(); in.hasNext();) {
PDOMNode node= in.next();
node.accept(collector);
@ -969,13 +1013,17 @@ public class PDOM extends PlatformObject implements IPDOM {
public File getPath() {
return fPath;
}
public IIndexFragmentBinding[] findBindingsForPrefix(char[] prefix, boolean filescope, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
return findBindingsForPrefix(prefix, filescope, false, filter, monitor);
}
public IIndexFragmentBinding[] findBindingsForPrefix(char[] prefix, boolean filescope, boolean caseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
ArrayList<IIndexFragmentBinding> result= new ArrayList<IIndexFragmentBinding>();
for (PDOMLinkage linkage : getLinkageList()) {
if (filter.acceptLinkage(linkage)) {
PDOMBinding[] bindings;
BindingCollector visitor = new BindingCollector(linkage, prefix, filter, true, false);
BindingCollector visitor = new BindingCollector(linkage, prefix, filter, true, caseSensitive);
visitor.setMonitor(monitor);
try {
linkage.accept(visitor);
@ -996,22 +1044,34 @@ public class PDOM extends PlatformObject implements IPDOM {
}
public IIndexFragmentBinding[] findBindings(char[] name, boolean filescope, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
return findBindings(name, filescope, true, filter, monitor);
}
public IIndexFragmentBinding[] findBindings(char[] name, boolean filescope, boolean isCaseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
ArrayList<IIndexFragmentBinding> result= new ArrayList<IIndexFragmentBinding>();
try {
for (PDOMLinkage linkage : getLinkageList()) {
if (filter.acceptLinkage(linkage)) {
PDOMBinding[] bindings= linkage.getBindingsViaCache(name, monitor);
for (PDOMBinding binding : bindings) {
if (filter.acceptBinding(binding)) {
result.add(binding);
if (isCaseSensitive) {
PDOMBinding[] bindings= linkage.getBindingsViaCache(name, monitor);
for (PDOMBinding binding : bindings) {
if (filter.acceptBinding(binding)) {
result.add(binding);
}
}
}
if (!filescope) {
BindingCollector visitor = new BindingCollector(linkage, name, filter, false, true);
}
if (!isCaseSensitive || !filescope) {
BindingCollector visitor= new BindingCollector(linkage, name, filter, false, isCaseSensitive);
visitor.setMonitor(monitor);
linkage.getNestedBindingsIndex().accept(visitor);
bindings= visitor.getBindings();
if (!isCaseSensitive)
linkage.accept(visitor);
if (!filescope)
linkage.getNestedBindingsIndex().accept(visitor);
PDOMBinding[] bindings = visitor.getBindings();
for (PDOMBinding binding : bindings) {
result.add(binding);
}
@ -1023,6 +1083,23 @@ public class PDOM extends PlatformObject implements IPDOM {
return result.toArray(new IIndexFragmentBinding[result.size()]);
}
public IIndexFragmentBinding[] findMacroContainers(char[] prefix, boolean isPrefix, boolean isCaseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
ArrayList<IIndexFragmentBinding> result= new ArrayList<IIndexFragmentBinding>();
try {
for (PDOMLinkage linkage : getLinkageList()) {
if (filter.acceptLinkage(linkage)) {
MacroContainerCollector visitor = new MacroContainerCollector(linkage, prefix, isPrefix, isCaseSensitive);
visitor.setMonitor(monitor);
linkage.getMacroIndex().accept(visitor);
result.addAll(visitor.getMacroList());
}
}
}
catch (OperationCanceledException e) {
}
return result.toArray(new IIndexFragmentBinding[result.size()]);
}
public IIndexMacro[] findMacros(char[] prefix, boolean isPrefix, boolean isCaseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
ArrayList<IIndexMacro> result= new ArrayList<IIndexMacro>();
try {