]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLAnnotationModel.java
Showing compilation warnings in SCL issue view and editors
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / editor2 / SCLAnnotationModel.java
index 181abf7e4eadb01521d7745335c7091ca198de63..b8010ef828a23868ba0b24b7820c53be38ef2dfa 100644 (file)
@@ -1,75 +1,83 @@
-package org.simantics.scl.ui.editor2;\r
-\r
-import java.util.Arrays;\r
-import java.util.Collections;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.text.IDocument;\r
-import org.eclipse.jface.text.Position;\r
-import org.eclipse.jface.text.source.Annotation;\r
-import org.eclipse.jface.text.source.AnnotationModel;\r
-import org.simantics.scl.compiler.errors.CompilationError;\r
-import org.simantics.scl.compiler.errors.Failable;\r
-import org.simantics.scl.compiler.errors.Failure;\r
-import org.simantics.scl.compiler.errors.Locations;\r
-import org.simantics.scl.compiler.module.Module;\r
-import org.simantics.scl.compiler.module.repository.ModuleRepository;\r
-import org.simantics.scl.compiler.module.repository.UpdateListener;\r
-\r
-public class SCLAnnotationModel extends AnnotationModel {\r
-    private final SCLModuleEditorInput input;\r
-    private final ModuleRepository repository;\r
-    private volatile boolean connected = false;\r
-    \r
-    public SCLAnnotationModel(SCLModuleEditorInput input,\r
-            ModuleRepository repository) {\r
-        this.input = input;\r
-        this.repository = repository;\r
-    }\r
-    \r
-    UpdateListener updateListener = new UpdateListener() {\r
-        @Override\r
-        public void notifyAboutUpdate() {\r
-            if(connected)\r
-                updateAnnotations();\r
-        }\r
-    };\r
-    \r
-    private void updateAnnotations() {\r
-        Failable<Module> result = repository.getModule(input.getModuleName(), updateListener);\r
-        if(result instanceof Failure) {\r
-            Failure failure = (Failure)result;\r
-            setAnnotations(Arrays.asList(failure.errors));\r
-        }\r
-        else {\r
-            setAnnotations(Collections.<CompilationError>emptyList());\r
-        }\r
-    }\r
-    \r
-    protected void setAnnotations(List<CompilationError> errors) {\r
-        synchronized(getLockObject()) {\r
-            removeAllAnnotations();\r
-            for(CompilationError error : errors) {\r
-                Annotation annotation = new Annotation("org.eclipse.ui.workbench.texteditor.error", true,\r
-                        error.description);\r
-                int begin = Locations.beginOf(error.location);\r
-                int end = Locations.endOf(error.location);\r
-                Position position = new Position(begin, end - begin);\r
-                addAnnotation(annotation, position);\r
-            }\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public void connect(IDocument document) {\r
-        super.connect(document);\r
-        connected = true;\r
-        updateAnnotations();\r
-    }\r
-    \r
-    @Override\r
-    public void disconnect(IDocument document) {\r
-        connected = false;\r
-        super.disconnect(document);\r
-    }\r
-}\r
+package org.simantics.scl.ui.editor2;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.AnnotationModel;
+import org.simantics.scl.compiler.errors.CompilationError;
+import org.simantics.scl.compiler.errors.DoesNotExist;
+import org.simantics.scl.compiler.errors.ErrorSeverity;
+import org.simantics.scl.compiler.errors.Failable;
+import org.simantics.scl.compiler.errors.Failure;
+import org.simantics.scl.compiler.errors.Locations;
+import org.simantics.scl.compiler.errors.Success;
+import org.simantics.scl.compiler.module.Module;
+import org.simantics.scl.compiler.module.repository.ModuleRepository;
+import org.simantics.scl.compiler.module.repository.UpdateListener;
+
+public class SCLAnnotationModel extends AnnotationModel {
+    private final SCLModuleEditorInput input;
+    private final ModuleRepository repository;
+    private volatile boolean connected = false;
+    
+    public SCLAnnotationModel(SCLModuleEditorInput input,
+            ModuleRepository repository) {
+        this.input = input;
+        this.repository = repository;
+    }
+    
+    UpdateListener updateListener = new UpdateListener() {
+        @Override
+        public void notifyAboutUpdate() {
+            if(connected)
+                updateAnnotations();
+        }
+    };
+    
+    private void updateAnnotations() {
+        Failable<Module> result = repository.getModule(input.getModuleName(), updateListener);
+        if(result instanceof Failure) {
+            Failure failure = (Failure)result;
+            setAnnotations(Arrays.asList(failure.errors));
+        }
+        else if(result == DoesNotExist.INSTANCE)
+            setAnnotations(Collections.<CompilationError>emptyList());
+        else
+            setAnnotations(Arrays.asList(result.getResult().getWarnings()));
+    }
+    
+    protected void setAnnotations(List<CompilationError> errors) {
+        synchronized(getLockObject()) {
+            removeAllAnnotations();
+            for(CompilationError error : errors) {
+                Annotation annotation = new Annotation(
+                        error.severity == ErrorSeverity.ERROR ?
+                                "org.eclipse.ui.workbench.texteditor.error" :
+                                    "org.eclipse.ui.workbench.texteditor.warning",
+                                    true, error.description);
+                int begin = Locations.beginOf(error.location);
+                int end = Locations.endOf(error.location);
+                Position position = new Position(begin, end - begin);
+                addAnnotation(annotation, position);
+            }
+        }
+    }
+
+    @Override
+    public void connect(IDocument document) {
+        super.connect(document);
+        connected = true;
+        updateAnnotations();
+    }
+    
+    @Override
+    public void disconnect(IDocument document) {
+        connected = false;
+        updateListener.stopListening();
+        super.disconnect(document);
+    }
+}