diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexSearchTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexSearchTest.java index f6a794e0569..ef72bed2d4b 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexSearchTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexSearchTest.java @@ -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"); diff --git a/core/org.eclipse.cdt.core.tests/resources/indexTests/search/macro.c b/core/org.eclipse.cdt.core.tests/resources/indexTests/search/macro.c new file mode 100644 index 00000000000..027463ae066 --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/resources/indexTests/search/macro.c @@ -0,0 +1,2 @@ +#define FOO 1 +#define Foo(x) 2 \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index a0a7cb46142..ea2e46a21e8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -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 result= new ArrayList(); 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 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 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 result= new ArrayList(); 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 result= new ArrayList(); 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 result= new ArrayList(); + 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 result= new ArrayList(); try {