blob: 3b7e49c40b19457abdb2b44a901982aa7ecf6ebd [file] [log] [blame]
package org.eclipse.jdt.internal.core.builder.impl;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.internal.core.builder.IProblemDetail;
import org.eclipse.jdt.internal.core.builder.IProblemReporter;
import java.util.*;
import org.eclipse.jdt.internal.core.builder.IDevelopmentContext;
/**
* A table of all the problems in the state, keyed by SourceEntry, and
* a vector of IProblemDetails as the values.
*/
public class ProblemTable extends StateTables implements IProblemReporter {
Hashtable fTable = new Hashtable(20);
Vector fImageProblems = new Vector(11);
/**
* Creates a copy of the table.
*/
public IProblemReporter copy() {
try {
ProblemTable copy = (ProblemTable) super.clone();
copy.fTable = new Hashtable(fTable.size() * 2 + 1);
for (Enumeration e = fTable.keys(); e.hasMoreElements();) {
SourceEntry sEntry = (SourceEntry) e.nextElement();
Vector v = (Vector) fTable.get(sEntry);
copy.fTable.put(sEntry, v.clone());
}
return copy;
} catch (CloneNotSupportedException e) {
// Should not happen.
throw new Error();
}
}
/**
* Returns an enumeration of all problems with elements of the image,
* but not with the image itself.
*/
public Enumeration getAllProblems() {
/* this is a very slow way of doing it.. is there a faster way? */
Vector allProblems = new Vector();
for (Enumeration e = fTable.elements(); e.hasMoreElements();) {
Vector problemVector = (Vector) e.nextElement();
for (Enumeration ee = problemVector.elements(); ee.hasMoreElements();) {
allProblems.addElement(ee.nextElement());
}
}
return allProblems.elements();
}
/**
* Returns the problems with the image itself. Returns null if no
* problems exist for the image. An example of such a problem is
* duplicate types in a package.
*/
public Enumeration getImageProblems() {
return fImageProblems.elements();
}
/**
* Returns an enumeration of problem table keys (SourceEntry objects)
*/
public Enumeration getProblemKeys() {
return fTable.keys();
}
/**
* Returns an enumeration of problems for a given source entry.
*/
public Enumeration getProblems(Object entry) {
Vector vProblems = (Vector) fTable.get(entry);
if (vProblems == null) {
return new Vector().elements();
}
return vProblems.elements();
}
/**
* Returns a vector of problems for a given source entry,
* or null if no problems.
*/
public Vector getProblemVector(Object entry) {
return (Vector) fTable.get(entry);
}
/**
* Returns whether the given entry has any problems.
*/
public boolean hasProblems(Object entry) {
return fTable.get(entry) != null;
}
/**
* Adds a problem to the problem table. If the problem is a duplicate, it is
* not added and an error message is generated.
*/
public void putProblem(Object entry, IProblemDetail problem) {
Vector problems = (Vector) fTable.get(entry);
if (problems == null) {
problems = new Vector();
fTable.put(entry, problems);
}
/* for (int i = 0; i < problems.size(); ++i) {
if (problem.equals(problems.elementAt(i))) {
System.err.println("DBG: Same error reported twice for " + entry + ": " + problem);
return;
}
}
*/ problems.addElement(problem);
}
/**
* Removes all problems except syntax errors for the given source entry.
*/
public void removeNonSyntaxErrors(Object entry) {
Vector problems = (Vector) fTable.get(entry);
if (problems != null) {
int i = 0;
while (i < problems.size()) {
IProblemDetail problem = (IProblemDetail) problems.elementAt(i);
if ((problem.getSeverity() & ProblemDetailImpl.S_SYNTAX_ERROR) == 0) {
problems.removeElementAt(i);
} else {
i++;
}
}
if (problems.isEmpty()) {
fTable.remove(entry);
}
}
}
/**
* Removes all problems for the given source entry
*/
public void removeProblems(Object entry) {
fTable.remove(entry);
}
/**
* Removes all syntax errors for the given source entry.
*/
public void removeSyntaxErrors(Object entry) {
Vector problems = (Vector) fTable.get(entry);
if (problems != null) {
int i = 0;
while (i < problems.size()) {
IProblemDetail problem = (IProblemDetail) problems.elementAt(i);
if ((problem.getSeverity() & ProblemDetailImpl.S_SYNTAX_ERROR) != 0) {
problems.removeElementAt(i);
} else {
i++;
}
}
if (problems.isEmpty()) {
fTable.remove(entry);
}
}
}
/**
* Returns the total number of problems in the table.
*/
int size() {
int size = fImageProblems.size();
for (Enumeration e = fTable.elements(); e.hasMoreElements(); ) {
Vector v = (Vector)e.nextElement();
size += v.size();
}
return size;
}
/**
* Returns a String that represents the value of this object.
* @return a string representation of the receiver
*/
public String toString() {
StringBuffer buf = new StringBuffer("ProblemTable(\n\t"/*nonNLS*/);
buf.append("type problems: "/*nonNLS*/);
buf.append(fTable);
buf.append("\n\timage problems: "/*nonNLS*/);
buf.append(fImageProblems);
buf.append(")"/*nonNLS*/);
return buf.toString();
}
/**
* @see org.eclipse.jdt.internal.core.builder.IProblemReporter
*/
public void initialize(IProject project, IDevelopmentContext dc) {
}
}