From 69e65acf48bb83579b835c17d78bfd65e335e400 Mon Sep 17 00:00:00 2001 From: mrward Date: Sun, 26 Sep 2010 17:47:55 +0100 Subject: [PATCH] Refactor IronPython resolver. --- .../Project/Src/IPythonResolver.cs | 2 +- .../Project/Src/PythonClassResolver.cs | 14 ++-- .../Project/Src/PythonDotNetMethodResolver.cs | 4 +- .../Project/Src/PythonImportResolver.cs | 12 +-- .../Src/PythonLocalVariableResolver.cs | 22 +++--- .../Project/Src/PythonMemberResolver.cs | 9 ++- .../Project/Src/PythonMethodResolver.cs | 6 +- .../Project/Src/PythonNamespaceResolver.cs | 3 +- .../Project/Src/PythonResolver.cs | 10 +-- .../Project/Src/PythonResolverContext.cs | 78 ++++++++++++------- .../Project/Src/PythonSelfResolver.cs | 16 ++-- .../Src/PythonStandardModuleMethodResolver.cs | 4 +- .../Src/PythonStandardModuleResolver.cs | 14 ++-- .../Test/Resolver/PythonSelfResolverTests.cs | 6 +- .../Test/Utils/PythonResolverTestsHelper.cs | 5 +- 15 files changed, 117 insertions(+), 88 deletions(-) diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IPythonResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IPythonResolver.cs index c33b49315e..e9e299c053 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IPythonResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IPythonResolver.cs @@ -8,6 +8,6 @@ namespace ICSharpCode.PythonBinding { public interface IPythonResolver { - ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult); + ResolveResult Resolve(PythonResolverContext resolverContext); } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassResolver.cs index 3c5aa335e8..d1a3427422 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassResolver.cs @@ -10,19 +10,21 @@ namespace ICSharpCode.PythonBinding { 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; diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDotNetMethodResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDotNetMethodResolver.cs index 2adbbf1907..e225b78d00 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDotNetMethodResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDotNetMethodResolver.cs @@ -15,9 +15,9 @@ namespace ICSharpCode.PythonBinding 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); diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonImportResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonImportResolver.cs index a1a2c54ea7..7b21192980 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonImportResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonImportResolver.cs @@ -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); diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs index 61991fd996..dc94c1c47c 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs @@ -123,34 +123,36 @@ namespace ICSharpCode.PythonBinding 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); } /// /// Tries to find the type that matches the local variable name. /// - 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; diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs index 3c7b70670e..31dd610fe3 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs @@ -19,15 +19,20 @@ namespace ICSharpCode.PythonBinding 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); diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodResolver.cs index aeab4d7910..eb552b9cef 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodResolver.cs @@ -17,13 +17,13 @@ namespace ICSharpCode.PythonBinding 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); } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonNamespaceResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonNamespaceResolver.cs index 76042b1c41..d5f48f8133 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonNamespaceResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonNamespaceResolver.cs @@ -11,8 +11,9 @@ namespace ICSharpCode.PythonBinding PythonResolverContext resolverContext; ExpressionResult expressionResult; - public PythonNamespaceResolver() + public ResolveResult Resolve(PythonResolverContext resolverContext) { + return Resolve(resolverContext, resolverContext.ExpressionResult); } public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult) diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs index 1f15bc3997..18bd70a044 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs @@ -46,18 +46,18 @@ namespace ICSharpCode.PythonBinding 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; } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolverContext.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolverContext.cs index 7daa8e531f..9b31decf27 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolverContext.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolverContext.cs @@ -14,6 +14,7 @@ namespace ICSharpCode.PythonBinding IProjectContent projectContent; IClass callingClass; string fileContent; + ExpressionResult expressionResult; public PythonResolverContext(ParseInformation parseInfo) : this(parseInfo, String.Empty) @@ -21,10 +22,17 @@ namespace ICSharpCode.PythonBinding } 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) @@ -41,6 +49,27 @@ namespace ICSharpCode.PythonBinding } } + /// + /// Determines the class and member at the specified + /// line and column in the specified file. + /// + void GetCallingMember() + { + if (projectContent != null) { + GetCallingClass(); + } + } + + /// + /// Gets the calling class at the specified line and column. + /// + void GetCallingClass() + { + if (compilationUnit.Classes.Count > 0) { + callingClass = compilationUnit.Classes[0]; + } + } + public string FileContent { get { return fileContent; } } @@ -49,6 +78,27 @@ namespace ICSharpCode.PythonBinding 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; } } @@ -86,34 +136,6 @@ namespace ICSharpCode.PythonBinding return false; } - /// - /// Determines the class and member at the specified - /// line and column in the specified file. - /// - public bool GetCallingMember(DomRegion region) - { - if (compilationUnit == null) { - return false; - } - - if (projectContent != null) { - callingClass = GetCallingClass(region); - return true; - } - return false; - } - - /// - /// Gets the calling class at the specified line and column. - /// - 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); diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonSelfResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonSelfResolver.cs index a02b018bcc..ce356dd8da 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonSelfResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonSelfResolver.cs @@ -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) @@ -33,9 +33,9 @@ namespace ICSharpCode.PythonBinding return new ResolveResult(callingClass, null, returnType); } - bool IsSelfExpressionAtStart(ExpressionResult expressionResult) + bool IsSelfExpressionAtStart(PythonResolverContext resolverContext) { - return expressionResult.Expression.StartsWith("self."); + return resolverContext.Expression.StartsWith("self."); } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs index 453cdba9dc..86e4d534b0 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs @@ -15,9 +15,9 @@ namespace ICSharpCode.PythonBinding 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; diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleResolver.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleResolver.cs index a3fcb15e6f..6983a6d1cc 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleResolver.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleResolver.cs @@ -10,19 +10,21 @@ namespace ICSharpCode.PythonBinding { 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)) { diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonSelfResolverTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonSelfResolverTests.cs index 3c586955de..090b4ddbd8 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonSelfResolverTests.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonSelfResolverTests.cs @@ -24,14 +24,13 @@ namespace PythonBinding.Tests.Resolver CreateParseInfo(); CreatePythonResolverContext(); - ResolveResult result = resolver.Resolve(context, expression); + ResolveResult result = resolver.Resolve(context); Assert.IsNull(result); } void CreatePythonSelfResolver() { resolver = new PythonSelfResolver(); - expression = new ExpressionResult("self"); } void CreateParseInfo() @@ -43,7 +42,8 @@ namespace PythonBinding.Tests.Resolver void CreatePythonResolverContext() { - context = new PythonResolverContext(parseInfo); + expression = new ExpressionResult("self"); + context = new PythonResolverContext(parseInfo, expression, String.Empty); } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonResolverTestsHelper.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonResolverTestsHelper.cs index 91669aeaf0..6e0eb18fd0 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonResolverTestsHelper.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonResolverTestsHelper.cs @@ -36,9 +36,8 @@ namespace PythonBinding.Tests.Utils public ResolveResult Resolve(string expression) { ExpressionResult expressionResult = new ExpressionResult(expression); - PythonResolverContext context = new PythonResolverContext(ParseInfo); - context.GetCallingMember(expressionResult.Region); - ResolveResult = Resolver.Resolve(context, expressionResult); + PythonResolverContext context = new PythonResolverContext(ParseInfo, expressionResult, String.Empty); + ResolveResult = Resolver.Resolve(context); return ResolveResult; }