From 687e8dc591d7cc207e6feafd54db06ca17b999de Mon Sep 17 00:00:00 2001 From: mrward Date: Tue, 12 Oct 2010 21:05:43 +0100 Subject: [PATCH] Add simple method return value resolver for IronPython. --- .../Project/PythonBinding.csproj | 1 + .../Project/Src/PythonMemberResolver.cs | 9 ++- .../Src/PythonMethodReturnValueResolver.cs | 46 +++++++++++++ .../Project/Src/PythonResolver.cs | 3 + .../Test/PythonBinding.Tests.csproj | 1 + .../Resolver/ResolveMethodReturnValueTests.cs | 66 +++++++++++++++++++ 6 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodReturnValueResolver.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveMethodReturnValueTests.cs diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj index 06dbede0cb..e30237378c 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj @@ -114,6 +114,7 @@ + diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs index 408b680c8e..ef62a48825 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs @@ -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); diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodReturnValueResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodReturnValueResolver.cs new file mode 100644 index 0000000000..62a46484f2 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodReturnValueResolver.cs @@ -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; + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs index c428da1e9e..225628d7e2 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs @@ -21,6 +21,7 @@ namespace ICSharpCode.PythonBinding PythonStandardModuleMethodResolver methodResolver; PythonMemberResolver memberResolver; PythonLocalVariableResolver localVariableResolver; + PythonMethodReturnValueResolver methodReturnValueResolver; List resolvers = new List(); @@ -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); diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj index 4d53119545..cfbaac957e 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj @@ -370,6 +370,7 @@ + diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveMethodReturnValueTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveMethodReturnValueTests.cs new file mode 100644 index 0000000000..94cd5d4550 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveMethodReturnValueTests.cs @@ -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); + } + } +}