Browse Source

implement special cases for enum type inference; closes #248

pull/348/head
Siegfried Pammer 13 years ago
parent
commit
91b74550fe
  1. 13
      ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs
  2. 10
      ICSharpCode.Decompiler/Tests/TypeAnalysisTests.cs

13
ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs

@ -1004,6 +1004,19 @@ namespace ICSharpCode.Decompiler.ILAst @@ -1004,6 +1004,19 @@ namespace ICSharpCode.Decompiler.ILAst
InferTypeForExpression(right, typeSystem.IntPtr);
return leftPreferred;
}
if (IsEnum(leftPreferred)) {
if (expectedType != null && IsEnum(expectedType)) {
// E-U=E
left.InferredType = left.ExpectedType = leftPreferred;
InferTypeForExpression(right, GetEnumUnderlyingType(leftPreferred));
return leftPreferred;
} else {
// E-E=U
left.InferredType = left.ExpectedType = leftPreferred;
InferTypeForExpression(right, leftPreferred);
return GetEnumUnderlyingType(leftPreferred);
}
}
return InferBinaryArguments(left, right, expectedType, leftPreferred: leftPreferred);
}

10
ICSharpCode.Decompiler/Tests/TypeAnalysisTests.cs

@ -140,4 +140,14 @@ public class TypeAnalysisTests @@ -140,4 +140,14 @@ public class TypeAnalysisTests
{
return new byte[length];
}
public StringComparison EnumDiffNumber(StringComparison data)
{
return data - 1;
}
public int EnumDiff(StringComparison a, StringComparison b)
{
return Math.Abs(a - b);
}
}

Loading…
Cancel
Save