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
internal ExpressionWithResolveResult GetDefaultValueExpression(IType type) internal ExpressionWithResolveResult GetDefaultValueExpression(IType type)
{ {
var expr = type.IsReferenceType == true ? (Expression)new NullReferenceExpression() : new DefaultValueExpression(ConvertType(type)); Expression expr;
var constantType = type.IsReferenceType == true ? SpecialType.NullType : type; 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)); return expr.WithRR(new ConstantResolveResult(constantType, null));
} }

30
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

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

Loading…
Cancel
Save