提交 dc19ae4f 编写于 作者: C Cyrus Najmabadi

Simplify

上级 6db545eb
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Diagnostics;
using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.DiaSymReader; using Microsoft.DiaSymReader;
using Roslyn.Utilities; using Roslyn.Utilities;
...@@ -82,175 +81,82 @@ public static ConstantValue GetSymConstantValue(ITypeSymbol type, object symValu ...@@ -82,175 +81,82 @@ public static ConstantValue GetSymConstantValue(ITypeSymbol type, object symValu
type = ((INamedTypeSymbol)type).EnumUnderlyingType; type = ((INamedTypeSymbol)type).EnumUnderlyingType;
} }
short shortValue; return type.SpecialType switch
switch (type.SpecialType)
{ {
case SpecialType.System_Boolean: SpecialType.System_Boolean => symValue is short shortVal
if (!(symValue is short)) ? ConstantValue.Create(shortVal != 0)
{ : ConstantValue.Bad,
return ConstantValue.Bad;
}
return ConstantValue.Create((short)symValue != 0); SpecialType.System_Byte => symValue is short shortVal && unchecked((byte)shortVal) == shortVal
? ConstantValue.Create((byte)shortVal)
: ConstantValue.Bad,
case SpecialType.System_Byte: SpecialType.System_SByte => symValue is short shortVal && unchecked((sbyte)shortVal) == shortVal
if (!(symValue is short)) ? ConstantValue.Create((sbyte)shortVal)
{ : ConstantValue.Bad,
return ConstantValue.Bad;
}
shortValue = (short)symValue; SpecialType.System_Int16 => symValue is short shortVal
if (unchecked((byte)shortValue) != shortValue) ? ConstantValue.Create(shortVal)
{ : ConstantValue.Bad,
return ConstantValue.Bad;
}
return ConstantValue.Create((byte)shortValue); SpecialType.System_Char => symValue is ushort ushortVal
? ConstantValue.Create((char)ushortVal)
: ConstantValue.Bad,
case SpecialType.System_SByte: SpecialType.System_UInt16 => symValue is ushort ushortVal
if (!(symValue is short)) ? ConstantValue.Create(ushortVal)
{ : ConstantValue.Bad,
return ConstantValue.Bad;
}
shortValue = (short)symValue; SpecialType.System_Int32 => symValue is int intVal
if (unchecked((sbyte)shortValue) != shortValue) ? ConstantValue.Create(intVal)
{ : ConstantValue.Bad,
return ConstantValue.Bad;
}
return ConstantValue.Create((sbyte)shortValue); SpecialType.System_UInt32 => symValue is uint uintVal
? ConstantValue.Create(uintVal)
: ConstantValue.Bad,
case SpecialType.System_Int16: SpecialType.System_Int64 => symValue is long longVal
if (!(symValue is short)) ? ConstantValue.Create(longVal)
{ : ConstantValue.Bad,
return ConstantValue.Bad;
}
return ConstantValue.Create((short)symValue); SpecialType.System_UInt64 => symValue is ulong ulongVal
? ConstantValue.Create(ulongVal)
: ConstantValue.Bad,
case SpecialType.System_Char: SpecialType.System_Single => symValue is float floatVal
if (!(symValue is ushort)) ? ConstantValue.Create(floatVal)
{ : ConstantValue.Bad,
return ConstantValue.Bad;
}
return ConstantValue.Create((char)(ushort)symValue); SpecialType.System_Double => symValue is double doubleVal
? ConstantValue.Create(doubleVal)
: ConstantValue.Bad,
case SpecialType.System_UInt16: SpecialType.System_String => symValue switch
if (!(symValue is ushort)) {
{ 0 => ConstantValue.Null,
return ConstantValue.Bad; null => ConstantValue.Create(string.Empty),
} string str => ConstantValue.Create(str),
_ => ConstantValue.Bad,
return ConstantValue.Create((ushort)symValue); },
case SpecialType.System_Int32: SpecialType.System_Object => symValue is 0
if (!(symValue is int)) ? ConstantValue.Null
{ : ConstantValue.Bad,
return ConstantValue.Bad;
} SpecialType.System_Decimal => symValue is decimal decimalValue
? ConstantValue.Create(decimalValue)
return ConstantValue.Create((int)symValue); : ConstantValue.Bad,
case SpecialType.System_UInt32: SpecialType.System_DateTime => symValue is double doubleVal
if (!(symValue is uint)) ? ConstantValue.Create(DateTimeUtilities.ToDateTime(doubleVal))
{ : ConstantValue.Bad,
return ConstantValue.Bad;
} SpecialType.None => type.IsReferenceType && symValue is 0
? ConstantValue.Null
return ConstantValue.Create((uint)symValue); : ConstantValue.Bad,
case SpecialType.System_Int64: _ => ConstantValue.Bad,
if (!(symValue is long)) };
{
return ConstantValue.Bad;
}
return ConstantValue.Create((long)symValue);
case SpecialType.System_UInt64:
if (!(symValue is ulong))
{
return ConstantValue.Bad;
}
return ConstantValue.Create((ulong)symValue);
case SpecialType.System_Single:
if (!(symValue is float))
{
return ConstantValue.Bad;
}
return ConstantValue.Create((float)symValue);
case SpecialType.System_Double:
if (!(symValue is double))
{
return ConstantValue.Bad;
}
return ConstantValue.Create((double)symValue);
case SpecialType.System_String:
if (symValue is int intVal1 && intVal1 == 0)
{
return ConstantValue.Null;
}
if (symValue == null)
{
return ConstantValue.Create(string.Empty);
}
if (!(symValue is string str))
{
return ConstantValue.Bad;
}
return ConstantValue.Create(str);
case SpecialType.System_Object:
if (symValue is int intVal2 && intVal2 == 0)
{
return ConstantValue.Null;
}
return ConstantValue.Bad;
case SpecialType.System_Decimal:
if (!(symValue is decimal decimalValue))
{
return ConstantValue.Bad;
}
return ConstantValue.Create(decimalValue);
case SpecialType.System_DateTime:
if (!(symValue is double))
{
return ConstantValue.Bad;
}
return ConstantValue.Create(DateTimeUtilities.ToDateTime((double)symValue));
case SpecialType.None:
if (type.IsReferenceType)
{
if (symValue is int intValue3 && intValue3 == 0)
{
return ConstantValue.Null;
}
return ConstantValue.Bad;
}
return ConstantValue.Bad;
default:
return ConstantValue.Bad;
}
} }
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册