From aba167fa4c1fd0690bf197b1017fc7a3d6fc3cfb Mon Sep 17 00:00:00 2001 From: Adam Connelly Date: Sun, 2 Sep 2012 22:12:17 +0100 Subject: [PATCH] [CodeIssues] Updating the NoDefaultConstructorIssue to take into account multiple constructors in the child class. If no constructors are defined in the child, the issue is put against the class identifier, whereas if constructors are defined, the issue is put against each constructor that has an issue. --- .../CodeIssues/NoDefaultConstructorIssue.cs | 39 ++++++++++++++----- .../NoDefaultConstructorIssueTests.cs | 18 +++++++++ 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/NoDefaultConstructorIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/NoDefaultConstructorIssue.cs index 9e0e4eb83c..eacf4a0d3d 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/NoDefaultConstructorIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/NoDefaultConstructorIssue.cs @@ -26,34 +26,53 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring { } - public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration) + public override void VisitTypeDeclaration(TypeDeclaration declaration) { - var result = ctx.Resolve(typeDeclaration) as TypeResolveResult; + var result = ctx.Resolve(declaration) as TypeResolveResult; var baseType = result.Type.GetNonInterfaceBaseTypes().FirstOrDefault(t => !t.IsKnownType(KnownTypeCode.Object) && !object.Equals(t, result.Type)); if (baseType != null) { - var constructor = baseType.GetConstructors(c => c.Parameters.Count == 0).FirstOrDefault(); + var baseConstructor = baseType.GetConstructors(c => c.Parameters.Count == 0).FirstOrDefault(); - if (constructor == null) { - base.VisitTypeDeclaration(typeDeclaration); + if (baseConstructor == null) { + var constructor = result.Type.GetConstructors(f => !f.IsSynthetic).FirstOrDefault(); - if (!this.initializerInvoked) { - var identifier = typeDeclaration.GetChildByRole(Roles.Identifier); - this.AddIssue(identifier, ctx.TranslateString("There is no default constructor in the base class")); + if (constructor == null) { + // If there are no constructors declared then the base constructor isn't being invoked + this.AddIssue(declaration); + } else { + base.VisitTypeDeclaration(declaration); } } } } - public override void VisitConstructorInitializer(ConstructorInitializer constructorInitializer) + public override void VisitConstructorDeclaration(ConstructorDeclaration declaration) { - var result = ctx.Resolve(constructorInitializer); + this.initializerInvoked = false; + + base.VisitConstructorDeclaration(declaration); + + if (!this.initializerInvoked) { + this.AddIssue(declaration); + } + } + + public override void VisitConstructorInitializer(ConstructorInitializer initializer) + { + var result = ctx.Resolve(initializer); if (!result.IsError) { this.initializerInvoked = true; } } + + private void AddIssue(AstNode node) + { + var identifier = node.GetChildByRole(Roles.Identifier); + this.AddIssue(identifier, ctx.TranslateString("There is no default constructor in the base class")); + } } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/NoDefaultConstructorIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/NoDefaultConstructorIssueTests.cs index c99cd22fad..054fa1c142 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/NoDefaultConstructorIssueTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/NoDefaultConstructorIssueTests.cs @@ -82,6 +82,24 @@ class ChildClass : BaseClass Test(testInput, 0); } + + [Test] + public void ShouldMakeSureAllConstructorsInvokeBaseConstructor() + { + var testInput = +@"class BaseClass +{ + public BaseClass(string test) {} +} + +class ChildClass : BaseClass +{ + public ChildClass() : base(""test"") {} + public ChildClass(string test) {} +}"; + + Test(testInput, 1); + } } }