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);