1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fix for a problem with DOM indexer, where external header files in translation unit's inclusion tree were not visited.

Optimization from Dave; skipping declarations in already visited external headers.
This commit is contained in:
Vladimir Hirsl 2005-06-07 20:40:23 +00:00
parent 3d2fcb3aa4
commit 6e8ba9eebb
8 changed files with 94 additions and 112 deletions

View file

@ -1,3 +1,16 @@
2005-06-07 Vladimir Hirsl
Fix for a problem with DOM indexer, where external header files in translation unit's
inclusion tree were not visited.
Optimization from Dave; skipping declarations in already visited external headers.
* index/org/eclipse/cdt/internal/core/index/cindexstorage/IndexOutput.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/CGenerateIndexVisitor.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/CPPGenerateIndexVisitor.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/DOMSourceIndexerRunner.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/IndexEncoderUtil.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/IndexVisitorUtil.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexer.java
2005-06-03 Vladimir Hirsl
Fix for PR 93786: DOM Indexer adds local variables to the index
Other smaller fixes in DOM Indexer domain.

View file

@ -24,6 +24,7 @@ import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer;
*/
public class IndexerOutput implements ICIndexStorageConstants, IIndexerOutput {
public static int entryCount = 0;
protected InMemoryIndex index;
/**
* IndexerOutput constructor comment.
@ -43,6 +44,7 @@ public class IndexerOutput implements ICIndexStorageConstants, IIndexerOutput {
if (modifiers <=0)
modifiers = 1;
entryCount++;
index.addRef(
encodeTypeEntry(name, suffix, type),
indexedFileNumber, offset, offsetLength, offsetType, modifiers);
@ -58,7 +60,7 @@ public class IndexerOutput implements ICIndexStorageConstants, IIndexerOutput {
if (modifiers <=0)
modifiers = 1;
entryCount++;
index.addRef(
encodeEntry(name, meta_kind, ref),
indexedFileNumber, offset, offsetLength, offsetType, modifiers);

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.index.domsourceindexer;
import org.eclipse.cdt.core.ICLogConstants;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTName;
@ -39,7 +40,7 @@ public class CGenerateIndexVisitor extends CASTVisitor {
private DOMSourceIndexerRunner indexer;
{
shouldVisitNames = true;
// shouldVisitDeclarations = false;
shouldVisitDeclarations = true;
// shouldVisitInitializers = false;
// shouldVisitParameterDeclarations = false;
// shouldVisitDeclarators = false;
@ -59,6 +60,15 @@ public class CGenerateIndexVisitor extends CASTVisitor {
this.indexer = indexer;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTDeclaration)
*/
public int visit(IASTDeclaration declaration) {
if (IndexEncoderUtil.nodeInVisitedExternalHeader(declaration, indexer.getIndexer()))
return PROCESS_SKIP;
return PROCESS_CONTINUE;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTName)
*/
@ -70,15 +80,16 @@ public class CGenerateIndexVisitor extends CASTVisitor {
processName(name);
}
catch (DOMException e) {
// TODO Auto-generated catch block
// TODO remove printStackTrace
e.printStackTrace();
Util.log(e, e.getProblem().getMessage(), ICLogConstants.CDT);
}
catch (Exception e) {
// TODO remove
// TODO remove printStackTrace
e.printStackTrace();
Util.log(e, e.toString(), ICLogConstants.CDT);
}
return PROCESS_CONTINUE;
return PROCESS_CONTINUE;
}
/* (non-Javadoc)

View file

@ -38,6 +38,7 @@ 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.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
@ -60,7 +61,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
{
shouldVisitNames = true;
// shouldVisitDeclarations = false;
shouldVisitDeclarations = true;
// shouldVisitInitializers = false;
// shouldVisitParameterDeclarations = false;
// shouldVisitDeclarators = false;
@ -73,7 +74,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
shouldVisitProblems = true;
// shouldVisitBaseSpecifiers = false;
// shouldVisitNamespaces = false;
shouldVisitNamespaces = true;
// shouldVisitTemplateParameters = false;
}
@ -82,7 +83,25 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
this.indexer = indexer;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor#visit(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition)
*/
public int visit(ICPPASTNamespaceDefinition namespace) {
if (IndexEncoderUtil.nodeInVisitedExternalHeader(namespace, indexer.getIndexer()))
return PROCESS_SKIP;
return PROCESS_CONTINUE;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTDeclaration)
*/
public int visit(IASTDeclaration declaration) {
if (IndexEncoderUtil.nodeInVisitedExternalHeader(declaration, indexer.getIndexer()))
return PROCESS_SKIP;
return PROCESS_CONTINUE;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTName)
*/
public int visit(IASTName name) {
@ -93,11 +112,12 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
processName(name);
}
catch (DOMException e) {
// TODO Auto-generated catch block
// TODO remove printStackTrace
e.printStackTrace();
Util.log(e, e.getProblem().getMessage(), ICLogConstants.CDT);
}
catch (Exception e) {
// TODO remove
// TODO remove printStackTrace
e.printStackTrace();
Util.log(e, e.toString(), ICLogConstants.CDT);
}
@ -214,8 +234,8 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
addDerivedDeclarations(name, (ICPPClassType)binding, indexEntry, fileNumber);
addFriendDeclarations(name, (ICPPClassType)binding, indexEntry, fileNumber);
}
indexEntry.serialize(indexer.getOutput());
serialize(indexEntry);
}
else if (binding instanceof IEnumeration) {
int modifiers = 0;
@ -225,25 +245,25 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
TypeEntry indexEntry = new TypeEntry(IIndex.TYPE_ENUM, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
serialize(indexEntry);
}
else if (binding instanceof ITypedef) {
TypeEntry indexEntry = new TypeEntry(IIndex.TYPE_TYPEDEF, entryKind, qualifiedName, 0, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
serialize(indexEntry);
}
else if (binding instanceof ICPPNamespace) {
NamedEntry indexEntry = new NamedEntry(IIndex.NAMESPACE, entryKind, qualifiedName, 0, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
serialize(indexEntry);
}
else if (binding instanceof IEnumerator) {
NamedEntry indexEntry = new NamedEntry(IIndex.ENUMTOR, entryKind, qualifiedName, 0, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
serialize(indexEntry);
}
else if (binding instanceof IField) {
int modifiers = 0;
@ -253,7 +273,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
NamedEntry indexEntry = new NamedEntry(IIndex.FIELD, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
serialize(indexEntry);
}
else if (binding instanceof IVariable &&
!(binding instanceof IParameter)) {
@ -267,7 +287,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
TypeEntry indexEntry = new TypeEntry(IIndex.TYPE_VAR, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
serialize(indexEntry);
}
}
else if (binding instanceof ICPPMethod) {
@ -280,7 +300,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
indexEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
indexEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
indexEntry.serialize(indexer.getOutput());
serialize(indexEntry);
// TODO In case we want to add friend method declarations to index
// if (isFriendDeclaration(name, binding)) {
// entryType = IndexerOutputWrapper.FRIEND;
@ -296,7 +316,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
indexEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
indexEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
indexEntry.serialize(indexer.getOutput());
serialize(indexEntry);
// TODO In case we want to add friend function declarations to index
// if (isFriendDeclaration(name, binding)) {
// entryType = IndexerOutputWrapper.FRIEND;
@ -312,16 +332,13 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
return;
}
// if (entryType != null) {
// IndexerOutputWrapper.addIndexEntry(indexer.getOutput(),
// getFullyQualifiedName(binding),
// entryType,
// entryKind,
// fileNumber,
// loc.getNodeOffset(),
// loc.getNodeLength(),
// IIndex.OFFSET);
// }
}
/**
* @param indexEntry
*/
private void serialize(IIndexEntry indexEntry) {
indexEntry.serialize(indexer.getOutput());
}
/**

View file

@ -41,6 +41,7 @@ import org.eclipse.cdt.core.parser.ParseError;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.index.NamedEntry;
import org.eclipse.cdt.internal.core.index.cindexstorage.IndexerOutput;
import org.eclipse.cdt.internal.core.index.impl.IndexDelta;
import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
@ -59,6 +60,7 @@ import org.eclipse.core.runtime.Path;
public class DOMSourceIndexerRunner extends AbstractIndexer {
private SourceIndexer indexer;
// timing & errors
static int totalParseTime = 0;
static int totalVisitTime = 0;
@ -117,10 +119,6 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
if (AbstractIndexer.TIMING)
parseTime = System.currentTimeMillis();
processIncludeDirectives(tu.getDependencyTree());
processMacroDefinitions(tu.getMacroDefinitions());
processPreprocessorProblems(tu.getPreprocessorProblems());
ASTVisitor visitor = null;
if (language == ParserLanguage.CPP) {
visitor = new CPPGenerateIndexVisitor(this);
@ -130,6 +128,10 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
tu.accept(visitor);
processMacroDefinitions(tu.getMacroDefinitions());
processPreprocessorProblems(tu.getPreprocessorProblems());
// must be the last step in processing of a translation unit
processIncludeDirectives(tu.getDependencyTree());
}
catch (VirtualMachineError vmErr) {
error = vmErr.toString();
@ -161,15 +163,17 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
}
errors.put(error, new Integer(((Integer) errors.get(error)).intValue()+1));
}
System.out.println("DOM Indexer - Total Parse Time for " + resourceFile.getName() + ": " + (parseTime - startTime)); //$NON-NLS-1$ //$NON-NLS-2$
System.out.println("DOM Indexer - Total Visit Time for " + resourceFile.getName() + ": " + (endTime - parseTime)); //$NON-NLS-1$ //$NON-NLS-2$
System.out.print("DOM Indexer - " + resourceFile.getName() + ": " + (parseTime - startTime)); //$NON-NLS-1$ //$NON-NLS-2$
System.out.print("+" + (endTime - parseTime)); //$NON-NLS-1$ //$NON-NLS-2$
totalParseTime += parseTime - startTime;
totalVisitTime += endTime - parseTime;
long currentTime = endTime - startTime;
System.out.println("DOM Indexer - Total Index Time for " + resourceFile.getName() + ": " + currentTime); //$NON-NLS-1$ //$NON-NLS-2$
System.out.print("=" + currentTime); //$NON-NLS-1$ //$NON-NLS-2$
long tempTotaltime = indexer.getTotalIndexTime() + currentTime;
indexer.setTotalIndexTime(tempTotaltime);
System.out.println("DOM Indexer - Overall Index Time: " + tempTotaltime + "(" + totalParseTime + ", " + totalVisitTime + ") " + errorCount + " errors"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
System.out.println(" \t\tOverall " + tempTotaltime + "=" + totalParseTime + "+" + totalVisitTime + " " + errorCount + " errors "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
System.out.println( "Attempted Entries " + IndexerOutput.entryCount + " Trimed " + SourceIndexer.trimed + " Added " + SourceIndexer.added); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
System.out.flush();
}
if (AbstractIndexer.VERBOSE){
@ -243,7 +247,7 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
IASTInclusionNode inclusion = inclusions[i];
// Quick check to see if the name is in an already indexed external header file
if (IndexEncoderUtil.nodeInVisitedExternalHeader(inclusion.getIncludeDirective(), getIndexer()))
return;
continue;
String include = inclusion.getIncludeDirective().getPath();
@ -298,7 +302,7 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
private void processPreprocessorProblems(IASTProblem[] preprocessorProblems) {
for (int i = 0; i < preprocessorProblems.length; i++) {
IASTProblem problem = preprocessorProblems[i];
// Quick check to see if the macro is in an already indexed external header file
// Quick check to see if the problem is in an already indexed external header file
if (IndexEncoderUtil.nodeInVisitedExternalHeader(problem, getIndexer()))
continue;

View file

@ -86,7 +86,7 @@ public class IndexEncoderUtil {
IPath filePath = new Path(fileName);
IPath projectPath = indexer.getProject().getFullPath();
return (CCorePlugin.getWorkspace().getRoot().getFileForLocation(new Path(fileName)) == null) &&
return (CCorePlugin.getWorkspace().getRoot().getFileForLocation(filePath) == null) &&
indexer.haveEncounteredHeader(projectPath, filePath, false);
}

View file

@ -44,77 +44,6 @@ import org.eclipse.cdt.internal.core.index.IIndex;
public class IndexVisitorUtil {
private IndexVisitorUtil() {}
/**
* @param declSpec
* @return
*/
// static int getModifiers(IASTDeclSpecifier declSpec) {
// int modifiers = 0;
// if (declSpec.isConst()) {
// modifiers |= IIndex.constQualifier;
// }
// else if (declSpec.isVolatile()) {
// modifiers |= IIndex.volatileQualifier;
// }
// if (declSpec.isInline()) {
// modifiers |= IIndex.inlineSpecifier;
// }
// if (declSpec instanceof ICPPASTDeclSpecifier) {
// ICPPASTDeclSpecifier cppDeclSpec = (ICPPASTDeclSpecifier) declSpec;
// if (cppDeclSpec.isExplicit()) {
// modifiers |= IIndex.explicitSpecifier;
// }
// if (cppDeclSpec.isVirtual()) {
// modifiers |= IIndex.virtualSpecifier;
// }
// }
// return modifiers;
// }
/**
* @param variableBinding
* @return
*/
// static int getModifiers(IVariable variableBinding) {
// int modifiers = 0;
// try {
// if (variableBinding.isAuto()) {
// modifiers |= IIndex.autoSpecifier;
// }
// else if (variableBinding.isExtern()) {
// modifiers |= IIndex.externSpecifier;
// }
// else if (variableBinding.isRegister()) {
// modifiers |= IIndex.registerSpecifier;
// }
// else if (variableBinding.isStatic()) {
// modifiers |= IIndex.staticSpecifier;
// }
// if (variableBinding instanceof ICPPVariable) {
// ICPPVariable cppVariable = (ICPPVariable) variableBinding;
// if (cppVariable.isMutable()) {
// modifiers |= IIndex.mutableSpecifier;
// }
// }
// if (variableBinding instanceof ICPPMember) {
// ICPPMember member = (ICPPMember) variableBinding;
// int vis = member.getVisibility();
// if (vis == ICPPMember.v_public) {
// modifiers |= IIndex.publicAccessSpecifier;
// }
// else if (vis == ICPPMember.v_private) {
// modifiers |= IIndex.privateAccessSpecifier;
// }
// else if (vis == ICPPMember.v_protected) {
// modifiers |= IIndex.protectedAccessSpecifier;
// }
// }
// }
// catch (DOMException e) {
// }
// return modifiers;
// }
/**
* @param name
* @param functionBinding

View file

@ -157,6 +157,9 @@ public class SourceIndexer extends AbstractCExtension implements ICDTIndexer {
*
* Warning: Does not check whether index is consistent (not being used)
*/
public static int trimed = 0;
public static int added = 0;
public synchronized boolean haveEncounteredHeader(IPath projectPath, IPath filePath, boolean add) {
SimpleLookupTable headerTable = indexStorage.getEncounteredHeaders();
@ -168,11 +171,14 @@ public class SourceIndexer extends AbstractCExtension implements ICDTIndexer {
headerTable.put(projectPath, headers);
}
if (headers.containsKey(filePath.toOSString()))
if (headers.containsKey(filePath.toOSString())) {
trimed++;
return true;
}
if (add) {
headers.put(filePath.toOSString());
added++;
}
return false;