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
return astType; return astType;
} }
public ExpressionWithResolveResult ConvertConstantValue(ResolveResult rr) public ExpressionWithResolveResult ConvertConstantValue(ResolveResult rr, bool allowImplicitConversion = false)
{ {
var expr = astBuilder.ConvertConstantValue(rr); var expr = astBuilder.ConvertConstantValue(rr);
if (expr is NullReferenceExpression && rr.Type.Kind != TypeKind.Null) { if (!allowImplicitConversion) {
expr = new CastExpression(ConvertType(rr.Type), expr); if (expr is NullReferenceExpression && rr.Type.Kind != TypeKind.Null) {
} else { expr = new CastExpression(ConvertType(rr.Type), expr);
switch (rr.Type.GetDefinition()?.KnownTypeCode) { } else {
case KnownTypeCode.SByte: switch (rr.Type.GetDefinition()?.KnownTypeCode) {
case KnownTypeCode.Byte: case KnownTypeCode.SByte:
case KnownTypeCode.Int16: case KnownTypeCode.Byte:
case KnownTypeCode.UInt16: case KnownTypeCode.Int16:
expr = new CastExpression(new PrimitiveType(KnownTypeReference.GetCSharpNameByTypeCode(rr.Type.GetDefinition().KnownTypeCode)), expr); case KnownTypeCode.UInt16:
break; expr = new CastExpression(new PrimitiveType(KnownTypeReference.GetCSharpNameByTypeCode(rr.Type.GetDefinition().KnownTypeCode)), expr);
break;
}
} }
} }
var exprRR = expr.Annotation<ResolveResult>(); var exprRR = expr.Annotation<ResolveResult>();

2
ICSharpCode.Decompiler/CSharp/StatementBuilder.cs

@ -96,7 +96,7 @@ namespace ICSharpCode.Decompiler.CSharp
} else { } else {
value = CSharpPrimitiveCast.Cast(ReflectionHelper.GetTypeCode(type), i, false); 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) protected internal override Statement VisitSwitchInstruction(SwitchInstruction inst)

2
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

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

Loading…
Cancel
Save