Browse Source

Many bugfixes/improvements in the resolver.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@80 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 21 years ago
parent
commit
cc63250aed
  1. 6
      src/Main/Base/Project/Src/Dom/IMember.cs
  2. 7
      src/Main/Base/Project/Src/Dom/IReturnType.cs
  3. 4
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/Field.cs
  4. 2
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/Method.cs
  5. 8
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs
  6. 32
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
  7. 4
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/Property.cs
  8. 5
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs
  9. 21
      src/Main/Base/Project/Src/Dom/ResolveResult.cs
  10. 2
      src/Main/Base/Test/NRefactoryResolverTests.cs

6
src/Main/Base/Project/Src/Dom/IMember.cs

@ -14,6 +14,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -14,6 +14,7 @@ namespace ICSharpCode.SharpDevelop.Dom
string FullyQualifiedName {
get;
}
IRegion Region {
get;
}
@ -21,13 +22,14 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -21,13 +22,14 @@ namespace ICSharpCode.SharpDevelop.Dom
string Name {
get;
}
string Namespace {
get;
}
IReturnType ReturnType {
get;
set;
}
}
}

7
src/Main/Base/Project/Src/Dom/IReturnType.cs

@ -13,15 +13,15 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -13,15 +13,15 @@ namespace ICSharpCode.SharpDevelop.Dom
string FullyQualifiedName {
get;
}
string Name {
get;
}
string Namespace {
get;
}
int PointerNestingLevel {
get;
}
@ -35,6 +35,5 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -35,6 +35,5 @@ namespace ICSharpCode.SharpDevelop.Dom
object DeclaredIn {
get;
}
}
}

4
src/Main/Base/Project/Src/Dom/NRefactoryResolver/Field.cs

@ -12,10 +12,10 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -12,10 +12,10 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
modifiers = modifiers | m;
}
public Field(ReturnType type, string fullyQualifiedName, Modifier m, IRegion region, IClass declaringType) : base(declaringType)
public Field(ReturnType type, string name, Modifier m, IRegion region, IClass declaringType) : base(declaringType)
{
this.returnType = type;
this.FullyQualifiedName = fullyQualifiedName;
this.FullyQualifiedName = declaringType.FullyQualifiedName + "." + name;
this.region = region;
modifiers = (ModifierEnum)m;
if (modifiers == ModifierEnum.None) {

2
src/Main/Base/Project/Src/Dom/NRefactoryResolver/Method.cs

@ -14,7 +14,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -14,7 +14,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
public Method(string name, ReturnType type, Modifier m, IRegion region, IRegion bodyRegion, IClass declaringType) : base(declaringType)
{
FullyQualifiedName = name;
FullyQualifiedName = declaringType.FullyQualifiedName + "." + name;
returnType = type;
this.region = region;
this.bodyRegion = bodyRegion;

8
src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs

@ -233,7 +233,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -233,7 +233,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
}
cu.Classes.Add(c);
}
Method invokeMethod = new Method("Invoke", new ReturnType(delegateDeclaration.ReturnType), delegateDeclaration.Modifier, null, null, GetCurrentClass());
Method invokeMethod = new Method("Invoke", new ReturnType(delegateDeclaration.ReturnType), delegateDeclaration.Modifier, null, null, c);
c.Methods.Add(invokeMethod);
return c;
}
@ -264,7 +264,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -264,7 +264,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
{
DefaultRegion region = GetRegion(constructorDeclaration.StartLocation, constructorDeclaration.EndLocation);
DefaultRegion bodyRegion = GetRegion(constructorDeclaration.EndLocation, constructorDeclaration.Body != null ? constructorDeclaration.Body.EndLocation : new Point(-1, -1));
Class c = GetCurrentClass();
Class c = GetCurrentClass();
Constructor constructor = new Constructor(constructorDeclaration.Modifier, region, bodyRegion, GetCurrentClass());
constructor.Attributes.AddRange(VisitAttributes(constructorDeclaration.Attributes));
@ -286,7 +286,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -286,7 +286,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
DefaultRegion region = GetRegion(destructorDeclaration.StartLocation, destructorDeclaration.EndLocation);
DefaultRegion bodyRegion = GetRegion(destructorDeclaration.EndLocation, destructorDeclaration.Body != null ? destructorDeclaration.Body.EndLocation : new Point(-1, -1));
Class c = GetCurrentClass();
Class c = GetCurrentClass();
Destructor destructor = new Destructor(c.Name, destructorDeclaration.Modifier, region, bodyRegion, GetCurrentClass());
destructor.Attributes.AddRange(VisitAttributes(destructorDeclaration.Attributes));
@ -308,7 +308,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -308,7 +308,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
retType = new ReturnType(c.FullyQualifiedName);
else
retType = new ReturnType(fieldDeclaration.GetTypeForField(i));
Field f = new Field(retType, field.Name, fieldDeclaration.Modifier, region, GetCurrentClass());
Field f = new Field(retType, field.Name, fieldDeclaration.Modifier, region, c);
f.Attributes.AddRange(VisitAttributes(fieldDeclaration.Attributes));
if (c.ClassType == ClassType.Enum) {
f.SetModifiers(ModifierEnum.Const | ModifierEnum.SpecialName);

32
src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs

@ -137,7 +137,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -137,7 +137,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
if (expr is InvocationExpression) {
IMethod method = typeVisitor.GetMethod((InvocationExpression)expr, null);
if (method != null)
return new MemberResolveResult(callingClass, callingMember, method);
return CreateMemberResolveResult(method);
} else if (expr is FieldReferenceExpression) {
FieldReferenceExpression fieldReferenceExpression = (FieldReferenceExpression)expr;
IReturnType returnType;
@ -166,7 +166,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -166,7 +166,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
}
IMember member = GetMember(returnType, fieldReferenceExpression.FieldName);
if (member != null)
return new MemberResolveResult(callingClass, callingMember, member);
return CreateMemberResolveResult(member);
ResolveResult result = ResolveMethod(returnType, fieldReferenceExpression.FieldName);
if (result != null)
return result;
@ -181,11 +181,17 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -181,11 +181,17 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
if (type == null || type.FullyQualifiedName == "" || type.PointerNestingLevel != 0) {
return null;
}
if (type.ArrayDimensions != null && type.ArrayDimensions.Length > 0)
return new ResolveResult(callingClass, callingMember, new ReturnType("System.Array"));
else {
return new ResolveResult(callingClass, callingMember, FixType(type));
if (expr is ObjectCreateExpression && type.ArrayCount == 0) {
IClass c = projectContent.GetClass(type.FullyQualifiedName);
if (c == null)
return null;
foreach (IMethod m in c.Methods) {
if (m.IsConstructor)
return CreateMemberResolveResult(m);
}
return null;
}
return new ResolveResult(callingClass, callingMember, FixType(type));
}
IReturnType FixType(IReturnType type)
@ -194,7 +200,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -194,7 +200,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return null;
IClass returnClass = SearchType(type.FullyQualifiedName, callingClass, cu);
if (returnClass != null && returnClass.FullyQualifiedName != type.FullyQualifiedName)
return new ReturnType(returnClass.FullyQualifiedName);
return new ReturnType(returnClass.FullyQualifiedName, type.ArrayDimensions, type.PointerNestingLevel);
else
return type;
}
@ -209,17 +215,17 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -209,17 +215,17 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
LocalLookupVariable var = SearchVariable(identifier);
if (var != null) {
IReturnType type = GetVariableType(var);
IField field = new LocalVariableField(type, identifier, new DefaultRegion(var.StartPos, var.EndPos), callingClass);
IField field = new LocalVariableField(FixType(type), identifier, new DefaultRegion(var.StartPos, var.EndPos), callingClass);
return new LocalResolveResult(callingMember, field, false);
}
IParameter para = SearchMethodParameter(identifier);
if (para != null) {
IField field = new LocalVariableField(para.ReturnType, para.Name, para.Region, callingClass);
IField field = new LocalVariableField(FixType(para.ReturnType), para.Name, para.Region, callingClass);
return new LocalResolveResult(callingMember, field, true);
}
IMember member = GetMember(callingClass, identifier);
if (member != null) {
return new MemberResolveResult(callingClass, callingMember, member);
return CreateMemberResolveResult(member);
}
ResolveResult result = ResolveMethod(callingClass, identifier);
if (result != null)
@ -253,6 +259,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -253,6 +259,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
}
#endregion
private ResolveResult CreateMemberResolveResult(IMember member)
{
member.ReturnType = FixType(member.ReturnType);
return new MemberResolveResult(callingClass, callingMember, member);
}
#region ResolveMethod
ResolveResult ResolveMethod(IReturnType type, string identifier)
{

4
src/Main/Base/Project/Src/Dom/NRefactoryResolver/Property.cs

@ -12,9 +12,9 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -12,9 +12,9 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
modifiers = modifiers | m;
}
public Property(string fullyQualifiedName, ReturnType type, Modifier m, IRegion region, IRegion bodyRegion, IClass declaringType) : base(declaringType)
public Property(string name, ReturnType type, Modifier m, IRegion region, IRegion bodyRegion, IClass declaringType) : base(declaringType)
{
this.FullyQualifiedName = fullyQualifiedName;
this.FullyQualifiedName = declaringType.FullyQualifiedName + "." + name;
returnType = type;
this.region = region;
this.bodyRegion = bodyRegion;

5
src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs

@ -289,7 +289,10 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -289,7 +289,10 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
public override object Visit(ObjectCreateExpression objectCreateExpression, object data)
{
string name = resolver.SearchType(objectCreateExpression.CreateType.Type, resolver.CallingClass, resolver.CompilationUnit).FullyQualifiedName;
string name = objectCreateExpression.CreateType.Type;
IClass c = resolver.SearchType(name, resolver.CallingClass, resolver.CompilationUnit);
if (c != null)
name = c.FullyQualifiedName;
return new ReturnType(name, objectCreateExpression.CreateType.RankSpecifier, objectCreateExpression.CreateType.PointerNestingLevel);
}

21
src/Main/Base/Project/Src/Dom/ResolveResult.cs

@ -71,11 +71,18 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -71,11 +71,18 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public virtual ArrayList GetCompletionData(IProjectContent projectContent)
public virtual IClass GetResolvedClass(IProjectContent projectContent)
{
if (resolvedType == null)
return null;
IClass c = projectContent.GetClass(resolvedType.FullyQualifiedName);
if (resolvedType.ArrayCount > 0)
return ProjectContentRegistry.GetMscorlibContent().GetClass("System.Array");
return projectContent.GetClass(resolvedType.FullyQualifiedName);
}
public virtual ArrayList GetCompletionData(IProjectContent projectContent)
{
IClass c = GetResolvedClass(projectContent);
if (c == null)
return null;
return c.GetAccessibleMembers(callingClass, false);
@ -221,12 +228,18 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -221,12 +228,18 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public override IClass GetResolvedClass(IProjectContent projectContent)
{
return resolvedClass;
}
public override ArrayList GetCompletionData(IProjectContent projectContent)
{
if (resolvedClass == null)
IClass c = GetResolvedClass(projectContent);
if (c == null)
return null;
else
return resolvedClass.GetAccessibleMembers(this.CallingClass, true);
return c.GetAccessibleMembers(this.CallingClass, true);
}
public override FilePosition GetDefinitionPosition()

2
src/Main/Base/Test/NRefactoryResolverTests.cs

@ -261,7 +261,7 @@ interface IInterface2 { @@ -261,7 +261,7 @@ interface IInterface2 {
}
";
ResolveResult result = Resolve(program, "new ThisClassDoesNotExist()", 3, 24);
Assert.IsNull(result, "result");
Assert.IsNull(result);
}
}
}

Loading…
Cancel
Save