Browse Source

IronPython local variable resolver uses class resolver to find type information.

pull/1/head
mrward 16 years ago
parent
commit
9fcf7b1699
  1. 8
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs
  2. 3
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs
  3. 3
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonLocalVariableResolverTests.cs
  4. 41
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalClassInstanceTests.cs

8
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs

@ -24,11 +24,17 @@ namespace ICSharpCode.PythonBinding
/// </summary> /// </summary>
public class PythonLocalVariableResolver : PythonWalker, IPythonResolver public class PythonLocalVariableResolver : PythonWalker, IPythonResolver
{ {
PythonClassResolver classResolver;
string variableName = String.Empty; string variableName = String.Empty;
string typeName; string typeName;
AssignmentStatement currentAssignStatement; AssignmentStatement currentAssignStatement;
bool foundVariableAssignment; bool foundVariableAssignment;
public PythonLocalVariableResolver(PythonClassResolver classResolver)
{
this.classResolver = classResolver;
}
/// <summary> /// <summary>
/// The resolved type name. /// The resolved type name.
/// </summary> /// </summary>
@ -141,7 +147,7 @@ namespace ICSharpCode.PythonBinding
LocalResolveResult CreateLocalResolveResult(string typeName, string identifier, PythonResolverContext resolverContext) LocalResolveResult CreateLocalResolveResult(string typeName, string identifier, PythonResolverContext resolverContext)
{ {
IClass resolvedClass = resolverContext.GetClass(typeName); IClass resolvedClass = classResolver.GetClass(resolverContext, typeName);
if (resolvedClass != null) { if (resolvedClass != null) {
return CreateLocalResolveResult(identifier, resolvedClass); return CreateLocalResolveResult(identifier, resolvedClass);
} }

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

@ -20,7 +20,7 @@ namespace ICSharpCode.PythonBinding
PythonSelfResolver selfResolver = new PythonSelfResolver(); PythonSelfResolver selfResolver = new PythonSelfResolver();
PythonMethodResolver methodResolver; PythonMethodResolver methodResolver;
PythonMemberResolver memberResolver; PythonMemberResolver memberResolver;
PythonLocalVariableResolver localVariableResolver = new PythonLocalVariableResolver(); PythonLocalVariableResolver localVariableResolver;
List<IPythonResolver> resolvers = new List<IPythonResolver>(); List<IPythonResolver> resolvers = new List<IPythonResolver>();
@ -28,6 +28,7 @@ namespace ICSharpCode.PythonBinding
{ {
methodResolver = new PythonMethodResolver(classResolver, standardModuleResolver); methodResolver = new PythonMethodResolver(classResolver, standardModuleResolver);
memberResolver = new PythonMemberResolver(classResolver); memberResolver = new PythonMemberResolver(classResolver);
localVariableResolver = new PythonLocalVariableResolver(classResolver);
resolvers.Add(importResolver); resolvers.Add(importResolver);
resolvers.Add(classResolver); resolvers.Add(classResolver);

3
src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonLocalVariableResolverTests.cs

@ -16,7 +16,8 @@ namespace PythonBinding.Tests.Resolver
void Resolve(string variableName, string code) void Resolve(string variableName, string code)
{ {
PythonLocalVariableResolver resolver = new PythonLocalVariableResolver(); PythonClassResolver classResolver = new PythonClassResolver();
PythonLocalVariableResolver resolver = new PythonLocalVariableResolver(classResolver);
typeName = resolver.Resolve(variableName, code); typeName = resolver.Resolve(variableName, code);
} }

41
src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalClassInstanceTests.cs

@ -22,20 +22,25 @@ namespace PythonBinding.Tests.Resolver
PythonResolverTestsHelper resolverHelper; PythonResolverTestsHelper resolverHelper;
MockClass testClass; MockClass testClass;
[SetUp] void CreateResolver()
public void Init()
{ {
resolverHelper = new PythonResolverTestsHelper(); CreateResolver(String.Empty);
}
void CreateResolver(string code)
{
resolverHelper = new PythonResolverTestsHelper(code);
testClass = resolverHelper.CreateClass("Test.Test1"); testClass = resolverHelper.CreateClass("Test.Test1");
resolverHelper.ProjectContent.ClassesInProjectContent.Add(testClass); resolverHelper.ProjectContent.ClassesInProjectContent.Add(testClass);
resolverHelper.ProjectContent.SetClassToReturnFromGetClass("Test.Test1", testClass); resolverHelper.ProjectContent.SetClassToReturnFromGetClass("Test.Test1", testClass);
} }
[Test] [Test]
public void Resolve_LocalVariableIsCreatedOnPreviousLine_ResolveResultVariableNameIsA() public void Resolve_LocalVariableIsCreatedOnPreviousLine_ResolveResultVariableNameIsA()
{ {
CreateResolver();
string python = string python =
"a = Test.Test1()\r\n" + "a = Test.Test1()\r\n" +
"a"; "a";
@ -50,6 +55,8 @@ namespace PythonBinding.Tests.Resolver
[Test] [Test]
public void Resolve_LocalVariableIsCreatedOnPreviousLine_ResolveResultResolvedTypeIsTestClass() public void Resolve_LocalVariableIsCreatedOnPreviousLine_ResolveResultResolvedTypeIsTestClass()
{ {
CreateResolver();
string python = string python =
"a = Test.Test1()\r\n" + "a = Test.Test1()\r\n" +
"a"; "a";
@ -65,6 +72,8 @@ namespace PythonBinding.Tests.Resolver
[Test] [Test]
public void Resolve_LocalVariableIsReDefinedAfterLineBeingConsidered_ResolveResultResolvedTypeIsTestClass() public void Resolve_LocalVariableIsReDefinedAfterLineBeingConsidered_ResolveResultResolvedTypeIsTestClass()
{ {
CreateResolver();
string python = string python =
"a = Test.Test1()\r\n" + "a = Test.Test1()\r\n" +
"a\r\n" + "a\r\n" +
@ -88,6 +97,8 @@ namespace PythonBinding.Tests.Resolver
[Test] [Test]
public void Resolve_LocalVariableIsReDefinedAfterLineBeingConsideredAndExpressionRegionEndLineIsMinusOne_ResolveResultResolvedTypeIsTestClass() public void Resolve_LocalVariableIsReDefinedAfterLineBeingConsideredAndExpressionRegionEndLineIsMinusOne_ResolveResultResolvedTypeIsTestClass()
{ {
CreateResolver();
string python = string python =
"a = Test.Test1()\r\n" + "a = Test.Test1()\r\n" +
"a\r\n" + "a\r\n" +
@ -107,5 +118,27 @@ namespace PythonBinding.Tests.Resolver
Assert.AreEqual(testClass, underlyingClass); 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);
}
} }
} }

Loading…
Cancel
Save