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 @@ -155,5 +155,12 @@ namespace UnitTesting.Tests.Utils
Fields.Add(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 @@ -255,5 +255,27 @@ namespace UnitTesting.Tests.Utils.Tests
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 @@ @@ -101,7 +101,6 @@
<Compile Include="Src\PythonCompletionItemList.cs" />
<Compile Include="Src\PythonConsoleApplication.cs" />
<Compile Include="Src\PythonConstructor.cs" />
<Compile Include="Src\PythonDotNetMethodResolver.cs" />
<Compile Include="Src\PythonFromImport.cs" />
<Compile Include="Src\PythonImport.cs" />
<Compile Include="Src\PythonInsightWindowHandler.cs" />
@ -114,7 +113,6 @@ @@ -114,7 +113,6 @@
<Compile Include="Src\PythonMethodDefinition.cs" />
<Compile Include="Src\PythonMethodGroupResolveResult.cs" />
<Compile Include="Src\PythonMethodOrClassBodyRegion.cs" />
<Compile Include="Src\PythonMethodResolver.cs" />
<Compile Include="Src\PythonModule.cs" />
<Compile Include="Src\PythonModuleCompletionItems.cs" />
<Compile Include="Src\PythonModuleCompletionItemsFactory.cs" />

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

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

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

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

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

@ -1,29 +0,0 @@ @@ -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 @@ -18,7 +18,7 @@ namespace ICSharpCode.PythonBinding
PythonClassResolver classResolver = new PythonClassResolver();
PythonStandardModuleResolver standardModuleResolver = new PythonStandardModuleResolver();
PythonSelfResolver selfResolver = new PythonSelfResolver();
PythonMethodResolver methodResolver;
PythonStandardModuleMethodResolver methodResolver;
PythonMemberResolver memberResolver;
PythonLocalVariableResolver localVariableResolver;
@ -26,7 +26,7 @@ namespace ICSharpCode.PythonBinding @@ -26,7 +26,7 @@ namespace ICSharpCode.PythonBinding
public PythonResolver()
{
methodResolver = new PythonMethodResolver(classResolver, standardModuleResolver);
methodResolver = new PythonStandardModuleMethodResolver(standardModuleResolver);
localVariableResolver = new PythonLocalVariableResolver(classResolver);
memberResolver = new PythonMemberResolver(classResolver, localVariableResolver);

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

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

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

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

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

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