mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-06 01:06:01 +02:00
Extends IIndex-API to allow for searching across linkage boundaries.
This commit is contained in:
parent
b2de7b53e3
commit
911444625c
19 changed files with 250 additions and 147 deletions
|
@ -34,17 +34,11 @@ import org.eclipse.core.runtime.IProgressMonitor;
|
|||
public class EmptyIndexFragment implements IIndexFragment {
|
||||
public void acquireReadLock() throws InterruptedException {}
|
||||
|
||||
public IIndexFragmentBinding adaptBinding(IBinding binding)
|
||||
throws CoreException {
|
||||
public IIndexFragmentBinding adaptBinding(IBinding binding) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public IIndexFragmentBinding adaptBinding(IIndexFragmentBinding proxy)
|
||||
throws CoreException {
|
||||
return null;
|
||||
}
|
||||
|
||||
public IIndexFragmentBinding findBinding(IASTName astName) throws CoreException {
|
||||
public IIndexFragmentBinding findBinding(IASTName astName) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -74,8 +68,7 @@ public class EmptyIndexFragment implements IIndexFragment {
|
|||
return IIndexFragmentInclude.EMPTY_FRAGMENT_INCLUDES_ARRAY;
|
||||
}
|
||||
|
||||
public IIndexFragmentName[] findNames(IIndexFragmentBinding binding,
|
||||
int flags) throws CoreException {
|
||||
public IIndexFragmentName[] findNames(IBinding binding, int flags) {
|
||||
return IIndexFragmentName.EMPTY_NAME_ARRAY;
|
||||
}
|
||||
|
||||
|
|
|
@ -258,13 +258,13 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
|
|||
|
||||
IndexFilter CLinkage= new IndexFilter() {
|
||||
public boolean acceptLinkage(ILinkage linkage) {
|
||||
return linkage.getID().equals(ILinkage.C_LINKAGE_ID);
|
||||
return linkage.getLinkageID() == ILinkage.C_LINKAGE_ID;
|
||||
}
|
||||
};
|
||||
|
||||
IndexFilter CPPLinkage= new IndexFilter() {
|
||||
public boolean acceptLinkage(ILinkage linkage) {
|
||||
return linkage.getID().equals(ILinkage.CPP_LINKAGE_ID);
|
||||
return linkage.getLinkageID() == ILinkage.CPP_LINKAGE_ID;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* Andrew Ferguson (Symbian) - Initial implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
* Andrew Ferguson (Symbian) - Initial implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.pdom.tests;
|
||||
|
||||
|
@ -20,16 +20,12 @@ import org.eclipse.cdt.core.dom.IName;
|
|||
import org.eclipse.cdt.core.dom.IPDOMManager;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
|
||||
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||
import org.eclipse.cdt.core.index.IIndexLocationConverter;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
import org.eclipse.cdt.core.index.ResourceContainerRelativeLocationConverter;
|
||||
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
|
||||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.core.model.LanguageManager;
|
||||
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
|
||||
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
|
||||
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
||||
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
|
||||
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
|
||||
|
@ -47,8 +43,6 @@ import org.eclipse.core.resources.IProject;
|
|||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
import org.eclipse.core.runtime.content.IContentType;
|
||||
|
||||
/**
|
||||
* Tests bugs found in the PDOM
|
||||
|
@ -208,21 +202,14 @@ public class PDOMCPPBugsTest extends BaseTestCase {
|
|||
pdom.releaseWriteLock();
|
||||
}
|
||||
|
||||
public void _test191679() throws Exception {
|
||||
public void test191679() throws Exception {
|
||||
IProject project= cproject.getProject();
|
||||
IFolder cHeaders= cproject.getProject().getFolder("cHeaders");
|
||||
cHeaders.create(true, true, NPM);
|
||||
LanguageManager lm= LanguageManager.getInstance();
|
||||
|
||||
IFile cHeader= TestSourceReader.createFile(cHeaders, "cHeader.h", "extern \"C\" void foo(int i) {}\n");
|
||||
ICProjectDescription pd= CCorePlugin.getDefault().getProjectDescription(project);
|
||||
ICConfigurationDescription cfgd= pd.getDefaultSettingConfiguration();
|
||||
ProjectLanguageConfiguration plc= LanguageManager.getInstance().getLanguageConfiguration(project);
|
||||
plc.addFileMapping(cfgd, cHeader, GCCLanguage.ID);
|
||||
IContentType ct= Platform.getContentTypeManager().getContentType(CCorePlugin.CONTENT_TYPE_CHEADER);
|
||||
lm.storeLanguageMappingConfiguration(project, new IContentType[] {ct});
|
||||
|
||||
IFile cppSource= TestSourceReader.createFile(cHeaders, "cppSource.cpp", "void ref() {foo(1);}");
|
||||
IFile cHeader= TestSourceReader.createFile(cHeaders, "cSource.c", "void foo(int i){}");
|
||||
IFile cppSource= TestSourceReader.createFile(cHeaders, "cppSource.cpp", "extern \"C\" void foo(int i); void ref() {foo(1);}");
|
||||
|
||||
IndexerPreferences.set(project, IndexerPreferences.KEY_INDEXER_ID, IPDOMManager.ID_FAST_INDEXER);
|
||||
CCorePlugin.getIndexManager().reindex(cproject);
|
||||
|
@ -233,14 +220,29 @@ public class PDOMCPPBugsTest extends BaseTestCase {
|
|||
try {
|
||||
{ // test reference to 'foo' was resolved correctly
|
||||
IIndexBinding[] ib= pdom.findBindings(new char[][]{"foo".toCharArray()}, IndexFilter.ALL, NPM);
|
||||
assertEquals(1, ib.length);
|
||||
|
||||
assertEquals(2, ib.length);
|
||||
if (ib[0] instanceof ICPPBinding) {
|
||||
IIndexBinding h= ib[0]; ib[0]= ib[1]; ib[1]= h;
|
||||
}
|
||||
assertTrue(ib[0] instanceof IFunction);
|
||||
assertTrue(!(ib[0] instanceof ICPPBinding));
|
||||
assertFalse(ib[0] instanceof ICPPBinding);
|
||||
|
||||
IName[] nms= pdom.findNames(ib[0], IIndexFragment.FIND_REFERENCES);
|
||||
assertTrue(ib[1] instanceof IFunction);
|
||||
assertTrue(ib[1] instanceof ICPPBinding);
|
||||
|
||||
IName[] nms= pdom.findNames(ib[0], IIndexFragment.FIND_REFERENCES | IIndexFragment.SEARCH_ACCROSS_LANGUAGE_BOUNDARIES);
|
||||
assertEquals(1, nms.length);
|
||||
assertTrue(nms[0].getFileLocation().getFileName().endsWith(".cpp"));
|
||||
|
||||
nms= pdom.findNames(ib[0], IIndexFragment.FIND_REFERENCES);
|
||||
assertEquals(0, nms.length);
|
||||
|
||||
nms= pdom.findNames(ib[1], IIndexFragment.FIND_DEFINITIONS | IIndexFragment.SEARCH_ACCROSS_LANGUAGE_BOUNDARIES);
|
||||
assertEquals(1, nms.length);
|
||||
assertTrue(nms[0].getFileLocation().getFileName().endsWith(".c"));
|
||||
|
||||
nms= pdom.findNames(ib[1], IIndexFragment.FIND_DEFINITIONS);
|
||||
assertEquals(0, nms.length);
|
||||
}
|
||||
} finally {
|
||||
pdom.releaseReadLock();
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
||||
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -22,10 +22,23 @@ package org.eclipse.cdt.core.dom;
|
|||
* @since 4.0
|
||||
*/
|
||||
public interface ILinkage {
|
||||
final static String NO_LINKAGE_ID= "none"; //$NON-NLS-1$
|
||||
final static String C_LINKAGE_ID= "C"; //$NON-NLS-1$
|
||||
final static String CPP_LINKAGE_ID= "C++"; //$NON-NLS-1$
|
||||
final static String FORTRAN_LINKAGE_ID= "Fortran"; //$NON-NLS-1$
|
||||
final static String NO_LINKAGE_NAME= "none"; //$NON-NLS-1$
|
||||
final static String C_LINKAGE_NAME= "C"; //$NON-NLS-1$
|
||||
final static String CPP_LINKAGE_NAME= "C++"; //$NON-NLS-1$
|
||||
final static String FORTRAN_LINKAGE_NAME= "Fortran"; //$NON-NLS-1$
|
||||
|
||||
String getID();
|
||||
final static int NO_LINKAGE_ID= 0;
|
||||
final static int C_LINKAGE_ID= 1;
|
||||
final static int CPP_LINKAGE_ID= 2;
|
||||
final static int FORTRAN_LINKAGE_ID= 3;
|
||||
|
||||
/**
|
||||
* Returns the name of the linkage.
|
||||
*/
|
||||
String getLinkageName();
|
||||
|
||||
/**
|
||||
* Returns a unique id for the linkage.
|
||||
*/
|
||||
int getLinkageID();
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ public interface ICPPFunction extends IFunction, ICPPBinding {
|
|||
|
||||
/**
|
||||
* Returns whether this function is declared as extern "C".
|
||||
* @since 5.0
|
||||
*/
|
||||
public boolean isExternC() throws DOMException;
|
||||
}
|
||||
|
|
|
@ -62,6 +62,12 @@ public interface IIndex {
|
|||
* Constant to search for all declarations including definitions.
|
||||
*/
|
||||
final int FIND_REFERENCES = 0x4;
|
||||
/**
|
||||
* Constant to search for occurrences across language boundaries.
|
||||
* You can use it to find the occurrences of a c++-function declared with 'extern "C"' within
|
||||
* the c-linkage.
|
||||
*/
|
||||
final int SEARCH_ACCROSS_LANGUAGE_BOUNDARIES= 0x8;
|
||||
/**
|
||||
* Constant to search for references. This does not include declarations or definitions.
|
||||
*/
|
||||
|
@ -293,7 +299,8 @@ public interface IIndex {
|
|||
* Searches for all names that resolve to the given binding. You can limit the result to references, declarations
|
||||
* or definitions, or a combination of those.
|
||||
* @param binding a binding for which names are searched for
|
||||
* @param flags a combination of {@link #FIND_DECLARATIONS}, {@link #FIND_DEFINITIONS} and {@link #FIND_REFERENCES}
|
||||
* @param flags a combination of {@link #FIND_DECLARATIONS}, {@link #FIND_DEFINITIONS},
|
||||
* {@link #FIND_REFERENCES} and {@link #SEARCH_ACCROSS_LANGUAGE_BOUNDARIES}.
|
||||
* @return an array of names
|
||||
* @throws CoreException
|
||||
*/
|
||||
|
|
|
@ -31,8 +31,8 @@ import org.eclipse.core.runtime.CoreException;
|
|||
|
||||
abstract public class IndexFilter {
|
||||
public static final IndexFilter ALL = new IndexFilter() {};
|
||||
public static final IndexFilter ALL_DECLARED = getDeclaredBindingFilter(null, false);
|
||||
public static final IndexFilter ALL_DECLARED_OR_IMPLICIT = getDeclaredBindingFilter(null, true);
|
||||
public static final IndexFilter ALL_DECLARED = getDeclaredBindingFilter(-1, false);
|
||||
public static final IndexFilter ALL_DECLARED_OR_IMPLICIT = getDeclaredBindingFilter(-1, true);
|
||||
public static final IndexFilter CPP_DECLARED_OR_IMPLICIT= getDeclaredBindingFilter(ILinkage.CPP_LINKAGE_ID, true);
|
||||
public static final IndexFilter C_DECLARED_OR_IMPLICIT= getDeclaredBindingFilter(ILinkage.C_LINKAGE_ID, true);
|
||||
|
||||
|
@ -42,10 +42,10 @@ abstract public class IndexFilter {
|
|||
* @param linkageID the id of the linkage whose bindings should be retained
|
||||
* @return an IndexFilter instance
|
||||
*/
|
||||
public static IndexFilter getFilter(final String linkageID) {
|
||||
public static IndexFilter getFilter(final int linkageID) {
|
||||
return new IndexFilter() {
|
||||
public boolean acceptLinkage(ILinkage linkage) {
|
||||
return linkageID.equals(linkage.getID());
|
||||
return linkageID == linkage.getLinkageID();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -53,10 +53,11 @@ abstract public class IndexFilter {
|
|||
/**
|
||||
* Get an IndexFilter that filters out bindings without declarations and those
|
||||
* from linkages other than that specified.
|
||||
* @param linkageID the id of the linkage whose bindings should be retained
|
||||
* @param linkageID the id of the linkage whose bindings should be retained, or -1
|
||||
* to accept all linkages.
|
||||
* @return an IndexFilter instance
|
||||
*/
|
||||
public static IndexFilter getDeclaredBindingFilter(final String linkageID, boolean acceptImplicit) {
|
||||
public static IndexFilter getDeclaredBindingFilter(final int linkageID, boolean acceptImplicit) {
|
||||
return new DeclaredBindingsFilter(linkageID, acceptImplicit);
|
||||
}
|
||||
|
||||
|
|
|
@ -15,10 +15,10 @@ import org.eclipse.cdt.core.dom.ILinkage;
|
|||
|
||||
public class Linkage implements ILinkage {
|
||||
|
||||
public static final ILinkage NO_LINKAGE = new Linkage(NO_LINKAGE_ID);
|
||||
public static final ILinkage C_LINKAGE = new Linkage(C_LINKAGE_ID);
|
||||
public static final ILinkage CPP_LINKAGE = new Linkage(CPP_LINKAGE_ID);
|
||||
public static final ILinkage FORTRAN_LINKAGE = new Linkage(FORTRAN_LINKAGE_ID);
|
||||
public static final ILinkage NO_LINKAGE = new Linkage(NO_LINKAGE_ID, NO_LINKAGE_NAME);
|
||||
public static final ILinkage C_LINKAGE = new Linkage(C_LINKAGE_ID, C_LINKAGE_NAME);
|
||||
public static final ILinkage CPP_LINKAGE = new Linkage(CPP_LINKAGE_ID, CPP_LINKAGE_NAME);
|
||||
public static final ILinkage FORTRAN_LINKAGE = new Linkage(FORTRAN_LINKAGE_ID, FORTRAN_LINKAGE_NAME);
|
||||
|
||||
private static final ILinkage[] LINKAGES= {C_LINKAGE, CPP_LINKAGE, FORTRAN_LINKAGE};
|
||||
|
||||
|
@ -26,11 +26,16 @@ public class Linkage implements ILinkage {
|
|||
return LINKAGES;
|
||||
}
|
||||
|
||||
private String fID;
|
||||
private Linkage(String id) {
|
||||
private int fID;
|
||||
private String fName;
|
||||
private Linkage(int id, String name) {
|
||||
fID= id;
|
||||
fName= name;
|
||||
}
|
||||
public String getID() {
|
||||
public int getLinkageID() {
|
||||
return fID;
|
||||
}
|
||||
public String getLinkageName() {
|
||||
return fName;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,7 +78,7 @@ public class CIndex implements IIndex {
|
|||
for (int i = 0; i < fPrimaryFragmentCount; i++) {
|
||||
IIndexFragmentBinding binding= fFragments[i].findBinding((IASTName) name);
|
||||
if(binding!=null) {
|
||||
return getCompositesFactory(binding.getLinkage().getID()).getCompositeBinding(binding);
|
||||
return getCompositesFactory(binding.getLinkage().getLinkageID()).getCompositeBinding(binding);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ public class CIndex implements IIndex {
|
|||
fragmentBindings[i] = IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
}
|
||||
}
|
||||
ICompositesFactory factory = getCompositesFactory(linkages[j].getID());
|
||||
ICompositesFactory factory = getCompositesFactory(linkages[j].getLinkageID());
|
||||
result.add(factory.getCompositeBindings(fragmentBindings));
|
||||
}
|
||||
}
|
||||
|
@ -121,13 +121,10 @@ public class CIndex implements IIndex {
|
|||
LinkedList result= new LinkedList();
|
||||
int fragCount= 0;
|
||||
for (int i = 0; i < fPrimaryFragmentCount; i++) {
|
||||
IIndexFragmentBinding adaptedBinding= fFragments[i].adaptBinding(binding);
|
||||
if (adaptedBinding != null) {
|
||||
final IIndexFragmentName[] names = fFragments[i].findNames(adaptedBinding, flags);
|
||||
if (names.length > 0) {
|
||||
result.addAll(Arrays.asList(names));
|
||||
fragCount++;
|
||||
}
|
||||
final IIndexFragmentName[] names = fFragments[i].findNames(binding, flags);
|
||||
if (names.length > 0) {
|
||||
result.addAll(Arrays.asList(names));
|
||||
fragCount++;
|
||||
}
|
||||
}
|
||||
// bug 192352, files can reside in multiple fragments, remove duplicates
|
||||
|
@ -333,7 +330,7 @@ public class CIndex implements IIndex {
|
|||
fragmentBindings[i] = IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
}
|
||||
}
|
||||
ICompositesFactory factory = getCompositesFactory(linkages[j].getID());
|
||||
ICompositesFactory factory = getCompositesFactory(linkages[j].getLinkageID());
|
||||
result.add(factory.getCompositeBindings(fragmentBindings));
|
||||
}
|
||||
}
|
||||
|
@ -351,7 +348,7 @@ public class CIndex implements IIndex {
|
|||
for (int i = 0; i < fPrimaryFragmentCount; i++) {
|
||||
IIndexFragmentBinding adaptedBinding= fFragments[i].adaptBinding(binding);
|
||||
if (adaptedBinding != null) {
|
||||
return getCompositesFactory(binding.getLinkage().getID()).getCompositeBinding(adaptedBinding);
|
||||
return getCompositesFactory(binding.getLinkage().getLinkageID()).getCompositeBinding(adaptedBinding);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -401,20 +398,21 @@ public class CIndex implements IIndex {
|
|||
return (IIndexFragmentBinding[]) result.toArray(new IIndexFragmentBinding[result.size()]);
|
||||
}
|
||||
|
||||
private ICompositesFactory getCompositesFactory(String linkageID) {
|
||||
if(linkageID.equals(ILinkage.CPP_LINKAGE_ID)) {
|
||||
private ICompositesFactory getCompositesFactory(int linkageID) {
|
||||
switch (linkageID) {
|
||||
case ILinkage.CPP_LINKAGE_ID:
|
||||
if(cppCF==null) {
|
||||
cppCF = new CPPCompositesFactory(new CIndex(fFragments, fFragments.length));
|
||||
}
|
||||
return cppCF;
|
||||
}
|
||||
if(linkageID.equals(ILinkage.C_LINKAGE_ID)) {
|
||||
|
||||
case ILinkage.C_LINKAGE_ID:
|
||||
if(cCF==null) {
|
||||
cCF = new CCompositesFactory(new CIndex(fFragments, fFragments.length));
|
||||
}
|
||||
return cCF;
|
||||
}
|
||||
if(linkageID.equals(ILinkage.FORTRAN_LINKAGE_ID)) {
|
||||
|
||||
case ILinkage.FORTRAN_LINKAGE_ID:
|
||||
if(fCF==null) {
|
||||
fCF = new CCompositesFactory(new CIndex(fFragments, fFragments.length));
|
||||
}
|
||||
|
@ -431,7 +429,7 @@ public class CIndex implements IIndex {
|
|||
return filter.acceptBinding(binding);
|
||||
}
|
||||
public boolean acceptLinkage(ILinkage other) {
|
||||
return linkage.getID().equals(other.getID());
|
||||
return linkage.getLinkageID() == other.getLinkageID();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -455,7 +453,7 @@ public class CIndex implements IIndex {
|
|||
fragmentBindings[i] = IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
}
|
||||
}
|
||||
ICompositesFactory factory = getCompositesFactory(linkages[j].getID());
|
||||
ICompositesFactory factory = getCompositesFactory(linkages[j].getLinkageID());
|
||||
result.add(factory.getCompositeBindings(fragmentBindings));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,20 +18,20 @@ import org.eclipse.cdt.core.index.IndexFilter;
|
|||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
public class DeclaredBindingsFilter extends IndexFilter {
|
||||
final private String fLinkageID;
|
||||
final private int fLinkageID;
|
||||
final private boolean fAcceptImplicit;
|
||||
|
||||
public DeclaredBindingsFilter() {
|
||||
this(null, false);
|
||||
this(-1, false);
|
||||
}
|
||||
|
||||
public DeclaredBindingsFilter(String linkageID, boolean acceptImplicit) {
|
||||
public DeclaredBindingsFilter(int linkageID, boolean acceptImplicit) {
|
||||
fLinkageID= linkageID;
|
||||
fAcceptImplicit= acceptImplicit;
|
||||
}
|
||||
|
||||
public boolean acceptLinkage(ILinkage linkage) {
|
||||
return fLinkageID == null || fLinkageID.equals(linkage.getID());
|
||||
return fLinkageID == -1 || fLinkageID == linkage.getLinkageID();
|
||||
}
|
||||
|
||||
public boolean acceptBinding(IBinding binding) throws CoreException {
|
||||
|
|
|
@ -43,6 +43,10 @@ public interface IIndexFragment {
|
|||
* @see IIndex#FIND_REFERENCES
|
||||
*/
|
||||
final int FIND_REFERENCES = IIndex.FIND_REFERENCES;
|
||||
/**
|
||||
* @see IIndex#SEARCH_ACCROSS_LANGUAGE_BOUNDARIES
|
||||
*/
|
||||
final int SEARCH_ACCROSS_LANGUAGE_BOUNDARIES= IIndex.SEARCH_ACCROSS_LANGUAGE_BOUNDARIES;
|
||||
/**
|
||||
* @see IIndex#FIND_DECLARATIONS_DEFINITIONS
|
||||
*/
|
||||
|
@ -89,7 +93,7 @@ public interface IIndexFragment {
|
|||
* another fragment. All of the include directives returned must belong to files managed by
|
||||
* this fragment.
|
||||
* @param file a file to search for includes pointing to it
|
||||
* @return an array of inlucde directives managed by this fragment
|
||||
* @return an array of include directives managed by this fragment
|
||||
* @throws CoreException
|
||||
*/
|
||||
IIndexFragmentInclude[] findIncludedBy(IIndexFragmentFile file) throws CoreException;
|
||||
|
@ -103,15 +107,6 @@ public interface IIndexFragment {
|
|||
*/
|
||||
IIndexFragmentBinding adaptBinding(IBinding binding) throws CoreException;
|
||||
|
||||
/**
|
||||
* Looks for a proxy binding matching the given one. May return <code>null</code>, if no
|
||||
* such binding exists. The binding may belong to another index fragment.
|
||||
* @param proxy the binding to look for.
|
||||
* @return the binding, or <code>null</code>
|
||||
* @throws CoreException
|
||||
*/
|
||||
IIndexFragmentBinding adaptBinding(IIndexFragmentBinding proxy) throws CoreException;
|
||||
|
||||
/**
|
||||
* Looks for a binding of the given name from the AST. May return <code>null</code>, if no
|
||||
* such binding exists.
|
||||
|
@ -153,7 +148,7 @@ public interface IIndexFragment {
|
|||
* @return an array of names
|
||||
* @throws CoreException
|
||||
*/
|
||||
IIndexFragmentName[] findNames(IIndexFragmentBinding binding, int flags) throws CoreException;
|
||||
IIndexFragmentName[] findNames(IBinding binding, int flags) throws CoreException;
|
||||
|
||||
/**
|
||||
* Acquires a read lock.
|
||||
|
|
|
@ -31,8 +31,15 @@ import org.eclipse.cdt.core.dom.ILinkage;
|
|||
import org.eclipse.cdt.core.dom.IName;
|
||||
import org.eclipse.cdt.core.dom.IPDOMNode;
|
||||
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IField;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
|
||||
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||
import org.eclipse.cdt.core.index.IIndexFileLocation;
|
||||
import org.eclipse.cdt.core.index.IIndexLinkage;
|
||||
|
@ -40,6 +47,7 @@ import org.eclipse.cdt.core.index.IIndexLocationConverter;
|
|||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.index.IIndexName;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
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.index.IIndexFragmentFile;
|
||||
|
@ -75,7 +83,7 @@ import org.eclipse.core.runtime.Status;
|
|||
*
|
||||
* @author Doug Schaefer
|
||||
*/
|
||||
public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
||||
public class PDOM extends PlatformObject implements IPDOM {
|
||||
/**
|
||||
* Identifier for PDOM format
|
||||
* @see IIndexFragment#PROPERTY_FRAGMENT_FORMAT_ID
|
||||
|
@ -499,7 +507,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
}
|
||||
}
|
||||
|
||||
public PDOMLinkage getLinkage(String linkageID) throws CoreException {
|
||||
public PDOMLinkage getLinkage(String linkageID) {
|
||||
return (PDOMLinkage) fLinkageIDCache.get(linkageID);
|
||||
}
|
||||
|
||||
|
@ -549,7 +557,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
public void insertLinkage(PDOMLinkage linkage) throws CoreException {
|
||||
linkage.setNext(db.getInt(LINKAGES));
|
||||
db.putInt(LINKAGES, linkage.getRecord());
|
||||
fLinkageIDCache.put(linkage.getID(), linkage);
|
||||
fLinkageIDCache.put(linkage.getLinkageName(), linkage);
|
||||
}
|
||||
|
||||
public PDOMBinding getBinding(int record) throws CoreException {
|
||||
|
@ -670,10 +678,13 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
}
|
||||
|
||||
protected PDOMLinkage adaptLinkage(ILinkage linkage) throws CoreException {
|
||||
return (PDOMLinkage) fLinkageIDCache.get(linkage.getID());
|
||||
return (PDOMLinkage) fLinkageIDCache.get(linkage.getLinkageName());
|
||||
}
|
||||
|
||||
public IIndexFragmentBinding adaptBinding(IBinding binding) throws CoreException {
|
||||
if (binding == null) {
|
||||
return null;
|
||||
}
|
||||
PDOMBinding pdomBinding= (PDOMBinding) binding.getAdapter(PDOMBinding.class);
|
||||
if (pdomBinding != null && pdomBinding.getPDOM() == this) {
|
||||
return pdomBinding;
|
||||
|
@ -686,13 +697,6 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
return null;
|
||||
}
|
||||
|
||||
public IIndexFragmentBinding adaptBinding(IIndexFragmentBinding binding) throws CoreException {
|
||||
if (binding != null) {
|
||||
return adaptBinding((IBinding) binding);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public IIndexFragmentBinding findBinding(IIndexFragmentName indexName) throws CoreException {
|
||||
if (indexName instanceof PDOMName) {
|
||||
PDOMName pdomName= (PDOMName) indexName;
|
||||
|
@ -702,37 +706,39 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
}
|
||||
|
||||
public IIndexFragmentName[] findNames(IBinding binding, int options) throws CoreException {
|
||||
IIndexFragmentBinding proxyBinding= adaptBinding(binding);
|
||||
if (proxyBinding != null) {
|
||||
return findNames(proxyBinding, options);
|
||||
ArrayList names= new ArrayList();
|
||||
PDOMBinding pdomBinding = (PDOMBinding) adaptBinding(binding);
|
||||
if (pdomBinding != null) {
|
||||
names= new ArrayList();
|
||||
findNamesForMyBinding(pdomBinding, options, names);
|
||||
}
|
||||
return IIndexFragmentName.EMPTY_NAME_ARRAY;
|
||||
if ((options & SEARCH_ACCROSS_LANGUAGE_BOUNDARIES) != 0) {
|
||||
PDOMBinding[] xlangBindings= getCrossLanguageBindings(binding);
|
||||
for (int j = 0; j < xlangBindings.length; j++) {
|
||||
findNamesForMyBinding(xlangBindings[j], options, names);
|
||||
}
|
||||
}
|
||||
return (IIndexFragmentName[]) names.toArray(new IIndexFragmentName[names.size()]);
|
||||
}
|
||||
|
||||
public IIndexFragmentName[] findNames(IIndexFragmentBinding binding, int options) throws CoreException {
|
||||
PDOMBinding pdomBinding = (PDOMBinding) adaptBinding(binding);
|
||||
|
||||
if (pdomBinding != null) {
|
||||
PDOMName name;
|
||||
List names = new ArrayList();
|
||||
if ((options & FIND_DECLARATIONS) != 0) {
|
||||
for (name= pdomBinding.getFirstDeclaration(); name != null; name= name.getNextInBinding()) {
|
||||
names.add(name);
|
||||
}
|
||||
private void findNamesForMyBinding(PDOMBinding pdomBinding, int options, ArrayList names)
|
||||
throws CoreException {
|
||||
PDOMName name;
|
||||
if ((options & FIND_DECLARATIONS) != 0) {
|
||||
for (name= pdomBinding.getFirstDeclaration(); name != null; name= name.getNextInBinding()) {
|
||||
names.add(name);
|
||||
}
|
||||
}
|
||||
if ((options & FIND_DEFINITIONS) != 0) {
|
||||
for (name = pdomBinding.getFirstDefinition(); name != null; name= name.getNextInBinding()) {
|
||||
names.add(name);
|
||||
}
|
||||
}
|
||||
if ((options & FIND_REFERENCES) != 0) {
|
||||
for (name = pdomBinding.getFirstReference(); name != null; name= name.getNextInBinding()) {
|
||||
names.add(name);
|
||||
}
|
||||
if ((options & FIND_DEFINITIONS) != 0) {
|
||||
for (name = pdomBinding.getFirstDefinition(); name != null; name= name.getNextInBinding()) {
|
||||
names.add(name);
|
||||
}
|
||||
}
|
||||
if ((options & FIND_REFERENCES) != 0) {
|
||||
for (name = pdomBinding.getFirstReference(); name != null; name= name.getNextInBinding()) {
|
||||
names.add(name);
|
||||
}
|
||||
}
|
||||
return (IIndexFragmentName[]) names.toArray(new IIndexFragmentName[names.size()]);
|
||||
}
|
||||
return IIndexFragmentName.EMPTY_NAME_ARRAY;
|
||||
}
|
||||
|
||||
public IIndexFragmentInclude[] findIncludedBy(IIndexFragmentFile file) throws CoreException {
|
||||
|
@ -872,4 +878,82 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
public String createKeyForCache(int record, char[] name) {
|
||||
return new StringBuffer(name.length+2).append((char) (record >> 16)).append((char) record).append(name).toString();
|
||||
}
|
||||
|
||||
private PDOMBinding[] getCrossLanguageBindings(IBinding binding) throws CoreException {
|
||||
switch(binding.getLinkage().getLinkageID()) {
|
||||
case ILinkage.C_LINKAGE_ID:
|
||||
return getCPPBindingForC(binding);
|
||||
case ILinkage.CPP_LINKAGE_ID:
|
||||
return getCBindingForCPP(binding);
|
||||
}
|
||||
return PDOMBinding.EMPTY_PDOMBINDING_ARRAY;
|
||||
}
|
||||
|
||||
private PDOMBinding[] getCBindingForCPP(IBinding binding) throws CoreException {
|
||||
PDOMBinding result= null;
|
||||
PDOMLinkage c= getLinkage(ILinkage.C_LINKAGE_NAME);
|
||||
if (c == null) {
|
||||
return PDOMBinding.EMPTY_PDOMBINDING_ARRAY;
|
||||
}
|
||||
try {
|
||||
if (binding instanceof ICPPFunction) {
|
||||
ICPPFunction func = (ICPPFunction) binding;
|
||||
if (func.isExternC()) {
|
||||
result = FindBinding.findBinding(c.getIndex(), this, func.getNameCharArray(),
|
||||
new int[] { IIndexCBindingConstants.CFUNCTION });
|
||||
}
|
||||
} else if (binding instanceof ICPPVariable) {
|
||||
ICPPVariable var = (ICPPVariable) binding;
|
||||
if (var.isExternC()) {
|
||||
result = FindBinding.findBinding(c.getIndex(), this, var.getNameCharArray(),
|
||||
new int[] { IIndexCBindingConstants.CVARIABLE });
|
||||
}
|
||||
}
|
||||
} catch (DOMException e) {
|
||||
}
|
||||
return result == null ? PDOMBinding.EMPTY_PDOMBINDING_ARRAY : new PDOMBinding[] {result};
|
||||
}
|
||||
|
||||
private PDOMBinding[] getCPPBindingForC(IBinding binding) throws CoreException {
|
||||
PDOMLinkage cpp= getLinkage(ILinkage.CPP_LINKAGE_NAME);
|
||||
if (cpp == null) {
|
||||
return PDOMBinding.EMPTY_PDOMBINDING_ARRAY;
|
||||
}
|
||||
IndexFilter filter= null;
|
||||
if (binding instanceof IFunction) {
|
||||
filter= new IndexFilter() {
|
||||
public boolean acceptBinding(IBinding binding) {
|
||||
try {
|
||||
if (binding instanceof ICPPFunction) {
|
||||
return ((ICPPFunction) binding).isExternC();
|
||||
}
|
||||
} catch (DOMException e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
} else if (binding instanceof IVariable) {
|
||||
if (!(binding instanceof IField) && !(binding instanceof IParameter)) {
|
||||
filter= new IndexFilter() {
|
||||
public boolean acceptBinding(IBinding binding) {
|
||||
try {
|
||||
if (binding instanceof ICPPVariable) {
|
||||
return ((ICPPVariable) binding).isExternC();
|
||||
}
|
||||
} catch (DOMException e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
if (filter != null) {
|
||||
BindingCollector collector= new BindingCollector(cpp, binding.getNameCharArray(), filter, false, true);
|
||||
cpp.accept(collector);
|
||||
return collector.getBindings();
|
||||
}
|
||||
return PDOMBinding.EMPTY_PDOMBINDING_ARRAY;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -61,12 +61,6 @@ public class PDOMProxy implements IPDOM {
|
|||
return null;
|
||||
}
|
||||
|
||||
public synchronized IIndexFragmentBinding adaptBinding(IIndexFragmentBinding proxy) throws CoreException {
|
||||
if (fDelegate != null)
|
||||
return fDelegate.adaptBinding(proxy);
|
||||
return null;
|
||||
}
|
||||
|
||||
public synchronized IIndexFragmentBinding findBinding(IASTName astName) throws CoreException {
|
||||
if (fDelegate != null)
|
||||
return fDelegate.findBinding(astName);
|
||||
|
@ -104,7 +98,7 @@ public class PDOMProxy implements IPDOM {
|
|||
return new IIndexFragmentInclude[0];
|
||||
}
|
||||
|
||||
public synchronized IIndexFragmentName[] findNames(IIndexFragmentBinding binding, int flags)
|
||||
public synchronized IIndexFragmentName[] findNames(IBinding binding, int flags)
|
||||
throws CoreException {
|
||||
if (fDelegate != null)
|
||||
return fDelegate.findNames(binding, flags);
|
||||
|
|
|
@ -79,7 +79,7 @@ public class WritablePDOM extends PDOM implements IWritableIndexFragment {
|
|||
|
||||
public PDOMBinding addBinding(IASTName name) throws CoreException {
|
||||
PDOMBinding result= null;
|
||||
PDOMLinkage linkage= createLinkage(name.getLinkage().getID());
|
||||
PDOMLinkage linkage= createLinkage(name.getLinkage().getLinkageName());
|
||||
if (linkage == null) {
|
||||
CCorePlugin.log(MessageFormat.format(Messages.WritablePDOM_error_unknownLinkage, new Object[]{name.getLinkage()}));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
@ -42,7 +42,7 @@ public final class BindingCollector extends NamedNodeCollector {
|
|||
}
|
||||
|
||||
public boolean addNode(PDOMNamedNode tBinding) throws CoreException {
|
||||
if (tBinding instanceof IBinding) {
|
||||
if (tBinding instanceof PDOMBinding) {
|
||||
if (filter == null || filter.acceptBinding((IBinding) tBinding)) {
|
||||
return super.addNode(tBinding);
|
||||
}
|
||||
|
@ -50,8 +50,8 @@ public final class BindingCollector extends NamedNodeCollector {
|
|||
return true; // look for more
|
||||
}
|
||||
|
||||
public IBinding[] getBindings() {
|
||||
public PDOMBinding[] getBindings() {
|
||||
List bindings= getNodeList();
|
||||
return (IBinding[])bindings.toArray(new IBinding[bindings.size()]);
|
||||
return (PDOMBinding[])bindings.toArray(new PDOMBinding[bindings.size()]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ import org.eclipse.core.runtime.CoreException;
|
|||
*
|
||||
*/
|
||||
public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmentBinding {
|
||||
public static final PDOMBinding[] EMPTY_PDOMBINDING_ARRAY = {};
|
||||
|
||||
private static final int FIRST_DECL_OFFSET = PDOMNamedNode.RECORD_SIZE + 0; // size 4
|
||||
private static final int FIRST_DEF_OFFSET = PDOMNamedNode.RECORD_SIZE + 4; // size 4
|
||||
|
|
|
@ -52,14 +52,18 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants {
|
|||
}
|
||||
|
||||
public PDOMCLinkage(PDOM pdom) throws CoreException {
|
||||
super(pdom, C_LINKAGE_ID, C_LINKAGE_ID.toCharArray());
|
||||
super(pdom, C_LINKAGE_NAME, C_LINKAGE_NAME.toCharArray());
|
||||
}
|
||||
|
||||
public int getNodeType() {
|
||||
return LINKAGE;
|
||||
}
|
||||
|
||||
public String getID() {
|
||||
public String getLinkageName() {
|
||||
return C_LINKAGE_NAME;
|
||||
}
|
||||
|
||||
public int getLinkageID() {
|
||||
return C_LINKAGE_ID;
|
||||
}
|
||||
|
||||
|
|
|
@ -6,8 +6,9 @@
|
|||
* 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)
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||
|
||||
|
@ -163,7 +164,7 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
|
|||
return !(binding instanceof ICPPTemplateParameter || binding instanceof ICPPSpecialization);
|
||||
}
|
||||
public boolean acceptLinkage(ILinkage linkage) {
|
||||
return linkage.getID() == ILinkage.CPP_LINKAGE_ID;
|
||||
return linkage.getLinkageID() == ILinkage.CPP_LINKAGE_ID;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -190,7 +191,7 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
|
|||
return !(binding instanceof ICPPTemplateParameter || binding instanceof ICPPSpecialization);
|
||||
}
|
||||
public boolean acceptLinkage(ILinkage linkage) {
|
||||
return linkage.getID() == ILinkage.CPP_LINKAGE_ID;
|
||||
return linkage.getLinkageID() == ILinkage.CPP_LINKAGE_ID;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -82,10 +82,14 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
|||
}
|
||||
|
||||
public PDOMCPPLinkage(PDOM pdom) throws CoreException {
|
||||
super(pdom, CPP_LINKAGE_ID, CPP_LINKAGE_ID.toCharArray());
|
||||
super(pdom, CPP_LINKAGE_NAME, CPP_LINKAGE_NAME.toCharArray());
|
||||
}
|
||||
|
||||
public String getID() {
|
||||
public String getLinkageName() {
|
||||
return CPP_LINKAGE_NAME;
|
||||
}
|
||||
|
||||
public int getLinkageID() {
|
||||
return CPP_LINKAGE_ID;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue