diff options
author | Markus Schorn | 2007-11-22 15:57:17 +0000 |
---|---|---|
committer | Markus Schorn | 2007-11-22 15:57:17 +0000 |
commit | 9b07ea66db6bbcb84703aeebda92983241c8ca01 (patch) | |
tree | 2abc4bf45443681fec1a08f5c1338e375f911577 /core/org.eclipse.cdt.core/parser | |
parent | 41e74e8cbff9a853b3e1727b4a9a379f07731bf0 (diff) | |
download | org.eclipse.cdt-9b07ea66db6bbcb84703aeebda92983241c8ca01.tar.gz org.eclipse.cdt-9b07ea66db6bbcb84703aeebda92983241c8ca01.tar.xz org.eclipse.cdt-9b07ea66db6bbcb84703aeebda92983241c8ca01.zip |
Static variables/functions in Open Element and Search (bug 193057 and 196414).
Diffstat (limited to 'core/org.eclipse.cdt.core/parser')
12 files changed, 132 insertions, 64 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java index 1f41022f51b..a0c635e1be2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java @@ -250,6 +250,9 @@ public interface IIndex { /** * Searches for all bindings in global scope with a given name. In case a binding exists in multiple projects, no duplicate bindings are returned. * This method makes use of the BTree and is faster than the methods using patterns. + * <p> + * To find bindings for file-local (static) variables or functions you need to provide an additional qualifier. It can be obtained by calling + * {@link #getFileLocalScopeQualifier()} or {@link IndexLocationFactory#getFileLocalQualifier(IIndexLocation)}. * @param names an array of names, which has to be matched by the qualified name of the bindings. * @param filter a filter that allows for skipping parts of the index * @param monitor a monitor to report progress, may be <code>null</code>. @@ -342,4 +345,11 @@ public interface IIndex { * @throws CoreException */ public IIndexBinding adaptBinding(IBinding binding); + + /** + * Returns the additional qualifier with which you can search for static (file-local) functions and + * variables. + * @see #findBindings(char[][], IndexFilter, IProgressMonitor). + */ + public String getFileLocalScopeQualifier(IIndexFileLocation loc); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java index 89da0dc5ad4..b2dd99e6ba4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java @@ -43,4 +43,11 @@ public interface IIndexBinding extends IBinding { * in another index. */ boolean isFileLocal() throws CoreException; + + /** + * Returns the qualifier that can be used to search for file local bindings using + * {@link IIndex#findBindings(char[][], IndexFilter, org.eclipse.core.runtime.IProgressMonitor)}. + * In case the binding is not file-local, <code>null</code> is returned. + */ + String getFileLocalScopeQualifier() throws CoreException; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java index 33ce7860361..f6f5c398adb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java @@ -558,4 +558,32 @@ public class CIndex implements IIndex { fFragments[i].resetCacheCounters(); } } + + public String getFileLocalScopeQualifier(IIndexFileLocation loc) { + return new String(getFileLocalScopeQualifier(loc.getFullPath())); + } + + public static char[] getFileLocalScopeQualifier(String fullPath) { + char[] fname= fullPath.toCharArray(); + int fnamestart= findFileNameStart(fname); + StringBuffer buf= new StringBuffer(); + buf.append('{'); + buf.append(fname, fnamestart, fname.length-fnamestart); + buf.append(':'); + buf.append(fullPath.hashCode()); + buf.append('}'); + fname= buf.toString().toCharArray(); + return fname; + } + + private static int findFileNameStart(char[] fname) { + for (int i= fname.length-2; i>=0; i--) { + switch (fname[i]) { + case '/': + case '\\': + return i+1; + } + } + return 0; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java index cc4d17df512..988e3774ad0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java @@ -121,4 +121,8 @@ final public class EmptyCIndex implements IIndex { public IIndexMacro[] findMacrosForPrefix(char[] prefix, IndexFilter filter, IProgressMonitor monitor) { return IIndexMacro.EMPTY_INDEX_MACRO_ARRAY; } + + public String getFileLocalScopeQualifier(IIndexFileLocation loc) { + return new String(CIndex.getFileLocalScopeQualifier(loc.getFullPath())); + } }
\ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java index ed617a2ccd0..f7f4d4fc862 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java @@ -6,9 +6,9 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation - * Markus Schorn (Wind River Systems) - * Bryan Wilkinson (QNX) + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) + * Bryan Wilkinson (QNX) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite; @@ -87,9 +87,13 @@ public abstract class CompositeIndexBinding implements IIndexBinding { } public boolean isFileLocal() throws CoreException { - return rbinding instanceof IIndexBinding ? ((IIndexBinding)rbinding).isFileLocal() : true; + return rbinding != null ? rbinding.isFileLocal() : false; } - + + public String getFileLocalScopeQualifier() throws CoreException { + return rbinding != null ? rbinding.getFileLocalScopeQualifier() : null; + } + public boolean equals(Object obj) { if (obj == this) return true; 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 5138048d8d2..79c9a753488 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 @@ -54,12 +54,14 @@ import org.eclipse.cdt.internal.core.pdom.dom.BindingCollector; import org.eclipse.cdt.internal.core.pdom.dom.FindBinding; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; import org.eclipse.cdt.internal.core.pdom.dom.MacroCollector; +import org.eclipse.cdt.internal.core.pdom.dom.NamedNodeCollector; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile; import org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMMacro; import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -372,20 +374,20 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { if (monitor.isCanceled()) throw new CoreException(Status.OK_STATUS); - if (node instanceof PDOMBinding) { - PDOMBinding binding = (PDOMBinding)node; - String name = binding.getName(); + if (node instanceof PDOMNamedNode) { + PDOMNamedNode nnode = (PDOMNamedNode)node; + String name = new String(nnode.getNameCharArray()); // check if we have a complete match. final int lastIdx = pattern.length-1; if (matchesUpToLevel.get(lastIdx) && pattern[lastIdx].matcher(name).matches()) { - if (filter.acceptBinding(binding)) { - bindings.add(binding); + if (nnode instanceof IBinding && filter.acceptBinding((IBinding) nnode)) { + bindings.add(nnode); } } // check if we have a partial match - if (binding.mayHaveChildren()) { + if (nnode.mayHaveChildren()) { boolean visitNextLevel= false; BitSet updatedMatchesUpToLevel= new BitSet(); if (!isFullyQualified) { @@ -401,7 +403,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { if (visitNextLevel) { matchStack.add(matchesUpToLevel); matchesUpToLevel= updatedMatchesUpToLevel; - currentPath.add(binding); + currentPath.add(nnode); return true; } } @@ -449,24 +451,33 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { } public IIndexFragmentBinding[] findBindings(char[][] names, IndexFilter filter, IProgressMonitor monitor) throws CoreException { + if (names.length == 0) { + return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY; + } ArrayList result= new ArrayList(); + ArrayList nodes= new ArrayList(); for (Iterator iter = fLinkageIDCache.values().iterator(); iter.hasNext();) { PDOMLinkage linkage = (PDOMLinkage) iter.next(); if (filter.acceptLinkage(linkage)) { - ArrayList bindings= new ArrayList(); - bindings.add(linkage); - for (int i=0; i < names.length; i++) { + nodes.add(linkage); + for (int i=0; i < names.length-1; i++) { char[] name= names[i]; - IndexFilter levelFilter= i==names.length-1 ? filter : IndexFilter.ALL; - BindingCollector collector= new BindingCollector(linkage, name, levelFilter, false, true); - for (Iterator in = bindings.iterator(); in.hasNext();) { + NamedNodeCollector collector= new NamedNodeCollector(linkage, name, false, true); + for (Iterator in = nodes.iterator(); in.hasNext();) { PDOMNode node= (PDOMNode) in.next(); node.accept(collector); } - bindings.clear(); - bindings.addAll(Arrays.asList(collector.getBindings())); + nodes.clear(); + nodes.addAll(Arrays.asList(collector.getNodes())); + } + char[] name= names[names.length-1]; + BindingCollector collector= new BindingCollector(linkage, name, filter, false, true); + for (Iterator in = nodes.iterator(); in.hasNext();) { + PDOMNode node= (PDOMNode) in.next(); + node.accept(collector); } - result.addAll(bindings); + nodes.clear(); + result.addAll(Arrays.asList(collector.getBindings())); } } return (IIndexFragmentBinding[]) result.toArray(new IIndexFragmentBinding[result.size()]); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java index 77b3ff07056..a6da94c6195 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java @@ -6,9 +6,9 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation - * Markus Schorn (Wind River Systems) - * Andrew Ferguson (Symbian) + * QNX - Initial API and implementation + * Markus Schorn (Wind River Systems) + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom; @@ -242,10 +242,6 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmen * Convenience method to shorten subclass file length */ protected final void fail() { throw new PDOMNotImplementedError(); } - - public boolean mayHaveChildren() { - return false; - } public IName getScopeName() throws DOMException { try { @@ -279,7 +275,15 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmen final public boolean isFileLocal() throws CoreException { return getParentNode() instanceof PDOMFileLocalScope; } - + + final public String getFileLocalScopeQualifier() throws CoreException { + final PDOMNode parentNode = getParentNode(); + if (parentNode instanceof PDOMFileLocalScope) { + return ((PDOMFileLocalScope) parentNode).getDBName().getString(); + } + return null; + } + public boolean hasDefinition() throws CoreException { return getFirstDefinition()!=null; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFileLocalScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFileLocalScope.java index 6caf82c2565..4ec95ad4f75 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFileLocalScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFileLocalScope.java @@ -56,4 +56,8 @@ public class PDOMFileLocalScope extends PDOMNamedNode implements IPDOMMemberOwne // no support for deleting bindings and their scopes. assert false; } + + public boolean mayHaveChildren() { + return true; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java index c8297913754..16045193266 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java @@ -41,6 +41,7 @@ import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexLinkage; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; +import org.eclipse.cdt.internal.core.index.CIndex; import org.eclipse.cdt.internal.core.index.IIndexBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.cdt.internal.core.index.composite.CompositeScope; @@ -130,11 +131,11 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage return 0; } public boolean visit(int record) throws CoreException { - PDOMBinding binding = pdom.getBinding(record); - if (binding != null) { - if (visitor.visit(binding)) - binding.accept(visitor); - visitor.leave(binding); + PDOMNode node= getNode(record); + if (node != null) { + if (visitor.visit(node)) + node.accept(visitor); + visitor.leave(node); } return true; } @@ -372,15 +373,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage * @since 4.0 */ final protected PDOMFileLocalScope findFileLocalScope(String fileName, boolean create) throws CoreException { - char[] fname= fileName.toCharArray(); - int fnamestart= findFileNameStart(fname); - StringBuffer buf= new StringBuffer(); - buf.append('{'); - buf.append(fname, fnamestart, fname.length-fnamestart); - buf.append(':'); - buf.append(fileName.hashCode()); - buf.append('}'); - fname= buf.toString().toCharArray(); + char[] fname = CIndex.getFileLocalScopeQualifier(fileName); final PDOMFileLocalScope[] fls= new PDOMFileLocalScope[] {null}; NamedNodeCollector collector= new NamedNodeCollector(this, fname) { @@ -399,17 +392,6 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage } return fls[0]; } - - private static int findFileNameStart(char[] fname) { - for (int i= fname.length-2; i>=0; i--) { - switch (fname[i]) { - case '/': - case '\\': - return i+1; - } - } - return 0; - } public void deleteType(IType type, int ownerRec) throws CoreException { if (type instanceof PDOMNode) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java index 8ef77bee0bd..bda40e23e34 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java @@ -6,9 +6,10 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation - * IBM Corporation - * Andrew Ferguson (Symbian) + * QNX - Initial API and implementation + * IBM Corporation + * Andrew Ferguson (Symbian) + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom; @@ -75,4 +76,8 @@ public abstract class PDOMNamedNode extends PDOMNode { } super.delete(linkage); } + + public boolean mayHaveChildren() { + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java index 4050a29d22a..25b6287eb0a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java @@ -6,8 +6,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation - * Andrew Ferguson (Symbian) + * QNX - Initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.c; @@ -21,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.internal.core.Util; +import org.eclipse.cdt.internal.core.index.IIndexCBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -74,7 +75,7 @@ class PDOMCParameter extends PDOMNamedNode implements IParameter, IIndexFragment } public int getNodeType() { - return PDOMCLinkage.CPARAMETER; + return IIndexCBindingConstants.CPARAMETER; } public void setNextParameter(PDOMCParameter nextParam) throws CoreException { @@ -161,6 +162,9 @@ class PDOMCParameter extends PDOMNamedNode implements IParameter, IIndexFragment public boolean isFileLocal() throws CoreException { return true; } + public String getFileLocalScopeQualifier() throws CoreException { + return null; + } public String[] getQualifiedName() { throw new PDOMNotImplementedError(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java index 826b40f553c..2fcb1ccea5b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java @@ -6,9 +6,9 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation - * Markus Schorn (Wind River Systems) - * IBM Corporation + * QNX - Initial API and implementation + * Markus Schorn (Wind River Systems) + * IBM Corporation *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; @@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDelegateCreator; +import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -121,7 +122,7 @@ class PDOMCPPParameter extends PDOMNamedNode } public int getNodeType() { - return PDOMCPPLinkage.CPPPARAMETER; + return IIndexCPPBindingConstants.CPPPARAMETER; } public void setNextParameter(PDOMCPPParameter nextParam) throws CoreException { @@ -236,6 +237,10 @@ class PDOMCPPParameter extends PDOMNamedNode return true; } + public String getFileLocalScopeQualifier() throws CoreException { + return null; + } + public int getBindingConstant() { return getNodeType(); } |