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
Fix for PR 91405: Search does not find declarations of printf
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.c.CASTVisitor;
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.runtime.Path;
@ -93,12 +94,7 @@ public class CGenerateIndexVisitor extends CASTVisitor {
* @throws DOMException
*/
private void processName(IASTName name) throws DOMException {
// Quick check to see if the name is a reference in an external header file
//if (IndexEncoderUtil.nodeInExternalHeader(name) && name.isReference())
if (IndexEncoderUtil.nodeInExternalHeader(name))
return;
IBinding binding = name.resolveBinding();
IBinding binding = name.resolveBinding();
// check for IProblemBinding
if (binding instanceof IProblemBinding) {
IProblemBinding problem = (IProblemBinding) binding;
@ -109,7 +105,6 @@ public class CGenerateIndexVisitor extends CASTVisitor {
}
return;
}
// Get the location
IASTFileLocation loc = IndexEncoderUtil.getFileLocation(name);
if (loc != null) {
@ -143,90 +138,59 @@ public class CGenerateIndexVisitor extends CASTVisitor {
* @param indexFlag
* @throws DOMException
*/
private void processNameBinding(IASTName name, IBinding binding, IASTFileLocation loc, int fileNumber) throws DOMException {
// determine type
EntryType entryType = null;
if (binding instanceof ICompositeType) {
int compositeKey = ((ICompositeType) binding).getKey();
ASTNodeProperty prop = name.getPropertyInParent();
switch (compositeKey) {
case ICompositeType.k_struct:
entryType = IndexerOutputWrapper.STRUCT;
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
if (name.isDeclaration()) {
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);
}
entryType = IndexerOutputWrapper.FWD_STRUCT;
break;
case ICompositeType.k_union:
case ICompositeType.k_union:
entryType = IndexerOutputWrapper.UNION;
if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME)
if (name.isDeclaration()) {
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);
}
entryType = IndexerOutputWrapper.FWD_UNION;
break;
}
}
else if (binding instanceof IEnumeration)
if (name.isDeclaration()) {
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);
}
entryType = IndexerOutputWrapper.ENUM;
else if (binding instanceof ITypedef)
if (name.isDeclaration()) {
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);
}
entryType = IndexerOutputWrapper.TYPEDEF;
else if (binding instanceof IEnumerator)
if (name.isDeclaration()) {
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);
}
entryType = IndexerOutputWrapper.ENUMERATOR;
else if (binding instanceof IField)
if (name.isDeclaration()) {
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);
}
entryType = IndexerOutputWrapper.FIELD;
else if (binding instanceof IParameter ||
binding instanceof IVariable)
if (name.isDeclaration()) {
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);
}
entryType = IndexerOutputWrapper.VAR;
else if (binding instanceof IFunction)
entryType = IndexerOutputWrapper.FUNCTION;
if (entryType != null) {
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()) {
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.IVariable;
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.ICPPBinding;
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.ICPPUsingDeclaration;
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.domsourceindexer.IndexerOutputWrapper.EntryType;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Path;
@ -123,7 +127,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
//or if it occurs in another file
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
* @throws DOMException
*/
private void processNameDeclBinding(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_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 {
private void processNameBinding(IASTName name, IBinding binding, IASTFileLocation loc, int fileNumber, LimitTo limitTo) throws DOMException {
// determine LimitTo
if (limitTo == null) {
if (name.isDeclaration()) {
processNameDeclBinding(name, binding, loc, fileNumber);
limitTo = ICSearchConstants.DECLARATIONS;
}
else if (name.isReference()) {
processNameRefBinding(name, binding, loc, fileNumber);
}
// else
// ICSearchConstants.UNKNOWN_LIMIT_TO;
limitTo = ICSearchConstants.REFERENCES;
}
else {
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 compBinding
* @param loc
* @param 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 compBinding
* @param binding
* @throws DOMException
*/
private void addDerivedAndFriendDeclaration(IASTName name, IBinding binding, IASTFileLocation loc, int fileNumber) throws DOMException {
private boolean isFriendDeclaration(IASTName name, IBinding binding) throws DOMException {
boolean rc = false;
if (!name.isDeclaration())
return rc;
ASTNodeProperty prop = name.getPropertyInParent();
if (binding instanceof ICompositeType) {
ICompositeType compBinding = (ICompositeType) binding;
int compositeKey = compBinding.getKey();
if (compositeKey == ICPPClassType.k_class ||
compositeKey == ICompositeType.k_struct) {
if (prop == ICPPASTBaseSpecifier.NAME) {
// base class
indexer.getOutput().addDerivedDecl(fileNumber,
getFullyQualifiedName(binding),
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);
if (compositeKey == ICPPClassType.k_class || compositeKey == ICompositeType.k_struct) {
if (prop == IASTElaboratedTypeSpecifier.TYPE_NAME) {
IASTElaboratedTypeSpecifier elaboratedTypeSpec = (IASTElaboratedTypeSpecifier) name.getParent();
if (elaboratedTypeSpec instanceof ICPPASTDeclSpecifier) {
ICPPASTDeclSpecifier cppDeclSpec = (ICPPASTDeclSpecifier) elaboratedTypeSpec;
rc = cppDeclSpec.isFriend();
}
}
}
}
@ -320,17 +314,12 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
// IASTDeclSpecifier declSpec = sDecl.getDeclSpecifier();
// if (declSpec instanceof ICPPASTSimpleDeclSpecifier) {
// ICPPASTSimpleDeclSpecifier fDeclSpec = (ICPPASTSimpleDeclSpecifier) declSpec;
// if (fDeclSpec.isFriend()) {
// // friend
// indexer.getOutput().addRef(fileNumber, IndexEncoderUtil.encodeEntry(
// getFullyQualifiedName(binding),
// ICIndexStorageConstants.FRIEND,
// ICSearchConstants.DECLARATIONS));
// }
// rc = fDeclSpec.isFriend();
// }
// }
// }
// }
return rc;
}
/**

View file

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

View file

@ -84,12 +84,5 @@ public class IndexEncoderUtil {
}
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;
}
}
}