Browse Source

Fix #1661: Ignore casts on this/base ctor calls, if base type cannot be found.

pull/1686/head
Siegfried Pammer 6 years ago
parent
commit
b6c7a25edf
  1. 16
      ICSharpCode.Decompiler/CSharp/Transforms/ConvertConstructorCallIntoInitializer.cs

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

@ -58,18 +58,20 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
public override void VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration) public override void VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration)
{ {
ExpressionStatement stmt = constructorDeclaration.Body.Statements.FirstOrDefault() as ExpressionStatement; var stmt = constructorDeclaration.Body.Statements.FirstOrDefault() as ExpressionStatement;
if (stmt == null) if (stmt == null)
return; return;
InvocationExpression invocation = stmt.Expression as InvocationExpression; if (!(stmt.Expression is InvocationExpression invocation))
if (invocation == null)
return; return;
MemberReferenceExpression mre = invocation.Target as MemberReferenceExpression; if (invocation.Target is MemberReferenceExpression mre && mre.MemberName == ".ctor") {
if (mre != null && mre.MemberName == ".ctor") {
ConstructorInitializer ci = new ConstructorInitializer(); ConstructorInitializer ci = new ConstructorInitializer();
if (mre.Target is ThisReferenceExpression) var target = mre.Target;
// Ignore casts, those might be added if references are missing.
if (target is CastExpression cast)
target = cast.Expression;
if (target is ThisReferenceExpression)
ci.ConstructorInitializerType = ConstructorInitializerType.This; ci.ConstructorInitializerType = ConstructorInitializerType.This;
else if (mre.Target is BaseReferenceExpression) else if (target is BaseReferenceExpression)
ci.ConstructorInitializerType = ConstructorInitializerType.Base; ci.ConstructorInitializerType = ConstructorInitializerType.Base;
else else
return; return;

Loading…
Cancel
Save