Fixed: [Issue 126] Protobuf Editor does not recognize 'inf' as a default
value for double
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/DOUBLEValueConverter_toValue_Test.java
similarity index 67%
rename from com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_Test.java
rename to com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/DOUBLEValueConverter_toValue_Test.java
index 03e58d8..6804161 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/DOUBLEValueConverter_toValue_Test.java
@@ -8,6 +8,7 @@
  */
 package com.google.eclipse.protobuf.conversion;
 
+import static java.lang.Double.*;
 import static java.util.Arrays.asList;
 import static org.hamcrest.core.IsEqual.equalTo;
 import static org.junit.Assert.assertThat;
@@ -24,45 +25,47 @@
 import com.google.eclipse.protobuf.junit.core.XtextRule;
 
 /**
- * Tests for <code>{@link FLOATValueConverter#toValue(String, INode)}</code>.
+ * Tests for <code>{@link DOUBLEValueConverter#toValue(String, INode)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
 @RunWith(Parameterized.class)
-public class FLOATValueConverter_toValue_Test {
+public class DOUBLEValueConverter_toValue_Test {
 
   @Rule public XtextRule xtext = new XtextRule();
 
   private final String input;
-  private final Float expected;
+  private final Double expected;
 
   @Parameters
   public static Collection<Object[]> parameters() {
     return asList(new Object[][] {
-      { "52e3", 52e3F },
-      { "52E3", 52e3F },
-      { "6e-3", 0.006F },
-      { "6.8", 6.8F },
-      { "-3.1", -3.1F },
-      { ".3", 0.3F }
+      { "52e3", 52e3D },
+      { "52E3", 52e3D },
+      { "6e-3", 0.006D },
+      { "6.8", 6.8D },
+      { "-3.1", -3.1D },
+      { ".3", 0.3D },
+      { "nan", NaN },
+      { "inf", POSITIVE_INFINITY }
     });
   }
 
-  public FLOATValueConverter_toValue_Test(String input, Float expected) {
+  public DOUBLEValueConverter_toValue_Test(String input, Double expected) {
     this.input = input;
     this.expected = expected;
   }
 
-  private FLOATValueConverter converter;
+  private DOUBLEValueConverter converter;
   private INode node;
 
   @Before public void setUp() {
     node = mock(INode.class);
-    converter = xtext.injector().getInstance(FLOATValueConverter.class);
+    converter = xtext.injector().getInstance(DOUBLEValueConverter.class);
   }
 
   @Test public void should_parse_hexadecimal_number() {
-    Float value = converter.toValue(input, node);
+    Double value = converter.toValue(input, node);
     assertThat(value, equalTo(expected));
   }
 }
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_withInvalidInput_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_withInvalidInput_Test.java
index a2957f4..7dc34e3 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_withInvalidInput_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_withInvalidInput_Test.java
@@ -22,7 +22,7 @@
 import com.google.eclipse.protobuf.junit.core.XtextRule;
 
 /**
- * Tests for <code>{@link FLOATValueConverter#toValue(String, INode)}</code>.
+ * Tests for <code>{@link DOUBLEValueConverter#toValue(String, INode)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
@@ -31,12 +31,12 @@
   @Rule public XtextRule xtext = new XtextRule();
   @Rule public ExpectedException thrown = none();
 
-  private FLOATValueConverter converter;
+  private DOUBLEValueConverter converter;
   private INode node;
 
   @Before public void setUp() {
     node = mock(INode.class);
-    converter = xtext.injector().getInstance(FLOATValueConverter.class);
+    converter = xtext.injector().getInstance(DOUBLEValueConverter.class);
   }
 
   @Test public void should_throw_error_if_input_is_null() {
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
index 84ba83c..ad6e825 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
@@ -106,7 +106,7 @@
   name=Name ':' value=SimpleRef;
 
 SimpleRef:
-	LiteralRef | BooleanRef | NumberRef | StringRef | Nan;
+	LiteralRef | BooleanRef | NumberRef | StringRef;
 
 LiteralRef:
   literal=[Literal];
@@ -119,7 +119,7 @@
   | false;
 
 NumberRef:
-  HexRef | LongRef | FloatRef;
+  HexRef | LongRef | DoubleRef;
 
 HexRef:
   hex=HEX;
@@ -130,11 +130,11 @@
 terminal LONG returns ecore::ELong:
   ('-')? (NUMBER)+;
 
-FloatRef:
-  float=FLOAT;
+DoubleRef:
+  double=DOUBLE;
 
-terminal FLOAT returns ecore::EFloat:
-  ('-')? (NUMBER)* ('.' (NUMBER)+)? (('e'|'E')('-')? (NUMBER)+)?;
+terminal DOUBLE returns ecore::EDouble:
+  (('-')? (NUMBER)* ('.' (NUMBER)+)? (('e'|'E')('-')? (NUMBER)+)?) | 'nan' | 'inf';
 
 StringRef:
   string=STRING;
@@ -147,9 +147,6 @@
 
 terminal UNICODE_OCTAL:
   ('0'..'3')('0'..'7')('0'..'7');
-  
-Nan:
-  number='nan';
 
 Enum:
   'enum' name=Name '{'
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/DOUBLEValueConverter.java
similarity index 72%
rename from com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter.java
rename to com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/DOUBLEValueConverter.java
index 930b070..cec6067 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/DOUBLEValueConverter.java
@@ -8,6 +8,8 @@
  */
 package com.google.eclipse.protobuf.conversion;
 
+import static java.lang.Double.*;
+import static java.lang.Double.NaN;
 import static org.eclipse.xtext.util.Strings.isEmpty;
 
 import org.eclipse.xtext.conversion.ValueConverterException;
@@ -15,11 +17,11 @@
 import org.eclipse.xtext.nodemodel.INode;
 
 /**
- * Converts floating-point numbers to {@code float}s.
+ * Converts floating-point numbers to {@code double}s.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class FLOATValueConverter extends AbstractLexerBasedConverter<Float> {
+public class DOUBLEValueConverter extends AbstractLexerBasedConverter<Double> {
 
   /**
    * Creates an {@code float} from the given input, if the given input represents a floating-point number.
@@ -29,16 +31,18 @@
    * @throws ValueConverterException if the given input is {@code null}, empty or does not represent a floating-point 
    * number.
    */
-  public Float toValue(String string, INode node) throws ValueConverterException {
-    if (isEmpty(string)) throw new ValueConverterException("Couldn't convert empty string to float.", node, null);
+  public Double toValue(String string, INode node) throws ValueConverterException {
+    if (isEmpty(string)) throw new ValueConverterException("Couldn't convert empty string to double.", node, null);
+    if ("nan".equals(string)) return NaN;
+    if ("inf".equals(string)) return POSITIVE_INFINITY;
     try {
-      return Float.parseFloat(string);
+      return Double.parseDouble(string);
     } catch (NumberFormatException e) {
       throw parsingError(string, node, e);
     }
   }
 
   private ValueConverterException parsingError(String string, INode node, Exception cause) {
-    return new ValueConverterException("Couldn't convert '" + string + "' to float.", node, cause);
+    return new ValueConverterException("Couldn't convert '" + string + "' to double.", node, cause);
   }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/ProtobufTerminalConverters.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/ProtobufTerminalConverters.java
index e4ac026..d778e94 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/ProtobufTerminalConverters.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/ProtobufTerminalConverters.java
@@ -18,14 +18,14 @@
  */
 public class ProtobufTerminalConverters extends DefaultTerminalConverters {
 
-  @Inject private FLOATValueConverter floatValueConverter;
+  @Inject private DOUBLEValueConverter doubleValueConverter;
   @Inject private HEXValueConverter hexValueConverter;
   @Inject private LONGValueConverter longValueConverter;
   @Inject private STRINGValueConverter stringValueConverter;
   
-  @ValueConverter(rule = "FLOAT")
-  public IValueConverter<Float> FLOAT() {
-    return floatValueConverter;
+  @ValueConverter(rule = "DOUBLE")
+  public IValueConverter<Double> DOUBLE() {
+    return doubleValueConverter;
   }
   
   @ValueConverter(rule = "HEX")
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/Properties.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/Properties.java
index 625ca65..df6ed1c 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/Properties.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/Properties.java
@@ -55,6 +55,11 @@
     return isScalarType(p, BOOL);
   }
 
+  /**
+   * Indicates whether the given property can accept "nan" as its default value.
+   * @param p the given property.
+   * @return {@code true} if the given property  can accept "nan" as its default value, {@code false} otherwise.
+   */
   public boolean mayBeNan(Property p) {
     String typeName = typeNameOf(p);
     return FLOAT.hasValue(typeName) || DOUBLE.hasValue(typeName);