5 changed files with 147 additions and 0 deletions
@ -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; |
||||
|
||||
namespace ICSharpCode.PythonBinding |
||||
{ |
||||
public class PythonPropertyResolver : IPythonResolver |
||||
{ |
||||
PythonClassResolver classResolver; |
||||
|
||||
public PythonPropertyResolver(PythonClassResolver classResolver) |
||||
{ |
||||
this.classResolver = classResolver; |
||||
} |
||||
|
||||
public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult) |
||||
{ |
||||
IProperty property = FindProperty(resolverContext, expressionResult); |
||||
if (property != null) { |
||||
return CreateMemberResolveResult(property); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
IProperty FindProperty(PythonResolverContext resolverContext, ExpressionResult expressionResult) |
||||
{ |
||||
MemberName memberName = new MemberName(expressionResult.Expression); |
||||
IClass matchingClass = FindClass(resolverContext, memberName.Type); |
||||
if (matchingClass != null) { |
||||
return FindProperty(matchingClass, memberName.Name); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
MemberResolveResult CreateMemberResolveResult(IProperty property) |
||||
{ |
||||
return new MemberResolveResult(null, null, property); |
||||
} |
||||
|
||||
IClass FindClass(PythonResolverContext resolverContext, string typeName) |
||||
{ |
||||
return classResolver.GetClass(resolverContext, typeName); |
||||
} |
||||
|
||||
IProperty FindProperty(IClass matchingClass, string memberName) |
||||
{ |
||||
foreach (IProperty property in matchingClass.Properties) { |
||||
if (property.Name == memberName) { |
||||
return property; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,85 @@
@@ -0,0 +1,85 @@
|
||||
// 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 ScriptingUtils = ICSharpCode.Scripting.Tests.Utils; |
||||
using ICSharpCode.SharpDevelop.Dom; |
||||
using NUnit.Framework; |
||||
using UnitTesting.Tests.Utils; |
||||
|
||||
namespace PythonBinding.Tests.Resolver |
||||
{ |
||||
[TestFixture] |
||||
public class ResolveClassPropertyTests |
||||
{ |
||||
ResolveResult result; |
||||
ParseInformation parseInfo; |
||||
IProperty myClassProperty; |
||||
MockClass myClass; |
||||
|
||||
void ResolveClassProperty() |
||||
{ |
||||
PythonResolverContext context = new PythonResolverContext(parseInfo); |
||||
ExpressionResult expression = new ExpressionResult("MyClass.MyProperty"); |
||||
|
||||
PythonResolver resolver = new PythonResolver(); |
||||
result = resolver.Resolve(context, expression); |
||||
} |
||||
|
||||
void CreateParseInfoWithOneClass() |
||||
{ |
||||
ScriptingUtils.MockProjectContent projectContent = new ScriptingUtils.MockProjectContent(); |
||||
myClass = new MockClass(projectContent, "MyClass"); |
||||
|
||||
projectContent.ClassToReturnFromGetClass = myClass; |
||||
projectContent.ClassNameForGetClass = "MyClass"; |
||||
|
||||
myClassProperty = CreateProperty(myClass); |
||||
myClass.Properties.Add(myClassProperty); |
||||
|
||||
DefaultCompilationUnit unit = new DefaultCompilationUnit(projectContent); |
||||
parseInfo = new ParseInformation(unit); |
||||
} |
||||
|
||||
IProperty CreateProperty(IClass c) |
||||
{ |
||||
return new DefaultProperty(c, "MyProperty"); |
||||
} |
||||
|
||||
[Test] |
||||
public void Resolve_ClassHasOneProperty_ReturnsMemberResolveResult() |
||||
{ |
||||
CreateParseInfoWithOneClass(); |
||||
ResolveClassProperty(); |
||||
MemberResolveResult memberResolveResult = result as MemberResolveResult; |
||||
|
||||
Assert.IsNotNull(memberResolveResult); |
||||
} |
||||
|
||||
[Test] |
||||
public void Resolve_ClassHasOneProperty_MemberResolveResultResolvedTypeIsMyClassProperty() |
||||
{ |
||||
CreateParseInfoWithOneClass(); |
||||
ResolveClassProperty(); |
||||
MemberResolveResult memberResolveResult = result as MemberResolveResult; |
||||
IMember resolvedMember = memberResolveResult.ResolvedMember; |
||||
|
||||
Assert.AreEqual(myClassProperty, resolvedMember); |
||||
} |
||||
|
||||
[Test] |
||||
public void Resolve_ClassHasTwoProperties_MemberResolveResultResolvedTypeIsSecondClassProperty() |
||||
{ |
||||
CreateParseInfoWithOneClass(); |
||||
DefaultProperty extraProperty = new DefaultProperty(myClass, "ExtraProperty"); |
||||
myClass.Properties.Insert(0, extraProperty); |
||||
ResolveClassProperty(); |
||||
|
||||
MemberResolveResult memberResolveResult = result as MemberResolveResult; |
||||
IMember resolvedMember = memberResolveResult.ResolvedMember; |
||||
|
||||
Assert.AreEqual(myClassProperty, resolvedMember); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue