Browse Source

Remove unnecessary casts in switch tests

pull/887/head
Siegfried Pammer 8 years ago
parent
commit
1bff19a7ce
  1. 24
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 2
      ICSharpCode.Decompiler/CSharp/StatementBuilder.cs
  3. 2
      ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

24
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -93,19 +93,21 @@ namespace ICSharpCode.Decompiler.CSharp @@ -93,19 +93,21 @@ namespace ICSharpCode.Decompiler.CSharp
return astType;
}
public ExpressionWithResolveResult ConvertConstantValue(ResolveResult rr)
public ExpressionWithResolveResult ConvertConstantValue(ResolveResult rr, bool allowImplicitConversion = false)
{
var expr = astBuilder.ConvertConstantValue(rr);
if (expr is NullReferenceExpression && rr.Type.Kind != TypeKind.Null) {
expr = new CastExpression(ConvertType(rr.Type), expr);
} else {
switch (rr.Type.GetDefinition()?.KnownTypeCode) {
case KnownTypeCode.SByte:
case KnownTypeCode.Byte:
case KnownTypeCode.Int16:
case KnownTypeCode.UInt16:
expr = new CastExpression(new PrimitiveType(KnownTypeReference.GetCSharpNameByTypeCode(rr.Type.GetDefinition().KnownTypeCode)), expr);
break;
if (!allowImplicitConversion) {
if (expr is NullReferenceExpression && rr.Type.Kind != TypeKind.Null) {
expr = new CastExpression(ConvertType(rr.Type), expr);
} else {
switch (rr.Type.GetDefinition()?.KnownTypeCode) {
case KnownTypeCode.SByte:
case KnownTypeCode.Byte:
case KnownTypeCode.Int16:
case KnownTypeCode.UInt16:
expr = new CastExpression(new PrimitiveType(KnownTypeReference.GetCSharpNameByTypeCode(rr.Type.GetDefinition().KnownTypeCode)), expr);
break;
}
}
}
var exprRR = expr.Annotation<ResolveResult>();

2
ICSharpCode.Decompiler/CSharp/StatementBuilder.cs

@ -96,7 +96,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -96,7 +96,7 @@ namespace ICSharpCode.Decompiler.CSharp
} else {
value = CSharpPrimitiveCast.Cast(ReflectionHelper.GetTypeCode(type), i, false);
}
return new CaseLabel(exprBuilder.ConvertConstantValue(new ConstantResolveResult(type, value)));
return new CaseLabel(exprBuilder.ConvertConstantValue(new ConstantResolveResult(type, value), allowImplicitConversion: true));
}
protected internal override Statement VisitSwitchInstruction(SwitchInstruction inst)

2
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

@ -296,7 +296,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -296,7 +296,7 @@ namespace ICSharpCode.Decompiler.CSharp
}
var rr = expressionBuilder.resolver.WithCheckForOverflow(checkForOverflow).ResolveCast(targetType, ResolveResult);
if (rr.IsCompileTimeConstant && !rr.IsError) {
return expressionBuilder.ConvertConstantValue(rr)
return expressionBuilder.ConvertConstantValue(rr, allowImplicitConversion)
.WithILInstruction(this.ILInstructions);
}
if (targetType.Kind == TypeKind.Pointer && (0.Equals(ResolveResult.ConstantValue) || 0u.Equals(ResolveResult.ConstantValue))) {

Loading…
Cancel
Save