import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Control;
import org.simantics.scl.compiler.errors.CompilationError;
+import org.simantics.scl.compiler.errors.DoesNotExist;
import org.simantics.scl.compiler.errors.Failable;
import org.simantics.scl.compiler.errors.Failure;
import org.simantics.scl.compiler.module.Module;
import org.simantics.scl.compiler.module.repository.UpdateListener;
import gnu.trove.map.hash.THashMap;
+import gnu.trove.procedure.TObjectObjectProcedure;
import gnu.trove.procedure.TObjectProcedure;
public class SCLIssuesContentProvider implements IStructuredContentProvider {
boolean disposed = false;
AtomicBoolean refreshInProgress = new AtomicBoolean(false);
- THashMap<String, Failure> currentFailures = new THashMap<String, Failure>();
+ THashMap<String, CompilationError[]> currentFailures = new THashMap<String, CompilationError[]>();
THashMap<String, UpdateListener> updateListeners = new THashMap<String, UpdateListener>();
@Override
}
private UpdateListener getUpdateListener(String moduleName) {
- UpdateListener listener = updateListeners.get(moduleName);
- if(listener == null) {
- listener = new UpdateListener() {
- @Override
- public void notifyAboutUpdate() {
- if(!disposed)
- listenModule(moduleName);
- }
- };
- updateListeners.put(moduleName, listener);
+ UpdateListener listener;
+ synchronized(updateListeners) {
+ listener = updateListeners.get(moduleName);
+ if(listener == null) {
+ listener = new UpdateListener() {
+ @Override
+ public void notifyAboutUpdate() {
+ if(!disposed)
+ listenModule(moduleName);
+ }
+ };
+ updateListeners.put(moduleName, listener);
+ }
}
return listener;
}
synchronized(currentFailures) {
if(result instanceof Failure) {
Failure failure = (Failure)result;
- currentFailures.put(moduleName, failure);
+ currentFailures.put(moduleName, failure.errors);
}
- else
+ else if(result == DoesNotExist.INSTANCE) {
if(currentFailures.remove(moduleName) == null)
return;
+ }
+ else {
+ CompilationError[] warnings = result.getResult().getWarnings();
+ if(warnings.length == 0) {
+ if(currentFailures.remove(moduleName) == null)
+ return;
+ }
+ else {
+ currentFailures.put(moduleName, warnings);
+ }
+ }
}
refresh();
}
@Override
public void dispose() {
+ if(this.disposed)
+ return;
this.disposed = true;
+ if(repository != null)
+ synchronized(updateListeners) {
+ updateListeners.forEachEntry(new TObjectObjectProcedure<String, UpdateListener>() {
+ @Override
+ public boolean execute(String moduleName, UpdateListener listener) {
+ listener.stopListening();
+ return true;
+ }
+ });
+ updateListeners.clear();
+ }
}
@Override
String[] moduleNames = currentFailures.keySet().toArray(new String[currentFailures.size()]);
Arrays.sort(moduleNames);
for(String moduleName : moduleNames) {
- Failure failure = currentFailures.get(moduleName);
- for(CompilationError error : failure.errors)
+ CompilationError[] errors = currentFailures.get(moduleName);
+ for(CompilationError error : errors)
result.add(new SCLIssuesTableEntry(moduleName, error));
if(result.size() >= MAX_ISSUE_COUNT)
break;