diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj
index b95b31ea8f..12fd3f4a92 100644
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj
@@ -101,6 +101,7 @@
+
@@ -163,7 +164,6 @@
-
Chiron.exe.Config
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonVariableResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs
similarity index 64%
rename from src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonVariableResolver.cs
rename to src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs
index 0523c0217d..9479733afa 100644
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonVariableResolver.cs
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs
@@ -21,17 +21,13 @@ namespace ICSharpCode.PythonBinding
///
/// Determines the type of a variable.
///
- public class PythonVariableResolver : PythonWalker
+ public class PythonLocalVariableResolver : PythonWalker, IPythonResolver
{
string variableName = String.Empty;
string typeName;
AssignmentStatement currentAssignStatement;
bool foundVariableAssignment;
- public PythonVariableResolver()
- {
- }
-
///
/// The resolved type name.
///
@@ -44,20 +40,22 @@ namespace ICSharpCode.PythonBinding
///
/// Name of the variable.
/// The python code containing the variable.
- public string Resolve(string variableName, string fileName, string code)
+ public string Resolve(string variableName, string code)
{
if (code != null) {
- ScriptEngine scriptEngine = IronPython.Hosting.Python.CreateEngine();
- PythonCompilerSink sink = new PythonCompilerSink();
- SourceUnit source = DefaultContext.DefaultPythonContext.CreateFileUnit(fileName, code);
- CompilerContext context = new CompilerContext(source, new PythonCompilerOptions(), sink);
- Parser parser = Parser.CreateParser(context, new PythonOptions());
- PythonAst ast = parser.ParseFile(false);
-
+ PythonParser parser = new PythonParser();
+ PythonAst ast = parser.CreateAst("resolver.py", code);
return Resolve(variableName, ast);
}
return null;
}
+
+ string Resolve(string variableName, PythonAst ast)
+ {
+ this.variableName = variableName;
+ ast.Walk(this);
+ return TypeName;
+ }
public override bool Walk(AssignmentStatement node)
{
@@ -136,11 +134,52 @@ namespace ICSharpCode.PythonBinding
return typeName.ToString();
}
- string Resolve(string variableName, PythonAst ast)
+ public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
{
- this.variableName = variableName;
- ast.Walk(this);
- return TypeName;
+ return GetLocalVariable(resolverContext, expressionResult.Expression);
+ }
+
+ ///
+ /// Tries to find the type that matches the local variable name.
+ ///
+ LocalResolveResult GetLocalVariable(PythonResolverContext resolverContext, string expression)
+ {
+ PythonLocalVariableResolver resolver = new PythonLocalVariableResolver();
+ string typeName = resolver.Resolve(expression, resolverContext.FileContent);
+ if (typeName != null) {
+ return CreateLocalResolveResult(typeName, expression, resolverContext);
+ }
+ return null;
+ }
+
+ LocalResolveResult CreateLocalResolveResult(string typeName, string identifier, PythonResolverContext resolverContext)
+ {
+ IClass resolvedClass = resolverContext.GetClass(typeName);
+ if (resolvedClass != null) {
+ return CreateLocalResolveResult(identifier, resolvedClass);
+ }
+ return null;
+ }
+
+ LocalResolveResult CreateLocalResolveResult(string identifier, IClass resolvedClass)
+ {
+ DefaultMethod dummyMethod = CreateDummyMethod();
+ DefaultField.LocalVariableField field = CreateLocalVariableField(identifier, resolvedClass, dummyMethod.DeclaringType);
+ return new LocalResolveResult(dummyMethod, field);
+ }
+
+ DefaultField.LocalVariableField CreateLocalVariableField(string identifier, IClass resolvedClass, IClass callingClass)
+ {
+ return new DefaultField.LocalVariableField(resolvedClass.DefaultReturnType,
+ identifier,
+ DomRegion.Empty,
+ callingClass);
+ }
+
+ DefaultMethod CreateDummyMethod()
+ {
+ DefaultClass dummyClass = new DefaultClass(DefaultCompilationUnit.DummyCompilationUnit, "Global");
+ return new DefaultMethod(dummyClass, String.Empty);
}
}
}
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonParser.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonParser.cs
index 4ab47e70e9..c8b1f85de5 100644
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonParser.cs
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonParser.cs
@@ -27,10 +27,6 @@ namespace ICSharpCode.PythonBinding
string[] lexerTags = new string[0];
ScriptEngine scriptEngine;
- public PythonParser()
- {
- }
-
public string[] LexerTags {
get { return lexerTags; }
set { lexerTags = value; }
@@ -40,10 +36,6 @@ namespace ICSharpCode.PythonBinding
get { return LanguageProperties.None; }
}
-
- ///
- /// Creates a PythonExpressionFinder.
- ///
public IExpressionFinder CreateExpressionFinder(string fileName)
{
return new PythonExpressionFinder();
@@ -75,14 +67,22 @@ namespace ICSharpCode.PythonBinding
///
/// Parses a python file and creates a PythonAst.
///
- public PythonAst CreateAst(string fileName, ITextBuffer fileContent)
+ public PythonAst CreateAst(string fileName, ITextBuffer textBuffer)
+ {
+ return CreateAst(fileName, textBuffer.Text);
+ }
+
+ ///
+ /// Parses a python file and creates a PythonAst.
+ ///
+ public PythonAst CreateAst(string fileName, string fileContent)
{
if (scriptEngine == null) {
scriptEngine = IronPython.Hosting.Python.CreateEngine();
}
PythonCompilerSink sink = new PythonCompilerSink();
- SourceUnit source = DefaultContext.DefaultPythonContext.CreateFileUnit(fileName, fileContent.Text);
+ SourceUnit source = DefaultContext.DefaultPythonContext.CreateFileUnit(fileName, fileContent);
CompilerContext context = new CompilerContext(source, new PythonCompilerOptions(), sink);
using (Parser parser = Parser.CreateParser(context, new PythonOptions())) {
return parser.ParseFile(false);
@@ -92,12 +92,24 @@ namespace ICSharpCode.PythonBinding
///
/// Parses the python code and returns an ICompilationUnit.
///
- public ICompilationUnit Parse(IProjectContent projectContent, string fileName, string fileContent)
+ public ICompilationUnit Parse(IProjectContent projectContent, string fileName, ITextBuffer textBuffer)
{
- return Parse(projectContent, fileName, new StringTextBuffer(fileContent));
+ string fileContent = GetFileContent(textBuffer);
+ return Parse(projectContent, fileName, fileContent);
}
- public ICompilationUnit Parse(IProjectContent projectContent, string fileName, ITextBuffer fileContent)
+ string GetFileContent(ITextBuffer textBuffer)
+ {
+ if (textBuffer != null) {
+ return textBuffer.Text;
+ }
+ return null;
+ }
+
+ ///
+ /// Parses the python code and returns an ICompilationUnit.
+ ///
+ public ICompilationUnit Parse(IProjectContent projectContent, string fileName, string fileContent)
{
if (fileContent != null) {
try {
@@ -115,9 +127,6 @@ namespace ICSharpCode.PythonBinding
return compilationUnit;
}
- ///
- /// Creates a new PythonResolver.
- ///
public IResolver CreateResolver()
{
return new PythonResolver();
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs
index 3bc88aca4e..daa57b23ce 100644
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs
@@ -20,6 +20,7 @@ namespace ICSharpCode.PythonBinding
PythonSelfResolver selfResolver = new PythonSelfResolver();
PythonMethodResolver methodResolver;
PythonMemberResolver memberResolver;
+ PythonLocalVariableResolver localVariableResolver = new PythonLocalVariableResolver();
List resolvers = new List();
@@ -35,6 +36,7 @@ namespace ICSharpCode.PythonBinding
resolvers.Add(methodResolver);
resolvers.Add(selfResolver);
resolvers.Add(namespaceResolver);
+ resolvers.Add(localVariableResolver);
}
public ResolveResult Resolve(ExpressionResult expressionResult, ParseInformation parseInfo, string fileContent)
@@ -43,7 +45,7 @@ namespace ICSharpCode.PythonBinding
return null;
}
- resolverContext = new PythonResolverContext(parseInfo);
+ resolverContext = new PythonResolverContext(parseInfo, fileContent);
if (!resolverContext.GetCallingMember(expressionResult.Region)) {
return null;
}
@@ -59,13 +61,6 @@ namespace ICSharpCode.PythonBinding
return resolveResult;
}
}
-
-// // Search for a local variable.
-// LocalResolveResult localResolveResult = GetLocalVariable(expressionResult.Expression, parseInfo.BestCompilationUnit.FileName, fileContent);
-// if (localResolveResult != null) {
-// return localResolveResult;
-// }
-
return null;
}
@@ -74,35 +69,25 @@ namespace ICSharpCode.PythonBinding
///
public List CtrlSpace(int caretLine, int caretColumn, ParseInformation parseInfo, string fileContent, ExpressionContext context)
{
- resolverContext = new PythonResolverContext(parseInfo);
+ resolverContext = new PythonResolverContext(parseInfo, fileContent);
+ return CtrlSpace(resolverContext, context);
+ }
+
+ List CtrlSpace(PythonResolverContext resolverContext, ExpressionContext expressionContext)
+ {
if (resolverContext.HasProjectContent) {
- if (context == ExpressionContext.Namespace) {
- PythonImportCompletion importCompletion = new PythonImportCompletion(resolverContext.ProjectContent);
- return importCompletion.GetCompletionItems();
- } else {
- return resolverContext.GetImportedTypes();
+ if (expressionContext == ExpressionContext.Namespace) {
+ return GetImportCompletionItems(resolverContext.ProjectContent);
}
+ return resolverContext.GetImportedTypes();
}
return new List();
}
- ///
- /// Tries to find the type that matches the local variable name.
- ///
- LocalResolveResult GetLocalVariable(string expression, string fileName, string fileContent)
+ List GetImportCompletionItems(IProjectContent projectContent)
{
-// PythonVariableResolver resolver = new PythonVariableResolver();
-// string typeName = resolver.Resolve(expression, fileName, fileContent);
-// if (typeName != null) {
-// IClass resolvedClass = GetClass(typeName);
-// if (resolvedClass != null) {
-// DefaultClass dummyClass = new DefaultClass(DefaultCompilationUnit.DummyCompilationUnit, "Global");
-// DefaultMethod dummyMethod = new DefaultMethod(dummyClass, String.Empty);
-// DefaultField.LocalVariableField field = new DefaultField.LocalVariableField(resolvedClass.DefaultReturnType, expression, DomRegion.Empty, dummyClass);
-// return new LocalResolveResult(dummyMethod, field);
-// }
-// }
- return null;
+ PythonImportCompletion importCompletion = new PythonImportCompletion(projectContent);
+ return importCompletion.GetCompletionItems();
}
}
}
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolverContext.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolverContext.cs
index 8f85de1d99..76a7cdd799 100644
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolverContext.cs
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolverContext.cs
@@ -13,9 +13,16 @@ namespace ICSharpCode.PythonBinding
ICompilationUnit compilationUnit;
IProjectContent projectContent;
IClass callingClass;
+ string fileContent;
public PythonResolverContext(ParseInformation parseInfo)
+ : this(parseInfo, String.Empty)
{
+ }
+
+ public PythonResolverContext(ParseInformation parseInfo, string fileContent)
+ {
+ this.fileContent = fileContent;
GetCompilationUnits(parseInfo);
GetProjectContent();
}
@@ -40,6 +47,10 @@ namespace ICSharpCode.PythonBinding
}
}
+ public string FileContent {
+ get { return fileContent; }
+ }
+
public IProjectContent ProjectContent {
get { return projectContent; }
}
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj
index da40fbfda1..07640e3197 100644
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj
@@ -348,11 +348,11 @@
+
-
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonLocalVariableResolverTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonLocalVariableResolverTests.cs
new file mode 100644
index 0000000000..a67afecc5e
--- /dev/null
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonLocalVariableResolverTests.cs
@@ -0,0 +1,78 @@
+// 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.PythonBinding;
+using NUnit.Framework;
+
+namespace PythonBinding.Tests.Resolver
+{
+ [TestFixture]
+ public class PythonLocalVariableResolverTests
+ {
+ string typeName;
+
+ void Resolve(string variableName, string code)
+ {
+ PythonLocalVariableResolver resolver = new PythonLocalVariableResolver();
+ typeName = resolver.Resolve(variableName, code);
+ }
+
+ [Test]
+ public void Resolve_InstanceCreatedInCode_ReturnsInstanceType()
+ {
+ string code = "a = Class1()";
+ Resolve("a", code);
+
+ Assert.AreEqual("Class1", typeName);
+ }
+
+ ///
+ /// Tests that the NameExpression in the resolver is reset so the second assignment
+ /// does not override the first.
+ ///
+ [Test]
+ public void Resolve_TwoInstancesCreatedInCode_ReturnsFirstInstanceType()
+ {
+ string code =
+ "a = Class1()\r\n" +
+ "b = Class2()";
+
+ Resolve("a", code);
+
+ Assert.AreEqual("Class1", typeName);
+ }
+
+ [Test]
+ public void Resolve_VariableIsAssignedToString_ReturnsNull()
+ {
+ string code = "a = \"test\"";
+ Resolve("a", code);
+
+ Assert.IsNull(typeName);
+ }
+
+ [Test]
+ public void Resolve_CodeIsNull_ReturnsNull()
+ {
+ Resolve("a", null);
+ Assert.IsNull(typeName);
+ }
+
+ [Test]
+ public void Resolve_InstanceCreatedWithNamespace_ReturnsFullyQualifiedTypeName()
+ {
+ string code = "a = Test.Class1()";
+ Resolve("a", code);
+ Assert.AreEqual("Test.Class1", typeName);
+ }
+
+ [Test]
+ public void Resolve_InstanceCreatedWithTwoPartsToNamespace_ReturnsFullyQualifiedTypeName()
+ {
+ string code = "a = Root.Test.Class1()";
+ Resolve("a", code);
+ Assert.AreEqual("Root.Test.Class1", typeName);
+ }
+ }
+}
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassEventTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassEventTests.cs
index c40495cad3..c112ddddb0 100644
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassEventTests.cs
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassEventTests.cs
@@ -53,7 +53,7 @@ namespace PythonBinding.Tests.Resolver
{
CreateClassWithOneEvent();
resolverHelper.Resolve("MyClass.MyEvent");
- IMember resolvedMember = resolverHelper.MemberResultResult.ResolvedMember;
+ IMember resolvedMember = resolverHelper.MemberResolveResult.ResolvedMember;
Assert.AreEqual(myClassEvent, resolvedMember);
}
@@ -64,7 +64,7 @@ namespace PythonBinding.Tests.Resolver
CreateClassWithOneEvent();
IEvent secondEvent = myClass.AddEvent("SecondEvent");
resolverHelper.Resolve("MyClass.SecondEvent");
- IMember resolvedMember = resolverHelper.MemberResultResult.ResolvedMember;
+ IMember resolvedMember = resolverHelper.MemberResolveResult.ResolvedMember;
Assert.AreEqual(secondEvent, resolvedMember);
}
@@ -74,7 +74,7 @@ namespace PythonBinding.Tests.Resolver
{
CreateClassWithOneEvent();
resolverHelper.Resolve("MyClass.MyEvent.Target");
- IMember resolvedMember = resolverHelper.MemberResultResult.ResolvedMember;
+ IMember resolvedMember = resolverHelper.MemberResolveResult.ResolvedMember;
Assert.AreEqual(eventHandlerTargetProperty, resolvedMember);
}
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassFieldTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassFieldTests.cs
index bdc02632a4..d1946ef4c4 100644
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassFieldTests.cs
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassFieldTests.cs
@@ -44,7 +44,7 @@ namespace PythonBinding.Tests.Resolver
{
CreateClassWithOneEvent();
resolverHelper.Resolve("MyClass.MyField");
- IMember resolvedMember = resolverHelper.MemberResultResult.ResolvedMember;
+ IMember resolvedMember = resolverHelper.MemberResolveResult.ResolvedMember;
Assert.AreEqual(myClassField, resolvedMember);
}
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassInstanceWithNamespaceTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassInstanceWithNamespaceTestFixture.cs
deleted file mode 100644
index 83f0cb9538..0000000000
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassInstanceWithNamespaceTestFixture.cs
+++ /dev/null
@@ -1,41 +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 System.Collections;
-using ICSharpCode.PythonBinding;
-using ICSharpCode.SharpDevelop.Dom;
-using NUnit.Framework;
-using PythonBinding.Tests;
-using PythonBinding.Tests.Utils;
-
-namespace PythonBinding.Tests.Resolver
-{
- ///
- /// Given code:
- ///
- /// a = Test.Class1()
- ///
- /// Where Test is the namespace of the class, check that the type of "a" can be obtained
- /// by the resolver.
- ///
- [TestFixture]
- public class ResolveClassInstanceWithNamespaceTestFixture
- {
- [Test]
- public void GetTypeOfInstance()
- {
- string code = "a = Test.Class1()";
- PythonVariableResolver resolver = new PythonVariableResolver();
- Assert.AreEqual("Test.Class1", resolver.Resolve("a", @"C:\Projects\Test\Test.py", code));
- }
-
- [Test]
- public void GetTypeOfInstanceWithTwoNamespaces()
- {
- string code = "a = Root.Test.Class1()";
- PythonVariableResolver resolver = new PythonVariableResolver();
- Assert.AreEqual("Root.Test.Class1", resolver.Resolve("a", @"C:\Projects\Test\Test.py", code));
- }
- }
-}
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassPropertyTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassPropertyTests.cs
index f710694f91..3efc9c7742 100644
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassPropertyTests.cs
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveClassPropertyTests.cs
@@ -54,7 +54,7 @@ namespace PythonBinding.Tests.Resolver
{
CreateClassWithOneProperty();
resolverHelper.Resolve("MyClass.MyProperty");
- IMember resolvedMember = resolverHelper.MemberResultResult.ResolvedMember;
+ IMember resolvedMember = resolverHelper.MemberResolveResult.ResolvedMember;
Assert.AreEqual(myClassProperty, resolvedMember);
}
@@ -65,7 +65,7 @@ namespace PythonBinding.Tests.Resolver
CreateClassWithOneProperty();
myClass.InsertPropertyAtStart("ExtraProperty");
resolverHelper.Resolve("MyClass.MyProperty");
- IMember resolvedMember = resolverHelper.MemberResultResult.ResolvedMember;
+ IMember resolvedMember = resolverHelper.MemberResolveResult.ResolvedMember;
Assert.AreEqual(myClassProperty, resolvedMember);
}
@@ -76,7 +76,7 @@ namespace PythonBinding.Tests.Resolver
CreateClassWithOneProperty();
AddNestedPropertyToExistingProperty();
resolverHelper.Resolve("MyClass.MyProperty.MyNestedProperty");
- IMember resolvedMember = resolverHelper.MemberResultResult.ResolvedMember;
+ IMember resolvedMember = resolverHelper.MemberResolveResult.ResolvedMember;
Assert.AreEqual(nestedClassProperty, resolvedMember);
}
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalClassInstanceTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalClassInstanceTests.cs
index 3f5a115f94..04cacf214f 100644
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalClassInstanceTests.cs
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalClassInstanceTests.cs
@@ -2,11 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
-using System.Collections;
-using ICSharpCode.PythonBinding;
-using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
-using PythonBinding.Tests;
using PythonBinding.Tests.Utils;
using UnitTesting.Tests.Utils;
@@ -20,82 +16,32 @@ namespace PythonBinding.Tests.Resolver
/// Check that the type of "a" can be obtained by the resolver.
///
[TestFixture]
- [Ignore("Disabled local variable resolution for SD 3.0")]
public class ResolveLocalClassInstanceTests
{
- PythonResolver resolver;
- ICSharpCode.Scripting.Tests.Utils.MockProjectContent mockProjectContent;
- LocalResolveResult resolveResult;
+ PythonResolverTestsHelper resolverHelper;
MockClass testClass;
- ICompilationUnit compilationUnit;
- [TestFixtureSetUp]
- public void SetUpFixture()
+ [SetUp]
+ public void Init()
{
- resolver = new PythonResolver();
+ resolverHelper = new PythonResolverTestsHelper();
- mockProjectContent = new ICSharpCode.Scripting.Tests.Utils.MockProjectContent();
- testClass = new MockClass(mockProjectContent, "Test.Test1");
- mockProjectContent.ClassesInProjectContent.Add(testClass);
- mockProjectContent.SetClassToReturnFromGetClass("Test.Test1", testClass);
-
- compilationUnit = new DefaultCompilationUnit(mockProjectContent);
- compilationUnit.FileName = @"C:\Projects\Test\test.py";
- ParseInformation parseInfo = new ParseInformation(compilationUnit);
+ testClass = resolverHelper.CreateClass("Test.Test1");
+ resolverHelper.ProjectContent.ClassesInProjectContent.Add(testClass);
+ resolverHelper.ProjectContent.SetClassToReturnFromGetClass("Test.Test1", testClass);
string python =
- "a = Test1()\r\n" +
+ "a = Test.Test1()\r\n" +
"a";
- ExpressionResult expressionResult = new ExpressionResult("a", new DomRegion(2, 1), null, null);
- resolveResult = resolver.Resolve(expressionResult, parseInfo, python) as LocalResolveResult;
- }
-
- [Test]
- public void GetTypeOfInstance()
- {
- string code = "a = Class1()";
- PythonVariableResolver resolver = new PythonVariableResolver();
- Assert.AreEqual("Class1", resolver.Resolve("a", @"C:\Projects\Test\Test.py", code));
- }
-
- ///
- /// Tests that the NameExpression in the resolver is reset so the second assignment
- /// does not override the first.
- ///
- [Test]
- public void DifferentTypeCreatedLast()
- {
- string code = "a = Class1()\r\n" +
- "b = Class2()";
- PythonVariableResolver resolver = new PythonVariableResolver();
- Assert.AreEqual("Class1", resolver.Resolve("a", @"C:\Projects\Test\Test.py", code));
- }
-
- [Test]
- public void StringAssignmentShouldNotResolve()
- {
- string code = "a = \"test\"";
- PythonVariableResolver resolver = new PythonVariableResolver();
- Assert.AreEqual(null, resolver.Resolve("a", @"C:\Projects\Test\Test.py", code));
- }
-
- [Test]
- public void NullCodeShouldNotResolve()
- {
- PythonVariableResolver resolver = new PythonVariableResolver();
- Assert.AreEqual(null, resolver.Resolve("a", @"C:\Projects\Test\Test.py", null));
- }
-
- [Test]
- public void ResolveResultIsLocalResolveResult()
- {
- Assert.IsNotNull(resolveResult);
+
+ resolverHelper.Resolve("a", python);
}
[Test]
public void ResolveResultVariableName()
{
- Assert.AreEqual(resolveResult.VariableName, "a");
+ string name = resolverHelper.LocalResolveResult.VariableName;
+ Assert.AreEqual("a", name);
}
}
}
diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonResolverTestsHelper.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonResolverTestsHelper.cs
index 51eb76f5f9..dcad496a05 100644
--- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonResolverTestsHelper.cs
+++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonResolverTestsHelper.cs
@@ -14,7 +14,6 @@ namespace PythonBinding.Tests.Utils
public ScriptingUtils.MockProjectContent ProjectContent;
public DefaultCompilationUnit CompilationUnit;
public ParseInformation ParseInfo;
- public PythonResolverContext Context;
public PythonResolver Resolver;
public ResolveResult ResolveResult;
@@ -25,9 +24,7 @@ namespace PythonBinding.Tests.Utils
string fileName = @"test.py";
CompilationUnit = parser.Parse(ProjectContent, fileName, code) as DefaultCompilationUnit;
- ParseInfo = new ParseInformation(CompilationUnit);
- Context = new PythonResolverContext(ParseInfo);
-
+ ParseInfo = new ParseInformation(CompilationUnit);
Resolver = new PythonResolver();
}
@@ -39,14 +36,26 @@ namespace PythonBinding.Tests.Utils
public ResolveResult Resolve(string expression)
{
ExpressionResult expressionResult = new ExpressionResult(expression);
- ResolveResult = Resolver.Resolve(Context, expressionResult);
+ PythonResolverContext context = new PythonResolverContext(ParseInfo);
+ ResolveResult = Resolver.Resolve(context, expressionResult);
+ return ResolveResult;
+ }
+
+ public ResolveResult Resolve(string expression, string code)
+ {
+ ExpressionResult expressionResult = new ExpressionResult(expression);
+ ResolveResult = Resolver.Resolve(expressionResult, ParseInfo, code);
return ResolveResult;
}
- public MemberResolveResult MemberResultResult {
+ public MemberResolveResult MemberResolveResult {
get { return ResolveResult as MemberResolveResult; }
}
+ public LocalResolveResult LocalResolveResult {
+ get { return ResolveResult as LocalResolveResult; }
+ }
+
public MockClass CreateClass(string name)
{
return new MockClass(ProjectContent, name);