Browse Source

Remove AST-helper-methods

pull/728/merge
Siegfried Pammer 9 years ago
parent
commit
610f0a922f
  1. 7
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs
  2. 18
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  3. 32
      ICSharpCode.Decompiler/CSharp/Syntax/AstType.cs
  4. 66
      ICSharpCode.Decompiler/CSharp/Syntax/Expressions/AsExpression.cs
  5. 66
      ICSharpCode.Decompiler/CSharp/Syntax/Expressions/AssignmentExpression.cs
  6. 65
      ICSharpCode.Decompiler/CSharp/Syntax/Expressions/BinaryOperatorExpression.cs
  7. 66
      ICSharpCode.Decompiler/CSharp/Syntax/Expressions/CastExpression.cs
  8. 66
      ICSharpCode.Decompiler/CSharp/Syntax/Expressions/ConditionalExpression.cs
  9. 100
      ICSharpCode.Decompiler/CSharp/Syntax/Expressions/Expression.cs
  10. 66
      ICSharpCode.Decompiler/CSharp/Syntax/Expressions/IsExpression.cs
  11. 66
      ICSharpCode.Decompiler/CSharp/Syntax/Expressions/QueryExpression.cs
  12. 8
      ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs
  13. 2
      ICSharpCode.Decompiler/CSharp/Transforms/ConvertConstructorCallIntoInitializer.cs
  14. 14
      ICSharpCode.Decompiler/CSharp/Transforms/CustomPatterns.cs
  15. 23
      ICSharpCode.Decompiler/CSharp/Transforms/ReplaceMethodCallsWithOperators.cs
  16. 2
      ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

7
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -411,9 +411,8 @@ namespace ICSharpCode.Decompiler.CSharp
methodDecl.Body.AddChild(new Comment( methodDecl.Body.AddChild(new Comment(
"ILSpy generated this explicit interface implementation from .override directive in " + memberDecl.Name), "ILSpy generated this explicit interface implementation from .override directive in " + memberDecl.Name),
Roles.Comment); Roles.Comment);
var forwardingCall = new ThisReferenceExpression().Invoke( var forwardingCall = new InvocationExpression(new MemberReferenceExpression(new ThisReferenceExpression(), memberDecl.Name,
memberDecl.Name, methodDecl.TypeParameters.Select(tp => new SimpleType(tp.Name))),
methodDecl.TypeParameters.Select(tp => new SimpleType(tp.Name)),
methodDecl.Parameters.Select(p => ForwardParameter(p)) methodDecl.Parameters.Select(p => ForwardParameter(p))
); );
if (m.ReturnType.IsKnownType(KnownTypeCode.Void)) { if (m.ReturnType.IsKnownType(KnownTypeCode.Void)) {
@ -559,7 +558,7 @@ namespace ICSharpCode.Decompiler.CSharp
method.Body = new BlockStatement { method.Body = new BlockStatement {
new IfElseStatement { new IfElseStatement {
Condition = new BinaryOperatorExpression { Condition = new BinaryOperatorExpression {
Left = typeSystemAstBuilder.ConvertType(typeSystem.Compilation.FindType(KnownTypeCode.IntPtr)).Member("Size"), Left = new MemberReferenceExpression(new TypeReferenceExpression(typeSystemAstBuilder.ConvertType(typeSystem.Compilation.FindType(KnownTypeCode.IntPtr))), "Size"),
Operator = BinaryOperatorType.Equality, Operator = BinaryOperatorType.Equality,
Right = new PrimitiveExpression(4) Right = new PrimitiveExpression(4)
}, },

18
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -88,14 +88,14 @@ namespace ICSharpCode.Decompiler.CSharp
{ {
var expr = astBuilder.ConvertConstantValue(rr); var expr = astBuilder.ConvertConstantValue(rr);
if (expr is NullReferenceExpression && rr.Type.Kind != TypeKind.Null) { if (expr is NullReferenceExpression && rr.Type.Kind != TypeKind.Null) {
expr = expr.CastTo(ConvertType(rr.Type)); expr = new CastExpression(ConvertType(rr.Type), expr);
} else { } else {
switch (rr.Type.GetDefinition()?.KnownTypeCode) { switch (rr.Type.GetDefinition()?.KnownTypeCode) {
case KnownTypeCode.SByte: case KnownTypeCode.SByte:
case KnownTypeCode.Byte: case KnownTypeCode.Byte:
case KnownTypeCode.Int16: case KnownTypeCode.Int16:
case KnownTypeCode.UInt16: case KnownTypeCode.UInt16:
expr = expr.CastTo(new PrimitiveType(KnownTypeReference.GetCSharpNameByTypeCode(rr.Type.GetDefinition().KnownTypeCode))); expr = new CastExpression(new PrimitiveType(KnownTypeReference.GetCSharpNameByTypeCode(rr.Type.GetDefinition().KnownTypeCode)), expr);
break; break;
} }
} }
@ -315,7 +315,7 @@ namespace ICSharpCode.Decompiler.CSharp
protected internal override TranslatedExpression VisitLdTypeToken(LdTypeToken inst, TranslationContext context) protected internal override TranslatedExpression VisitLdTypeToken(LdTypeToken inst, TranslationContext context)
{ {
return new TypeOfExpression(ConvertType(inst.Type)).Member("TypeHandle") return new MemberReferenceExpression(new TypeOfExpression(ConvertType(inst.Type)), "TypeHandle")
.WithILInstruction(inst) .WithILInstruction(inst)
.WithRR(new TypeOfResolveResult(compilation.FindType(new TopLevelTypeName("System", "RuntimeTypeHandle")), inst.Type)); .WithRR(new TypeOfResolveResult(compilation.FindType(new TopLevelTypeName("System", "RuntimeTypeHandle")), inst.Type));
} }
@ -993,7 +993,7 @@ namespace ICSharpCode.Decompiler.CSharp
simplifiedDelegateCreation.Arguments.Add(replacement); simplifiedDelegateCreation.Arguments.Add(replacement);
replacement = simplifiedDelegateCreation; replacement = simplifiedDelegateCreation;
} else if (!expectedType.ContainsAnonymousType()) { } else if (!expectedType.ContainsAnonymousType()) {
replacement = replacement.CastTo(ConvertType(expectedType)); replacement = new CastExpression(ConvertType(expectedType), replacement);
} }
return replacement return replacement
.WithILInstruction(function) .WithILInstruction(function)
@ -1137,7 +1137,7 @@ namespace ICSharpCode.Decompiler.CSharp
string methodName = method.Name; string methodName = method.Name;
// HACK : convert this.Dispose() to ((IDisposable)this).Dispose(), if Dispose is an explicitly implemented interface method. // HACK : convert this.Dispose() to ((IDisposable)this).Dispose(), if Dispose is an explicitly implemented interface method.
if (inst.Method.IsExplicitInterfaceImplementation && targetExpr is ThisReferenceExpression) { if (inst.Method.IsExplicitInterfaceImplementation && targetExpr is ThisReferenceExpression) {
targetExpr = targetExpr.CastTo(ConvertType(method.ImplementedInterfaceMembers[0].DeclaringType)); targetExpr = new CastExpression(ConvertType(method.ImplementedInterfaceMembers[0].DeclaringType), targetExpr);
methodName = method.ImplementedInterfaceMembers[0].Name; methodName = method.ImplementedInterfaceMembers[0].Name;
} }
var mre = new MemberReferenceExpression(targetExpr, methodName); var mre = new MemberReferenceExpression(targetExpr, methodName);
@ -1269,11 +1269,11 @@ namespace ICSharpCode.Decompiler.CSharp
arrayExpr = arrayExpr.ConvertTo(compilation.FindType(KnownTypeCode.Array), this); arrayExpr = arrayExpr.ConvertTo(compilation.FindType(KnownTypeCode.Array), this);
} }
if (inst.ResultType == StackType.I4) { if (inst.ResultType == StackType.I4) {
return arrayExpr.Expression.Member("Length") return new MemberReferenceExpression(arrayExpr.Expression, "Length")
.WithILInstruction(inst) .WithILInstruction(inst)
.WithRR(new ResolveResult(compilation.FindType(KnownTypeCode.Int32))); .WithRR(new ResolveResult(compilation.FindType(KnownTypeCode.Int32)));
} else { } else {
return arrayExpr.Expression.Member("LongLength") return new MemberReferenceExpression(arrayExpr.Expression, "LongLength")
.WithILInstruction(inst) .WithILInstruction(inst)
.WithRR(new ResolveResult(compilation.FindType(KnownTypeCode.Int64))); .WithRR(new ResolveResult(compilation.FindType(KnownTypeCode.Int64)));
} }
@ -1384,10 +1384,10 @@ namespace ICSharpCode.Decompiler.CSharp
protected internal override TranslatedExpression VisitRefAnyType(RefAnyType inst, TranslationContext context) protected internal override TranslatedExpression VisitRefAnyType(RefAnyType inst, TranslationContext context)
{ {
return new UndocumentedExpression { return new MemberReferenceExpression(new UndocumentedExpression {
UndocumentedExpressionType = UndocumentedExpressionType.RefType, UndocumentedExpressionType = UndocumentedExpressionType.RefType,
Arguments = { Translate(inst.Argument).Expression.Detach() } Arguments = { Translate(inst.Argument).Expression.Detach() }
}.Member("TypeHandle") }, "TypeHandle")
.WithILInstruction(inst) .WithILInstruction(inst)
.WithRR(new TypeResolveResult(compilation.FindType(new TopLevelTypeName("System", "RuntimeTypeHandle")))); .WithRR(new TypeResolveResult(compilation.FindType(new TopLevelTypeName("System", "RuntimeTypeHandle"))));
} }

32
ICSharpCode.Decompiler/CSharp/Syntax/AstType.cs

@ -218,14 +218,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
{ {
return new ComposedType { BaseType = this, HasRefSpecifier = true }; return new ComposedType { BaseType = this, HasRefSpecifier = true };
} }
/// <summary>
/// Builds an expression that can be used to access a static member on this type.
/// </summary>
public MemberReferenceExpression Member(string memberName)
{
return new TypeReferenceExpression { Type = this }.Member(memberName);
}
/// <summary> /// <summary>
/// Builds an expression that can be used to access a static member on this type. /// Builds an expression that can be used to access a static member on this type.
@ -247,30 +239,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
return memberType; return memberType;
} }
/// <summary>
/// Builds an invocation expression using this type as target.
/// </summary>
public InvocationExpression Invoke(string methodName, IEnumerable<Expression> arguments)
{
return new TypeReferenceExpression { Type = this }.Invoke(methodName, arguments);
}
/// <summary>
/// Builds an invocation expression using this type as target.
/// </summary>
public InvocationExpression Invoke(string methodName, params Expression[] arguments)
{
return new TypeReferenceExpression { Type = this }.Invoke(methodName, arguments);
}
/// <summary>
/// Builds an invocation expression using this type as target.
/// </summary>
public InvocationExpression Invoke(string methodName, IEnumerable<AstType> typeArguments, IEnumerable<Expression> arguments)
{
return new TypeReferenceExpression { Type = this }.Invoke(methodName, typeArguments, arguments);
}
/// <summary> /// <summary>
/// Creates a simple AstType from a dotted name. /// Creates a simple AstType from a dotted name.
/// Does not support generics, arrays, etc. - just simple dotted names, /// Does not support generics, arrays, etc. - just simple dotted names,

66
ICSharpCode.Decompiler/CSharp/Syntax/Expressions/AsExpression.cs

@ -78,72 +78,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
AsExpression o = other as AsExpression; AsExpression o = other as AsExpression;
return o != null && this.Expression.DoMatch(o.Expression, match) && this.Type.DoMatch(o.Type, match); return o != null && this.Expression.DoMatch(o.Expression, match) && this.Type.DoMatch(o.Type, match);
} }
#region Builder methods
public override MemberReferenceExpression Member(string memberName)
{
return new MemberReferenceExpression { Target = this, MemberName = memberName };
}
public override IndexerExpression Indexer(IEnumerable<Expression> arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override IndexerExpression Indexer(params Expression[] arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override InvocationExpression Invoke(string methodName, IEnumerable<AstType> typeArguments, IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
MemberReferenceExpression mre = new MemberReferenceExpression();
mre.Target = new ParenthesizedExpression(this);
mre.MemberName = methodName;
mre.TypeArguments.AddRange(typeArguments);
ie.Target = mre;
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(params Expression[] arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override CastExpression CastTo(AstType type)
{
return new CastExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override AsExpression CastAs(AstType type)
{
return new AsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override IsExpression IsType(AstType type)
{
return new IsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
#endregion
} }
} }

66
ICSharpCode.Decompiler/CSharp/Syntax/Expressions/AssignmentExpression.cs

@ -202,72 +202,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
throw new NotSupportedException("Invalid value for AssignmentOperatorType"); throw new NotSupportedException("Invalid value for AssignmentOperatorType");
} }
} }
#region Builder methods
public override MemberReferenceExpression Member(string memberName)
{
return new MemberReferenceExpression { Target = this, MemberName = memberName };
}
public override IndexerExpression Indexer(IEnumerable<Expression> arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override IndexerExpression Indexer(params Expression[] arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override InvocationExpression Invoke(string methodName, IEnumerable<AstType> typeArguments, IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
MemberReferenceExpression mre = new MemberReferenceExpression();
mre.Target = new ParenthesizedExpression(this);
mre.MemberName = methodName;
mre.TypeArguments.AddRange(typeArguments);
ie.Target = mre;
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(params Expression[] arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override CastExpression CastTo(AstType type)
{
return new CastExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override AsExpression CastAs(AstType type)
{
return new AsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override IsExpression IsType(AstType type)
{
return new IsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
#endregion
} }
public enum AssignmentOperatorType public enum AssignmentOperatorType

65
ICSharpCode.Decompiler/CSharp/Syntax/Expressions/BinaryOperatorExpression.cs

@ -201,71 +201,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
throw new NotSupportedException("Invalid value for BinaryOperatorType"); throw new NotSupportedException("Invalid value for BinaryOperatorType");
} }
} }
#region Builder methods
public override MemberReferenceExpression Member(string memberName)
{
return new MemberReferenceExpression { Target = this, MemberName = memberName };
}
public override IndexerExpression Indexer(IEnumerable<Expression> arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override IndexerExpression Indexer(params Expression[] arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override InvocationExpression Invoke(string methodName, IEnumerable<AstType> typeArguments, IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
MemberReferenceExpression mre = new MemberReferenceExpression();
mre.Target = new ParenthesizedExpression(this);
mre.MemberName = methodName;
mre.TypeArguments.AddRange(typeArguments);
ie.Target = mre;
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(params Expression[] arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override CastExpression CastTo(AstType type)
{
return new CastExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override AsExpression CastAs(AstType type)
{
return new AsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override IsExpression IsType(AstType type)
{
return new IsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
#endregion
} }
public enum BinaryOperatorType public enum BinaryOperatorType

66
ICSharpCode.Decompiler/CSharp/Syntax/Expressions/CastExpression.cs

@ -80,72 +80,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
CastExpression o = other as CastExpression; CastExpression o = other as CastExpression;
return o != null && this.Type.DoMatch(o.Type, match) && this.Expression.DoMatch(o.Expression, match); return o != null && this.Type.DoMatch(o.Type, match) && this.Expression.DoMatch(o.Expression, match);
} }
#region Builder methods
public override MemberReferenceExpression Member(string memberName)
{
return new MemberReferenceExpression { Target = this, MemberName = memberName };
}
public override IndexerExpression Indexer(IEnumerable<Expression> arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override IndexerExpression Indexer(params Expression[] arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override InvocationExpression Invoke(string methodName, IEnumerable<AstType> typeArguments, IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
MemberReferenceExpression mre = new MemberReferenceExpression();
mre.Target = new ParenthesizedExpression(this);
mre.MemberName = methodName;
mre.TypeArguments.AddRange(typeArguments);
ie.Target = mre;
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(params Expression[] arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override CastExpression CastTo(AstType type)
{
return new CastExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override AsExpression CastAs(AstType type)
{
return new AsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override IsExpression IsType(AstType type)
{
return new IsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
#endregion
} }
} }

66
ICSharpCode.Decompiler/CSharp/Syntax/Expressions/ConditionalExpression.cs

@ -92,71 +92,5 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
ConditionalExpression o = other as ConditionalExpression; ConditionalExpression o = other as ConditionalExpression;
return o != null && this.Condition.DoMatch(o.Condition, match) && this.TrueExpression.DoMatch(o.TrueExpression, match) && this.FalseExpression.DoMatch(o.FalseExpression, match); return o != null && this.Condition.DoMatch(o.Condition, match) && this.TrueExpression.DoMatch(o.TrueExpression, match) && this.FalseExpression.DoMatch(o.FalseExpression, match);
} }
#region Builder methods
public override MemberReferenceExpression Member(string memberName)
{
return new MemberReferenceExpression { Target = this, MemberName = memberName };
}
public override IndexerExpression Indexer(IEnumerable<Expression> arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override IndexerExpression Indexer(params Expression[] arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override InvocationExpression Invoke(string methodName, IEnumerable<AstType> typeArguments, IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
MemberReferenceExpression mre = new MemberReferenceExpression();
mre.Target = new ParenthesizedExpression(this);
mre.MemberName = methodName;
mre.TypeArguments.AddRange(typeArguments);
ie.Target = mre;
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(params Expression[] arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override CastExpression CastTo(AstType type)
{
return new CastExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override AsExpression CastAs(AstType type)
{
return new AsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override IsExpression IsType(AstType type)
{
return new IsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
#endregion
} }
} }

100
ICSharpCode.Decompiler/CSharp/Syntax/Expressions/Expression.cs

@ -126,105 +126,5 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
throw new ArgumentNullException("replaceFunction"); throw new ArgumentNullException("replaceFunction");
return (Expression)base.ReplaceWith(node => replaceFunction((Expression)node)); return (Expression)base.ReplaceWith(node => replaceFunction((Expression)node));
} }
#region Builder methods
/// <summary>
/// Builds an member reference expression using this expression as target.
/// </summary>
public virtual MemberReferenceExpression Member(string memberName)
{
return new MemberReferenceExpression { Target = this, MemberName = memberName };
}
/// <summary>
/// Builds an indexer expression using this expression as target.
/// </summary>
public virtual IndexerExpression Indexer(IEnumerable<Expression> arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = this;
expr.Arguments.AddRange(arguments);
return expr;
}
/// <summary>
/// Builds an indexer expression using this expression as target.
/// </summary>
public virtual IndexerExpression Indexer(params Expression[] arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = this;
expr.Arguments.AddRange(arguments);
return expr;
}
/// <summary>
/// Builds an invocation expression using this expression as target.
/// </summary>
public virtual InvocationExpression Invoke(string methodName, IEnumerable<Expression> arguments)
{
return Invoke(methodName, null, arguments);
}
/// <summary>
/// Builds an invocation expression using this expression as target.
/// </summary>
public virtual InvocationExpression Invoke(string methodName, params Expression[] arguments)
{
return Invoke(methodName, null, arguments);
}
/// <summary>
/// Builds an invocation expression using this expression as target.
/// </summary>
public virtual InvocationExpression Invoke(string methodName, IEnumerable<AstType> typeArguments, IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
MemberReferenceExpression mre = new MemberReferenceExpression();
mre.Target = this;
mre.MemberName = methodName;
mre.TypeArguments.AddRange(typeArguments);
ie.Target = mre;
ie.Arguments.AddRange(arguments);
return ie;
}
/// <summary>
/// Builds an invocation expression using this expression as target.
/// </summary>
public virtual InvocationExpression Invoke(IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = this;
ie.Arguments.AddRange(arguments);
return ie;
}
/// <summary>
/// Builds an invocation expression using this expression as target.
/// </summary>
public virtual InvocationExpression Invoke(params Expression[] arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = this;
ie.Arguments.AddRange(arguments);
return ie;
}
public virtual CastExpression CastTo(AstType type)
{
return new CastExpression { Type = type, Expression = this };
}
public virtual AsExpression CastAs(AstType type)
{
return new AsExpression { Type = type, Expression = this };
}
public virtual IsExpression IsType(AstType type)
{
return new IsExpression { Type = type, Expression = this };
}
#endregion
} }
} }

66
ICSharpCode.Decompiler/CSharp/Syntax/Expressions/IsExpression.cs

@ -79,72 +79,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
IsExpression o = other as IsExpression; IsExpression o = other as IsExpression;
return o != null && this.Expression.DoMatch(o.Expression, match) && this.Type.DoMatch(o.Type, match); return o != null && this.Expression.DoMatch(o.Expression, match) && this.Type.DoMatch(o.Type, match);
} }
#region Builder methods
public override MemberReferenceExpression Member(string memberName)
{
return new MemberReferenceExpression { Target = this, MemberName = memberName };
}
public override IndexerExpression Indexer(IEnumerable<Expression> arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override IndexerExpression Indexer(params Expression[] arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override InvocationExpression Invoke(string methodName, IEnumerable<AstType> typeArguments, IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
MemberReferenceExpression mre = new MemberReferenceExpression();
mre.Target = new ParenthesizedExpression(this);
mre.MemberName = methodName;
mre.TypeArguments.AddRange(typeArguments);
ie.Target = mre;
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(params Expression[] arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override CastExpression CastTo(AstType type)
{
return new CastExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override AsExpression CastAs(AstType type)
{
return new AsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override IsExpression IsType(AstType type)
{
return new IsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
#endregion
} }
} }

66
ICSharpCode.Decompiler/CSharp/Syntax/Expressions/QueryExpression.cs

@ -81,72 +81,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
QueryExpression o = other as QueryExpression; QueryExpression o = other as QueryExpression;
return o != null && !o.IsNull && this.Clauses.DoMatch(o.Clauses, match); return o != null && !o.IsNull && this.Clauses.DoMatch(o.Clauses, match);
} }
#region Builder methods
public override MemberReferenceExpression Member(string memberName)
{
return new MemberReferenceExpression { Target = this, MemberName = memberName };
}
public override IndexerExpression Indexer(IEnumerable<Expression> arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override IndexerExpression Indexer(params Expression[] arguments)
{
IndexerExpression expr = new IndexerExpression();
expr.Target = new ParenthesizedExpression(this);
expr.Arguments.AddRange(arguments);
return expr;
}
public override InvocationExpression Invoke(string methodName, IEnumerable<AstType> typeArguments, IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
MemberReferenceExpression mre = new MemberReferenceExpression();
mre.Target = new ParenthesizedExpression(this);
mre.MemberName = methodName;
mre.TypeArguments.AddRange(typeArguments);
ie.Target = mre;
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(IEnumerable<Expression> arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override InvocationExpression Invoke(params Expression[] arguments)
{
InvocationExpression ie = new InvocationExpression();
ie.Target = new ParenthesizedExpression(this);
ie.Arguments.AddRange(arguments);
return ie;
}
public override CastExpression CastTo(AstType type)
{
return new CastExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override AsExpression CastAs(AstType type)
{
return new AsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
public override IsExpression IsType(AstType type)
{
return new IsExpression { Type = type, Expression = new ParenthesizedExpression(this) };
}
#endregion
} }
public abstract class QueryClause : AstNode public abstract class QueryClause : AstNode

8
ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs

@ -557,7 +557,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
TypeCode enumBaseTypeCode = ReflectionHelper.GetTypeCode(enumDefinition.EnumUnderlyingType); TypeCode enumBaseTypeCode = ReflectionHelper.GetTypeCode(enumDefinition.EnumUnderlyingType);
foreach (IField field in enumDefinition.Fields) { foreach (IField field in enumDefinition.Fields) {
if (field.IsConst && object.Equals(CSharpPrimitiveCast.Cast(TypeCode.Int64, field.ConstantValue, false), val)) if (field.IsConst && object.Equals(CSharpPrimitiveCast.Cast(TypeCode.Int64, field.ConstantValue, false), val))
return ConvertType(type).Member(field.Name); return new MemberReferenceExpression(new TypeReferenceExpression(ConvertType(type)), field.Name);
} }
if (IsFlagsEnum(enumDefinition)) { if (IsFlagsEnum(enumDefinition)) {
long enumValue = val; long enumValue = val;
@ -585,7 +585,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
continue; // skip None enum value continue; // skip None enum value
if ((fieldValue & enumValue) == fieldValue) { if ((fieldValue & enumValue) == fieldValue) {
var fieldExpression = ConvertType(type).Member(field.Name); var fieldExpression = new MemberReferenceExpression(new TypeReferenceExpression(ConvertType(type)), field.Name);
if (expr == null) if (expr == null)
expr = fieldExpression; expr = fieldExpression;
else else
@ -594,7 +594,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
enumValue &= ~fieldValue; enumValue &= ~fieldValue;
} }
if ((fieldValue & negatedEnumValue) == fieldValue) { if ((fieldValue & negatedEnumValue) == fieldValue) {
var fieldExpression = ConvertType(type).Member(field.Name); var fieldExpression = new MemberReferenceExpression(new TypeReferenceExpression(ConvertType(type)), field.Name);
if (negatedExpr == null) if (negatedExpr == null)
negatedExpr = fieldExpression; negatedExpr = fieldExpression;
else else
@ -612,7 +612,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
return new UnaryOperatorExpression(UnaryOperatorType.BitNot, negatedExpr); return new UnaryOperatorExpression(UnaryOperatorType.BitNot, negatedExpr);
} }
} }
return new PrimitiveExpression(CSharpPrimitiveCast.Cast(enumBaseTypeCode, val, false)).CastTo(ConvertType(type)); return new CastExpression(ConvertType(type), new PrimitiveExpression(CSharpPrimitiveCast.Cast(enumBaseTypeCode, val, false)));
} }
#endregion #endregion

2
ICSharpCode.Decompiler/CSharp/Transforms/ConvertConstructorCallIntoInitializer.cs

@ -92,7 +92,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
} }
}; };
static readonly AstNode thisCallPattern = new ExpressionStatement(new ThisReferenceExpression().Invoke(".ctor", new Repeat(new AnyNode()))); static readonly AstNode thisCallPattern = new ExpressionStatement(new InvocationExpression(new MemberReferenceExpression(new ThisReferenceExpression(), ".ctor"), new Repeat(new AnyNode())));
public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration) public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration)
{ {

14
ICSharpCode.Decompiler/CSharp/Transforms/CustomPatterns.cs

@ -20,6 +20,7 @@ using System;
using System.Linq; using System.Linq;
using ICSharpCode.Decompiler.CSharp.Syntax; using ICSharpCode.Decompiler.CSharp.Syntax;
using ICSharpCode.Decompiler.CSharp.Syntax.PatternMatching; using ICSharpCode.Decompiler.CSharp.Syntax.PatternMatching;
using ICSharpCode.Decompiler.Semantics;
using Mono.Cecil; using Mono.Cecil;
namespace ICSharpCode.Decompiler.CSharp.Transforms namespace ICSharpCode.Decompiler.CSharp.Transforms
@ -48,8 +49,8 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
if (o == null) if (o == null)
return false; return false;
} }
TypeReference tr = o.Annotation<TypeReference>(); var trr = o.GetResolveResult() as TypeResolveResult;
return tr != null && tr.Namespace == ns && tr.Name == name; return trr != null && trr.Type.Namespace == ns && trr.Type.Name == name;
} }
public override string ToString() public override string ToString()
@ -91,8 +92,13 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
public TypeOfPattern(string groupName) public TypeOfPattern(string groupName)
{ {
childNode = new TypePattern(typeof(Type)).ToType().Invoke( childNode = new MemberReferenceExpression(
"GetTypeFromHandle", new TypeOfExpression(new AnyNode(groupName)).Member("TypeHandle")); new InvocationExpression(
new MemberReferenceExpression(
new TypeReferenceExpression { Type = new TypePattern(typeof(Type)).ToType() },
"GetTypeFromHandle"),
new TypeOfExpression(new AnyNode(groupName))
), "TypeHandle");
} }
public override bool DoMatch(INode other, Match match) public override bool DoMatch(INode other, Match match)

23
ICSharpCode.Decompiler/CSharp/Transforms/ReplaceMethodCallsWithOperators.cs

@ -94,7 +94,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
FieldReference field = oldArg.Annotation<FieldReference>(); FieldReference field = oldArg.Annotation<FieldReference>();
if (field != null) { if (field != null) {
AstType declaringType = ((TypeOfExpression)mre2.Target).Type.Detach(); AstType declaringType = ((TypeOfExpression)mre2.Target).Type.Detach();
oldArg.ReplaceWith(declaringType.Member(field.Name).CopyAnnotationsFrom(oldArg)); oldArg.ReplaceWith(new MemberReferenceExpression(new TypeReferenceExpression(declaringType), field.Name).CopyAnnotationsFrom(oldArg));
invocationExpression.ReplaceWith(mre1.Target); invocationExpression.ReplaceWith(mre1.Target);
return; return;
} }
@ -123,7 +123,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
if (method.Name == "op_Explicit" && arguments.Length == 1) { if (method.Name == "op_Explicit" && arguments.Length == 1) {
arguments[0].Remove(); // detach argument arguments[0].Remove(); // detach argument
invocationExpression.ReplaceWith( invocationExpression.ReplaceWith(
arguments[0].CastTo(context.TypeSystemAstBuilder.ConvertType(method.ReturnType)) new CastExpression(context.TypeSystemAstBuilder.ConvertType(method.ReturnType), arguments[0])
.CopyAnnotationsFrom(invocationExpression) .CopyAnnotationsFrom(invocationExpression)
); );
return; return;
@ -314,14 +314,13 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
} }
static readonly Expression getMethodOrConstructorFromHandlePattern = static readonly Expression getMethodOrConstructorFromHandlePattern =
new TypePattern(typeof(MethodBase)).ToType().Invoke( new CastExpression(new Choice {
"GetMethodFromHandle", new TypePattern(typeof(MethodInfo)),
new NamedNode("ldtokenNode", new LdTokenPattern("method")).ToExpression().Member("MethodHandle"), new TypePattern(typeof(ConstructorInfo))
new OptionalNode(new TypeOfExpression(new AnyNode("declaringType")).Member("TypeHandle")) }, new InvocationExpression(new MemberReferenceExpression(new TypeReferenceExpression(new TypePattern(typeof(MethodBase)).ToType()), "GetMethodFromHandle"),
).CastTo(new Choice { new NamedNode("ldtokenNode", new MemberReferenceExpression(new LdTokenPattern("method").ToExpression(), "MethodHandle")),
new TypePattern(typeof(MethodInfo)), new OptionalNode(new MemberReferenceExpression(new TypeOfExpression(new AnyNode("declaringType")), "TypeHandle"))
new TypePattern(typeof(ConstructorInfo)) ));
});
public override void VisitCastExpression(CastExpression castExpression) public override void VisitCastExpression(CastExpression castExpression)
{ {
@ -331,8 +330,8 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
if (m.Success) { if (m.Success) {
IMethod method = m.Get<AstNode>("method").Single().GetSymbol() as IMethod; IMethod method = m.Get<AstNode>("method").Single().GetSymbol() as IMethod;
if (m.Has("declaringType") && method != null) { if (m.Has("declaringType") && method != null) {
Expression newNode = m.Get<AstType>("declaringType").Single().Detach().Member(method.Name); Expression newNode = new MemberReferenceExpression(new TypeReferenceExpression(m.Get<AstType>("declaringType").Single().Detach()), method.Name);
newNode = newNode.Invoke(method.Parameters.Select(p => new TypeReferenceExpression(context.TypeSystemAstBuilder.ConvertType(p.Type)))); newNode = new InvocationExpression(newNode, method.Parameters.Select(p => new TypeReferenceExpression(context.TypeSystemAstBuilder.ConvertType(p.Type))));
m.Get<AstNode>("method").Single().ReplaceWith(newNode); m.Get<AstNode>("method").Single().ReplaceWith(newNode);
} }
castExpression.ReplaceWith(m.Get<AstNode>("ldtokenNode").Single().CopyAnnotationsFrom(castExpression)); castExpression.ReplaceWith(m.Get<AstNode>("ldtokenNode").Single().CopyAnnotationsFrom(castExpression));

2
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

@ -290,7 +290,7 @@ namespace ICSharpCode.Decompiler.CSharp
.WithILInstruction(this.ILInstructions); .WithILInstruction(this.ILInstructions);
} }
if (targetType.Kind == TypeKind.Pointer && 0.Equals(ResolveResult.ConstantValue)) { if (targetType.Kind == TypeKind.Pointer && 0.Equals(ResolveResult.ConstantValue)) {
return new NullReferenceExpression().CastTo(expressionBuilder.ConvertType(targetType)) return new CastExpression(expressionBuilder.ConvertType(targetType), new NullReferenceExpression())
.WithILInstruction(this.ILInstructions) .WithILInstruction(this.ILInstructions)
.WithRR(new ConstantResolveResult(targetType, null)); .WithRR(new ConstantResolveResult(targetType, null));
} }

Loading…
Cancel
Save