--- /dev/null
+package net.mograsim.plugin.asm.editor;
+
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocumentListener;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXParseException;
+
+public class AsmDocumentValidator implements IDocumentListener
+{
+
+ private final IFile file;
+ private IMarker marker;
+
+ AsmDocumentValidator(IFile file)
+ {
+ this.file = file;
+ }
+
+ @Override
+ public void documentChanged(DocumentEvent event)
+ {
+ if (this.marker != null)
+ {
+ try
+ {
+ this.marker.delete();
+ }
+ catch (CoreException e)
+ {
+ e.printStackTrace();
+ }
+ this.marker = null;
+ }
+ try (StringReader reader = new StringReader(event.getDocument().get());)
+ {
+ DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ documentBuilder.parse(new InputSource(reader));
+ }
+ catch (Exception ex)
+ {
+ try
+ {
+ this.marker = file.createMarker(IMarker.PROBLEM);
+ this.marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
+ this.marker.setAttribute(IMarker.MESSAGE, ex.getMessage());
+ if (ex instanceof SAXParseException)
+ {
+ SAXParseException saxParseException = (SAXParseException) ex;
+ int lineNumber = saxParseException.getLineNumber();
+ int offset = event.getDocument().getLineInformation(lineNumber - 1).getOffset() + saxParseException.getColumnNumber()
+ - 1;
+ this.marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
+ this.marker.setAttribute(IMarker.CHAR_START, offset);
+ this.marker.setAttribute(IMarker.CHAR_END, offset + 1);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void documentAboutToBeChanged(DocumentEvent event)
+ {
+ }
+
+}