diff --git a/com.google.eclipse.protobuf.junit/META-INF/MANIFEST.MF b/com.google.eclipse.protobuf.junit/META-INF/MANIFEST.MF
index a1521b5..a2160b9 100644
--- a/com.google.eclipse.protobuf.junit/META-INF/MANIFEST.MF
+++ b/com.google.eclipse.protobuf.junit/META-INF/MANIFEST.MF
@@ -21,7 +21,9 @@
  com.google.inject;bundle-version="2.0.0",
  org.eclipse.core.resources;bundle-version="3.7.100",
  org.eclipse.core.jobs;bundle-version="3.5.100",
- org.eclipse.equinox.common;bundle-version="3.6.0"
+ org.eclipse.equinox.common;bundle-version="3.6.0",
+ org.eclipse.core.contenttype;bundle-version="3.4.100"
 Export-Package: com.google.eclipse.protobuf.junit.core,
  com.google.eclipse.protobuf.junit.matchers,
+ com.google.eclipse.protobuf.junit.stubs,
  com.google.eclipse.protobuf.junit.util
diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java
index 22491f4..e6dcec0 100644
--- a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java
@@ -8,6 +8,8 @@
  */
 package com.google.eclipse.protobuf.junit.stubs;
 
+import static java.util.Collections.*;
+
 import java.io.InputStream;
 import java.io.Reader;
 import java.net.URI;
@@ -15,14 +17,15 @@
 
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.content.IContentDescription;
 import org.eclipse.core.runtime.jobs.ISchedulingRule;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
-public abstract class FileStub implements IFile {
+public class FileStub implements IFile {
 
-  private final Map<String, List<IMarker>> markersByType = new HashMap<String, List<IMarker>>();
+  private final Map<String, List<MarkerStub>> markersByType = new HashMap<String, List<MarkerStub>>();
 
   /** {@inheritDoc} */
   public void accept(IResourceProxyVisitor visitor, int memberFlags) throws CoreException {
@@ -45,6 +48,17 @@
   }
 
   /** {@inheritDoc} */
+  public void appendContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
+      throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void appendContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
   public void clearHistory(IProgressMonitor monitor) throws CoreException {
     throw new UnsupportedOperationException();
   }
@@ -75,14 +89,29 @@
   }
 
   /** {@inheritDoc} */
+  public void create(InputStream source, boolean force, IProgressMonitor monitor) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void create(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void createLink(IPath localLocation, int updateFlags, IProgressMonitor monitor) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void createLink(URI location, int updateFlags, IProgressMonitor monitor) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
   public IMarker createMarker(String type) throws CoreException {
     MarkerStub marker = new MarkerStub(type);
-    List<IMarker> markers = markersByType.get(type);
-    if (markers == null) {
-      markers = new ArrayList<IMarker>();
-      markersByType.put(type, markers);
-    }
-    markers.add(marker);
+    addMarker(marker);
     return marker;
   }
 
@@ -92,6 +121,11 @@
   }
 
   /** {@inheritDoc} */
+  public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
   public void delete(boolean force, IProgressMonitor monitor) throws CoreException {
     throw new UnsupportedOperationException();
   }
@@ -103,7 +137,7 @@
 
   /** {@inheritDoc} */
   public void deleteMarkers(String type, boolean includeSubtypes, int depth) throws CoreException {
-    List<IMarker> markers = markersByType.get(type);
+    List<MarkerStub> markers = markersByType.get(type);
     if (markers != null) markers.clear();
   }
 
@@ -119,7 +153,7 @@
 
   /** {@inheritDoc} */
   public IMarker[] findMarkers(String type, boolean includeSubtypes, int depth) throws CoreException {
-    List<IMarker> markers = markersByType.get(type);
+    List<MarkerStub> markers = markersByType.get(type);
     if (markers == null) return new IMarker[0];
     return markers.toArray(new IMarker[markers.size()]);
   }
@@ -135,11 +169,56 @@
   }
 
   /** {@inheritDoc} */
+  public String getCharset() throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public String getCharset(boolean checkImplicit) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public String getCharsetFor(Reader reader) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public IContentDescription getContentDescription() throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public InputStream getContents() throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public InputStream getContents(boolean force) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public int getEncoding() throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
   public String getFileExtension() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
+  public IPath getFullPath() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public IFileState[] getHistory(IProgressMonitor monitor) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
   public long getLocalTimeStamp() {
     throw new UnsupportedOperationException();
   }
@@ -165,7 +244,7 @@
   }
 
   /** {@inheritDoc} */
-  public IPathVariableManager getPathVariableManager() {
+  public String getName() {
     throw new UnsupportedOperationException();
   }
 
@@ -175,6 +254,11 @@
   }
 
   /** {@inheritDoc} */
+  public IPathVariableManager getPathVariableManager() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
   public Map<QualifiedName, String> getPersistentProperties() throws CoreException {
     throw new UnsupportedOperationException();
   }
@@ -265,11 +349,6 @@
   }
 
   /** {@inheritDoc} */
-  public boolean isVirtual() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
   public boolean isLinked(int options) {
     throw new UnsupportedOperationException();
   }
@@ -285,6 +364,11 @@
   }
 
   /** {@inheritDoc} */
+  public boolean isReadOnly() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
   public boolean isSynchronized(int depth) {
     throw new UnsupportedOperationException();
   }
@@ -300,6 +384,17 @@
   }
 
   /** {@inheritDoc} */
+  public boolean isVirtual() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor)
+      throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
   public void move(IPath destination, boolean force, IProgressMonitor monitor) throws CoreException {
     throw new UnsupportedOperationException();
   }
@@ -331,6 +426,38 @@
   }
 
   /** {@inheritDoc} */
+  public void setCharset(String newCharset) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void setCharset(String newCharset, IProgressMonitor monitor) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void setContents(IFileState source, boolean force, boolean keepHistory, IProgressMonitor monitor)
+      throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void setContents(IFileState source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void setContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
+      throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
   public void setDerived(boolean isDerived) throws CoreException {
     throw new UnsupportedOperationException();
   }
@@ -385,127 +512,24 @@
     throw new UnsupportedOperationException();
   }
 
-  /** {@inheritDoc} */
-  public void appendContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
-    throw new UnsupportedOperationException();
+  public int markerCount(String type) {
+    List<MarkerStub> markers = markersByType.get(type);
+    return (markers == null) ? 0 : markers.size();
+  }
+  
+  public List<MarkerStub> markers(String type) {
+    List<MarkerStub> markers = markersByType.get(type);
+    if (markers == null) return emptyList();
+    return unmodifiableList(markers);
   }
 
-  /** {@inheritDoc} */
-  public void appendContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void create(InputStream source, boolean force, IProgressMonitor monitor) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void create(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void createLink(IPath localLocation, int updateFlags, IProgressMonitor monitor) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void createLink(URI location, int updateFlags, IProgressMonitor monitor) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public String getCharset() throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public String getCharset(boolean checkImplicit) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public String getCharsetFor(Reader reader) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public InputStream getContents() throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public InputStream getContents(boolean force) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public int getEncoding() throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public IPath getFullPath() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public IFileState[] getHistory(IProgressMonitor monitor) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public String getName() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public boolean isReadOnly() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void setCharset(String newCharset) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void setCharset(String newCharset, IProgressMonitor monitor) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void setContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void setContents(IFileState source, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  public void setContents(IFileState source, int updateFlags, IProgressMonitor monitor) throws CoreException {
-    throw new UnsupportedOperationException();
+  public void addMarker(MarkerStub marker) throws CoreException {
+    String type = marker.getType();
+    List<MarkerStub> markers = markersByType.get(type);
+    if (markers == null) {
+      markers = new ArrayList<MarkerStub>();
+      markersByType.put(type, markers);
+    }
+    markers.add(marker);
   }
 }
diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java
index 0578871..4312479 100644
--- a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java
@@ -1,9 +1,6 @@
 /*
- * Copyright (c) 2011 Google Inc.
- *
- * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
- * Public License v1.0 which accompanies this distribution, and is available at
- *
+ * Copyright (c) 2011 Google Inc. All rights reserved. This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  */
 package com.google.eclipse.protobuf.junit.stubs;
@@ -25,6 +22,14 @@
   private final String type;
   private final long creationTime;
 
+  public static MarkerStub error(String type, String description, int lineNumber) throws CoreException {
+    MarkerStub marker = new MarkerStub(type);
+    marker.setAttribute(SEVERITY, SEVERITY_ERROR);
+    marker.setAttribute(MESSAGE, description);
+    marker.setAttribute(LINE_NUMBER, lineNumber);
+    return marker;
+  }
+
   public MarkerStub(String type) {
     this.type = type;
     creationTime = System.currentTimeMillis();
@@ -79,7 +84,8 @@
   /** {@inheritDoc} */
   public Object[] getAttributes(String[] attributeNames) throws CoreException {
     List<Object> values = new ArrayList<Object>();
-    for (String name : attributeNames) values.add(attributes.get(name));
+    for (String name : attributeNames)
+      values.add(attributes.get(name));
     return values.toArray();
   }
 
@@ -132,4 +138,16 @@
   public void setAttributes(Map<String, ? extends Object> attributes) throws CoreException {
     this.attributes.putAll(attributes);
   }
+
+  public int severity() throws CoreException {
+    return getAttribute(SEVERITY, -1);
+  }
+  
+  public String message() throws CoreException {
+    return (String) getAttribute(MESSAGE);
+  }
+
+  public int lineNumber() throws CoreException {
+    return getAttribute(LINE_NUMBER, -1);
+  }
 }
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory_createErrorIfNecessary_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory_createErrorIfNecessary_Test.java
new file mode 100644
index 0000000..c88b35c
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory_createErrorIfNecessary_Test.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.ui.builder;
+
+import static com.google.eclipse.protobuf.junit.stubs.MarkerStub.error;
+import static org.eclipse.core.resources.IMarker.SEVERITY_ERROR;
+import static org.eclipse.xtext.ui.MarkerTypes.FAST_VALIDATION;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.eclipse.protobuf.junit.stubs.FileStub;
+import com.google.eclipse.protobuf.junit.stubs.MarkerStub;
+
+/**
+ * Tests for <code>{@link ProtocMarkerFactory#createErrorIfNecessary(String, int)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProtocMarkerFactory_createErrorIfNecessary_Test {
+
+  private static final String PROTOC = "com.google.eclipse.protobuf.ui.protocMarker";
+
+  private FileStub file;
+  private MarkerStub fastValidationMarker;
+  private ProtocMarkerFactory markerFactory;
+  
+  @Before public void setUp() throws CoreException {
+    file = new FileStub();
+    file.createMarker(PROTOC);
+    assertThat(file.markerCount(PROTOC), equalTo(1));
+    fastValidationMarker = error(FAST_VALIDATION, "Expected field name.", 68);
+    file.addMarker(fastValidationMarker);
+    markerFactory = new ProtocMarkerFactory(file);
+    assertThat(file.markerCount(PROTOC), equalTo(0));
+  }
+  
+  @Test public void should_create_marker_if_a_similar_one_does_not_exist() throws CoreException {
+    String message = "File not found.";
+    int lineNumber = 8;
+    markerFactory.createErrorIfNecessary(message, lineNumber);
+    List<MarkerStub> markers = file.markers(PROTOC);
+    assertThat(markers.size(), equalTo(1));
+    MarkerStub marker = markers.get(0);
+    assertThat(marker.severity(), equalTo(SEVERITY_ERROR));
+    assertThat(marker.message(), equalTo(message));
+    assertThat(marker.lineNumber(), equalTo(lineNumber));
+  }
+  
+  @Test public void should_not_create_marker_if_a_similar_one_exists() throws CoreException {
+    markerFactory.createErrorIfNecessary(fastValidationMarker.message(), fastValidationMarker.lineNumber());
+    assertThat(file.markerCount(PROTOC), equalTo(0));
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser_parseAndAddMarkerIfNecessary_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser_parseAndAddMarkerIfNecessary_Test.java
index 5a37962..58d02ea 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser_parseAndAddMarkerIfNecessary_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser_parseAndAddMarkerIfNecessary_Test.java
@@ -36,8 +36,8 @@
   }
   
   @Test public void should_attempt_to_create_IMarker_if_line_matches_error_pattern() throws CoreException {
-    String line = "test.proto:23:21: Expected field name";
+    String line = "test.proto:23:21: Expected field name.";
     outputParser.parseAndAddMarkerIfNecessary(line, markerFactory);
-    verify(markerFactory).createErrorIfNecessary("Expected field name", 23);
+    verify(markerFactory).createErrorIfNecessary("Expected field name.", 23);
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory.java
index f62fd06..a1eb6c9 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory.java
@@ -23,7 +23,7 @@
  */
 class ProtocMarkerFactory {
 
-  static final String PROTOC = "com.google.eclipse.protobuf.ui.protocMarker";
+  private static final String PROTOC = "com.google.eclipse.protobuf.ui.protocMarker";
 
   private final IFile file;
   private final IMarker[] markers;
@@ -34,11 +34,11 @@
     markers = file.findMarkers(FAST_VALIDATION, true, DEPTH_INFINITE);
   }
   
-  void createErrorIfNecessary(String description, int lineNumber) throws CoreException {
-    if (containsMarker(description, lineNumber)) return;
+  void createErrorIfNecessary(String message, int lineNumber) throws CoreException {
+    if (containsMarker(message, lineNumber)) return;
     IMarker marker = file.createMarker(PROTOC);
     marker.setAttribute(SEVERITY, SEVERITY_ERROR);
-    marker.setAttribute(MESSAGE, description);
+    marker.setAttribute(MESSAGE, message);
     marker.setAttribute(LINE_NUMBER, lineNumber);
   }
   
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser.java
index f7ba1c6..d4822a2 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser.java
@@ -38,7 +38,7 @@
     Matcher errorMatcher = ERROR_PATTERN.matcher(line);
     if (!errorMatcher.matches()) return;
     int lineNumber = parseInt(errorMatcher.group(2));
-    String description = errorMatcher.group(4);
-    markerFactory.createErrorIfNecessary(description, lineNumber);
+    String message = errorMatcher.group(4);
+    markerFactory.createErrorIfNecessary(message, lineNumber);
   }
 }
