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 @@ -24,11 +24,17 @@ namespace ICSharpCode.PythonBinding
/// </summary>
public class PythonLocalVariableResolver : PythonWalker, IPythonResolver
{
PythonClassResolver classResolver;
string variableName = String.Empty;
string typeName;
AssignmentStatement currentAssignStatement;
bool foundVariableAssignment;
public PythonLocalVariableResolver(PythonClassResolver classResolver)
{
this.classResolver = classResolver;
}
/// <summary>
/// The resolved type name.
/// </summary>
@ -141,7 +147,7 @@ namespace ICSharpCode.PythonBinding @@ -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);
}

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

@ -20,7 +20,7 @@ namespace ICSharpCode.PythonBinding @@ -20,7 +20,7 @@ namespace ICSharpCode.PythonBinding
PythonSelfResolver selfResolver = new PythonSelfResolver();
PythonMethodResolver methodResolver;
PythonMemberResolver memberResolver;
PythonLocalVariableResolver localVariableResolver = new PythonLocalVariableResolver();
PythonLocalVariableResolver localVariableResolver;
List<IPythonResolver> resolvers = new List<IPythonResolver>();
@ -28,6 +28,7 @@ namespace ICSharpCode.PythonBinding @@ -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);

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

@ -16,7 +16,8 @@ namespace PythonBinding.Tests.Resolver @@ -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);
}

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

@ -22,20 +22,25 @@ namespace PythonBinding.Tests.Resolver @@ -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 @@ -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 @@ -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 @@ -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 @@ -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);
}
}
}

Loading…
Cancel
Save