6 changed files with 124 additions and 2 deletions
@ -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; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -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…
Reference in new issue