Skip to content
This repository has been archived by the owner on Oct 16, 2020. It is now read-only.

Commit

Permalink
Refactor IronPython resolver.
Browse files Browse the repository at this point in the history
  • Loading branch information
mrward committed Sep 26, 2010
1 parent 1123bf8 commit 69e65ac
Show file tree
Hide file tree
Showing 15 changed files with 117 additions and 88 deletions.
Expand Up @@ -8,6 +8,6 @@ namespace ICSharpCode.PythonBinding
{
public interface IPythonResolver
{
ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult);
ResolveResult Resolve(PythonResolverContext resolverContext);
}
}
Expand Up @@ -10,19 +10,21 @@ public class PythonClassResolver : IPythonResolver
{
PythonResolverContext resolverContext;

public PythonClassResolver()
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
}

public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
{
IClass matchingClass = GetClass(resolverContext, expressionResult.Expression);
IClass matchingClass = GetClass(resolverContext);
if (matchingClass != null) {
return CreateTypeResolveResult(matchingClass);
}
return null;
}

public IClass GetClass(PythonResolverContext resolverContext)
{
string name = resolverContext.Expression;
return GetClass(resolverContext, name);
}

public IClass GetClass(PythonResolverContext resolverContext, string name)
{
this.resolverContext = resolverContext;
Expand Down
Expand Up @@ -15,9 +15,9 @@ public PythonDotNetMethodResolver(PythonClassResolver classResolver)
this.classResolver = classResolver;
}

public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
MemberName memberName = new MemberName(expressionResult.Expression);
MemberName memberName = resolverContext.CreateExpressionMemberName();
IClass matchingClass = classResolver.GetClass(resolverContext, memberName.Type);
if (matchingClass != null) {
return new PythonMethodGroupResolveResult(matchingClass, memberName.Name);
Expand Down
Expand Up @@ -8,15 +8,11 @@ namespace ICSharpCode.PythonBinding
{
public class PythonImportResolver : IPythonResolver
{
public PythonImportResolver()
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
}

public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
{
if (IsNamespace(expressionResult)) {
PythonImportExpression importExpression = new PythonImportExpression(expressionResult.Expression);
PythonImportExpressionContext context = expressionResult.Context as PythonImportExpressionContext;
if (IsNamespace(resolverContext.ExpressionResult)) {
PythonImportExpression importExpression = new PythonImportExpression(resolverContext.Expression);
PythonImportExpressionContext context = resolverContext.ExpressionContext as PythonImportExpressionContext;
context.HasFromAndImport = importExpression.HasFromAndImport;

return new PythonImportModuleResolveResult(importExpression);
Expand Down
Expand Up @@ -123,34 +123,36 @@ public static string GetTypeName(Expression node)
return PythonControlFieldExpression.GetMemberName(node as MemberExpression);
}

public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
return GetLocalVariable(resolverContext, expressionResult);
return GetLocalVariable(resolverContext);
}

/// <summary>
/// Tries to find the type that matches the local variable name.
/// </summary>
LocalResolveResult GetLocalVariable(PythonResolverContext resolverContext, ExpressionResult expressionResult)
LocalResolveResult GetLocalVariable(PythonResolverContext resolverContext)
{
string code = GetLocalMethodCode(resolverContext.FileContent, expressionResult);
string typeName = Resolve(expressionResult.Expression, code);
string code = GetLocalMethodCode(resolverContext);
string typeName = Resolve(resolverContext.Expression, code);
if (typeName != null) {
return CreateLocalResolveResult(typeName, expressionResult.Expression, resolverContext);
return CreateLocalResolveResult(typeName, resolverContext);
}
return null;
}

string GetLocalMethodCode(string fullCode, ExpressionResult expressionResult)
string GetLocalMethodCode(PythonResolverContext resolverContext)
{
ScriptingLocalMethod localMethod = new ScriptingLocalMethod(fullCode);
return localMethod.GetCode(expressionResult.Region.BeginLine);
ScriptingLocalMethod localMethod = new ScriptingLocalMethod(resolverContext.FileContent);
int beginLine = resolverContext.ExpressionRegion.BeginLine;
return localMethod.GetCode(beginLine);
}

LocalResolveResult CreateLocalResolveResult(string typeName, string identifier, PythonResolverContext resolverContext)
LocalResolveResult CreateLocalResolveResult(string typeName, PythonResolverContext resolverContext)
{
IClass resolvedClass = classResolver.GetClass(resolverContext, typeName);
if (resolvedClass != null) {
string identifier = resolverContext.Expression;
return CreateLocalResolveResult(identifier, resolvedClass);
}
return null;
Expand Down
Expand Up @@ -19,15 +19,20 @@ public PythonMemberResolver(PythonClassResolver classResolver)
this.classResolver = classResolver;
}

public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
IMember member = FindMember(resolverContext, expressionResult.Expression);
IMember member = FindMember(resolverContext);
if (member != null) {
return CreateMemberResolveResult(member);
}
return null;
}

IMember FindMember(PythonResolverContext resolverContext)
{
return FindMember(resolverContext, resolverContext.Expression);
}

IMember FindMember(PythonResolverContext resolverContext, string expression)
{
MemberName memberName = new MemberName(expression);
Expand Down
Expand Up @@ -17,13 +17,13 @@ public PythonMethodResolver(PythonClassResolver classResolver, PythonStandardMod
standardModuleMethodResolver = new PythonStandardModuleMethodResolver(standardModuleResolver);
}

public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
ResolveResult resolveResult = dotNetMethodResolver.Resolve(resolverContext, expressionResult);
ResolveResult resolveResult = dotNetMethodResolver.Resolve(resolverContext);
if (resolveResult != null) {
return resolveResult;
}
return standardModuleMethodResolver.Resolve(resolverContext, expressionResult);
return standardModuleMethodResolver.Resolve(resolverContext);
}
}
}
Expand Up @@ -11,8 +11,9 @@ public class PythonNamespaceResolver : IPythonResolver
PythonResolverContext resolverContext;
ExpressionResult expressionResult;

public PythonNamespaceResolver()
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
return Resolve(resolverContext, resolverContext.ExpressionResult);
}

public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
Expand Down
Expand Up @@ -46,18 +46,18 @@ public ResolveResult Resolve(ExpressionResult expressionResult, ParseInformation
return null;
}

resolverContext = new PythonResolverContext(parseInfo, fileContent);
if (!resolverContext.GetCallingMember(expressionResult.Region)) {
resolverContext = new PythonResolverContext(parseInfo, expressionResult, fileContent);
if (!resolverContext.HasProjectContent) {
return null;
}

return Resolve(resolverContext, expressionResult);
return Resolve(resolverContext);
}

public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
foreach (IPythonResolver resolver in resolvers) {
ResolveResult resolveResult = resolver.Resolve(resolverContext, expressionResult);
ResolveResult resolveResult = resolver.Resolve(resolverContext);
if (resolveResult != null) {
return resolveResult;
}
Expand Down
Expand Up @@ -14,17 +14,25 @@ public class PythonResolverContext
IProjectContent projectContent;
IClass callingClass;
string fileContent;
ExpressionResult expressionResult;

public PythonResolverContext(ParseInformation parseInfo)
: this(parseInfo, String.Empty)
{
}

public PythonResolverContext(ParseInformation parseInfo, string fileContent)
: this(parseInfo, new ExpressionResult(), fileContent)
{
}

public PythonResolverContext(ParseInformation parseInfo, ExpressionResult expressionResult, string fileContent)
{
this.fileContent = fileContent;
this.expressionResult = expressionResult;
GetCompilationUnit(parseInfo);
GetProjectContent();
GetCallingMember();
}

void GetCompilationUnit(ParseInformation parseInfo)
Expand All @@ -41,6 +49,27 @@ void GetProjectContent()
}
}

/// <summary>
/// Determines the class and member at the specified
/// line and column in the specified file.
/// </summary>
void GetCallingMember()
{
if (projectContent != null) {
GetCallingClass();
}
}

/// <summary>
/// Gets the calling class at the specified line and column.
/// </summary>
void GetCallingClass()
{
if (compilationUnit.Classes.Count > 0) {
callingClass = compilationUnit.Classes[0];
}
}

public string FileContent {
get { return fileContent; }
}
Expand All @@ -49,6 +78,27 @@ void GetProjectContent()
get { return projectContent; }
}

public ExpressionResult ExpressionResult {
get { return expressionResult; }
}

public MemberName CreateExpressionMemberName()
{
return new MemberName(Expression);
}

public string Expression {
get { return expressionResult.Expression; }
}

public ExpressionContext ExpressionContext {
get { return expressionResult.Context; }
}

public DomRegion ExpressionRegion {
get { return expressionResult.Region; }
}

public bool HasProjectContent {
get { return projectContent != null; }
}
Expand Down Expand Up @@ -86,34 +136,6 @@ bool PartialNamespaceExists(IProjectContent projectContent, string name)
return false;
}

/// <summary>
/// Determines the class and member at the specified
/// line and column in the specified file.
/// </summary>
public bool GetCallingMember(DomRegion region)
{
if (compilationUnit == null) {
return false;
}

if (projectContent != null) {
callingClass = GetCallingClass(region);
return true;
}
return false;
}

/// <summary>
/// Gets the calling class at the specified line and column.
/// </summary>
IClass GetCallingClass(DomRegion region)
{
if (compilationUnit.Classes.Count > 0) {
return compilationUnit.Classes[0];
}
return null;
}

public IClass GetClass(string fullyQualifiedName)
{
return projectContent.GetClass(fullyQualifiedName, 0);
Expand Down
Expand Up @@ -8,22 +8,22 @@ namespace ICSharpCode.PythonBinding
{
public class PythonSelfResolver : IPythonResolver
{
public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
if (resolverContext.HasCallingClass) {
if (IsSelfExpression(expressionResult)) {
if (IsSelfExpression(resolverContext)) {
return CreateResolveResult(resolverContext);
} else if (IsSelfExpressionAtStart(expressionResult)) {
MemberName memberName = new MemberName(expressionResult.Expression);
} else if (IsSelfExpressionAtStart(resolverContext)) {
MemberName memberName = resolverContext.CreateExpressionMemberName();
return new PythonMethodGroupResolveResult(resolverContext.CallingClass, memberName.Name);
}
}
return null;
}

bool IsSelfExpression(ExpressionResult expressionResult)
bool IsSelfExpression(PythonResolverContext resolverContext)
{
return expressionResult.Expression == "self";
return resolverContext.Expression == "self";
}

ResolveResult CreateResolveResult(PythonResolverContext resolverContext)
Expand All @@ -33,9 +33,9 @@ ResolveResult CreateResolveResult(PythonResolverContext resolverContext)
return new ResolveResult(callingClass, null, returnType);
}

bool IsSelfExpressionAtStart(ExpressionResult expressionResult)
bool IsSelfExpressionAtStart(PythonResolverContext resolverContext)
{
return expressionResult.Expression.StartsWith("self.");
return resolverContext.Expression.StartsWith("self.");
}
}
}
Expand Up @@ -15,9 +15,9 @@ public PythonStandardModuleMethodResolver(PythonStandardModuleResolver standardM
this.standardModuleResolver = standardModuleResolver;
}

public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
MemberName memberName = new MemberName(expressionResult.Expression);
MemberName memberName = resolverContext.CreateExpressionMemberName();
MethodGroupResolveResult result = ResolveMethodFromImportedNames(resolverContext, memberName);
if (result != null) {
return result;
Expand Down
Expand Up @@ -10,19 +10,21 @@ public class PythonStandardModuleResolver : IPythonResolver
{
PythonStandardModules standardPythonModules = new PythonStandardModules();

public PythonStandardModuleResolver()
public ResolveResult Resolve(PythonResolverContext resolverContext)
{
}

public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
{
PythonStandardModuleType type = GetStandardModuleTypeIfImported(resolverContext, expressionResult.Expression);
PythonStandardModuleType type = GetStandardModuleTypeIfImported(resolverContext);
if (type != null) {
return new PythonStandardModuleResolveResult(type);
}
return null;
}

PythonStandardModuleType GetStandardModuleTypeIfImported(PythonResolverContext resolverContext)
{
string moduleName = resolverContext.Expression;
return GetStandardModuleTypeIfImported(resolverContext, moduleName);
}

public PythonStandardModuleType GetStandardModuleTypeIfImported(PythonResolverContext resolverContext, string moduleName)
{
if (resolverContext.HasImport(moduleName) || PythonBuiltInModuleMemberName.IsBuiltInModule(moduleName)) {
Expand Down

0 comments on commit 69e65ac

Please sign in to comment.