diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs index b6bd9b8a93..173288c3b5 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs @@ -24,11 +24,17 @@ namespace ICSharpCode.PythonBinding /// public class PythonLocalVariableResolver : PythonWalker, IPythonResolver { + PythonClassResolver classResolver; string variableName = String.Empty; string typeName; AssignmentStatement currentAssignStatement; bool foundVariableAssignment; + public PythonLocalVariableResolver(PythonClassResolver classResolver) + { + this.classResolver = classResolver; + } + /// /// The resolved type name. /// @@ -141,7 +147,7 @@ namespace ICSharpCode.PythonBinding LocalResolveResult CreateLocalResolveResult(string typeName, string identifier, PythonResolverContext resolverContext) { - IClass resolvedClass = resolverContext.GetClass(typeName); + IClass resolvedClass = classResolver.GetClass(resolverContext, typeName); if (resolvedClass != null) { return CreateLocalResolveResult(identifier, resolvedClass); } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs index daa57b23ce..1f15bc3997 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs @@ -20,7 +20,7 @@ namespace ICSharpCode.PythonBinding PythonSelfResolver selfResolver = new PythonSelfResolver(); PythonMethodResolver methodResolver; PythonMemberResolver memberResolver; - PythonLocalVariableResolver localVariableResolver = new PythonLocalVariableResolver(); + PythonLocalVariableResolver localVariableResolver; List resolvers = new List(); @@ -28,6 +28,7 @@ namespace ICSharpCode.PythonBinding { methodResolver = new PythonMethodResolver(classResolver, standardModuleResolver); memberResolver = new PythonMemberResolver(classResolver); + localVariableResolver = new PythonLocalVariableResolver(classResolver); resolvers.Add(importResolver); resolvers.Add(classResolver); diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonLocalVariableResolverTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonLocalVariableResolverTests.cs index 9977ebf536..24e5d2b6aa 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonLocalVariableResolverTests.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonLocalVariableResolverTests.cs @@ -16,7 +16,8 @@ namespace PythonBinding.Tests.Resolver void Resolve(string variableName, string code) { - PythonLocalVariableResolver resolver = new PythonLocalVariableResolver(); + PythonClassResolver classResolver = new PythonClassResolver(); + PythonLocalVariableResolver resolver = new PythonLocalVariableResolver(classResolver); typeName = resolver.Resolve(variableName, code); } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalClassInstanceTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalClassInstanceTests.cs index 68d24f040d..4660385048 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalClassInstanceTests.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalClassInstanceTests.cs @@ -22,20 +22,25 @@ namespace PythonBinding.Tests.Resolver PythonResolverTestsHelper resolverHelper; MockClass testClass; - [SetUp] - public void Init() + void CreateResolver() { - resolverHelper = new PythonResolverTestsHelper(); + CreateResolver(String.Empty); + } + + void CreateResolver(string code) + { + resolverHelper = new PythonResolverTestsHelper(code); testClass = resolverHelper.CreateClass("Test.Test1"); resolverHelper.ProjectContent.ClassesInProjectContent.Add(testClass); resolverHelper.ProjectContent.SetClassToReturnFromGetClass("Test.Test1", testClass); - } [Test] public void Resolve_LocalVariableIsCreatedOnPreviousLine_ResolveResultVariableNameIsA() { + CreateResolver(); + string python = "a = Test.Test1()\r\n" + "a"; @@ -50,6 +55,8 @@ namespace PythonBinding.Tests.Resolver [Test] public void Resolve_LocalVariableIsCreatedOnPreviousLine_ResolveResultResolvedTypeIsTestClass() { + CreateResolver(); + string python = "a = Test.Test1()\r\n" + "a"; @@ -65,6 +72,8 @@ namespace PythonBinding.Tests.Resolver [Test] public void Resolve_LocalVariableIsReDefinedAfterLineBeingConsidered_ResolveResultResolvedTypeIsTestClass() { + CreateResolver(); + string python = "a = Test.Test1()\r\n" + "a\r\n" + @@ -88,6 +97,8 @@ namespace PythonBinding.Tests.Resolver [Test] public void Resolve_LocalVariableIsReDefinedAfterLineBeingConsideredAndExpressionRegionEndLineIsMinusOne_ResolveResultResolvedTypeIsTestClass() { + CreateResolver(); + string python = "a = Test.Test1()\r\n" + "a\r\n" + @@ -107,5 +118,27 @@ namespace PythonBinding.Tests.Resolver Assert.AreEqual(testClass, underlyingClass); } + + [Test] + public void Resolve_LocalVariableTypeIsImported_ResolveResultResolvedTypeDeterminedFromImportedTypes() + { + string python = + "from MyNamespace import MyClass\r\n" + + "\r\n" + + "a = MyClass()\r\n" + + "a"; + + CreateResolver(python); + + MockClass myClass = resolverHelper.CreateClass("MyNamespace.MyClass"); + resolverHelper.ProjectContent.SetClassToReturnFromGetClass("MyNamespace.MyClass", myClass); + + resolverHelper.Resolve("a", python); + + IReturnType resolvedType = resolverHelper.LocalResolveResult.ResolvedType; + IClass underlyingClass = resolvedType.GetUnderlyingClass(); + + Assert.AreEqual(myClass, underlyingClass); + } } }