Browse Source

Fix null reference exception in IronPython resolver when class member has a null IReturnType.

pull/14/head
Matt Ward 15 years ago
parent
commit
58b32c7005
  1. 8
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs
  2. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj
  3. 40
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveMemberWhenFieldHasNoReturnTypeTests.cs
  4. 38
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveRandomRandintTests.cs

8
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs

@ -119,8 +119,12 @@ namespace ICSharpCode.PythonBinding @@ -119,8 +119,12 @@ namespace ICSharpCode.PythonBinding
IMember FindMemberInParent(IMember parentMember, string memberName)
{
IClass parentMemberClass = parentMember.ReturnType.GetUnderlyingClass();
return FindMemberInClass(parentMemberClass, memberName);
IReturnType returnType = parentMember.ReturnType;
if (returnType != null) {
IClass parentMemberClass = returnType.GetUnderlyingClass();
return FindMemberInClass(parentMemberClass, memberName);
}
return null;
}
}
}

2
src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj

@ -369,11 +369,13 @@ @@ -369,11 +369,13 @@
<Compile Include="Resolver\ResolveImportsTestFixture.cs" />
<Compile Include="Resolver\ResolveLocalClassInstanceTests.cs" />
<Compile Include="Resolver\ResolveLocalVariableMethodTests.cs" />
<Compile Include="Resolver\ResolveMemberWhenFieldHasNoReturnTypeTests.cs" />
<Compile Include="Resolver\ResolveMethodFromUnknownImportAllTests.cs" />
<Compile Include="Resolver\ResolveMethodReturnValueTests.cs" />
<Compile Include="Resolver\ResolveMethodWhenFromImportIsUnknownTests.cs" />
<Compile Include="Resolver\ResolveMethodWhenImportIsUnknownTests.cs" />
<Compile Include="Resolver\ResolveNullCtrlSpaceParseInfoTestFixture.cs" />
<Compile Include="Resolver\ResolveRandomRandintTests.cs" />
<Compile Include="Resolver\ResolverContextDottedImportedNameMatchTests.cs" />
<Compile Include="Resolver\ResolverContextGetModulesThatImportEverythingTests.cs" />
<Compile Include="Resolver\ResolverContextGetModuleForNameImportedAsDifferentNameTestFixture.cs" />

40
src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveMemberWhenFieldHasNoReturnTypeTests.cs

@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections;
using System.Collections.Generic;
using ICSharpCode.PythonBinding;
using ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.CSharp;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
using UnitTestingUtils = UnitTesting.Tests.Utils;
namespace PythonBinding.Tests.Resolver
{
[TestFixture]
public class ResolveMemberWhenFieldHasNoReturnTypeTests
{
[Test]
public void Resolve_FieldHasNoReturnType_DoesNotThrowNullReferenceException()
{
MockProjectContent projectContent = new MockProjectContent();
UnitTestingUtils.MockClass c = new UnitTestingUtils.MockClass(projectContent, "Test");
projectContent.SetClassToReturnFromGetClass("self", c);
DefaultField field = c.AddField("randomNumber");
field.ReturnType = null;
ParseInformation parseInfo = new ParseInformation(c.CompilationUnit);
ExpressionResult expression = new ExpressionResult("self.randomNumber.randint", ExpressionContext.Default);
PythonClassResolver classResolver = new PythonClassResolver();
PythonLocalVariableResolver localVariableResolver = new PythonLocalVariableResolver(classResolver);
PythonMemberResolver resolver = new PythonMemberResolver(classResolver, localVariableResolver);
PythonResolverContext context = new PythonResolverContext(parseInfo, expression, "class Test:\r\npass");
Assert.DoesNotThrow(delegate { resolver.Resolve(context); });
}
}
}

38
src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveRandomRandintTests.cs

@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.PythonBinding;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Resolver
{
[TestFixture]
public class ResolveRandomRandintTests : ResolveTestsBase
{
protected override ExpressionResult GetExpressionResult()
{
return new ExpressionResult("self.randomNumber.randint", ExpressionContext.Default);
}
protected override string GetPythonScript()
{
return
"import random\r\n" +
"\r\n" +
"class Test:\r\n" +
" def __init__(self):\r\n" +
" self.randomNumber = random.random()\r\n" +
" self.randomNumber.randint\r\n" +
"\r\n";
}
[Test]
public void Resolve_RandomModuleCannotBeFound_NoNullRefererenceExceptionThrown()
{
Assert.IsNotNull(resolveResult as PythonMethodGroupResolveResult);
}
}
}
Loading…
Cancel
Save