提交 cfd156be 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #14944 from mattwar/Issue14943

Add DateTime support back to serializer
...@@ -528,6 +528,8 @@ public void TestFalseBooleanArray() ...@@ -528,6 +528,8 @@ public void TestFalseBooleanArray()
TestRoundTripMember(inputBool); TestRoundTripMember(inputBool);
} }
private static readonly DateTime _testNow = DateTime.Now;
[Fact] [Fact]
public void TestPrimitiveValues() public void TestPrimitiveValues()
{ {
...@@ -562,6 +564,7 @@ public void TestPrimitiveValues() ...@@ -562,6 +564,7 @@ public void TestPrimitiveValues()
TestRoundTripValue(ELong.Value); TestRoundTripValue(ELong.Value);
TestRoundTripValue(EULong.Value); TestRoundTripValue(EULong.Value);
TestRoundTripValue(typeof(object)); TestRoundTripValue(typeof(object));
TestRoundTripValue(_testNow);
} }
[Fact] [Fact]
...@@ -638,6 +641,7 @@ public void TestPrimitiveMemberValues() ...@@ -638,6 +641,7 @@ public void TestPrimitiveMemberValues()
TestRoundTripMember(ELong.Value); TestRoundTripMember(ELong.Value);
TestRoundTripMember(EULong.Value); TestRoundTripMember(EULong.Value);
TestRoundTripMember(typeof(object)); TestRoundTripMember(typeof(object));
TestRoundTripMember(_testNow);
} }
[Fact] [Fact]
...@@ -783,6 +787,7 @@ private static void TestWritingPrimitiveValues(ObjectWriter writer) ...@@ -783,6 +787,7 @@ private static void TestWritingPrimitiveValues(ObjectWriter writer)
writer.WriteValue(ELong.Value); writer.WriteValue(ELong.Value);
writer.WriteValue(EULong.Value); writer.WriteValue(EULong.Value);
writer.WriteValue(typeof(object)); writer.WriteValue(typeof(object));
writer.WriteValue(_testNow);
} }
private static void TestReadingPrimitiveValues(ObjectReader reader) private static void TestReadingPrimitiveValues(ObjectReader reader)
...@@ -818,6 +823,7 @@ private static void TestReadingPrimitiveValues(ObjectReader reader) ...@@ -818,6 +823,7 @@ private static void TestReadingPrimitiveValues(ObjectReader reader)
Assert.Equal(ELong.Value, reader.ReadValue()); Assert.Equal(ELong.Value, reader.ReadValue());
Assert.Equal(EULong.Value, reader.ReadValue()); Assert.Equal(EULong.Value, reader.ReadValue());
Assert.Equal(typeof(object), (Type)reader.ReadValue()); Assert.Equal(typeof(object), (Type)reader.ReadValue());
Assert.Equal(_testNow, (DateTime)reader.ReadValue());
} }
public enum EByte : byte public enum EByte : byte
......
...@@ -372,6 +372,8 @@ private Variant ReadVariant() ...@@ -372,6 +372,8 @@ private Variant ReadVariant()
return Variant.FromType(ReadType(kind)); return Variant.FromType(ReadType(kind));
case EncodingKind.Enum: case EncodingKind.Enum:
return Variant.FromBoxedEnum(ReadBoxedEnum()); return Variant.FromBoxedEnum(ReadBoxedEnum());
case EncodingKind.DateTime:
return Variant.FromDateTime(DateTime.FromBinary(_reader.ReadInt64()));
case EncodingKind.Array: case EncodingKind.Array:
case EncodingKind.Array_0: case EncodingKind.Array_0:
case EncodingKind.Array_1: case EncodingKind.Array_1:
......
...@@ -302,6 +302,11 @@ private void WriteVariant(Variant value) ...@@ -302,6 +302,11 @@ private void WriteVariant(Variant value)
WriteBoxedEnum(e, e.GetType()); WriteBoxedEnum(e, e.GetType());
break; break;
case VariantKind.DateTime:
_writer.Write((byte)EncodingKind.DateTime);
_writer.Write(value.AsDateTime().ToBinary());
break;
case VariantKind.Type: case VariantKind.Type:
WriteType(value.AsType()); WriteType(value.AsType());
break; break;
...@@ -1283,6 +1288,11 @@ internal enum EncodingKind : byte ...@@ -1283,6 +1288,11 @@ internal enum EncodingKind : byte
/// </summary> /// </summary>
Enum, Enum,
/// <summary>
/// A DateTime value
/// </summary>
DateTime,
/// <summary> /// <summary>
/// An array with length encoded as compressed uint /// An array with length encoded as compressed uint
/// </summary> /// </summary>
...@@ -1339,6 +1349,7 @@ internal enum VariantKind ...@@ -1339,6 +1349,7 @@ internal enum VariantKind
String, String,
Object, Object,
BoxedEnum, BoxedEnum,
DateTime,
Array, Array,
Type Type
} }
...@@ -1434,6 +1445,11 @@ public static Variant FromBoxedEnum(object value) ...@@ -1434,6 +1445,11 @@ public static Variant FromBoxedEnum(object value)
return new Variant(VariantKind.BoxedEnum, image: 0, instance: value); return new Variant(VariantKind.BoxedEnum, image: 0, instance: value);
} }
public static Variant FromDateTime(DateTime value)
{
return new Variant(VariantKind.DateTime, image: value.ToBinary(), instance: null);
}
public static Variant FromType(Type value) public static Variant FromType(Type value)
{ {
return new Variant(VariantKind.Type, image: 0, instance: value); return new Variant(VariantKind.Type, image: 0, instance: value);
...@@ -1545,6 +1561,12 @@ public object AsBoxedEnum() ...@@ -1545,6 +1561,12 @@ public object AsBoxedEnum()
return _instance; return _instance;
} }
public DateTime AsDateTime()
{
Debug.Assert(Kind == VariantKind.DateTime);
return DateTime.FromBinary((long)_image);
}
public Type AsType() public Type AsType()
{ {
Debug.Assert(Kind == VariantKind.Type); Debug.Assert(Kind == VariantKind.Type);
...@@ -1628,6 +1650,10 @@ public static Variant FromBoxedObject(object value) ...@@ -1628,6 +1650,10 @@ public static Variant FromBoxedObject(object value)
{ {
return FromDouble((double)value); return FromDouble((double)value);
} }
else if (type == typeof(DateTime))
{
return FromDateTime((DateTime)value);
}
else if (type.IsArray) else if (type.IsArray)
{ {
var instance = (Array)value; var instance = (Array)value;
...@@ -1664,6 +1690,8 @@ public object ToBoxedObject() ...@@ -1664,6 +1690,8 @@ public object ToBoxedObject()
return this.AsByte(); return this.AsByte();
case VariantKind.Char: case VariantKind.Char:
return this.AsChar(); return this.AsChar();
case VariantKind.DateTime:
return this.AsDateTime();
case VariantKind.Decimal: case VariantKind.Decimal:
return this.AsDecimal(); return this.AsDecimal();
case VariantKind.Float4: case VariantKind.Float4:
......
...@@ -37,6 +37,16 @@ End Class ...@@ -37,6 +37,16 @@ End Class
</Foo>.Value) </Foo>.Value)
End Sub End Sub
<Fact>
Public Sub TestRoundTripDateTimeLiteral()
Dim x As DateTime = #10/5/2015#
RoundTrip(<Foo>
Public Class C
Private _x As DateTime = #10/5/2015#
End Class
</Foo>.Value)
End Sub
<Fact> <Fact>
Public Sub TestRoundTripSyntaxNodeWithDiagnostics() Public Sub TestRoundTripSyntaxNodeWithDiagnostics()
Dim text = <Foo> Dim text = <Foo>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册