Browse Source

Add code completion for methods on local variables in IronPython code.

pull/2/head
mrward 15 years ago
parent
commit
264afa673c
  1. 7
      src/AddIns/Analysis/UnitTesting/Test/Utils/MockClass.cs
  2. 22
      src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockClassTests.cs
  3. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj
  4. 1
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassMembers.cs
  5. 28
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDotNetMethodResolver.cs
  6. 7
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs
  7. 29
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodResolver.cs
  8. 4
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs
  9. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs
  10. 1
      src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj
  11. 18
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveConsoleWriteLineTests.cs
  12. 57
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveLocalVariableMethodTests.cs

7
src/AddIns/Analysis/UnitTesting/Test/Utils/MockClass.cs

@ -155,5 +155,12 @@ namespace UnitTesting.Tests.Utils
Fields.Add(field); Fields.Add(field);
return field; return field;
} }
public DefaultMethod AddMethod(string name)
{
DefaultMethod method = new DefaultMethod(this, name);
Methods.Add(method);
return method;
}
} }
} }

22
src/AddIns/Analysis/UnitTesting/Test/Utils/Tests/MockClassTests.cs

@ -255,5 +255,27 @@ namespace UnitTesting.Tests.Utils.Tests
Assert.AreEqual("MyField", name); 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);
}
} }
} }

2
src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj

@ -101,7 +101,6 @@
<Compile Include="Src\PythonCompletionItemList.cs" /> <Compile Include="Src\PythonCompletionItemList.cs" />
<Compile Include="Src\PythonConsoleApplication.cs" /> <Compile Include="Src\PythonConsoleApplication.cs" />
<Compile Include="Src\PythonConstructor.cs" /> <Compile Include="Src\PythonConstructor.cs" />
<Compile Include="Src\PythonDotNetMethodResolver.cs" />
<Compile Include="Src\PythonFromImport.cs" /> <Compile Include="Src\PythonFromImport.cs" />
<Compile Include="Src\PythonImport.cs" /> <Compile Include="Src\PythonImport.cs" />
<Compile Include="Src\PythonInsightWindowHandler.cs" /> <Compile Include="Src\PythonInsightWindowHandler.cs" />
@ -114,7 +113,6 @@
<Compile Include="Src\PythonMethodDefinition.cs" /> <Compile Include="Src\PythonMethodDefinition.cs" />
<Compile Include="Src\PythonMethodGroupResolveResult.cs" /> <Compile Include="Src\PythonMethodGroupResolveResult.cs" />
<Compile Include="Src\PythonMethodOrClassBodyRegion.cs" /> <Compile Include="Src\PythonMethodOrClassBodyRegion.cs" />
<Compile Include="Src\PythonMethodResolver.cs" />
<Compile Include="Src\PythonModule.cs" /> <Compile Include="Src\PythonModule.cs" />
<Compile Include="Src\PythonModuleCompletionItems.cs" /> <Compile Include="Src\PythonModuleCompletionItems.cs" />
<Compile Include="Src\PythonModuleCompletionItemsFactory.cs" /> <Compile Include="Src\PythonModuleCompletionItemsFactory.cs" />

1
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassMembers.cs

@ -32,6 +32,7 @@ namespace ICSharpCode.PythonBinding
members.AddRange(declaringType.Events); members.AddRange(declaringType.Events);
members.AddRange(declaringType.Fields); members.AddRange(declaringType.Fields);
members.AddRange(declaringType.Properties); members.AddRange(declaringType.Properties);
members.AddRange(declaringType.Methods);
return members; return members;
} }
} }

28
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDotNetMethodResolver.cs

@ -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;
}
}
}

7
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs

@ -26,7 +26,7 @@ namespace ICSharpCode.PythonBinding
{ {
this.resolverContext = resolverContext; this.resolverContext = resolverContext;
IMember member = FindMember(); IMember member = FindMember();
return CreateMemberResolveResult(member); return CreateResolveResult(member);
} }
IMember FindMember() IMember FindMember()
@ -72,9 +72,12 @@ namespace ICSharpCode.PythonBinding
return null; return null;
} }
MemberResolveResult CreateMemberResolveResult(IMember member) ResolveResult CreateResolveResult(IMember member)
{ {
if (member != null) { if (member != null) {
if (member is IMethod) {
return new PythonMethodGroupResolveResult(member.DeclaringType, member.Name);
}
return new MemberResolveResult(null, null, member); return new MemberResolveResult(null, null, member);
} }
return null; return null;

29
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodResolver.cs

@ -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);
}
}
}

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

@ -18,7 +18,7 @@ namespace ICSharpCode.PythonBinding
PythonClassResolver classResolver = new PythonClassResolver(); PythonClassResolver classResolver = new PythonClassResolver();
PythonStandardModuleResolver standardModuleResolver = new PythonStandardModuleResolver(); PythonStandardModuleResolver standardModuleResolver = new PythonStandardModuleResolver();
PythonSelfResolver selfResolver = new PythonSelfResolver(); PythonSelfResolver selfResolver = new PythonSelfResolver();
PythonMethodResolver methodResolver; PythonStandardModuleMethodResolver methodResolver;
PythonMemberResolver memberResolver; PythonMemberResolver memberResolver;
PythonLocalVariableResolver localVariableResolver; PythonLocalVariableResolver localVariableResolver;
@ -26,7 +26,7 @@ namespace ICSharpCode.PythonBinding
public PythonResolver() public PythonResolver()
{ {
methodResolver = new PythonMethodResolver(classResolver, standardModuleResolver); methodResolver = new PythonStandardModuleMethodResolver(standardModuleResolver);
localVariableResolver = new PythonLocalVariableResolver(classResolver); localVariableResolver = new PythonLocalVariableResolver(classResolver);
memberResolver = new PythonMemberResolver(classResolver, localVariableResolver); memberResolver = new PythonMemberResolver(classResolver, localVariableResolver);

2
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs

@ -6,7 +6,7 @@ using ICSharpCode.SharpDevelop.Dom;
namespace ICSharpCode.PythonBinding namespace ICSharpCode.PythonBinding
{ {
public class PythonStandardModuleMethodResolver public class PythonStandardModuleMethodResolver : IPythonResolver
{ {
PythonStandardModuleResolver standardModuleResolver; PythonStandardModuleResolver standardModuleResolver;

1
src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj

@ -367,6 +367,7 @@
<Compile Include="Resolver\ResolveFromSystemImportEverythingTests.cs" /> <Compile Include="Resolver\ResolveFromSystemImportEverythingTests.cs" />
<Compile Include="Resolver\ResolveImportsTestFixture.cs" /> <Compile Include="Resolver\ResolveImportsTestFixture.cs" />
<Compile Include="Resolver\ResolveLocalClassInstanceTests.cs" /> <Compile Include="Resolver\ResolveLocalClassInstanceTests.cs" />
<Compile Include="Resolver\ResolveLocalVariableMethodTests.cs" />
<Compile Include="Resolver\ResolveMethodFromUnknownImportAllTests.cs" /> <Compile Include="Resolver\ResolveMethodFromUnknownImportAllTests.cs" />
<Compile Include="Resolver\ResolveMethodWhenFromImportIsUnknownTests.cs" /> <Compile Include="Resolver\ResolveMethodWhenFromImportIsUnknownTests.cs" />
<Compile Include="Resolver\ResolveMethodWhenImportIsUnknownTests.cs" /> <Compile Include="Resolver\ResolveMethodWhenImportIsUnknownTests.cs" />

18
src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ResolveConsoleWriteLineTests.cs

@ -24,6 +24,7 @@ namespace PythonBinding.Tests.Resolver
protected override ExpressionResult GetExpressionResult() protected override ExpressionResult GetExpressionResult()
{ {
systemConsoleClass = new MockClass(projectContent, "System.Console"); systemConsoleClass = new MockClass(projectContent, "System.Console");
systemConsoleClass.AddMethod("WriteLine");
projectContent.SetClassToReturnFromGetClass("Console", systemConsoleClass); projectContent.SetClassToReturnFromGetClass("Console", systemConsoleClass);
return new ExpressionResult("Console.WriteLine", new DomRegion(2, 2), null, null); return new ExpressionResult("Console.WriteLine", new DomRegion(2, 2), null, null);
} }
@ -35,26 +36,23 @@ namespace PythonBinding.Tests.Resolver
"Console.WriteLine\r\n"; "Console.WriteLine\r\n";
} }
[Test]
public void ResolveResultExists()
{
Assert.IsNotNull(resolveResult);
}
/// <summary> /// <summary>
/// Gets the class name used in IProjectContent.GetClass call. /// Gets the class name used in IProjectContent.GetClass call.
/// </summary> /// </summary>
[Test] [Test]
public void GetClassName() public void Resolve_ExpressionIsSystemConsoleWriteLine_ProjectContentGetClassNamePassedConsole()
{ {
Assert.AreEqual("Console", projectContent.GetClassName); string className = projectContent.GetClassName;
Assert.AreEqual("Console", className);
} }
[Test] [Test]
public void MethodNameResolveIsWriteLine() public void Resolve_ExpressionIsSystemConsoleWriteLine_MethodNameResolvedIsWriteLine()
{ {
MethodGroupResolveResult methodResolveResult = (MethodGroupResolveResult)resolveResult; MethodGroupResolveResult methodResolveResult = (MethodGroupResolveResult)resolveResult;
Assert.AreEqual("WriteLine", methodResolveResult.Name); string name = methodResolveResult.Name;
string expectedName = "WriteLine";
Assert.AreEqual(expectedName, name);
} }
} }
} }

57
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);
}
}
}
Loading…
Cancel
Save