mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-01 06:05:24 +02:00
Fixed problem marker updating for files that are not indexed due to empty scanner info. Some refactoring of problem marker generation code.
This commit is contained in:
parent
0751a71a3a
commit
693f2a4708
8 changed files with 232 additions and 238 deletions
|
@ -1,3 +1,15 @@
|
|||
2005-05-17 Vladimir Hirsl
|
||||
Fixed problem marker updating for files that are not indexed due to
|
||||
empty scanner info. Some refactoring of problem marker generation code.
|
||||
|
||||
* index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsIndexerRunner.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/sourceindexer/AbstractIndexer.java
|
||||
* index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexerRequestor.java
|
||||
* index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexerRunner.java
|
||||
|
||||
2005-05-13 Vladimir Hirsl
|
||||
Files with empty scanner info are not indexed anymore.
|
||||
Info problem marker is created for each such file.
|
||||
|
|
|
@ -32,7 +32,6 @@ import org.eclipse.core.runtime.Path;
|
|||
* @author Bogdan Gheorghe
|
||||
*/
|
||||
public class CTagsIndexerRunner extends AbstractIndexer {
|
||||
IFile resourceFile;
|
||||
private CTagsIndexer indexer;
|
||||
/**
|
||||
* @param resource
|
||||
|
@ -43,13 +42,6 @@ public class CTagsIndexerRunner extends AbstractIndexer {
|
|||
this.indexer = indexer;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer#getResourceFile()
|
||||
*/
|
||||
public IFile getResourceFile() {
|
||||
return resourceFile;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer#indexFile(org.eclipse.cdt.internal.core.index.IDocument)
|
||||
*/
|
||||
|
|
|
@ -78,7 +78,7 @@ public class CGenerateIndexVisitor extends CASTVisitor {
|
|||
if (indexer.areProblemMarkersEnabled() && indexer.shouldRecordProblem(problem)){
|
||||
// Get the location
|
||||
IASTFileLocation loc = IndexEncoderUtil.getFileLocation(problem);
|
||||
indexer.processProblem(problem, loc);
|
||||
indexer.processProblem(problem.getMessage(), loc);
|
||||
}
|
||||
return super.visit(problem);
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ public class CGenerateIndexVisitor extends CASTVisitor {
|
|||
if (indexer.areProblemMarkersEnabled() && indexer.shouldRecordProblem(problem)){
|
||||
// Get the location
|
||||
IASTFileLocation loc = IndexEncoderUtil.getFileLocation(name);
|
||||
indexer.processProblem(name, loc);
|
||||
indexer.processProblem(problem.getMessage(), loc);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -92,7 +92,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
|
|||
if (indexer.areProblemMarkersEnabled() && indexer.shouldRecordProblem(problem)) {
|
||||
// Get the location
|
||||
IASTFileLocation loc = IndexEncoderUtil.getFileLocation(problem);
|
||||
indexer.processProblem(problem, loc);
|
||||
indexer.processProblem(problem.getMessage(), loc);
|
||||
}
|
||||
return super.visit(problem);
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
|
|||
if (indexer.areProblemMarkersEnabled() && indexer.shouldRecordProblem(problem)){
|
||||
// Get the location
|
||||
IASTFileLocation loc = IndexEncoderUtil.getFileLocation(name);
|
||||
indexer.processProblem(name, loc);
|
||||
indexer.processProblem(problem.getMessage(), loc);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
package org.eclipse.cdt.internal.core.index.domsourceindexer;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
|
@ -24,7 +25,6 @@ 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.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTProblem;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||
|
@ -57,7 +57,6 @@ import org.eclipse.core.runtime.Path;
|
|||
*/
|
||||
public class DOMSourceIndexerRunner extends AbstractIndexer {
|
||||
|
||||
private IFile resourceFile;
|
||||
private SourceIndexer indexer;
|
||||
// timing & errors
|
||||
static int totalParseTime = 0;
|
||||
|
@ -70,10 +69,6 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
|
|||
this.indexer = indexer;
|
||||
}
|
||||
|
||||
public IFile getResourceFile() {
|
||||
return resourceFile;
|
||||
}
|
||||
|
||||
public void setFileTypes(String[] fileTypes) {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
@ -89,6 +84,9 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
|
|||
if (isScannerInfoEmpty(resourceFile)) {
|
||||
// generate info marker - file is not indexed
|
||||
addInfoMarker(resourceFile, CCorePlugin.getResourceString("DOMIndexerMarker.EmptyScannerInfo")); //$NON-NLS-1$
|
||||
if (areProblemMarkersEnabled()) {
|
||||
reportProblems();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -303,7 +301,7 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
|
|||
if (areProblemMarkersEnabled() && shouldRecordProblem(problem)) {
|
||||
// Get the location
|
||||
IASTFileLocation loc = IndexEncoderUtil.getFileLocation(problem);
|
||||
processProblem(problem, loc);
|
||||
processProblem(problem.getMessage(), loc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -311,81 +309,88 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
|
|||
/**
|
||||
* @param name
|
||||
*/
|
||||
public void processProblem(IASTNode node, IASTFileLocation loc) {
|
||||
public void processProblem(String message, IASTFileLocation loc) {
|
||||
IFile tempFile = resourceFile;
|
||||
//If we are in an include file, get the include file
|
||||
if (loc != null) {
|
||||
String fileName = loc.getFileName();
|
||||
tempFile = CCorePlugin.getWorkspace().getRoot().getFileForLocation(new Path(fileName));
|
||||
if (tempFile != null) {
|
||||
generateMarkerProblem(tempFile, resourceFile, node, loc);
|
||||
generateMarkerProblem(tempFile, resourceFile, message, loc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer#addMarkers(org.eclipse.core.resources.IFile, org.eclipse.core.resources.IFile, java.lang.Object, java.lang.Object)
|
||||
*/
|
||||
protected void addMarkers(IFile tempFile, IFile originator, Object problem, Object location) {
|
||||
String errorMessage = ""; //$NON-NLS-1$
|
||||
|
||||
if (problem instanceof IASTProblem) {
|
||||
IASTProblem astProblem = (IASTProblem) problem;
|
||||
errorMessage = astProblem.getMessage();
|
||||
private void generateMarkerProblem(IFile tempFile, IFile originator, String message, IASTFileLocation loc) {
|
||||
Problem tempProblem = new AddMarkerProblem(tempFile, originator, message, loc);
|
||||
if (getProblemsMap().containsKey(tempFile)) {
|
||||
List list = (List) getProblemsMap().get(tempFile);
|
||||
list.add(tempProblem);
|
||||
} else {
|
||||
List list = new ArrayList();
|
||||
list.add(new RemoveMarkerProblem(tempFile, resourceFile)); //remove existing markers
|
||||
list.add(tempProblem);
|
||||
getProblemsMap().put(tempFile, list);
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
if (location != null && location instanceof IASTFileLocation) {
|
||||
IASTFileLocation fileLoc = (IASTFileLocation) location;
|
||||
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;
|
||||
int nameStart = -1;
|
||||
int nameLen = -1;
|
||||
String tempMsgString = null;
|
||||
|
||||
for (int i=0; i<markers.length; i++) {
|
||||
tempMarker = markers[i];
|
||||
nameStart = ((Integer) tempMarker.getAttribute(IMarker.CHAR_START)).intValue();
|
||||
nameLen = ((Integer) tempMarker.getAttribute(IMarker.CHAR_END)).intValue() - nameStart;
|
||||
tempMsgString = (String) tempMarker.getAttribute(IMarker.MESSAGE);
|
||||
if (nameStart != -1 &&
|
||||
nameStart == fileLoc.getNodeOffset() &&
|
||||
nameLen == fileLoc.getNodeLength() &&
|
||||
tempMsgString.equalsIgnoreCase(INDEXER_MARKER_PREFIX + errorMessage)) {
|
||||
newProblem = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (newProblem) {
|
||||
IMarker marker = tempFile.createMarker(ICModelMarker.INDEXER_MARKER);
|
||||
int start = fileLoc.getNodeOffset();
|
||||
int end = start + fileLoc.getNodeLength();
|
||||
marker.setAttribute(IMarker.LOCATION, fileLoc.getStartingLineNumber());
|
||||
marker.setAttribute(IMarker.MESSAGE, INDEXER_MARKER_PREFIX + errorMessage);
|
||||
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
|
||||
marker.setAttribute(IMarker.LINE_NUMBER, fileLoc.getStartingLineNumber());
|
||||
marker.setAttribute(IMarker.CHAR_START, start);
|
||||
marker.setAttribute(IMarker.CHAR_END, end);
|
||||
marker.setAttribute(INDEXER_MARKER_ORIGINATOR, originator.getFullPath().toString());
|
||||
}
|
||||
|
||||
} catch (CoreException e) {
|
||||
// You need to handle the cases where attribute value is rejected
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class AddMarkerProblem extends Problem {
|
||||
private String message;
|
||||
private IASTFileLocation location;
|
||||
public AddMarkerProblem(IResource resource, IResource originator, String message, IASTFileLocation location) {
|
||||
super(resource, originator);
|
||||
this.message = message;
|
||||
this.location = location;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
if (location != null) {
|
||||
try {
|
||||
//we only ever add index markers on the file, so DEPTH_ZERO is far enough
|
||||
IMarker[] markers = resource.findMarkers(ICModelMarker.INDEXER_MARKER, true,IResource.DEPTH_ZERO);
|
||||
|
||||
boolean newProblem = true;
|
||||
|
||||
if (markers.length > 0) {
|
||||
IMarker tempMarker = null;
|
||||
int nameStart = -1;
|
||||
int nameLen = -1;
|
||||
String tempMsgString = null;
|
||||
|
||||
for (int i=0; i<markers.length; i++) {
|
||||
tempMarker = markers[i];
|
||||
nameStart = ((Integer) tempMarker.getAttribute(IMarker.CHAR_START)).intValue();
|
||||
nameLen = ((Integer) tempMarker.getAttribute(IMarker.CHAR_END)).intValue() - nameStart;
|
||||
tempMsgString = (String) tempMarker.getAttribute(IMarker.MESSAGE);
|
||||
if (nameStart != -1 &&
|
||||
nameStart == location.getNodeOffset() &&
|
||||
nameLen == location.getNodeLength() &&
|
||||
tempMsgString.equalsIgnoreCase(INDEXER_MARKER_PREFIX + message)) {
|
||||
newProblem = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (newProblem) {
|
||||
IMarker marker = resource.createMarker(ICModelMarker.INDEXER_MARKER);
|
||||
int start = location.getNodeOffset();
|
||||
int end = start + location.getNodeLength();
|
||||
marker.setAttribute(IMarker.LOCATION, location.getStartingLineNumber());
|
||||
marker.setAttribute(IMarker.MESSAGE, INDEXER_MARKER_PREFIX + message);
|
||||
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
|
||||
marker.setAttribute(IMarker.LINE_NUMBER, location.getStartingLineNumber());
|
||||
marker.setAttribute(IMarker.CHAR_START, start);
|
||||
marker.setAttribute(IMarker.CHAR_END, end);
|
||||
marker.setAttribute(INDEXER_MARKER_ORIGINATOR, originator.getFullPath().toString());
|
||||
}
|
||||
|
||||
} catch (CoreException e) {
|
||||
// You need to handle the cases where attribute value is rejected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public boolean shouldRecordProblem(IASTProblem problem) {
|
||||
boolean preprocessor = (getProblemMarkersEnabled() & SourceIndexer.PREPROCESSOR_PROBLEMS_BIT ) != 0;
|
||||
|
@ -414,38 +419,6 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
|
|||
return (getProblemMarkersEnabled() & SourceIndexer.SEMANTIC_PROBLEMS_BIT) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param file
|
||||
* @param message
|
||||
*/
|
||||
private void addInfoMarker(IFile file, String message) {
|
||||
try {
|
||||
IMarker[] markers = file.findMarkers(ICModelMarker.INDEXER_MARKER, true, IResource.DEPTH_ZERO);
|
||||
|
||||
boolean newProblem = true;
|
||||
|
||||
if (markers.length > 0) {
|
||||
IMarker tempMarker = null;
|
||||
String tempMsgString = null;
|
||||
|
||||
for (int i=0; i<markers.length; i++) {
|
||||
tempMarker = markers[i];
|
||||
tempMsgString = (String) tempMarker.getAttribute(IMarker.MESSAGE);
|
||||
if (tempMsgString.equalsIgnoreCase( message )) {
|
||||
newProblem = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (newProblem){
|
||||
IMarker marker = file.createMarker(ICModelMarker.INDEXER_MARKER);
|
||||
marker.setAttribute(IMarker.MESSAGE, message);
|
||||
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO);
|
||||
}
|
||||
} catch (CoreException e) {}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -50,6 +50,7 @@ public abstract class AbstractIndexer implements IIndexer, ICSearchConstants {
|
|||
protected static final String INDEXER_MARKER_PREFIX = Util.bind("indexerMarker.prefix" ) + " "; //$NON-NLS-1$ //$NON-NLS-2$
|
||||
protected static final String INDEXER_MARKER_ORIGINATOR = ICModelMarker.INDEXER_MARKER + ".originator"; //$NON-NLS-1$
|
||||
private static final String INDEXER_MARKER_PROCESSING = Util.bind( "indexerMarker.processing" ); //$NON-NLS-1$
|
||||
protected IFile resourceFile;
|
||||
|
||||
public AbstractIndexer() {
|
||||
super();
|
||||
|
@ -64,10 +65,10 @@ public abstract class AbstractIndexer implements IIndexer, ICSearchConstants {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the file types being indexed.
|
||||
*/
|
||||
public abstract IFile getResourceFile();
|
||||
public Map getProblemsMap() {
|
||||
return problemsMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see IIndexer#index(IFile document, IIndexerOutput output)
|
||||
*/
|
||||
|
@ -77,6 +78,7 @@ public abstract class AbstractIndexer implements IIndexer, ICSearchConstants {
|
|||
}
|
||||
|
||||
protected abstract void indexFile(IFile file) throws IOException;
|
||||
|
||||
/**
|
||||
* @param fileToBeIndexed
|
||||
* @see IIndexer#shouldIndex(IFile file)
|
||||
|
@ -97,51 +99,107 @@ public abstract class AbstractIndexer implements IIndexer, ICSearchConstants {
|
|||
return false;
|
||||
}
|
||||
|
||||
abstract private class Problem {
|
||||
public IFile file;
|
||||
public IFile originator;
|
||||
public Problem( IFile file, IFile orig ){
|
||||
this.file = file;
|
||||
this.originator = orig;
|
||||
protected abstract class Problem {
|
||||
public IResource resource;
|
||||
public IResource originator;
|
||||
public Problem (IResource resource, IResource originator) {
|
||||
this.resource = resource;
|
||||
this.originator = originator;
|
||||
}
|
||||
|
||||
abstract public boolean isAddProblem();
|
||||
abstract public Object getProblem();
|
||||
abstract public Object getLocation();
|
||||
/**
|
||||
* Method to actually add/remove problem markers
|
||||
*/
|
||||
abstract public void run();
|
||||
}
|
||||
|
||||
private class AddMarkerProblem extends Problem {
|
||||
private Object problem;
|
||||
private Object location;
|
||||
public AddMarkerProblem(IFile file, IFile orig, Object problem, Object location) {
|
||||
super( file, orig );
|
||||
this.problem = problem;
|
||||
this.location = location;
|
||||
}
|
||||
public boolean isAddProblem(){
|
||||
return true;
|
||||
}
|
||||
public Object getProblem(){
|
||||
return problem;
|
||||
}
|
||||
public Object getLocation() {
|
||||
return location;
|
||||
protected class FileInfoMarker extends Problem {
|
||||
private String message;
|
||||
public FileInfoMarker(IResource resource, IResource originator, String message) {
|
||||
super(resource, originator);
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
try {
|
||||
IMarker[] markers = resource.findMarkers(ICModelMarker.INDEXER_MARKER, true, IResource.DEPTH_ZERO);
|
||||
|
||||
boolean newProblem = true;
|
||||
|
||||
if (markers.length > 0) {
|
||||
IMarker tempMarker = null;
|
||||
String tempMsgString = null;
|
||||
|
||||
for (int i=0; i<markers.length; i++) {
|
||||
tempMarker = markers[i];
|
||||
tempMsgString = (String) tempMarker.getAttribute(IMarker.MESSAGE);
|
||||
if (tempMsgString.equalsIgnoreCase( message )) {
|
||||
newProblem = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (newProblem){
|
||||
IMarker marker = resource.createMarker(ICModelMarker.INDEXER_MARKER);
|
||||
marker.setAttribute(IMarker.MESSAGE, message);
|
||||
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO);
|
||||
}
|
||||
} catch (CoreException e) {}
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* @param file
|
||||
* @param message
|
||||
*/
|
||||
protected void addInfoMarker(IFile tempFile, String message) {
|
||||
Problem tempProblem = new FileInfoMarker(tempFile, tempFile, message);
|
||||
if (getProblemsMap().containsKey(tempFile)) {
|
||||
List list = (List) getProblemsMap().get(tempFile);
|
||||
list.add(tempProblem);
|
||||
} else {
|
||||
List list = new ArrayList();
|
||||
list.add(new RemoveMarkerProblem(tempFile, getResourceFile())); //remove existing markers
|
||||
list.add(tempProblem);
|
||||
getProblemsMap().put(tempFile, list);
|
||||
}
|
||||
}
|
||||
|
||||
private class RemoveMarkerProblem extends Problem {
|
||||
protected class RemoveMarkerProblem extends Problem {
|
||||
public RemoveMarkerProblem(IFile file, IFile orig) {
|
||||
super(file, orig);
|
||||
}
|
||||
public boolean isAddProblem() {
|
||||
return false;
|
||||
}
|
||||
public Object getProblem() {
|
||||
return null;
|
||||
}
|
||||
public Object getLocation() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
if (originator == null) {
|
||||
//remove all markers
|
||||
try {
|
||||
resource.deleteMarkers(ICModelMarker.INDEXER_MARKER, true, IResource.DEPTH_INFINITE);
|
||||
} catch (CoreException e) {
|
||||
}
|
||||
return;
|
||||
}
|
||||
// else remove only those markers with matching originator
|
||||
IMarker[] markers;
|
||||
try {
|
||||
markers = resource.findMarkers(ICModelMarker.INDEXER_MARKER, true, IResource.DEPTH_INFINITE);
|
||||
} catch (CoreException e1) {
|
||||
return;
|
||||
}
|
||||
String origPath = originator.getFullPath().toString();
|
||||
IMarker mark = null;
|
||||
String orig = null;
|
||||
for (int i = 0; i < markers.length; i++) {
|
||||
mark = markers[ i ];
|
||||
try {
|
||||
orig = (String) mark.getAttribute(INDEXER_MARKER_ORIGINATOR);
|
||||
if( orig != null && orig.equals(origPath )) {
|
||||
mark.delete();
|
||||
}
|
||||
} catch (CoreException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Problem markers ******************************
|
||||
|
@ -161,24 +219,7 @@ public abstract class AbstractIndexer implements IIndexer, ICSearchConstants {
|
|||
this.problemMarkersEnabled = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param tempFile - not null
|
||||
* @param resourceFile
|
||||
* @param problem
|
||||
* @param location
|
||||
*/
|
||||
public void generateMarkerProblem(IFile tempFile, IFile resourceFile, Object problem, Object location) {
|
||||
Problem tempProblem = new AddMarkerProblem(tempFile, resourceFile, problem, location);
|
||||
if (problemsMap.containsKey(tempFile)) {
|
||||
List list = (List) problemsMap.get(tempFile);
|
||||
list.add(tempProblem);
|
||||
} else {
|
||||
List list = new ArrayList();
|
||||
list.add(new RemoveMarkerProblem(tempFile, resourceFile)); //remove existing markers
|
||||
list.add(tempProblem);
|
||||
problemsMap.put(tempFile, list);
|
||||
}
|
||||
}
|
||||
// abstract public void generateMarkerProblem(Problem problem);
|
||||
|
||||
public void requestRemoveMarkers(IFile resource, IFile originator ){
|
||||
if (!areProblemMarkersEnabled())
|
||||
|
@ -264,47 +305,17 @@ public abstract class AbstractIndexer implements IIndexer, ICSearchConstants {
|
|||
Iterator i = problemsList.iterator();
|
||||
while (i.hasNext()) {
|
||||
Problem prob = (Problem) i.next();
|
||||
if (prob.isAddProblem()) {
|
||||
addMarkers(prob.file, prob.originator, prob.getProblem(), prob.getLocation());
|
||||
} else {
|
||||
removeMarkers(prob.file, prob.originator);
|
||||
}
|
||||
prob.run();
|
||||
}
|
||||
}
|
||||
public void run() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
abstract protected void addMarkers(IFile tempFile, IFile originator, Object problem, Object location);
|
||||
|
||||
public void removeMarkers(IFile resource, IFile originator) {
|
||||
if (originator == null) {
|
||||
//remove all markers
|
||||
try {
|
||||
resource.deleteMarkers(ICModelMarker.INDEXER_MARKER, true, IResource.DEPTH_INFINITE);
|
||||
} catch (CoreException e) {
|
||||
}
|
||||
return;
|
||||
}
|
||||
// else remove only those markers with matching originator
|
||||
IMarker[] markers;
|
||||
try {
|
||||
markers = resource.findMarkers(ICModelMarker.INDEXER_MARKER, true, IResource.DEPTH_INFINITE);
|
||||
} catch (CoreException e1) {
|
||||
return;
|
||||
}
|
||||
String origPath = originator.getFullPath().toString();
|
||||
IMarker mark = null;
|
||||
String orig = null;
|
||||
for (int i = 0; i < markers.length; i++) {
|
||||
mark = markers[ i ];
|
||||
try {
|
||||
orig = (String) mark.getAttribute(INDEXER_MARKER_ORIGINATOR);
|
||||
if( orig != null && orig.equals(origPath )) {
|
||||
mark.delete();
|
||||
}
|
||||
} catch (CoreException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public IFile getResourceFile() {
|
||||
return resourceFile;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -116,7 +116,7 @@ public class SourceIndexerRequestor implements ISourceElementRequestor {
|
|||
}
|
||||
|
||||
if( tempFile != null ){
|
||||
indexer.generateMarkerProblem(tempFile, resourceFile, problem, null);
|
||||
indexer.generateMarkerProblem(tempFile, resourceFile, problem);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ import java.io.IOException;
|
|||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.ICLogConstants;
|
||||
|
@ -86,7 +87,6 @@ import org.eclipse.core.runtime.Path;
|
|||
* - Unions
|
||||
*/
|
||||
public class SourceIndexerRunner extends AbstractIndexer {
|
||||
IFile resourceFile;
|
||||
private SourceIndexer indexer;
|
||||
|
||||
/**
|
||||
|
@ -191,13 +191,6 @@ public class SourceIndexerRunner extends AbstractIndexer {
|
|||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.search.indexing.AbstractIndexer#getResourceFile()
|
||||
*/
|
||||
public IFile getResourceFile() {
|
||||
return resourceFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param fullPath
|
||||
* @param path
|
||||
|
@ -206,16 +199,17 @@ public class SourceIndexerRunner extends AbstractIndexer {
|
|||
return indexer.haveEncounteredHeader(fullPath, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer#addMarkers(org.eclipse.core.resources.IFile, org.eclipse.core.resources.IFile, java.lang.Object, java.lang.Object)
|
||||
*/
|
||||
protected void addMarkers(IFile tempFile, IFile originator, Object problem, Object location) {
|
||||
if (problem instanceof IProblem) {
|
||||
IProblem iProblem = (IProblem) problem;
|
||||
|
||||
protected class AddMarkerProblem extends Problem {
|
||||
private IProblem problem;
|
||||
public AddMarkerProblem(IResource file, IResource orig, IProblem problem) {
|
||||
super(file, orig);
|
||||
this.problem = problem;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
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);
|
||||
IMarker[] markers = resource.findMarkers(ICModelMarker.INDEXER_MARKER, true,IResource.DEPTH_ZERO);
|
||||
|
||||
boolean newProblem = true;
|
||||
|
||||
|
@ -228,8 +222,8 @@ public class SourceIndexerRunner extends AbstractIndexer {
|
|||
tempMarker = markers[i];
|
||||
tempInt = (Integer) tempMarker.getAttribute(IMarker.LINE_NUMBER);
|
||||
tempMsgString = (String) tempMarker.getAttribute(IMarker.MESSAGE);
|
||||
if (tempInt != null && tempInt.intValue()==iProblem.getSourceLineNumber() &&
|
||||
tempMsgString.equalsIgnoreCase( INDEXER_MARKER_PREFIX + iProblem.getMessage()))
|
||||
if (tempInt != null && tempInt.intValue() == problem.getSourceLineNumber() &&
|
||||
tempMsgString.equalsIgnoreCase( INDEXER_MARKER_PREFIX + problem.getMessage()))
|
||||
{
|
||||
newProblem = false;
|
||||
break;
|
||||
|
@ -238,24 +232,23 @@ public class SourceIndexerRunner extends AbstractIndexer {
|
|||
}
|
||||
|
||||
if (newProblem) {
|
||||
IMarker marker = tempFile.createMarker(ICModelMarker.INDEXER_MARKER);
|
||||
int start = iProblem.getSourceStart();
|
||||
int end = iProblem.getSourceEnd();
|
||||
IMarker marker = resource.createMarker(ICModelMarker.INDEXER_MARKER);
|
||||
int start = problem.getSourceStart();
|
||||
int end = problem.getSourceEnd();
|
||||
if (end <= start)
|
||||
end = start + 1;
|
||||
marker.setAttribute(IMarker.LOCATION, iProblem.getSourceLineNumber());
|
||||
marker.setAttribute(IMarker.MESSAGE, INDEXER_MARKER_PREFIX + iProblem.getMessage());
|
||||
marker.setAttribute(IMarker.LOCATION, problem.getSourceLineNumber());
|
||||
marker.setAttribute(IMarker.MESSAGE, INDEXER_MARKER_PREFIX + problem.getMessage());
|
||||
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
|
||||
marker.setAttribute(IMarker.LINE_NUMBER, iProblem.getSourceLineNumber());
|
||||
marker.setAttribute(IMarker.LINE_NUMBER, problem.getSourceLineNumber());
|
||||
marker.setAttribute(IMarker.CHAR_START, start);
|
||||
marker.setAttribute(IMarker.CHAR_END, end);
|
||||
marker.setAttribute(INDEXER_MARKER_ORIGINATOR, originator.getFullPath().toString() );
|
||||
}
|
||||
|
||||
} catch (CoreException e) {
|
||||
// You need to handle the cases where attribute value is rejected
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void addClassSpecifier(IASTClassSpecifier classSpecification, int fileNumber){
|
||||
|
@ -647,4 +640,17 @@ public class SourceIndexerRunner extends AbstractIndexer {
|
|||
int BOGUS_ENTRY = 1;
|
||||
this.output.addIncludeRef(fileNumber, incName,1,1, IIndex.OFFSET);
|
||||
}
|
||||
|
||||
public void generateMarkerProblem(IFile tempFile, IFile originator, IProblem problem) {
|
||||
Problem tempProblem = new AddMarkerProblem(tempFile, originator, problem);
|
||||
if (getProblemsMap().containsKey(tempFile)) {
|
||||
List list = (List) getProblemsMap().get(tempFile);
|
||||
list.add(tempProblem);
|
||||
} else {
|
||||
List list = new ArrayList();
|
||||
list.add(new RemoveMarkerProblem(tempFile, originator)); //remove existing markers
|
||||
list.add(tempProblem);
|
||||
getProblemsMap().put(tempFile, list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue