In progress: [ Issue 32 ]  Mapping Xtext syntax errors to protoc ones.
https://code.google.com/p/protobuf-dt/issues/detail?id=32

diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
index a8b9ace..833d9db 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
@@ -9,10 +9,12 @@
 package com.google.eclipse.protobuf;
 
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.parser.antlr.ISyntaxErrorMessageProvider;
 import org.eclipse.xtext.scoping.impl.ImportUriResolver;
 
 import com.google.eclipse.protobuf.naming.ProtobufQualifiedNameProvider;
 import com.google.eclipse.protobuf.scoping.ImportUriFixerAndResolver;
+import com.google.eclipse.protobuf.validation.ProtobufSyntaxErrorMessageProvider;
 import com.google.inject.Binder;
 
 /**
@@ -28,4 +30,8 @@
   public void configureImportUriResolver(Binder binder) {
     binder.bind(ImportUriResolver.class).to(ImportUriFixerAndResolver.class);
   }
+
+  public void configureSyntaxErrorMessageProvider(Binder binder) {
+    binder.bind(ISyntaxErrorMessageProvider.class).to(ProtobufSyntaxErrorMessageProvider.class);
+  }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
index 8a0cc00..2bdff31 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
@@ -81,12 +81,12 @@
     for (Import anImport : root.getImports()) {
       URI importUri = createURI(uriResolver.apply(anImport));
       Resource imported = resourceSet.getResource(importUri, true);
-      descriptions.addAll(describeTypesUsingQualifiedNames(imported));
+      descriptions.addAll(innerTypes(imported));
     }
     return descriptions;
   }
 
-  private Collection<IEObjectDescription> describeTypesUsingQualifiedNames(Resource resource) {
+  private Collection<IEObjectDescription> innerTypes(Resource resource) {
     List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
     TreeIterator<Object> contents = getAllContents(resource, true);
     while (contents.hasNext()) {
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.java
new file mode 100644
index 0000000..52c5409
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.java
@@ -0,0 +1,29 @@
+/*
+ * 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.validation;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Messages extends NLS {
+
+  static {
+    Class<Messages> targetType = Messages.class;
+    NLS.initializeMessages(targetType.getName(), targetType);
+  }
+
+  private Messages() {}
+
+  public static String Error_expectedFieldName;
+  public static String Error_expectedFieldNumber;
+  public static String Error_missingFieldNumber;
+  public static String Error_fieldNumbersMustBePositive;
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.properties b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.properties
new file mode 100644
index 0000000..6ececf8
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.properties
@@ -0,0 +1,4 @@
+Error_expectedFieldName = Expected field name.
+Error_expectedFieldNumber = Expected field number.
+Error_missingFieldNumber = Missing field number.
+Error_fieldNumbersMustBePositive = Field numbers must be positive integers.
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
index 158aa1b..94a11a8 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
@@ -8,6 +8,8 @@
  */
 package com.google.eclipse.protobuf.validation;
 
+import static com.google.eclipse.protobuf.validation.Messages.*;
+
 import org.eclipse.xtext.validation.Check;
 
 import com.google.eclipse.protobuf.protobuf.Property;
@@ -22,9 +24,10 @@
    * @param property the given property.
    */
   @Check public void checkTagNumberIsGreaterThanZero(Property property) {
+    if (property.getName() == null) return; // we already show an error if name is null, no need to go further.
     int index = property.getIndex();
     if (index > 0) return;
-    String msg = (index == 0) ? "Field numbers must be positive integers." : "Expected field number.";
+    String msg = (index == 0) ? Error_fieldNumbersMustBePositive : Error_expectedFieldNumber;
     error(msg, property.eClass().getEStructuralFeature("index"));
   }
 
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufSyntaxErrorMessageProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufSyntaxErrorMessageProvider.java
new file mode 100644
index 0000000..b35c79a
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufSyntaxErrorMessageProvider.java
@@ -0,0 +1,44 @@
+/*
+ * 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.validation;
+
+import static com.google.eclipse.protobuf.validation.Messages.*;
+import static org.eclipse.xtext.diagnostics.Diagnostic.SYNTAX_DIAGNOSITC;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.nodemodel.SyntaxErrorMessage;
+import org.eclipse.xtext.parser.antlr.SyntaxErrorMessageProvider;
+
+import com.google.eclipse.protobuf.protobuf.Property;
+
+/**
+ * Messages for syntax errors.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProtobufSyntaxErrorMessageProvider extends SyntaxErrorMessageProvider {
+
+  @Override public SyntaxErrorMessage getSyntaxErrorMessage(IParserErrorContext context) {
+    String message = context.getDefaultMessage();
+    EObject currentContext = context.getCurrentContext();
+    if (currentContext instanceof Property) message = mapToProtocMessage((Property) currentContext, message);
+    return new SyntaxErrorMessage(message, SYNTAX_DIAGNOSITC);
+  }
+
+  private String mapToProtocMessage(Property property, String message) {
+    if (message.contains("RULE_ID") && property.getName() == null) return Error_expectedFieldName;
+    if (message.equals("mismatched input ';' expecting '='") && property.getIndex() == 0) return Error_missingFieldNumber;
+    return message;
+  }
+
+  @Override public SyntaxErrorMessage getSyntaxErrorMessage(IValueConverterErrorContext context) {
+    return new SyntaxErrorMessage(context.getDefaultMessage(), SYNTAX_DIAGNOSITC);
+  }
+
+}