Browse Source

Fix duplicate ResolveResult on ConvertConstantValue()

pull/728/head
Daniel Grunwald 11 years ago
parent
commit
ad8d4a7ef6
  1. 7
      ICSharpCode.Decompiler/CSharp/Annotations.cs
  2. 15
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  3. 5
      ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs
  4. 2
      ILSpy/Properties/app.config.template

7
ICSharpCode.Decompiler/CSharp/Annotations.cs

@ -57,6 +57,13 @@ namespace ICSharpCode.Decompiler.CSharp
return new TranslatedExpression(expression.Expression, expression.ResolveResult); return new TranslatedExpression(expression.Expression, expression.ResolveResult);
} }
public static TranslatedExpression WithILInstruction(this ExpressionWithResolveResult expression, IEnumerable<ILInstruction> instructions)
{
foreach (var inst in instructions)
expression.Expression.AddAnnotation(inst);
return new TranslatedExpression(expression.Expression, expression.ResolveResult);
}
public static TranslatedExpression WithoutILInstruction(this ExpressionWithResolveResult expression) public static TranslatedExpression WithoutILInstruction(this ExpressionWithResolveResult expression)
{ {
return new TranslatedExpression(expression.Expression, expression.ResolveResult); return new TranslatedExpression(expression.Expression, expression.ResolveResult);

15
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -40,7 +40,7 @@ namespace ICSharpCode.Decompiler.CSharp
{ {
internal readonly ICompilation compilation; internal readonly ICompilation compilation;
internal readonly CSharpResolver resolver; internal readonly CSharpResolver resolver;
internal readonly TypeSystemAstBuilder astBuilder; readonly TypeSystemAstBuilder astBuilder;
public ExpressionBuilder(ITypeResolveContext decompilationContext) public ExpressionBuilder(ITypeResolveContext decompilationContext)
{ {
@ -55,10 +55,21 @@ namespace ICSharpCode.Decompiler.CSharp
public AstType ConvertType(IType type) public AstType ConvertType(IType type)
{ {
var astType = astBuilder.ConvertType(type); var astType = astBuilder.ConvertType(type);
astType.AddAnnotation(new TypeResolveResult(type)); Debug.Assert(astType.Annotation<TypeResolveResult>() != null);
return astType; return astType;
} }
public ExpressionWithResolveResult ConvertConstantValue(ResolveResult rr)
{
var expr = astBuilder.ConvertConstantValue(rr);
var exprRR = expr.Annotation<ResolveResult>();
if (exprRR == null) {
exprRR = rr;
expr.AddAnnotation(rr);
}
return new ExpressionWithResolveResult(expr, exprRR);
}
public TranslatedExpression Translate(ILInstruction inst) public TranslatedExpression Translate(ILInstruction inst)
{ {
Debug.Assert(inst != null); Debug.Assert(inst != null);

5
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

@ -172,9 +172,8 @@ namespace ICSharpCode.Decompiler.CSharp
} }
var rr = expressionBuilder.resolver.ResolveCast(targetType, ResolveResult); var rr = expressionBuilder.resolver.ResolveCast(targetType, ResolveResult);
if (rr.IsCompileTimeConstant && !rr.IsError) { if (rr.IsCompileTimeConstant && !rr.IsError) {
return expressionBuilder.astBuilder.ConvertConstantValue(rr) return expressionBuilder.ConvertConstantValue(rr)
.WithILInstruction(this.ILInstructions) .WithILInstruction(this.ILInstructions);
.WithRR(rr);
} }
return Expression.CastTo(expressionBuilder.ConvertType(targetType)) return Expression.CastTo(expressionBuilder.ConvertType(targetType))
.WithoutILInstruction().WithRR(rr); .WithoutILInstruction().WithRR(rr);

2
ILSpy/Properties/app.config.template

@ -13,7 +13,7 @@
</dependentAssembly> </dependentAssembly>
<dependentAssembly> <dependentAssembly>
<assemblyIdentity name="ICSharpCode.AvalonEdit" publicKeyToken="9cc39be672370310" culture="neutral"/> <assemblyIdentity name="ICSharpCode.AvalonEdit" publicKeyToken="9cc39be672370310" culture="neutral"/>
<bindingRedirect oldVersion="4.1.0.0-99.9.9.9" newVersion="4.4.2.9744"/> <bindingRedirect oldVersion="4.1.0.0-99.9.9.9" newVersion="5.0.1.0"/>
</dependentAssembly> </dependentAssembly>
<dependentAssembly> <dependentAssembly>
<assemblyIdentity name="ICSharpCode.NRefactory" publicKeyToken="d4bfe873e7598c49" culture="neutral"/> <assemblyIdentity name="ICSharpCode.NRefactory" publicKeyToken="d4bfe873e7598c49" culture="neutral"/>

Loading…
Cancel
Save