5 changed files with 147 additions and 0 deletions
@ -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 @@ |
|||||||
|
// 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