From d87a233e85c4e4576de4f2b39a24b16786d209ad Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 9 Jul 2013 01:45:33 +0200 Subject: [PATCH] Fix false positive in NoDefaultConstructorIssue for static constructors. --- .../NoDefaultConstructorIssue.cs | 2 + ICSharpCode.NRefactory.Cecil/CecilLoader.cs | 2 +- ICSharpCode.NRefactory.IKVM/IkvmLoader.cs | 2 +- .../NoDefaultConstructorIssueTests.cs | 59 +++++++++++++++++++ Packages/ICSharpCode.NRefactory.nuspec | 4 ++ 5 files changed, 67 insertions(+), 2 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/Uncategorized/NoDefaultConstructorIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/Uncategorized/NoDefaultConstructorIssue.cs index 2ef9a3c2c..008b9db08 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/Uncategorized/NoDefaultConstructorIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/Uncategorized/NoDefaultConstructorIssue.cs @@ -57,6 +57,8 @@ public override void VisitConstructorDeclaration(ConstructorDeclaration declarat var result = ctx.Resolve(declaration) as MemberResolveResult; if (result == null || result.IsError) return; + if (result.Member.IsStatic) + return; // ignore static ctor var baseType = result.Member.DeclaringType.DirectBaseTypes.FirstOrDefault(t => !t.IsKnownType(KnownTypeCode.Object) && t.Kind != TypeKind.Interface); diff --git a/ICSharpCode.NRefactory.Cecil/CecilLoader.cs b/ICSharpCode.NRefactory.Cecil/CecilLoader.cs index 6fe1cc230..a1feef9e0 100644 --- a/ICSharpCode.NRefactory.Cecil/CecilLoader.cs +++ b/ICSharpCode.NRefactory.Cecil/CecilLoader.cs @@ -521,7 +521,7 @@ void AddAttributes(MethodDefinition methodDefinition, IList attr switch (flags & ImplMapFlags.CallConvMask) { case (ImplMapFlags)0: Debug.WriteLine ("P/Invoke calling convention not set on:" + methodDefinition.Name); - callingConvention = CallingConvention.StdCall; + callingConvention = 0; break; case ImplMapFlags.CallConvCdecl: callingConvention = CallingConvention.Cdecl; diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/NoDefaultConstructorIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/NoDefaultConstructorIssueTests.cs index 5ddd888d1..17082a332 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/NoDefaultConstructorIssueTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/NoDefaultConstructorIssueTests.cs @@ -164,6 +164,65 @@ public A() {} Assert.AreEqual("CS1729: The type 'B' does not contain a constructor that takes '0' arguments", issues.ElementAt(1).Description); Assert.AreEqual("CS1729: The type 'D' does not contain a constructor that takes '0' arguments", issues.ElementAt(0).Description); } + + [Test] + [Ignore("Fix me")] + public void ShouldNotReturnIssueIfBaseClassCtorHasOptionalParameters() + { + var testInput = +@"class BaseClass +{ + public BaseClass(int i = 0) + { + } +} + +class ChildClass : BaseClass +{ +}"; + + Test(testInput, 0); + } + + [Test] + [Ignore("Fix me")] + public void ShouldNotReturnIssueIfBaseClassCtorHasVariadicParameters() + { + var testInput = +@"class BaseClass +{ + public BaseClass(params string[] str) + { + } +} + +class ChildClass : BaseClass +{ +}"; + + Test(testInput, 0); + } + + [Test] + public void ShouldNotReturnIssueForStaticConstructor() + { + var testInput = +@"class BaseClass +{ + public BaseClass(string text) + { + } +} + +class ChildClass : BaseClass +{ + public ChildClass() : base(""text"") {} + + static ChildClass() {} +}"; + + Test(testInput, 0); + } } } diff --git a/Packages/ICSharpCode.NRefactory.nuspec b/Packages/ICSharpCode.NRefactory.nuspec index d86a3aee3..4d9560d5f 100644 --- a/Packages/ICSharpCode.NRefactory.nuspec +++ b/Packages/ICSharpCode.NRefactory.nuspec @@ -22,6 +22,9 @@ + + + @@ -29,6 +32,7 @@ +