1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 17:56:01 +02:00

Fix for PR 91964: Dom Indexer misses give a friend declaration for forward decls. Fixed detection of friend class/struct declaration.

Fix for PR 92060: [DOM Indexer] for C projects only seems to do macros now. Taken a different approach by wrapping calls to IIndexerOutput in anticipation of its soon change.
This commit is contained in:
Vladimir Hirsl 2005-04-21 13:46:13 +00:00
parent 1c7f6f77c0
commit 2bd5fd9dfa
6 changed files with 400 additions and 229 deletions

View file

@ -1,3 +1,16 @@
2005-04-21 Vladimir Hirsl
Fix for PR 91964: Dom Indexer misses give a friend declaration for forward decls
Fixed detection of friend class/struct declaration.
Fix for PR 92060: [DOM Indexer] for C projects only seems to do macros now
Taken a different approach by wrapping calls to IIndexerOutput in anticipation
of its soon change.
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/CGenerateIndexVisitor.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/CPPGenerateIndexerVisitor.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexerDOMSourceIndexerRunner.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/IndexerEncoderUtil.java
+ index/org/eclipse/cdt/internal/core/index/domsourceindexer/IndexerOutputWrapper.java
2005-04-15 Vladimir Hirsl 2005-04-15 Vladimir Hirsl
Fix for PR 91405: Search does not find declarations of printf Fix for PR 91405: Search does not find declarations of printf
Index entries form include files external to workspace were erroneously stored Index entries form include files external to workspace were erroneously stored

View file

@ -30,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.c.CASTVisitor; import org.eclipse.cdt.core.dom.ast.c.CASTVisitor;
import org.eclipse.cdt.internal.core.index.cindexstorage.ICIndexStorageConstants; import org.eclipse.cdt.internal.core.index.cindexstorage.ICIndexStorageConstants;
import org.eclipse.cdt.internal.core.index.domsourceindexer.IndexerOutputWrapper.EntryType;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
@ -93,12 +94,7 @@ public class CGenerateIndexVisitor extends CASTVisitor {
* @throws DOMException * @throws DOMException
*/ */
private void processName(IASTName name) throws DOMException { private void processName(IASTName name) throws DOMException {
// Quick check to see if the name is a reference in an external header file IBinding binding = name.resolveBinding();
//if (IndexEncoderUtil.nodeInExternalHeader(name) && name.isReference())
if (IndexEncoderUtil.nodeInExternalHeader(name))
return;
IBinding binding = name.resolveBinding();
// check for IProblemBinding // check for IProblemBinding
if (binding instanceof IProblemBinding) { if (binding instanceof IProblemBinding) {
IProblemBinding problem = (IProblemBinding) binding; IProblemBinding problem = (IProblemBinding) binding;
@ -109,7 +105,6 @@ public class CGenerateIndexVisitor extends CASTVisitor {
} }
return; return;
} }
// Get the location // Get the location
IASTFileLocation loc = IndexEncoderUtil.getFileLocation(name); IASTFileLocation loc = IndexEncoderUtil.getFileLocation(name);
if (loc != null) { if (loc != null) {
@ -143,90 +138,59 @@ public class CGenerateIndexVisitor extends CASTVisitor {
* @param indexFlag * @param indexFlag
* @throws DOMException * @throws DOMException
*/ */
private void processNameBinding(IASTName name, IBinding binding, IASTFileLocation loc, int fileNumber) throws DOMException { private void processNameBinding(IASTName name, IBinding binding, IASTFileLocation loc, int fileNumber) throws DOMException {
// determine type // determine type
EntryType entryType = null;
if (binding instanceof ICompositeType) { if (binding instanceof ICompositeType) {
int compositeKey = ((ICompositeType) binding).getKey(); int compositeKey = ((ICompositeType) binding).getKey();
ASTNodeProperty prop = name.getPropertyInParent(); ASTNodeProperty prop = name.getPropertyInParent();
switch (compositeKey) { switch (compositeKey) {
case ICompositeType.k_struct: case ICompositeType.k_struct:
entryType = IndexerOutputWrapper.STRUCT;
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME) if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
if (name.isDeclaration()) { entryType = IndexerOutputWrapper.FWD_STRUCT;
indexer.getOutput().addFwd_StructDecl(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (name.isReference()) {
indexer.getOutput().addFwd_StructRef(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else
if (name.isDeclaration()) {
indexer.getOutput().addStructDecl(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (name.isReference()) {
indexer.getOutput().addStructRef(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
break; break;
case ICompositeType.k_union: case ICompositeType.k_union:
entryType = IndexerOutputWrapper.UNION;
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME) if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
if (name.isDeclaration()) { entryType = IndexerOutputWrapper.FWD_UNION;
indexer.getOutput().addFwd_UnionDecl(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (name.isReference()) {
indexer.getOutput().addFwd_UnionRef(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else
if (name.isDeclaration()) {
indexer.getOutput().addUnionDecl(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (name.isReference()) {
indexer.getOutput().addUnionRef(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
break; break;
} }
} }
else if (binding instanceof IEnumeration) else if (binding instanceof IEnumeration)
if (name.isDeclaration()) { entryType = IndexerOutputWrapper.ENUM;
indexer.getOutput().addEnumDecl(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (name.isReference()) {
indexer.getOutput().addEnumRef(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (binding instanceof ITypedef) else if (binding instanceof ITypedef)
if (name.isDeclaration()) { entryType = IndexerOutputWrapper.TYPEDEF;
indexer.getOutput().addTypedefDecl(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (name.isReference()) {
indexer.getOutput().addTypedefRef(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (binding instanceof IEnumerator) else if (binding instanceof IEnumerator)
if (name.isDeclaration()) { entryType = IndexerOutputWrapper.ENUMERATOR;
indexer.getOutput().addEnumtorDecl(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (name.isReference()) {
indexer.getOutput().addEnumtorRef(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (binding instanceof IField) else if (binding instanceof IField)
if (name.isDeclaration()) { entryType = IndexerOutputWrapper.FIELD;
indexer.getOutput().addFieldDecl(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (name.isReference()) {
indexer.getOutput().addFieldRef(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (binding instanceof IParameter || else if (binding instanceof IParameter ||
binding instanceof IVariable) binding instanceof IVariable)
if (name.isDeclaration()) { entryType = IndexerOutputWrapper.VAR;
indexer.getOutput().addVarDecl(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (name.isReference()) {
indexer.getOutput().addVarRef(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
}
else if (binding instanceof IFunction) else if (binding instanceof IFunction)
entryType = IndexerOutputWrapper.FUNCTION;
if (entryType != null) {
if (name.isDeclaration()) { if (name.isDeclaration()) {
indexer.getOutput().addFunctionDecl(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET); IndexerOutputWrapper.addNameDecl(indexer.getOutput(),
getFullyQualifiedName(name),
entryType,
fileNumber,
loc.getNodeOffset(),
loc.getNodeLength(),
ICIndexStorageConstants.OFFSET);
} }
else if (name.isReference()) { else if (name.isReference()) {
indexer.getOutput().addFunctionRef(fileNumber, getFullyQualifiedName(name),loc.getNodeOffset(),loc.getNodeLength(),ICIndexStorageConstants.OFFSET); IndexerOutputWrapper.addNameRef(indexer.getOutput(),
getFullyQualifiedName(name),
entryType,
fileNumber,
loc.getNodeOffset(),
loc.getNodeLength(),
ICIndexStorageConstants.OFFSET);
} }
}
} }
/** /**

View file

@ -29,6 +29,7 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor; import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
@ -37,7 +38,10 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.search.ICSearchConstants;
import org.eclipse.cdt.core.search.ICSearchConstants.LimitTo;
import org.eclipse.cdt.internal.core.index.cindexstorage.ICIndexStorageConstants; import org.eclipse.cdt.internal.core.index.cindexstorage.ICIndexStorageConstants;
import org.eclipse.cdt.internal.core.index.domsourceindexer.IndexerOutputWrapper.EntryType;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
@ -123,7 +127,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
//or if it occurs in another file //or if it occurs in another file
int indexFlag = IndexEncoderUtil.calculateIndexFlags(indexer, loc); int indexFlag = IndexEncoderUtil.calculateIndexFlags(indexer, loc);
processNameBinding(name, binding, loc, indexFlag); // function will determine Ref or Decl processNameBinding(name, binding, loc, indexFlag, null); // function will determine limitTo
} }
} }
@ -150,162 +154,152 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
* @param limitTo * @param limitTo
* @throws DOMException * @throws DOMException
*/ */
private void processNameBinding(IASTName name, IBinding binding, IASTFileLocation loc, int fileNumber, LimitTo limitTo) throws DOMException {
private void processNameDeclBinding(IASTName name, IBinding binding, IASTFileLocation loc, int fileNumber) throws DOMException { // determine LimitTo
if (binding instanceof ICompositeType) { if (limitTo == null) {
ICompositeType compBinding = (ICompositeType) binding;
int compositeKey = compBinding.getKey();
ASTNodeProperty prop = name.getPropertyInParent();
switch (compositeKey) {
case ICPPClassType.k_class:
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
indexer.getOutput().addFwd_ClassDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else
indexer.getOutput().addClassDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
break;
case ICompositeType.k_struct:
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
indexer.getOutput().addFwd_StructDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else
indexer.getOutput().addStructDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
break;
case ICompositeType.k_union:
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
indexer.getOutput().addFwd_UnionDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else
indexer.getOutput().addUnionDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
break;
}
addDerivedAndFriendDeclaration(name, compBinding, loc, fileNumber);
}
else if (binding instanceof IEnumeration)
indexer.getOutput().addEnumDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof ITypedef)
indexer.getOutput().addTypedefDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof ICPPNamespace)
indexer.getOutput().addNamespaceDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof IEnumerator)
indexer.getOutput().addEnumtorDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof IField)
indexer.getOutput().addFieldDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof IParameter ||
binding instanceof IVariable)
indexer.getOutput().addVarDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof ICPPMethod)
indexer.getOutput().addMethodDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof IFunction) {
indexer.getOutput().addFunctionDecl(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
// TODO In case we want to add friend function declarations to index
// addDerivedAndFriendDeclaration(name, binding, loc, fileNumber);
}
else if (binding instanceof ICPPUsingDeclaration) {
ICPPDelegate[] delegates = ((ICPPUsingDeclaration)binding).getDelegates();
for (int i = 0; i < delegates.length; i++) {
IBinding orig = delegates[i].getBinding();
processNameRefBinding(name, orig, loc, fileNumber); // reference to the original binding
processNameDeclBinding(name, delegates[i], loc, fileNumber); // declaration of the new name
}
return;
}
}
private void processNameRefBinding(IASTName name, IBinding binding, IASTFileLocation loc, int fileNumber) throws DOMException {
if (binding instanceof ICompositeType) {
ICompositeType compBinding = (ICompositeType) binding;
int compositeKey = compBinding.getKey();
ASTNodeProperty prop = name.getPropertyInParent();
switch (compositeKey) {
case ICPPClassType.k_class:
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
indexer.getOutput().addFwd_ClassRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else
indexer.getOutput().addClassRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
break;
case ICompositeType.k_struct:
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
indexer.getOutput().addFwd_StructRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else
indexer.getOutput().addStructRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
break;
case ICompositeType.k_union:
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
indexer.getOutput().addFwd_UnionRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else
indexer.getOutput().addUnionRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
break;
}
addDerivedAndFriendDeclaration(name, compBinding, loc, fileNumber);
}
else if (binding instanceof IEnumeration)
indexer.getOutput().addEnumRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof ITypedef)
indexer.getOutput().addTypedefRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof ICPPNamespace)
indexer.getOutput().addNamespaceRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof IEnumerator)
indexer.getOutput().addEnumtorRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof IField)
indexer.getOutput().addFieldRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof IParameter ||
binding instanceof IVariable)
indexer.getOutput().addVarRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof ICPPMethod)
indexer.getOutput().addMethodRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
else if (binding instanceof IFunction) {
indexer.getOutput().addFunctionRef(fileNumber, getFullyQualifiedName(binding), loc.getNodeOffset(), loc.getNodeLength(),ICIndexStorageConstants.OFFSET);
// TODO In case we want to add friend function declarations to index
// addDerivedAndFriendDeclaration(name, binding, loc, fileNumber);
}
else if (binding instanceof ICPPUsingDeclaration) {
ICPPDelegate[] delegates = ((ICPPUsingDeclaration)binding).getDelegates();
for (int i = 0; i < delegates.length; i++) {
IBinding orig = delegates[i].getBinding();
processNameRefBinding(name, orig, loc, fileNumber); // reference to the original binding
processNameDeclBinding(name, delegates[i], loc, fileNumber); // declaration of the new name
}
return;
}
}
private void processNameBinding(IASTName name, IBinding binding, IASTFileLocation loc, int fileNumber) throws DOMException {
if (name.isDeclaration()) { if (name.isDeclaration()) {
processNameDeclBinding(name, binding, loc, fileNumber); limitTo = ICSearchConstants.DECLARATIONS;
} }
else if (name.isReference()) { else if (name.isReference()) {
processNameRefBinding(name, binding, loc, fileNumber); limitTo = ICSearchConstants.REFERENCES;
} }
// else else {
// ICSearchConstants.UNKNOWN_LIMIT_TO; limitTo = ICSearchConstants.UNKNOWN_LIMIT_TO;
}
}
// determine type
EntryType entryType = null;
if (binding instanceof ICompositeType) {
ICompositeType compBinding = (ICompositeType) binding;
int compositeKey = compBinding.getKey();
ASTNodeProperty prop = name.getPropertyInParent();
switch (compositeKey) {
case ICPPClassType.k_class:
entryType = IndexerOutputWrapper.CLASS;
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
entryType = IndexerOutputWrapper.FWD_CLASS;
break;
case ICompositeType.k_struct:
entryType = IndexerOutputWrapper.STRUCT;
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
entryType = IndexerOutputWrapper.FWD_STRUCT;
break;
case ICompositeType.k_union:
entryType = IndexerOutputWrapper.UNION;
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
entryType = IndexerOutputWrapper.FWD_UNION;
break;
}
addDerivedDeclaratiion(name, compBinding, loc, fileNumber);
if (isFriendDeclaration(name, binding)) {
entryType = IndexerOutputWrapper.FRIEND;
}
}
else if (binding instanceof IEnumeration)
entryType = IndexerOutputWrapper.ENUM;
else if (binding instanceof ITypedef)
entryType = IndexerOutputWrapper.TYPEDEF;
else if (binding instanceof ICPPNamespace)
entryType = IndexerOutputWrapper.NAMESPACE;
else if (binding instanceof IEnumerator)
entryType = IndexerOutputWrapper.ENUMERATOR;
else if (binding instanceof IField)
entryType = IndexerOutputWrapper.FIELD;
else if (binding instanceof IParameter ||
binding instanceof IVariable)
entryType = IndexerOutputWrapper.VAR;
else if (binding instanceof ICPPMethod) {
entryType = IndexerOutputWrapper.METHOD;
// TODO In case we want to add friend method declarations to index
// if (isFriendDeclaration(name, binding)) {
// entryType = IndexerOutputWrapper.FRIEND;
// }
}
else if (binding instanceof IFunction) {
entryType = IndexerOutputWrapper.FUNCTION;
// TODO In case we want to add friend function declarations to index
// if (isFriendDeclaration(name, binding)) {
// entryType = IndexerOutputWrapper.FRIEND;
// }
}
else if (binding instanceof ICPPUsingDeclaration) {
ICPPDelegate[] delegates = ((ICPPUsingDeclaration)binding).getDelegates();
for (int i = 0; i < delegates.length; i++) {
IBinding orig = delegates[i].getBinding();
processNameBinding(name, orig, loc, fileNumber, ICSearchConstants.REFERENCES); // reference to the original binding
processNameBinding(name, delegates[i], loc, fileNumber, ICSearchConstants.DECLARATIONS); // declaration of the new name
}
return;
}
if (entryType != null) {
if (limitTo == ICSearchConstants.DECLARATIONS) {
IndexerOutputWrapper.addNameDecl(indexer.getOutput(),
getFullyQualifiedName(binding),
entryType,
fileNumber,
loc.getNodeOffset(),
loc.getNodeLength(),
ICIndexStorageConstants.OFFSET);
}
else if (limitTo == ICSearchConstants.REFERENCES) {
IndexerOutputWrapper.addNameRef(indexer.getOutput(),
getFullyQualifiedName(binding),
entryType,
fileNumber,
loc.getNodeOffset(),
loc.getNodeLength(),
ICIndexStorageConstants.OFFSET);
}
}
} }
/** /**
* @param name * @param name
* @param fileNumber
* @param loc
* @param compBinding * @param compBinding
* @param loc
* @param fileNumber
* @throws DOMException * @throws DOMException
*/ */
private void addDerivedAndFriendDeclaration(IASTName name, IBinding binding, IASTFileLocation loc, int fileNumber) throws DOMException { private void addDerivedDeclaratiion(IASTName name, ICompositeType compBinding, IASTFileLocation loc, int fileNumber) throws DOMException {
ASTNodeProperty prop = name.getPropertyInParent();
int compositeKey = compBinding.getKey();
if (compositeKey == ICPPClassType.k_class || compositeKey == ICompositeType.k_struct) {
if (prop == ICPPASTBaseSpecifier.NAME) {
// base class
IndexerOutputWrapper.addNameDecl(indexer.getOutput(), getFullyQualifiedName(compBinding),
IndexerOutputWrapper.DERIVED,
fileNumber,
loc.getNodeOffset(),
loc.getNodeLength(),
ICIndexStorageConstants.OFFSET);
}
}
}
/**
* @param name
* @param fileNumber
* @param loc
* @param binding
* @throws DOMException
*/
private boolean isFriendDeclaration(IASTName name, IBinding binding) throws DOMException {
boolean rc = false;
if (!name.isDeclaration())
return rc;
ASTNodeProperty prop = name.getPropertyInParent(); ASTNodeProperty prop = name.getPropertyInParent();
if (binding instanceof ICompositeType) { if (binding instanceof ICompositeType) {
ICompositeType compBinding = (ICompositeType) binding; ICompositeType compBinding = (ICompositeType) binding;
int compositeKey = compBinding.getKey(); int compositeKey = compBinding.getKey();
if (compositeKey == ICPPClassType.k_class || if (compositeKey == ICPPClassType.k_class || compositeKey == ICompositeType.k_struct) {
compositeKey == ICompositeType.k_struct) { if (prop == IASTElaboratedTypeSpecifier.TYPE_NAME) {
if (prop == ICPPASTBaseSpecifier.NAME) { IASTElaboratedTypeSpecifier elaboratedTypeSpec = (IASTElaboratedTypeSpecifier) name.getParent();
// base class if (elaboratedTypeSpec instanceof ICPPASTDeclSpecifier) {
indexer.getOutput().addDerivedDecl(fileNumber, ICPPASTDeclSpecifier cppDeclSpec = (ICPPASTDeclSpecifier) elaboratedTypeSpec;
getFullyQualifiedName(binding), rc = cppDeclSpec.isFriend();
loc.getNodeOffset(), }
loc.getNodeLength(),
ICIndexStorageConstants.OFFSET);
}
else if (prop == IASTElaboratedTypeSpecifier.TYPE_NAME) {
// friend
indexer.getOutput().addFriendDecl(fileNumber,
getFullyQualifiedName(binding),
loc.getNodeOffset(),
loc.getNodeLength(),
ICIndexStorageConstants.OFFSET);
} }
} }
} }
@ -320,17 +314,12 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
// IASTDeclSpecifier declSpec = sDecl.getDeclSpecifier(); // IASTDeclSpecifier declSpec = sDecl.getDeclSpecifier();
// if (declSpec instanceof ICPPASTSimpleDeclSpecifier) { // if (declSpec instanceof ICPPASTSimpleDeclSpecifier) {
// ICPPASTSimpleDeclSpecifier fDeclSpec = (ICPPASTSimpleDeclSpecifier) declSpec; // ICPPASTSimpleDeclSpecifier fDeclSpec = (ICPPASTSimpleDeclSpecifier) declSpec;
// if (fDeclSpec.isFriend()) { // rc = fDeclSpec.isFriend();
// // friend
// indexer.getOutput().addRef(fileNumber, IndexEncoderUtil.encodeEntry(
// getFullyQualifiedName(binding),
// ICIndexStorageConstants.FRIEND,
// ICSearchConstants.DECLARATIONS));
// }
// } // }
// } // }
// } // }
// } // }
return rc;
} }
/** /**

View file

@ -202,10 +202,14 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
getOutput().addIncludeRef(fileNumber, include); getOutput().addIncludeRef(fileNumber, include);
getOutput().addRelatives(fileNumber, include, getOutput().addRelatives(fileNumber, include,
(parent != null) ? parent.getIncludeDirective().getPath() : null); (parent != null) ? parent.getIncludeDirective().getPath() : null);
getOutput().addIncludeRef(fileNumber,
new char[][] {include.toCharArray()}, IndexerOutputWrapper.addNameRef(getOutput(),
1,1, ICIndexStorageConstants.LINE new char[][] {include.toCharArray()},
); IndexerOutputWrapper.INCLUDE,
fileNumber,
1,
1,
ICIndexStorageConstants.OFFSET);
/* See if this file has been encountered before */ /* See if this file has been encountered before */
indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(include)); indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(include));
@ -224,9 +228,11 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
// Get the location // Get the location
IASTFileLocation loc = IndexEncoderUtil.getFileLocation(macro); IASTFileLocation loc = IndexEncoderUtil.getFileLocation(macro);
int fileNumber = IndexEncoderUtil.calculateIndexFlags(this, loc); int fileNumber = IndexEncoderUtil.calculateIndexFlags(this, loc);
getOutput().addMacroDecl(fileNumber, IndexerOutputWrapper.addNameDecl(getOutput(),
new char[][] {macro.toCharArray()}, new char[][] {macro.toCharArray()},
loc.getNodeOffset(), IndexerOutputWrapper.MACRO,
fileNumber,
loc.getNodeOffset(),
loc.getNodeLength(), loc.getNodeLength(),
ICIndexStorageConstants.OFFSET); ICIndexStorageConstants.OFFSET);
} }

View file

@ -85,11 +85,4 @@ public class IndexEncoderUtil {
return fileLoc; return fileLoc;
} }
public static boolean nodeInExternalHeader(IASTNode node) {
String fileName = node.getContainingFilename();
return (CCorePlugin.getWorkspace().getRoot().getFileForLocation(new Path(fileName)) == null)
? true : false;
}
} }

View file

@ -0,0 +1,206 @@
/**********************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.internal.core.index.domsourceindexer;
import org.eclipse.cdt.internal.core.index.IIndexerOutput;
/**
* Wrapper for calls to IIndexerOutput
* (in anticipation that the interface is going to change)
*
* @author vhirsl
*/
class IndexerOutputWrapper {
static class EntryType {
public int toInt() {
return type;
}
private EntryType(int type) {
this.type = type;
}
private int type;
}
private final static int CLASS_CONST = 1;
private final static int STRUCT_CONST = 2;
private final static int UNION_CONST = 3;
private final static int ENUM_CONST = 4;
private final static int VAR_CONST = 5;
private final static int TYPEDEF_CONST = 6;
private final static int DERIVED_CONST = 7;
private final static int FRIEND_CONST = 8;
private final static int FWD_CLASS_CONST = 9;
private final static int FWD_STRUCT_CONST = 10;
private final static int FWD_UNION_CONST = 11;
private final static int NAMESPACE_CONST = 12;
private final static int ENUMERATOR_CONST = 13;
private final static int FIELD_CONST = 14;
private final static int METHOD_CONST = 15;
private final static int FUNCTION_CONST = 16;
private final static int MACRO_CONST = 17;
private final static int INCLUDE_CONST = 18;
// entry types
final static EntryType CLASS = new EntryType(CLASS_CONST);
final static EntryType STRUCT = new EntryType(STRUCT_CONST);
final static EntryType UNION = new EntryType(UNION_CONST);
final static EntryType ENUM = new EntryType(ENUM_CONST);
final static EntryType VAR = new EntryType(VAR_CONST);
final static EntryType TYPEDEF = new EntryType(TYPEDEF_CONST);
final static EntryType DERIVED = new EntryType(DERIVED_CONST);
final static EntryType FRIEND = new EntryType(FRIEND_CONST);
final static EntryType FWD_CLASS = new EntryType(FWD_CLASS_CONST);
final static EntryType FWD_STRUCT = new EntryType(FWD_STRUCT_CONST);
final static EntryType FWD_UNION = new EntryType(FWD_UNION_CONST);
final static EntryType NAMESPACE = new EntryType(NAMESPACE_CONST);
final static EntryType ENUMERATOR = new EntryType(ENUMERATOR_CONST);
final static EntryType FIELD = new EntryType(FIELD_CONST);
final static EntryType METHOD = new EntryType(METHOD_CONST);
final static EntryType FUNCTION = new EntryType(FUNCTION_CONST);
final static EntryType MACRO = new EntryType(MACRO_CONST);
final static EntryType INCLUDE = new EntryType(INCLUDE_CONST);
private IndexerOutputWrapper() {
}
static void addNameDecl(IIndexerOutput indexerOutput,
char[][] name,
EntryType entryType,
int fileNumber,
int offset,
int length,
int offsetType) {
//TODO temporary until all bindings are completed
if (name == null)
name = new char[][] {"NPE".toCharArray()}; //$NON-NLS-1$
switch (entryType.toInt()) {
case CLASS_CONST:
indexerOutput.addClassDecl(fileNumber, name, offset, length, offsetType);
break;
case STRUCT_CONST:
indexerOutput.addStructDecl(fileNumber, name, offset, length, offsetType);
break;
case UNION_CONST:
indexerOutput.addUnionDecl(fileNumber, name, offset, length, offsetType);
break;
case ENUM_CONST:
indexerOutput.addEnumDecl(fileNumber, name, offset, length, offsetType);
break;
case VAR_CONST:
indexerOutput.addVarDecl(fileNumber, name, offset, length, offsetType);
break;
case TYPEDEF_CONST:
indexerOutput.addTypedefDecl(fileNumber, name, offset, length, offsetType);
break;
case DERIVED_CONST:
indexerOutput.addDerivedDecl(fileNumber, name, offset, length, offsetType);
break;
case FRIEND_CONST:
indexerOutput.addFriendDecl(fileNumber, name, offset, length, offsetType);
break;
case FWD_CLASS_CONST:
indexerOutput.addFwd_ClassDecl(fileNumber, name, offset, length, offsetType);
break;
case FWD_STRUCT_CONST:
indexerOutput.addFwd_StructDecl(fileNumber, name, offset, length, offsetType);
break;
case FWD_UNION_CONST:
indexerOutput.addFwd_UnionDecl(fileNumber, name, offset, length, offsetType);
break;
case NAMESPACE_CONST:
indexerOutput.addNamespaceDecl(fileNumber, name, offset, length, offsetType);
break;
case ENUMERATOR_CONST:
indexerOutput.addEnumtorDecl(fileNumber, name, offset, length, offsetType);
break;
case FIELD_CONST:
indexerOutput.addFieldDecl(fileNumber, name, offset, length, offsetType);
break;
case METHOD_CONST:
indexerOutput.addMethodDecl(fileNumber, name, offset, length, offsetType);
break;
case FUNCTION_CONST:
indexerOutput.addFunctionDecl(fileNumber, name, offset, length, offsetType);
break;
case MACRO_CONST:
indexerOutput.addMacroDecl(fileNumber, name, offset, length, offsetType);
break;
}
}
static void addNameRef(IIndexerOutput indexerOutput,
char[][] name,
EntryType entryType,
int fileNumber,
int offset,
int length,
int offsetType) {
//TODO temporary until all bindings are completed
if (name == null)
name = new char[][] {"NPE".toCharArray()}; //$NON-NLS-1$
switch (entryType.toInt()) {
case CLASS_CONST:
indexerOutput.addClassRef(fileNumber, name, offset, length, offsetType);
break;
case STRUCT_CONST:
indexerOutput.addStructRef(fileNumber, name, offset, length, offsetType);
break;
case UNION_CONST:
indexerOutput.addUnionRef(fileNumber, name, offset, length, offsetType);
break;
case ENUM_CONST:
indexerOutput.addEnumRef(fileNumber, name, offset, length, offsetType);
break;
case VAR_CONST:
indexerOutput.addVarRef(fileNumber, name, offset, length, offsetType);
break;
case TYPEDEF_CONST:
indexerOutput.addTypedefRef(fileNumber, name, offset, length, offsetType);
break;
case DERIVED_CONST:
indexerOutput.addDerivedRef(fileNumber, name, offset, length, offsetType);
break;
case FRIEND_CONST:
indexerOutput.addFriendRef(fileNumber, name, offset, length, offsetType);
break;
case FWD_CLASS_CONST:
indexerOutput.addFwd_ClassRef(fileNumber, name, offset, length, offsetType);
break;
case FWD_STRUCT_CONST:
indexerOutput.addFwd_StructRef(fileNumber, name, offset, length, offsetType);
break;
case FWD_UNION_CONST:
indexerOutput.addFwd_UnionRef(fileNumber, name, offset, length, offsetType);
break;
case NAMESPACE_CONST:
indexerOutput.addNamespaceRef(fileNumber, name, offset, length, offsetType);
break;
case ENUMERATOR_CONST:
indexerOutput.addEnumtorRef(fileNumber, name, offset, length, offsetType);
break;
case FIELD_CONST:
indexerOutput.addFieldRef(fileNumber, name, offset, length, offsetType);
break;
case METHOD_CONST:
indexerOutput.addMethodRef(fileNumber, name, offset, length, offsetType);
break;
case FUNCTION_CONST:
indexerOutput.addFunctionRef(fileNumber, name, offset, length, offsetType);
break;
case INCLUDE_CONST:
indexerOutput.addIncludeRef(fileNumber, name, offset, length, offsetType);
break;
}
}
}