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 @@ -411,9 +411,8 @@ namespace ICSharpCode.Decompiler.CSharp
methodDecl.Body.AddChild(new Comment(
"ILSpy generated this explicit interface implementation from .override directive in " + memberDecl.Name),
Roles.Comment);
var forwardingCall = new ThisReferenceExpression().Invoke(
memberDecl.Name,
methodDecl.TypeParameters.Select(tp => new SimpleType(tp.Name)),
var forwardingCall = new InvocationExpression(new MemberReferenceExpression(new ThisReferenceExpression(), memberDecl.Name,
methodDecl.TypeParameters.Select(tp => new SimpleType(tp.Name))),
methodDecl.Parameters.Select(p => ForwardParameter(p))
);
if (m.ReturnType.IsKnownType(KnownTypeCode.Void)) {
@ -559,7 +558,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -559,7 +558,7 @@ namespace ICSharpCode.Decompiler.CSharp
method.Body = new BlockStatement {
new IfElseStatement {
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,
Right = new PrimitiveExpression(4)
},

18
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -88,14 +88,14 @@ namespace ICSharpCode.Decompiler.CSharp @@ -88,14 +88,14 @@ namespace ICSharpCode.Decompiler.CSharp
{
var expr = astBuilder.ConvertConstantValue(rr);
if (expr is NullReferenceExpression && rr.Type.Kind != TypeKind.Null) {
expr = expr.CastTo(ConvertType(rr.Type));
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 = expr.CastTo(new PrimitiveType(KnownTypeReference.GetCSharpNameByTypeCode(rr.Type.GetDefinition().KnownTypeCode)));
expr = new CastExpression(new PrimitiveType(KnownTypeReference.GetCSharpNameByTypeCode(rr.Type.GetDefinition().KnownTypeCode)), expr);
break;
}
}
@ -315,7 +315,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -315,7 +315,7 @@ namespace ICSharpCode.Decompiler.CSharp
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)
.WithRR(new TypeOfResolveResult(compilation.FindType(new TopLevelTypeName("System", "RuntimeTypeHandle")), inst.Type));
}
@ -993,7 +993,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -993,7 +993,7 @@ namespace ICSharpCode.Decompiler.CSharp
simplifiedDelegateCreation.Arguments.Add(replacement);
replacement = simplifiedDelegateCreation;
} else if (!expectedType.ContainsAnonymousType()) {
replacement = replacement.CastTo(ConvertType(expectedType));
replacement = new CastExpression(ConvertType(expectedType), replacement);
}
return replacement
.WithILInstruction(function)
@ -1137,7 +1137,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1137,7 +1137,7 @@ namespace ICSharpCode.Decompiler.CSharp
string methodName = method.Name;
// HACK : convert this.Dispose() to ((IDisposable)this).Dispose(), if Dispose is an explicitly implemented interface method.
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;
}
var mre = new MemberReferenceExpression(targetExpr, methodName);
@ -1269,11 +1269,11 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1269,11 +1269,11 @@ namespace ICSharpCode.Decompiler.CSharp
arrayExpr = arrayExpr.ConvertTo(compilation.FindType(KnownTypeCode.Array), this);
}
if (inst.ResultType == StackType.I4) {
return arrayExpr.Expression.Member("Length")
return new MemberReferenceExpression(arrayExpr.Expression, "Length")
.WithILInstruction(inst)
.WithRR(new ResolveResult(compilation.FindType(KnownTypeCode.Int32)));
} else {
return arrayExpr.Expression.Member("LongLength")
return new MemberReferenceExpression(arrayExpr.Expression, "LongLength")
.WithILInstruction(inst)
.WithRR(new ResolveResult(compilation.FindType(KnownTypeCode.Int64)));
}
@ -1384,10 +1384,10 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1384,10 +1384,10 @@ namespace ICSharpCode.Decompiler.CSharp
protected internal override TranslatedExpression VisitRefAnyType(RefAnyType inst, TranslationContext context)
{
return new UndocumentedExpression {
return new MemberReferenceExpression(new UndocumentedExpression {
UndocumentedExpressionType = UndocumentedExpressionType.RefType,
Arguments = { Translate(inst.Argument).Expression.Detach() }
}.Member("TypeHandle")
}, "TypeHandle")
.WithILInstruction(inst)
.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 @@ -218,14 +218,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
{
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>
/// Builds an expression that can be used to access a static member on this type.
@ -247,30 +239,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax @@ -247,30 +239,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
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>
/// Creates a simple AstType from a dotted name.
/// 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 @@ -78,72 +78,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
AsExpression o = other as AsExpression;
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 @@ -202,72 +202,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
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

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

@ -201,71 +201,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax @@ -201,71 +201,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
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

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

@ -80,72 +80,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax @@ -80,72 +80,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
CastExpression o = other as CastExpression;
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 @@ -92,71 +92,5 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
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);
}
#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 @@ -126,105 +126,5 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
throw new ArgumentNullException("replaceFunction");
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 @@ -79,72 +79,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
IsExpression o = other as IsExpression;
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 @@ -81,72 +81,6 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
QueryExpression o = other as QueryExpression;
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

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

@ -557,7 +557,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax @@ -557,7 +557,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
TypeCode enumBaseTypeCode = ReflectionHelper.GetTypeCode(enumDefinition.EnumUnderlyingType);
foreach (IField field in enumDefinition.Fields) {
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)) {
long enumValue = val;
@ -585,7 +585,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax @@ -585,7 +585,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
continue; // skip None enum value
if ((fieldValue & enumValue) == fieldValue) {
var fieldExpression = ConvertType(type).Member(field.Name);
var fieldExpression = new MemberReferenceExpression(new TypeReferenceExpression(ConvertType(type)), field.Name);
if (expr == null)
expr = fieldExpression;
else
@ -594,7 +594,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax @@ -594,7 +594,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
enumValue &= ~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)
negatedExpr = fieldExpression;
else
@ -612,7 +612,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax @@ -612,7 +612,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
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

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

@ -92,7 +92,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -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)
{

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

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

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

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

2
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

@ -290,7 +290,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -290,7 +290,7 @@ namespace ICSharpCode.Decompiler.CSharp
.WithILInstruction(this.ILInstructions);
}
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)
.WithRR(new ConstantResolveResult(targetType, null));
}

Loading…
Cancel
Save