Browse Source

Add simple method return value resolver for IronPython.

pull/2/head
mrward 15 years ago
parent
commit
687e8dc591
  1. 1
      src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj
  2. 9
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs
  3. 46
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodReturnValueResolver.cs
  4. 3
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs
  5. 1
      src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj
  6. 66
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveMethodReturnValueTests.cs

1
src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj

@ -114,6 +114,7 @@ @@ -114,6 +114,7 @@
<Compile Include="Src\PythonMethodDefinition.cs" />
<Compile Include="Src\PythonMethodGroupResolveResult.cs" />
<Compile Include="Src\PythonMethodOrClassBodyRegion.cs" />
<Compile Include="Src\PythonMethodReturnValueResolver.cs" />
<Compile Include="Src\PythonModule.cs" />
<Compile Include="Src\PythonModuleCompletionItems.cs" />
<Compile Include="Src\PythonModuleCompletionItemsFactory.cs" />

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

@ -25,11 +25,16 @@ namespace ICSharpCode.PythonBinding @@ -25,11 +25,16 @@ namespace ICSharpCode.PythonBinding
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
this.resolverContext = resolverContext;
IMember member = FindMember();
IMember member = FindMember(resolverContext);
return CreateResolveResult(member);
}
public IMember FindMember(PythonResolverContext resolverContext)
{
this.resolverContext = resolverContext;
return FindMember();
}
IMember FindMember()
{
return FindMember(resolverContext.Expression);

46
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodReturnValueResolver.cs

@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
// 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.SharpDevelop.Dom;
namespace ICSharpCode.PythonBinding
{
public class PythonMethodReturnValueResolver : IPythonResolver
{
PythonMemberResolver memberResolver;
public PythonMethodReturnValueResolver(PythonMemberResolver memberResolver)
{
this.memberResolver = memberResolver;
}
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
string methodName = GetMethodName(resolverContext.Expression);
if (methodName != null) {
PythonResolverContext newResolverContext = resolverContext.Clone(methodName);
IMember member = memberResolver.FindMember(newResolverContext);
return CreateResolveResult(member);
}
return null;
}
string GetMethodName(string expression)
{
int methodParametersStartIndex = expression.IndexOf('(');
if ((methodParametersStartIndex > 0) && expression.EndsWith(")")) {
return expression.Substring(0, methodParametersStartIndex);
}
return null;
}
MemberResolveResult CreateResolveResult(IMember member)
{
if (member != null) {
return new MemberResolveResult(null, null, member);
}
return null;
}
}
}

3
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs

@ -21,6 +21,7 @@ namespace ICSharpCode.PythonBinding @@ -21,6 +21,7 @@ namespace ICSharpCode.PythonBinding
PythonStandardModuleMethodResolver methodResolver;
PythonMemberResolver memberResolver;
PythonLocalVariableResolver localVariableResolver;
PythonMethodReturnValueResolver methodReturnValueResolver;
List<IPythonResolver> resolvers = new List<IPythonResolver>();
@ -29,10 +30,12 @@ namespace ICSharpCode.PythonBinding @@ -29,10 +30,12 @@ namespace ICSharpCode.PythonBinding
methodResolver = new PythonStandardModuleMethodResolver(standardModuleResolver);
localVariableResolver = new PythonLocalVariableResolver(classResolver);
memberResolver = new PythonMemberResolver(classResolver, localVariableResolver);
methodReturnValueResolver = new PythonMethodReturnValueResolver(memberResolver);
resolvers.Add(importResolver);
resolvers.Add(classResolver);
resolvers.Add(standardModuleResolver);
resolvers.Add(methodReturnValueResolver);
resolvers.Add(memberResolver);
resolvers.Add(methodResolver);
resolvers.Add(selfResolver);

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

@ -370,6 +370,7 @@ @@ -370,6 +370,7 @@
<Compile Include="Resolver\ResolveLocalClassInstanceTests.cs" />
<Compile Include="Resolver\ResolveLocalVariableMethodTests.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" />

66
src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveMethodReturnValueTests.cs

@ -0,0 +1,66 @@ @@ -0,0 +1,66 @@
// 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.SharpDevelop.Dom;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
using UnitTesting.Tests.Utils;
namespace PythonBinding.Tests.Resolver
{
[TestFixture]
public class ResolveMethodReturnValueTests
{
PythonResolverTestsHelper resolverHelper;
MockClass myClass;
DefaultMethod myMethod;
void CreateResolver()
{
resolverHelper = new PythonResolverTestsHelper();
myClass = resolverHelper.CreateClass("MyClass");
myMethod = myClass.AddMethod("MyMethod");
myMethod.ReturnType = new DefaultReturnType(myClass);
resolverHelper.ProjectContent.SetClassToReturnFromGetClass("MyClass", myClass);
}
[Test]
public void Resolve_ExpressionToResolveIsMethodCallWithNoParameters_ReturnsMemberResolveResultWithResolvedMemberAsMethod()
{
CreateResolver();
string code = "MyClass.MyMethod()";
resolverHelper.Resolve(code);
MemberResolveResult result = resolverHelper.MemberResolveResult;
IMember resolvedMember = result.ResolvedMember;
Assert.AreEqual(myMethod, resolvedMember);
}
[Test]
public void Resolve_ExpressionToResolveIsMethodCallWithNoParameters_ReturnsMemberResolveResultWithMethodReturnValueAsResolvedType()
{
CreateResolver();
string code = "MyClass.MyMethod()";
resolverHelper.Resolve(code);
MemberResolveResult result = resolverHelper.MemberResolveResult;
IReturnType resolvedType = result.ResolvedType;
IReturnType expectedResolvedType = myMethod.ReturnType;
Assert.AreEqual(expectedResolvedType, resolvedType);
}
[Test]
public void Resolve_ExpressionHasCloseParenthesisButNoOpenParenthesis_NoArgumentOutOfRangeExceptionThrownAndResolveResultIsNull()
{
CreateResolver();
string code = "MyClass.MyMethod)";
resolverHelper.Resolve(code);
Assert.IsNull(resolverHelper.ResolveResult);
}
}
}
Loading…
Cancel
Save