diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 909ca8917bd..e268c8072ab 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,11 @@ +2005-03-29 Vladimir Hirsl + Problem markers for DOM AST based indexer. + + * 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/search/indexing/IIndexEncodingConstants.java + 2005-03-28 Bogdan Gheorghe Modified DeltaProcessor to make use of ICDTIndexer elements when requesting an index for an element. Added indextiming option to trace options in CCorePlugin. 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 84f491f7956..da755c63f96 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 @@ -13,11 +13,13 @@ package org.eclipse.cdt.internal.core.index.domsourceindexer; import java.util.ArrayList; import java.util.List; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; @@ -34,6 +36,7 @@ import org.eclipse.cdt.core.search.ICSearchConstants; import org.eclipse.cdt.internal.core.search.indexing.IIndexEncodingConstants; import org.eclipse.cdt.internal.core.search.indexing.IIndexEncodingConstants.EntryType; import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.Path; public class CGenerateIndexVisitor extends CASTVisitor { private DOMSourceIndexerRunner indexer; @@ -88,7 +91,21 @@ public class CGenerateIndexVisitor extends CASTVisitor { * @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTProblem) */ public int visit(IASTProblem problem) { - problems.add(problem); + if (indexer.areProblemMarkersEnabled() && indexer.shouldRecordProblem(problem)){ + IFile tempFile = resourceFile; + + //If we are in an include file, get the include file + IASTNodeLocation[] locs = problem.getNodeLocations(); + if (locs[0] instanceof IASTFileLocation) { + IASTFileLocation fileLoc = (IASTFileLocation) locs[0]; + String fileName = fileLoc.getFileName(); + tempFile = CCorePlugin.getWorkspace().getRoot().getFileForLocation(new Path(fileName)); + } + + if( tempFile != null ){ + indexer.generateMarkerProblem(tempFile, resourceFile, problem); + } + } return super.visit(problem); } @@ -102,9 +119,20 @@ public class CGenerateIndexVisitor extends CASTVisitor { // check for IProblemBinding if (binding instanceof IProblemBinding) { IProblemBinding problem = (IProblemBinding) binding; - problems.add(problem); - if (indexer.isProblemReportingEnabled()) { - // TODO report problem + if (indexer.areProblemMarkersEnabled() && indexer.shouldRecordProblem(problem)){ + IFile tempFile = resourceFile; + + //If we are in an include file, get the include file + IASTNodeLocation[] locs = name.getNodeLocations(); + if (locs[0] instanceof IASTFileLocation) { + IASTFileLocation fileLoc = (IASTFileLocation) locs[0]; + String fileName = fileLoc.getFileName(); + tempFile = CCorePlugin.getWorkspace().getRoot().getFileForLocation(new Path(fileName)); + } + + if( tempFile != null ){ + indexer.generateMarkerProblem(tempFile, resourceFile, problem); + } } return; } @@ -125,16 +153,14 @@ public class CGenerateIndexVisitor extends CASTVisitor { ASTNodeProperty prop = name.getPropertyInParent(); switch (compositeKey) { case ICompositeType.k_struct: - if (prop == IASTElaboratedTypeSpecifier.TYPE_NAME) + entryType = IIndexEncodingConstants.STRUCT; + if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME) entryType = IIndexEncodingConstants.FWD_STRUCT; - else if (prop == IASTCompositeTypeSpecifier.TYPE_NAME) - entryType = IIndexEncodingConstants.STRUCT; break; case ICompositeType.k_union: - if (prop == IASTElaboratedTypeSpecifier.TYPE_NAME) + entryType = IIndexEncodingConstants.UNION; + if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME) entryType = IIndexEncodingConstants.FWD_UNION; - else if (prop == IASTCompositeTypeSpecifier.TYPE_NAME) - entryType = IIndexEncodingConstants.UNION; break; } } @@ -175,6 +201,18 @@ public class CGenerateIndexVisitor extends CASTVisitor { * @return */ private char[][] getFullyQualifiedName(IASTName name) { + IBinding binding = name.resolveBinding(); + if (!(binding instanceof IField)) + return new char[][] {name.toCharArray()}; + // special case for fields + IASTName parent = null; + try { + parent = binding.getScope().getScopeName(); + } + catch (DOMException e) { + } + if (parent != null) + return new char[][] {parent.toCharArray(), name.toCharArray()}; return new char[][] {name.toCharArray()}; } 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 7623d00fef1..60dfb40239a 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 @@ -10,14 +10,13 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.index.domsourceindexer; -import java.util.ArrayList; -import java.util.List; - +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; @@ -44,11 +43,11 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBaseClause.CPPBaseProblem import org.eclipse.cdt.internal.core.search.indexing.IIndexEncodingConstants; import org.eclipse.cdt.internal.core.search.indexing.IIndexEncodingConstants.EntryType; import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.Path; public class CPPGenerateIndexVisitor extends CPPASTVisitor { private DOMSourceIndexerRunner indexer; private IFile resourceFile; - private List problems; { shouldVisitNames = true; @@ -73,7 +72,6 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor { super(); this.indexer = indexer; this.resourceFile = resourceFile; - problems = new ArrayList(); } /* (non-Javadoc) @@ -101,7 +99,21 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor { * @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTProblem) */ public int visit(IASTProblem problem) { - problems.add(problem); + if (indexer.areProblemMarkersEnabled() && indexer.shouldRecordProblem(problem)){ + IFile tempFile = resourceFile; + + //If we are in an include file, get the include file + IASTNodeLocation[] locs = problem.getNodeLocations(); + if (locs[0] instanceof IASTFileLocation) { + IASTFileLocation fileLoc = (IASTFileLocation) locs[0]; + String fileName = fileLoc.getFileName(); + tempFile = CCorePlugin.getWorkspace().getRoot().getFileForLocation(new Path(fileName)); + } + + if( tempFile != null ){ + indexer.generateMarkerProblem(tempFile, resourceFile, problem); + } + } return super.visit(problem); } @@ -115,9 +127,20 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor { // check for IProblemBinding if (binding instanceof IProblemBinding) { IProblemBinding problem = (IProblemBinding) binding; - problems.add(problem); - if (indexer.isProblemReportingEnabled()) { - // TODO report problem + if (indexer.areProblemMarkersEnabled() && indexer.shouldRecordProblem(problem)){ + IFile tempFile = resourceFile; + + //If we are in an include file, get the include file + IASTNodeLocation[] locs = name.getNodeLocations(); + if (locs[0] instanceof IASTFileLocation) { + IASTFileLocation fileLoc = (IASTFileLocation) locs[0]; + String fileName = fileLoc.getFileName(); + tempFile = CCorePlugin.getWorkspace().getRoot().getFileForLocation(new Path(fileName)); + } + + if (tempFile != null) { + indexer.generateMarkerProblem(tempFile, resourceFile, name); + } } return; } @@ -162,22 +185,19 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor { ASTNodeProperty prop = name.getPropertyInParent(); switch (compositeKey) { case ICPPClassType.k_class: - if (prop == IASTElaboratedTypeSpecifier.TYPE_NAME) + entryType = IIndexEncodingConstants.CLASS; + if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME) entryType = IIndexEncodingConstants.FWD_CLASS; - else if (prop == IASTCompositeTypeSpecifier.TYPE_NAME) - entryType = IIndexEncodingConstants.CLASS; break; case ICompositeType.k_struct: - if (prop == IASTElaboratedTypeSpecifier.TYPE_NAME) + entryType = IIndexEncodingConstants.STRUCT; + if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME) entryType = IIndexEncodingConstants.FWD_STRUCT; - else if (prop == IASTCompositeTypeSpecifier.TYPE_NAME) - entryType = IIndexEncodingConstants.STRUCT; break; case ICompositeType.k_union: - if (prop == IASTElaboratedTypeSpecifier.TYPE_NAME) + entryType = IIndexEncodingConstants.UNION; + if (name.isDeclaration() && prop == IASTElaboratedTypeSpecifier.TYPE_NAME) entryType = IIndexEncodingConstants.FWD_UNION; - else if (prop == IASTCompositeTypeSpecifier.TYPE_NAME) - entryType = IIndexEncodingConstants.UNION; break; } } 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 6ec78ed9c90..105a9c56dc4 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 @@ -16,11 +16,16 @@ import org.eclipse.cdt.core.ICLogConstants; import org.eclipse.cdt.core.dom.CDOM; import org.eclipse.cdt.core.dom.IASTServiceProvider.UnsupportedDialectException; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; +import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.ICModelMarker; import org.eclipse.cdt.core.parser.ParseError; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.search.ICSearchConstants; @@ -29,7 +34,10 @@ import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer; import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer; import org.eclipse.cdt.internal.core.search.indexing.IIndexEncodingConstants; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; /** @@ -49,7 +57,6 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { private IFile resourceFile; private SourceIndexer indexer; - private boolean problemReportingEnabled = false; public DOMSourceIndexerRunner(IFile resource, SourceIndexer indexer) { this.resourceFile = resource; @@ -60,13 +67,6 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { return resourceFile; } - /** - * @return Returns the problemReportingEnabled. - */ - public boolean isProblemReportingEnabled() { - return problemReportingEnabled; - } - public void setFileTypes(String[] fileTypes) { // TODO Auto-generated method stub @@ -75,7 +75,9 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { protected void indexFile(IDocument document) throws IOException { // Add the name of the file to the index output.addDocument(document); - problemReportingEnabled = indexer.indexProblemsEnabled(resourceFile.getProject()) != 0; + int problems = indexer.indexProblemsEnabled(resourceFile.getProject()); + setProblemMarkersEnabled(problems); + requestRemoveMarkers(resourceFile, null); //C or CPP? ParserLanguage language = CoreModel.hasCCNature(resourceFile.getProject()) ? @@ -112,12 +114,7 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { endTime = System.currentTimeMillis(); 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$ - long currentTime = endTime - startTime; - System.out.println("DOM Indexer - Total Index Time for " + resourceFile.getName() + ": " + currentTime); //$NON-NLS-1$ //$NON-NLS-2$ - long tempTotaltime = indexer.getTotalIndexTime() + currentTime; - indexer.setTotalIndexTime(tempTotaltime); - System.out.println("DOM Indexer - Overall Index Time: " + tempTotaltime); //$NON-NLS-1$ - System.out.flush(); + System.out.println("DOM Indexer - Total Index Time for " + resourceFile.getName() + ": " + (endTime - startTime)); //$NON-NLS-1$ //$NON-NLS-2$ } if (AbstractIndexer.VERBOSE){ AbstractIndexer.verbose("DOM AST TRAVERSAL FINISHED " + resourceFile.getName().toString()); //$NON-NLS-1$ @@ -139,15 +136,16 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { throw (IOException) ex; } finally{ - //if the user disable problem reporting since we last checked, don't report the collected problems -// if( manager.indexProblemsEnabled( resourceFile.getProject() ) != 0 ) -// requestor.reportProblems(); -// -// //Report events + // if the user disable problem reporting since we last checked, don't report the collected problems + if (areProblemMarkersEnabled()) { + reportProblems(); + } + + // Report events // ArrayList filesTrav = requestor.getFilesTraversed(); // IndexDelta indexDelta = new IndexDelta(resourceFile.getProject(),filesTrav, IIndexDelta.INDEX_FINISHED_DELTA); // CCorePlugin.getDefault().getCoreModel().getIndexManager().notifyListeners(indexDelta); - //Release all resources + // Release all resources } } @@ -207,8 +205,94 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { * @see org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer#addMarkers(org.eclipse.core.resources.IFile, org.eclipse.core.resources.IFile, java.lang.Object) */ protected void addMarkers(IFile tempFile, IFile originator, Object problem) { - // TODO Auto-generated method stub + String fileName; + int sourceLineNumber = -1; + String errorMessage = ""; //$NON-NLS-1$ + IASTNodeLocation location = null; + + if (problem instanceof IASTProblem) { + IASTProblem astProblem = (IASTProblem) problem; + errorMessage = astProblem.getMessage(); + location = astProblem.getNodeLocations()[0]; + } + else if (problem instanceof IASTName) { // semantic error specified in IProblemBinding + IASTName name = (IASTName) problem; + if (name.resolveBinding() instanceof IProblemBinding) { + IProblemBinding problemBinding = (IProblemBinding) name.resolveBinding(); + errorMessage = problemBinding.getMessage(); + location = name.getNodeLocations()[0]; + } + } + if (location != null) { + if (location instanceof IASTFileLocation) { + IASTFileLocation fileLoc = (IASTFileLocation) location; + fileName = fileLoc.getFileName(); + try { + //we only ever add index markers on the file, so DEPTH_ZERO is far enough + IMarker[] markers = tempFile.findMarkers(ICModelMarker.INDEXER_MARKER, true,IResource.DEPTH_ZERO); + + boolean newProblem = true; + + if (markers.length > 0) { + IMarker tempMarker = null; + Integer tempInt = null; + String tempMsgString = null; + + for (int i=0; i