diff --git a/src/AddIns/Analysis/UnitTesting/Test/Utils/MockClass.cs b/src/AddIns/Analysis/UnitTesting/Test/Utils/MockClass.cs index da0cb9b97c..3f1bcb7598 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Utils/MockClass.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Utils/MockClass.cs @@ -155,5 +155,12 @@ namespace UnitTesting.Tests.Utils Fields.Add(field); return field; } + + public DefaultMethod AddMethod(string name) + { + DefaultMethod method = new DefaultMethod(this, name); + Methods.Add(method); + return method; + } } } diff --git a/src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockClassTests.cs b/src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockClassTests.cs index 8373db55e4..2fac8a5d02 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockClassTests.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockClassTests.cs @@ -255,5 +255,27 @@ namespace UnitTesting.Tests.Utils.Tests Assert.AreEqual("MyField", name); } + + [Test] + public void AddMethod_PassedName_AddsMethodToClass() + { + MockClass c = new MockClass(); + c.AddMethod("MyMethod"); + + IMethod myMethod = c.Methods[0]; + string name = myMethod.Name; + + Assert.AreEqual("MyMethod", name); + } + + [Test] + public void AddMethod_PassedMethodName_ReturnsMethodWithExpectedName() + { + MockClass c = new MockClass(); + IMethod myMethod = c.AddMethod("MyMethod"); + string name = myMethod.Name; + + Assert.AreEqual("MyMethod", name); + } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj index efc54d5625..f7468c9d24 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj @@ -101,7 +101,6 @@ - @@ -114,7 +113,6 @@ - diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassMembers.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassMembers.cs index bf44d6e6e2..73c67db924 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassMembers.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassMembers.cs @@ -32,6 +32,7 @@ namespace ICSharpCode.PythonBinding members.AddRange(declaringType.Events); members.AddRange(declaringType.Fields); members.AddRange(declaringType.Properties); + members.AddRange(declaringType.Methods); return members; } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDotNetMethodResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDotNetMethodResolver.cs deleted file mode 100644 index e225b78d00..0000000000 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDotNetMethodResolver.cs +++ /dev/null @@ -1,28 +0,0 @@ -// 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 PythonDotNetMethodResolver - { - PythonClassResolver classResolver; - - public PythonDotNetMethodResolver(PythonClassResolver classResolver) - { - this.classResolver = classResolver; - } - - public ResolveResult Resolve(PythonResolverContext resolverContext) - { - MemberName memberName = resolverContext.CreateExpressionMemberName(); - IClass matchingClass = classResolver.GetClass(resolverContext, memberName.Type); - if (matchingClass != null) { - return new PythonMethodGroupResolveResult(matchingClass, memberName.Name); - } - return null; - } - } -} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs index cab49606d7..475fc17f62 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs @@ -26,7 +26,7 @@ namespace ICSharpCode.PythonBinding { this.resolverContext = resolverContext; IMember member = FindMember(); - return CreateMemberResolveResult(member); + return CreateResolveResult(member); } IMember FindMember() @@ -72,9 +72,12 @@ namespace ICSharpCode.PythonBinding return null; } - MemberResolveResult CreateMemberResolveResult(IMember member) + ResolveResult CreateResolveResult(IMember member) { if (member != null) { + if (member is IMethod) { + return new PythonMethodGroupResolveResult(member.DeclaringType, member.Name); + } return new MemberResolveResult(null, null, member); } return null; diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodResolver.cs deleted file mode 100644 index eb552b9cef..0000000000 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodResolver.cs +++ /dev/null @@ -1,29 +0,0 @@ -// 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 PythonMethodResolver : IPythonResolver - { - PythonDotNetMethodResolver dotNetMethodResolver; - PythonStandardModuleMethodResolver standardModuleMethodResolver; - - public PythonMethodResolver(PythonClassResolver classResolver, PythonStandardModuleResolver standardModuleResolver) - { - dotNetMethodResolver = new PythonDotNetMethodResolver(classResolver); - standardModuleMethodResolver = new PythonStandardModuleMethodResolver(standardModuleResolver); - } - - public ResolveResult Resolve(PythonResolverContext resolverContext) - { - ResolveResult resolveResult = dotNetMethodResolver.Resolve(resolverContext); - if (resolveResult != null) { - return resolveResult; - } - return standardModuleMethodResolver.Resolve(resolverContext); - } - } -} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs index 4f4e4e86f8..c428da1e9e 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs @@ -18,7 +18,7 @@ namespace ICSharpCode.PythonBinding PythonClassResolver classResolver = new PythonClassResolver(); PythonStandardModuleResolver standardModuleResolver = new PythonStandardModuleResolver(); PythonSelfResolver selfResolver = new PythonSelfResolver(); - PythonMethodResolver methodResolver; + PythonStandardModuleMethodResolver methodResolver; PythonMemberResolver memberResolver; PythonLocalVariableResolver localVariableResolver; @@ -26,7 +26,7 @@ namespace ICSharpCode.PythonBinding public PythonResolver() { - methodResolver = new PythonMethodResolver(classResolver, standardModuleResolver); + methodResolver = new PythonStandardModuleMethodResolver(standardModuleResolver); localVariableResolver = new PythonLocalVariableResolver(classResolver); memberResolver = new PythonMemberResolver(classResolver, localVariableResolver); diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs index 86e4d534b0..9ac53ca70e 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs @@ -6,7 +6,7 @@ using ICSharpCode.SharpDevelop.Dom; namespace ICSharpCode.PythonBinding { - public class PythonStandardModuleMethodResolver + public class PythonStandardModuleMethodResolver : IPythonResolver { PythonStandardModuleResolver standardModuleResolver; diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj index f2b8498cbb..f73928cf9a 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj @@ -367,6 +367,7 @@ + diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveConsoleWriteLineTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveConsoleWriteLineTests.cs index ef116d3c5b..2230da1614 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveConsoleWriteLineTests.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveConsoleWriteLineTests.cs @@ -24,6 +24,7 @@ namespace PythonBinding.Tests.Resolver protected override ExpressionResult GetExpressionResult() { systemConsoleClass = new MockClass(projectContent, "System.Console"); + systemConsoleClass.AddMethod("WriteLine"); projectContent.SetClassToReturnFromGetClass("Console", systemConsoleClass); return new ExpressionResult("Console.WriteLine", new DomRegion(2, 2), null, null); } @@ -35,26 +36,23 @@ namespace PythonBinding.Tests.Resolver "Console.WriteLine\r\n"; } - [Test] - public void ResolveResultExists() - { - Assert.IsNotNull(resolveResult); - } - /// /// Gets the class name used in IProjectContent.GetClass call. /// [Test] - public void GetClassName() + public void Resolve_ExpressionIsSystemConsoleWriteLine_ProjectContentGetClassNamePassedConsole() { - Assert.AreEqual("Console", projectContent.GetClassName); + string className = projectContent.GetClassName; + Assert.AreEqual("Console", className); } [Test] - public void MethodNameResolveIsWriteLine() + public void Resolve_ExpressionIsSystemConsoleWriteLine_MethodNameResolvedIsWriteLine() { MethodGroupResolveResult methodResolveResult = (MethodGroupResolveResult)resolveResult; - Assert.AreEqual("WriteLine", methodResolveResult.Name); + string name = methodResolveResult.Name; + string expectedName = "WriteLine"; + Assert.AreEqual(expectedName, name); } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalVariableMethodTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalVariableMethodTests.cs new file mode 100644 index 0000000000..6d30d2aeb1 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalVariableMethodTests.cs @@ -0,0 +1,57 @@ +// 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 ResolveLocalVariableMethodTests + { + PythonResolverTestsHelper resolverHelper; + MockClass myClass; + + void CreateClassWithOneProperty() + { + resolverHelper = new PythonResolverTestsHelper(); + myClass = resolverHelper.CreateClass("MyClass"); + myClass.AddMethod("MyMethod"); + + resolverHelper.ProjectContent.SetClassToReturnFromGetClass("MyClass", myClass); + } + + [Test] + public void Resolve_ExpressionIsForMethodOnLocalVariable_MethodGroupResolveResultNameIsMethodName() + { + CreateClassWithOneProperty(); + string code = + "a = MyClass()\r\n" + + "a.MyMethod"; + + resolverHelper.Resolve("a.MyMethod", code); + string methodName = resolverHelper.MethodGroupResolveResult.Name; + string expectedMethodName = "MyMethod"; + + Assert.AreEqual(expectedMethodName, methodName); + } + + [Test] + public void Resolve_ExpressionIsForMethodOnLocalVariable_MethodGroupResolveResultContainingTypeUnderlyingClassIsMyClass() + { + CreateClassWithOneProperty(); + string code = + "a = MyClass()\r\n" + + "a.MyMethod"; + + resolverHelper.Resolve("a.MyMethod", code); + IClass c = resolverHelper.MethodGroupResolveResult.ContainingType.GetUnderlyingClass(); + + Assert.AreEqual(myClass, c); + } + + } +}