1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections.Generic;
6
using ICSharpCode.SharpDevelop.Dom;
8
namespace ICSharpCode.PythonBinding
11
/// Resolves properties, events and fields.
13
public class PythonMemberResolver : IPythonResolver
15
PythonClassResolver classResolver;
16
PythonLocalVariableResolver localVariableResolver;
17
PythonResolverContext resolverContext;
18
PythonSelfResolver selfResolver = new PythonSelfResolver();
20
public PythonMemberResolver(PythonClassResolver classResolver, PythonLocalVariableResolver localVariableResolver)
22
this.classResolver = classResolver;
23
this.localVariableResolver = localVariableResolver;
26
public ResolveResult Resolve(PythonResolverContext resolverContext)
28
IMember member = FindMember(resolverContext);
29
return CreateResolveResult(member);
32
public IMember FindMember(PythonResolverContext resolverContext)
34
this.resolverContext = resolverContext;
40
return FindMember(resolverContext.Expression);
43
IMember FindMember(string expression)
45
MemberName memberName = new MemberName(expression);
46
if (memberName.HasName) {
47
IClass c = FindClass(memberName.Type);
49
return FindMemberInClass(c, memberName.Name);
51
return FindMemberInParent(memberName);
57
IClass FindClass(string className)
59
IClass c = FindClassFromClassResolver(className);
63
if (PythonSelfResolver.IsSelfExpression(className)) {
64
return FindClassFromSelfResolver();
66
return FindClassFromLocalVariableResolver(className);
69
IClass FindClassFromClassResolver(string className)
71
return classResolver.GetClass(resolverContext, className);
74
IClass FindClassFromLocalVariableResolver(string localVariableName)
76
MemberName memberName = new MemberName(localVariableName);
77
if (!memberName.HasName) {
78
string typeName = localVariableResolver.Resolve(localVariableName, resolverContext.FileContent);
79
return FindClassFromClassResolver(typeName);
84
IClass FindClassFromSelfResolver()
86
PythonResolverContext newContext = resolverContext.Clone("self");
87
ResolveResult result = selfResolver.Resolve(newContext);
89
return result.ResolvedType.GetUnderlyingClass();
94
ResolveResult CreateResolveResult(IMember member)
97
if (member is IMethod) {
98
return new PythonMethodGroupResolveResult(member.DeclaringType, member.Name);
100
return new MemberResolveResult(null, null, member);
105
IMember FindMemberInClass(IClass matchingClass, string memberName)
107
PythonClassMembers classMembers = new PythonClassMembers(matchingClass);
108
return classMembers.FindMember(memberName);
111
IMember FindMemberInParent(MemberName memberName)
113
IMember parentMember = FindMember(memberName.Type);
114
if (parentMember != null) {
115
return FindMemberInParent(parentMember, memberName.Name);
120
IMember FindMemberInParent(IMember parentMember, string memberName)
122
IReturnType returnType = parentMember.ReturnType;
123
if (returnType != null) {
124
IClass parentMemberClass = returnType.GetUnderlyingClass();
125
return FindMemberInClass(parentMemberClass, memberName);