Browse Source

Fix #918: Conversion of bool literals to bool? not pretty

pull/946/head
Siegfried Pammer 8 years ago
parent
commit
d783fc68ef
  1. 11
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 30
      ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

11
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -325,8 +325,15 @@ namespace ICSharpCode.Decompiler.CSharp @@ -325,8 +325,15 @@ namespace ICSharpCode.Decompiler.CSharp
internal ExpressionWithResolveResult GetDefaultValueExpression(IType type)
{
var expr = type.IsReferenceType == true ? (Expression)new NullReferenceExpression() : new DefaultValueExpression(ConvertType(type));
var constantType = type.IsReferenceType == true ? SpecialType.NullType : type;
Expression expr;
IType constantType;
if (type.IsReferenceType == true || type.IsKnownType(KnownTypeCode.NullableOfT)) {
expr = new NullReferenceExpression();
constantType = SpecialType.NullType;
} else {
expr = new DefaultValueExpression(ConvertType(type));
constantType = type;
}
return expr.WithRR(new ConstantResolveResult(constantType, null));
}

30
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

@ -173,16 +173,26 @@ namespace ICSharpCode.Decompiler.CSharp @@ -173,16 +173,26 @@ namespace ICSharpCode.Decompiler.CSharp
var type = this.Type;
if (type.Equals(targetType)) {
// Make explicit conversion implicit, if possible
if (allowImplicitConversion && ResolveResult is ConversionResolveResult conversion) {
if (Expression is CastExpression cast
&& (type.IsKnownType(KnownTypeCode.Object) && conversion.Conversion.IsBoxingConversion
|| type.Kind == TypeKind.Delegate && conversion.Conversion.IsAnonymousFunctionConversion
)) {
return this.UnwrapChild(cast.Expression);
} else if (Expression is ObjectCreateExpression oce && conversion.Conversion.IsMethodGroupConversion
&& oce.Arguments.Count == 1 && expressionBuilder.settings.UseImplicitMethodGroupConversion)
{
return this.UnwrapChild(oce.Arguments.Single());
if (allowImplicitConversion) {
switch (ResolveResult) {
case ConversionResolveResult conversion: {
if (Expression is CastExpression cast
&& (type.IsKnownType(KnownTypeCode.Object) && conversion.Conversion.IsBoxingConversion
|| type.Kind == TypeKind.Delegate && conversion.Conversion.IsAnonymousFunctionConversion
)) {
return this.UnwrapChild(cast.Expression);
} else if (Expression is ObjectCreateExpression oce && conversion.Conversion.IsMethodGroupConversion
&& oce.Arguments.Count == 1 && expressionBuilder.settings.UseImplicitMethodGroupConversion) {
return this.UnwrapChild(oce.Arguments.Single());
}
break;
}
case InvocationResolveResult invocation: {
if (Expression is ObjectCreateExpression oce && oce.Arguments.Count == 1 && invocation.Type.IsKnownType(KnownTypeCode.NullableOfT)) {
return this.UnwrapChild(oce.Arguments.Single());
}
break;
}
}
}
return this;

Loading…
Cancel
Save