From ab0ae772ae6b680b89959efb26fa40f329c2ea8e Mon Sep 17 00:00:00 2001 From: Vladimir Hirsl Date: Fri, 20 May 2005 20:29:35 +0000 Subject: [PATCH] Indexer performance improvement: indexing nodes from external include files only once. --- core/org.eclipse.cdt.core/ChangeLog | 11 ++++++++ .../CGenerateIndexVisitor.java | 7 ++++- .../CPPGenerateIndexVisitor.java | 8 ++++-- .../DOMSourceIndexerRunner.java | 28 +++++++++++++++---- .../domsourceindexer/IndexEncoderUtil.java | 17 +++++++++++ .../index/sourceindexer/AddFileToIndex.java | 2 +- .../index/sourceindexer/SourceIndexer.java | 11 ++++---- .../sourceindexer/SourceIndexerRunner.java | 2 +- 8 files changed, 70 insertions(+), 16 deletions(-) diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 1aa1d1a4d94..db6d6ae58c8 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,14 @@ +2005-05-20 Vladimir Hirsl + Indexer performance improvement: indexing nodes from external include files only once. + + * 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/sourceindexer/AddFileToIndex.java + * index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexer.java + * index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexerRunner.java + 2005-05-19 Vladimir Hirsl Final fix for 95641: [Scanner Config] Per file scanner info not available for header files and not compiled source files. diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/CGenerateIndexVisitor.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/CGenerateIndexVisitor.java index eac311e3e2b..2aaee802733 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/CGenerateIndexVisitor.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/CGenerateIndexVisitor.java @@ -88,7 +88,11 @@ public class CGenerateIndexVisitor extends CASTVisitor { * @throws DOMException */ private void processName(IASTName name) throws DOMException { - IBinding binding = name.resolveBinding(); + // Quick check to see if the name is in an already indexed external header file + if (IndexEncoderUtil.nodeInVisitedExternalHeader(name, indexer.getIndexer())) + return; + + IBinding binding = name.resolveBinding(); // check for IProblemBinding if (binding instanceof IProblemBinding) { IProblemBinding problem = (IProblemBinding) binding; @@ -99,6 +103,7 @@ public class CGenerateIndexVisitor extends CASTVisitor { } return; } + // Get the location IASTFileLocation loc = IndexEncoderUtil.getFileLocation(name); if (loc != null) { diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/CPPGenerateIndexVisitor.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/CPPGenerateIndexVisitor.java index 7e28221608e..b95e2971890 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/CPPGenerateIndexVisitor.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/CPPGenerateIndexVisitor.java @@ -102,7 +102,11 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor { * @throws DOMException */ private void processName(IASTName name) throws DOMException { - IBinding binding = name.resolveBinding(); + // Quick check to see if the name is in an already indexed external header file + if (IndexEncoderUtil.nodeInVisitedExternalHeader(name, indexer.getIndexer())) + return; + + IBinding binding = name.resolveBinding(); // check for IProblemBinding if (binding instanceof IProblemBinding) { IProblemBinding problem = (IProblemBinding) binding; @@ -114,7 +118,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor { return; } - // Get the location + // Get the location IASTFileLocation loc = IndexEncoderUtil.getFileLocation(name); if (loc != null) { //Check to see if this reference actually occurs in the file being indexed diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/DOMSourceIndexerRunner.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/DOMSourceIndexerRunner.java index 30a68ba0f9f..54e1fb810e8 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/DOMSourceIndexerRunner.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/DOMSourceIndexerRunner.java @@ -64,11 +64,18 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { static int errorCount = 0; static Map errors = new HashMap(); - public DOMSourceIndexerRunner(IFile resource, SourceIndexer indexer) { + public DOMSourceIndexerRunner(IFile resource, SourceIndexer indexer) { this.resourceFile = resource; this.indexer = indexer; } + /** + * @return Returns the indexer. + */ + public SourceIndexer getIndexer() { + return indexer; + } + public void setFileTypes(String[] fileTypes) { // TODO Auto-generated method stub } @@ -199,14 +206,14 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { for (int i = 0; i < extScanInfo.getIncludeFiles().length; i++) { String includeFile = extScanInfo.getIncludeFiles()[i]; /* See if this file has been encountered before */ - indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(includeFile)); + indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(includeFile), true); } } if (extScanInfo.getMacroFiles().length > 0) { for (int i = 0; i < extScanInfo.getIncludeFiles().length; i++) { String macrosFile = extScanInfo.getMacroFiles()[i]; /* See if this file has been encountered before */ - indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(macrosFile)); + indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(macrosFile), true); } } } @@ -233,6 +240,10 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { private void processNestedInclusions(int fileNumber, IASTInclusionNode[] inclusions, IASTInclusionNode parent) { for (int i = 0; i < inclusions.length; i++) { 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; + String include = inclusion.getIncludeDirective().getPath(); if (areProblemMarkersEnabled()) { @@ -257,7 +268,7 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { IIndex.OFFSET); /* See if this file has been encountered before */ - indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(include)); + indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(include), true); // recurse processNestedInclusions(fileNumber, inclusion.getNestedInclusions(), inclusion); @@ -270,7 +281,11 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { private void processMacroDefinitions(IASTPreprocessorMacroDefinition[] macroDefinitions) { for (int i = 0; i < macroDefinitions.length; i++) { IASTName macro = macroDefinitions[i].getName(); - // Get the location + // Quick check to see if the macro is in an already indexed external header file + if (IndexEncoderUtil.nodeInVisitedExternalHeader(macro, getIndexer())) + continue; + + // Get the location IASTFileLocation loc = IndexEncoderUtil.getFileLocation(macro); int fileNumber = IndexEncoderUtil.calculateIndexFlags(this, loc); IndexerOutputWrapper.addNameDecl(getOutput(), @@ -290,6 +305,9 @@ 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 + if (IndexEncoderUtil.nodeInVisitedExternalHeader(problem, getIndexer())) + continue; if (areProblemMarkersEnabled() && shouldRecordProblem(problem)) { // Get the location diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/IndexEncoderUtil.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/IndexEncoderUtil.java index 3afa3268031..710570730a9 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/IndexEncoderUtil.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/IndexEncoderUtil.java @@ -15,7 +15,9 @@ import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; import org.eclipse.cdt.internal.core.index.cindexstorage.IndexedFileEntry; +import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer; import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; public class IndexEncoderUtil { @@ -83,4 +85,19 @@ 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; + } + + public static boolean nodeInVisitedExternalHeader(IASTNode node, SourceIndexer indexer) { + String fileName = node.getContainingFilename(); + IPath filePath = new Path(fileName); + IPath projectPath = indexer.getProject().getFullPath(); + + return (CCorePlugin.getWorkspace().getRoot().getFileForLocation(new Path(fileName)) == null) && + indexer.haveEncounteredHeader(projectPath, filePath, false); + } + } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/AddFileToIndex.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/AddFileToIndex.java index 05335663820..b398795ef83 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/AddFileToIndex.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/AddFileToIndex.java @@ -49,7 +49,7 @@ public abstract class AddFileToIndex extends IndexRequest { /* See if this file has been encountered before */ if (type.isHeader() && - indexer.haveEncounteredHeader(resourceProject.getFullPath(),resource.getLocation())) + indexer.haveEncounteredHeader(resourceProject.getFullPath(),resource.getLocation(), true)) return true; } /* ensure no concurrent write access to index */ diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexer.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexer.java index 6e02e26c7fa..e685009c7c0 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexer.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexer.java @@ -152,14 +152,11 @@ public class SourceIndexer extends AbstractCExtension implements ICDTIndexer { } /** - * Returns the index for a given project, according to the following algorithm: - * - if index is already in memory: answers this one back - * - if (reuseExistingFile) then read it and return this index and record it in memory - * - if (createIfMissing) then create a new empty index and record it in memory + * * * Warning: Does not check whether index is consistent (not being used) */ - public synchronized boolean haveEncounteredHeader(IPath projectPath, IPath filePath) { + public synchronized boolean haveEncounteredHeader(IPath projectPath, IPath filePath, boolean add) { SimpleLookupTable headerTable = indexStorage.getEncounteredHeaders(); // Path is already canonical per construction @@ -173,7 +170,9 @@ public class SourceIndexer extends AbstractCExtension implements ICDTIndexer { if (headers.containsKey(filePath.toOSString())) return true; - headers.put(filePath.toOSString()); + if (add) { + headers.put(filePath.toOSString()); + } return false; } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexerRunner.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexerRunner.java index d400974e168..70c9f1863b9 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexerRunner.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexerRunner.java @@ -196,7 +196,7 @@ public class SourceIndexerRunner extends AbstractIndexer { * @param path */ public boolean haveEncounteredHeader(IPath fullPath, Path path) { - return indexer.haveEncounteredHeader(fullPath, path); + return indexer.haveEncounteredHeader(fullPath, path, true); } protected class AddMarkerProblem extends Problem {