Browse Source

Fix NullReferenceException in SpecializedMethod.AccessorOwner

pull/32/merge
Daniel Grunwald 13 years ago
parent
commit
647af8b485
  1. 4
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ValueParameterUnusedIssue.cs
  2. 9
      ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs
  3. 5
      ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMethod.cs

4
ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ValueParameterUnusedIssue.cs

@ -66,8 +66,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
// don't warn on empty custom events // don't warn on empty custom events
if (addAccessor.Body.Statements.Count == 0 && removeAccessor.Body.Statements.Count == 0) if (addAccessor.Body.Statements.Count == 0 && removeAccessor.Body.Statements.Count == 0)
return; return;
FindIssuesInNode(addAccessor, addAccessor.Body, "add accessor"); FindIssuesInAccessor(addAccessor, "add accessor");
FindIssuesInNode(removeAccessor, removeAccessor.Body, "remove accessor"); FindIssuesInAccessor(removeAccessor, "remove accessor");
} }
void FindIssuesInAccessor(Accessor accessor, string accessorName = "setter") void FindIssuesInAccessor(Accessor accessor, string accessorName = "setter")

9
ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs

@ -73,6 +73,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
Assert.AreEqual(0, method.Parameters.Count); Assert.AreEqual(0, method.Parameters.Count);
Assert.AreEqual(0, method.Attributes.Count); Assert.AreEqual(0, method.Attributes.Count);
Assert.IsTrue(method.HasBody); Assert.IsTrue(method.HasBody);
Assert.IsNull(method.AccessorOwner);
} }
[Test] [Test]
@ -246,6 +247,14 @@ namespace ICSharpCode.NRefactory.TypeSystem
Assert.AreEqual(m12, m2); Assert.AreEqual(m12, m2);
} }
[Test]
public void SpecializedMethod_AccessorOwner()
{
// NRefactory bug #143 - Accessor Owner throws null reference exception in some cases now
var method = compilation.FindType(typeof(GenericClass<string, object>)).GetMethods(m => m.Name == "GetIndex").Single();
Assert.IsNull(method.AccessorOwner);
}
[Test] [Test]
public void Specialized_GetIndex_ToMemberReference() public void Specialized_GetIndex_ToMemberReference()
{ {

5
ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMethod.cs

@ -142,7 +142,10 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
if (result != null) { if (result != null) {
return result; return result;
} else { } else {
result = methodDefinition.AccessorOwner.Specialize(this.Substitution); var ownerDefinition = methodDefinition.AccessorOwner;
if (ownerDefinition == null)
return null;
result = ownerDefinition.Specialize(this.Substitution);
return LazyInit.GetOrSet(ref accessorOwner, result); return LazyInit.GetOrSet(ref accessorOwner, result);
} }
} }

Loading…
Cancel
Save