Browse Source

Refactor IronPython resolver.

pull/1/head
mrward 16 years ago
parent
commit
69e65acf48
  1. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IPythonResolver.cs
  2. 14
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassResolver.cs
  3. 4
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDotNetMethodResolver.cs
  4. 12
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonImportResolver.cs
  5. 22
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs
  6. 9
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs
  7. 6
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodResolver.cs
  8. 3
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonNamespaceResolver.cs
  9. 10
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs
  10. 78
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolverContext.cs
  11. 16
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonSelfResolver.cs
  12. 4
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs
  13. 14
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleResolver.cs
  14. 6
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonSelfResolverTests.cs
  15. 5
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonResolverTestsHelper.cs

2
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IPythonResolver.cs

@ -8,6 +8,6 @@ namespace ICSharpCode.PythonBinding
{ {
public interface IPythonResolver public interface IPythonResolver
{ {
ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult); ResolveResult Resolve(PythonResolverContext resolverContext);
} }
} }

14
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonClassResolver.cs

@ -10,19 +10,21 @@ namespace ICSharpCode.PythonBinding
{ {
PythonResolverContext resolverContext; PythonResolverContext resolverContext;
public PythonClassResolver() public ResolveResult Resolve(PythonResolverContext resolverContext)
{ {
} IClass matchingClass = GetClass(resolverContext);
public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
{
IClass matchingClass = GetClass(resolverContext, expressionResult.Expression);
if (matchingClass != null) { if (matchingClass != null) {
return CreateTypeResolveResult(matchingClass); return CreateTypeResolveResult(matchingClass);
} }
return null; return null;
} }
public IClass GetClass(PythonResolverContext resolverContext)
{
string name = resolverContext.Expression;
return GetClass(resolverContext, name);
}
public IClass GetClass(PythonResolverContext resolverContext, string name) public IClass GetClass(PythonResolverContext resolverContext, string name)
{ {
this.resolverContext = resolverContext; this.resolverContext = resolverContext;

4
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDotNetMethodResolver.cs

@ -15,9 +15,9 @@ namespace ICSharpCode.PythonBinding
this.classResolver = 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); IClass matchingClass = classResolver.GetClass(resolverContext, memberName.Type);
if (matchingClass != null) { if (matchingClass != null) {
return new PythonMethodGroupResolveResult(matchingClass, memberName.Name); return new PythonMethodGroupResolveResult(matchingClass, memberName.Name);

12
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonImportResolver.cs

@ -8,15 +8,11 @@ namespace ICSharpCode.PythonBinding
{ {
public class PythonImportResolver : IPythonResolver public class PythonImportResolver : IPythonResolver
{ {
public PythonImportResolver() public ResolveResult Resolve(PythonResolverContext resolverContext)
{ {
} if (IsNamespace(resolverContext.ExpressionResult)) {
PythonImportExpression importExpression = new PythonImportExpression(resolverContext.Expression);
public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult) PythonImportExpressionContext context = resolverContext.ExpressionContext as PythonImportExpressionContext;
{
if (IsNamespace(expressionResult)) {
PythonImportExpression importExpression = new PythonImportExpression(expressionResult.Expression);
PythonImportExpressionContext context = expressionResult.Context as PythonImportExpressionContext;
context.HasFromAndImport = importExpression.HasFromAndImport; context.HasFromAndImport = importExpression.HasFromAndImport;
return new PythonImportModuleResolveResult(importExpression); return new PythonImportModuleResolveResult(importExpression);

22
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonLocalVariableResolver.cs

@ -123,34 +123,36 @@ namespace ICSharpCode.PythonBinding
return PythonControlFieldExpression.GetMemberName(node as MemberExpression); 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> /// <summary>
/// Tries to find the type that matches the local variable name. /// Tries to find the type that matches the local variable name.
/// </summary> /// </summary>
LocalResolveResult GetLocalVariable(PythonResolverContext resolverContext, ExpressionResult expressionResult) LocalResolveResult GetLocalVariable(PythonResolverContext resolverContext)
{ {
string code = GetLocalMethodCode(resolverContext.FileContent, expressionResult); string code = GetLocalMethodCode(resolverContext);
string typeName = Resolve(expressionResult.Expression, code); string typeName = Resolve(resolverContext.Expression, code);
if (typeName != null) { if (typeName != null) {
return CreateLocalResolveResult(typeName, expressionResult.Expression, resolverContext); return CreateLocalResolveResult(typeName, resolverContext);
} }
return null; return null;
} }
string GetLocalMethodCode(string fullCode, ExpressionResult expressionResult) string GetLocalMethodCode(PythonResolverContext resolverContext)
{ {
ScriptingLocalMethod localMethod = new ScriptingLocalMethod(fullCode); ScriptingLocalMethod localMethod = new ScriptingLocalMethod(resolverContext.FileContent);
return localMethod.GetCode(expressionResult.Region.BeginLine); 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); IClass resolvedClass = classResolver.GetClass(resolverContext, typeName);
if (resolvedClass != null) { if (resolvedClass != null) {
string identifier = resolverContext.Expression;
return CreateLocalResolveResult(identifier, resolvedClass); return CreateLocalResolveResult(identifier, resolvedClass);
} }
return null; return null;

9
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMemberResolver.cs

@ -19,15 +19,20 @@ namespace ICSharpCode.PythonBinding
this.classResolver = 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) { if (member != null) {
return CreateMemberResolveResult(member); return CreateMemberResolveResult(member);
} }
return null; return null;
} }
IMember FindMember(PythonResolverContext resolverContext)
{
return FindMember(resolverContext, resolverContext.Expression);
}
IMember FindMember(PythonResolverContext resolverContext, string expression) IMember FindMember(PythonResolverContext resolverContext, string expression)
{ {
MemberName memberName = new MemberName(expression); MemberName memberName = new MemberName(expression);

6
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonMethodResolver.cs

@ -17,13 +17,13 @@ namespace ICSharpCode.PythonBinding
standardModuleMethodResolver = new PythonStandardModuleMethodResolver(standardModuleResolver); 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) { if (resolveResult != null) {
return resolveResult; return resolveResult;
} }
return standardModuleMethodResolver.Resolve(resolverContext, expressionResult); return standardModuleMethodResolver.Resolve(resolverContext);
} }
} }
} }

3
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonNamespaceResolver.cs

@ -11,8 +11,9 @@ namespace ICSharpCode.PythonBinding
PythonResolverContext resolverContext; PythonResolverContext resolverContext;
ExpressionResult expressionResult; ExpressionResult expressionResult;
public PythonNamespaceResolver() public ResolveResult Resolve(PythonResolverContext resolverContext)
{ {
return Resolve(resolverContext, resolverContext.ExpressionResult);
} }
public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult) public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)

10
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolver.cs

@ -46,18 +46,18 @@ namespace ICSharpCode.PythonBinding
return null; return null;
} }
resolverContext = new PythonResolverContext(parseInfo, fileContent); resolverContext = new PythonResolverContext(parseInfo, expressionResult, fileContent);
if (!resolverContext.GetCallingMember(expressionResult.Region)) { if (!resolverContext.HasProjectContent) {
return null; 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) { foreach (IPythonResolver resolver in resolvers) {
ResolveResult resolveResult = resolver.Resolve(resolverContext, expressionResult); ResolveResult resolveResult = resolver.Resolve(resolverContext);
if (resolveResult != null) { if (resolveResult != null) {
return resolveResult; return resolveResult;
} }

78
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonResolverContext.cs

@ -14,6 +14,7 @@ namespace ICSharpCode.PythonBinding
IProjectContent projectContent; IProjectContent projectContent;
IClass callingClass; IClass callingClass;
string fileContent; string fileContent;
ExpressionResult expressionResult;
public PythonResolverContext(ParseInformation parseInfo) public PythonResolverContext(ParseInformation parseInfo)
: this(parseInfo, String.Empty) : this(parseInfo, String.Empty)
@ -21,10 +22,17 @@ namespace ICSharpCode.PythonBinding
} }
public PythonResolverContext(ParseInformation parseInfo, string fileContent) public PythonResolverContext(ParseInformation parseInfo, string fileContent)
: this(parseInfo, new ExpressionResult(), fileContent)
{
}
public PythonResolverContext(ParseInformation parseInfo, ExpressionResult expressionResult, string fileContent)
{ {
this.fileContent = fileContent; this.fileContent = fileContent;
this.expressionResult = expressionResult;
GetCompilationUnit(parseInfo); GetCompilationUnit(parseInfo);
GetProjectContent(); GetProjectContent();
GetCallingMember();
} }
void GetCompilationUnit(ParseInformation parseInfo) void GetCompilationUnit(ParseInformation parseInfo)
@ -41,6 +49,27 @@ namespace ICSharpCode.PythonBinding
} }
} }
/// <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 { public string FileContent {
get { return fileContent; } get { return fileContent; }
} }
@ -49,6 +78,27 @@ namespace ICSharpCode.PythonBinding
get { return projectContent; } 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 { public bool HasProjectContent {
get { return projectContent != null; } get { return projectContent != null; }
} }
@ -86,34 +136,6 @@ namespace ICSharpCode.PythonBinding
return false; 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) public IClass GetClass(string fullyQualifiedName)
{ {
return projectContent.GetClass(fullyQualifiedName, 0); return projectContent.GetClass(fullyQualifiedName, 0);

16
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonSelfResolver.cs

@ -8,22 +8,22 @@ namespace ICSharpCode.PythonBinding
{ {
public class PythonSelfResolver : IPythonResolver public class PythonSelfResolver : IPythonResolver
{ {
public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult) public ResolveResult Resolve(PythonResolverContext resolverContext)
{ {
if (resolverContext.HasCallingClass) { if (resolverContext.HasCallingClass) {
if (IsSelfExpression(expressionResult)) { if (IsSelfExpression(resolverContext)) {
return CreateResolveResult(resolverContext); return CreateResolveResult(resolverContext);
} else if (IsSelfExpressionAtStart(expressionResult)) { } else if (IsSelfExpressionAtStart(resolverContext)) {
MemberName memberName = new MemberName(expressionResult.Expression); MemberName memberName = resolverContext.CreateExpressionMemberName();
return new PythonMethodGroupResolveResult(resolverContext.CallingClass, memberName.Name); return new PythonMethodGroupResolveResult(resolverContext.CallingClass, memberName.Name);
} }
} }
return null; return null;
} }
bool IsSelfExpression(ExpressionResult expressionResult) bool IsSelfExpression(PythonResolverContext resolverContext)
{ {
return expressionResult.Expression == "self"; return resolverContext.Expression == "self";
} }
ResolveResult CreateResolveResult(PythonResolverContext resolverContext) ResolveResult CreateResolveResult(PythonResolverContext resolverContext)
@ -33,9 +33,9 @@ namespace ICSharpCode.PythonBinding
return new ResolveResult(callingClass, null, returnType); return new ResolveResult(callingClass, null, returnType);
} }
bool IsSelfExpressionAtStart(ExpressionResult expressionResult) bool IsSelfExpressionAtStart(PythonResolverContext resolverContext)
{ {
return expressionResult.Expression.StartsWith("self."); return resolverContext.Expression.StartsWith("self.");
} }
} }
} }

4
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleMethodResolver.cs

@ -15,9 +15,9 @@ namespace ICSharpCode.PythonBinding
this.standardModuleResolver = standardModuleResolver; 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); MethodGroupResolveResult result = ResolveMethodFromImportedNames(resolverContext, memberName);
if (result != null) { if (result != null) {
return result; return result;

14
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonStandardModuleResolver.cs

@ -10,19 +10,21 @@ namespace ICSharpCode.PythonBinding
{ {
PythonStandardModules standardPythonModules = new PythonStandardModules(); PythonStandardModules standardPythonModules = new PythonStandardModules();
public PythonStandardModuleResolver() public ResolveResult Resolve(PythonResolverContext resolverContext)
{ {
} PythonStandardModuleType type = GetStandardModuleTypeIfImported(resolverContext);
public ResolveResult Resolve(PythonResolverContext resolverContext, ExpressionResult expressionResult)
{
PythonStandardModuleType type = GetStandardModuleTypeIfImported(resolverContext, expressionResult.Expression);
if (type != null) { if (type != null) {
return new PythonStandardModuleResolveResult(type); return new PythonStandardModuleResolveResult(type);
} }
return null; return null;
} }
PythonStandardModuleType GetStandardModuleTypeIfImported(PythonResolverContext resolverContext)
{
string moduleName = resolverContext.Expression;
return GetStandardModuleTypeIfImported(resolverContext, moduleName);
}
public PythonStandardModuleType GetStandardModuleTypeIfImported(PythonResolverContext resolverContext, string moduleName) public PythonStandardModuleType GetStandardModuleTypeIfImported(PythonResolverContext resolverContext, string moduleName)
{ {
if (resolverContext.HasImport(moduleName) || PythonBuiltInModuleMemberName.IsBuiltInModule(moduleName)) { if (resolverContext.HasImport(moduleName) || PythonBuiltInModuleMemberName.IsBuiltInModule(moduleName)) {

6
src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/PythonSelfResolverTests.cs

@ -24,14 +24,13 @@ namespace PythonBinding.Tests.Resolver
CreateParseInfo(); CreateParseInfo();
CreatePythonResolverContext(); CreatePythonResolverContext();
ResolveResult result = resolver.Resolve(context, expression); ResolveResult result = resolver.Resolve(context);
Assert.IsNull(result); Assert.IsNull(result);
} }
void CreatePythonSelfResolver() void CreatePythonSelfResolver()
{ {
resolver = new PythonSelfResolver(); resolver = new PythonSelfResolver();
expression = new ExpressionResult("self");
} }
void CreateParseInfo() void CreateParseInfo()
@ -43,7 +42,8 @@ namespace PythonBinding.Tests.Resolver
void CreatePythonResolverContext() void CreatePythonResolverContext()
{ {
context = new PythonResolverContext(parseInfo); expression = new ExpressionResult("self");
context = new PythonResolverContext(parseInfo, expression, String.Empty);
} }
} }
} }

5
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonResolverTestsHelper.cs

@ -36,9 +36,8 @@ namespace PythonBinding.Tests.Utils
public ResolveResult Resolve(string expression) public ResolveResult Resolve(string expression)
{ {
ExpressionResult expressionResult = new ExpressionResult(expression); ExpressionResult expressionResult = new ExpressionResult(expression);
PythonResolverContext context = new PythonResolverContext(ParseInfo); PythonResolverContext context = new PythonResolverContext(ParseInfo, expressionResult, String.Empty);
context.GetCallingMember(expressionResult.Region); ResolveResult = Resolver.Resolve(context);
ResolveResult = Resolver.Resolve(context, expressionResult);
return ResolveResult; return ResolveResult;
} }

Loading…
Cancel
Save