Browse Source

r7308@daniel-notebook (orig r3339): daniel | 2008-08-14 09:31:18 +0200

Fixed SD2-1436: Type references in VB delegate declarations are not resolved correctly


git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3341 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
cd5d5eebb5
  1. 13
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/Parser.cs
  2. 4
      src/Main/Base/Test/GenericResolverTests.cs
  3. 4
      src/Main/Base/Test/InnerClassesResolverTests.cs
  4. 45
      src/Main/Base/Test/NRefactoryResolverTests.cs
  5. 9
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs

13
src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/Parser.cs

@ -102,6 +102,9 @@ namespace VBNetBinding.Parser
p.Parse(); p.Parse();
NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(projectContent); NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(projectContent);
if (projectContent.Project != null) {
visitor.VBRootNamespace = ((IProject)projectContent.Project).RootNamespace;
}
visitor.Specials = p.Lexer.SpecialTracker.CurrentSpecials; visitor.Specials = p.Lexer.SpecialTracker.CurrentSpecials;
visitor.VisitCompilationUnit(p.CompilationUnit, null); visitor.VisitCompilationUnit(p.CompilationUnit, null);
visitor.Cu.FileName = fileName; visitor.Cu.FileName = fileName;
@ -109,16 +112,6 @@ namespace VBNetBinding.Parser
RetrieveRegions(visitor.Cu, p.Lexer.SpecialTracker); RetrieveRegions(visitor.Cu, p.Lexer.SpecialTracker);
AddCommentTags(visitor.Cu, p.Lexer.TagComments); AddCommentTags(visitor.Cu, p.Lexer.TagComments);
string rootNamespace = null;
if (projectContent.Project != null) {
rootNamespace = ((IProject)projectContent.Project).RootNamespace;
}
if (rootNamespace != null && rootNamespace.Length > 0) {
foreach (DefaultClass c in visitor.Cu.Classes) {
c.FullyQualifiedName = rootNamespace + "." + c.FullyQualifiedName;
}
}
return visitor.Cu; return visitor.Cu;
} }

4
src/Main/Base/Test/GenericResolverTests.cs

@ -32,9 +32,9 @@ namespace ICSharpCode.SharpDevelop.Tests
return nrrt.Resolve<RR>(program, expression, line, column, ExpressionContext.Default); return nrrt.Resolve<RR>(program, expression, line, column, ExpressionContext.Default);
} }
ResolveResult ResolveVB(string program, string expression, int line) RR ResolveVB<RR>(string program, string expression, int line) where RR : ResolveResult
{ {
return nrrt.ResolveVB(program, expression, line); return nrrt.ResolveVB<RR>(program, expression, line);
} }
#endregion #endregion

4
src/Main/Base/Test/InnerClassesResolverTests.cs

@ -28,9 +28,9 @@ namespace ICSharpCode.SharpDevelop.Tests
return nrrt.Resolve<T>(program, expression, line); return nrrt.Resolve<T>(program, expression, line);
} }
ResolveResult ResolveVB(string program, string expression, int line) T ResolveVB<T>(string program, string expression, int line) where T : ResolveResult
{ {
return nrrt.ResolveVB(program, expression, line); return nrrt.ResolveVB<T>(program, expression, line);
} }
#endregion #endregion

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

@ -65,11 +65,12 @@ namespace ICSharpCode.SharpDevelop.Tests
pc.Language = LanguageProperties.VBNet; pc.Language = LanguageProperties.VBNet;
lastPC = pc; lastPC = pc;
NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(pc); NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(pc);
visitor.VBRootNamespace = "RootNamespace";
visitor.VisitCompilationUnit(p.CompilationUnit, null); visitor.VisitCompilationUnit(p.CompilationUnit, null);
visitor.Cu.FileName = fileName; visitor.Cu.FileName = fileName;
Assert.AreEqual(0, p.Errors.Count, "Parse error preparing compilation unit"); Assert.AreEqual(0, p.Errors.Count, "Parse error preparing compilation unit");
visitor.Cu.ErrorsDuringCompile = p.Errors.Count > 0; visitor.Cu.ErrorsDuringCompile = p.Errors.Count > 0;
foreach (IClass c in visitor.Cu.Classes) { foreach (DefaultClass c in visitor.Cu.Classes) {
pc.AddClassToNamespaceList(c); pc.AddClassToNamespaceList(c);
} }
@ -95,12 +96,12 @@ namespace ICSharpCode.SharpDevelop.Tests
return resolver.Resolve(expressionResult, parseInfo, program); return resolver.Resolve(expressionResult, parseInfo, program);
} }
public ResolveResult ResolveVB(string program, string expression, int line) public ResolveResult ResolveVB(string program, string expression, int line, int column, ExpressionContext context)
{ {
ParseInformation parseInfo = AddCompilationUnit(ParseVB("a.vb", program), "a.vb"); ParseInformation parseInfo = AddCompilationUnit(ParseVB("a.vb", program), "a.vb");
NRefactoryResolver resolver = new NRefactoryResolver(LanguageProperties.VBNet); NRefactoryResolver resolver = new NRefactoryResolver(LanguageProperties.VBNet);
ExpressionResult expressionResult = new ExpressionResult(expression, new DomRegion(line, 0), ExpressionContext.Default, null); ExpressionResult expressionResult = new ExpressionResult(expression, new DomRegion(line, column), context, null);
return resolver.Resolve(expressionResult, parseInfo, program); return resolver.Resolve(expressionResult, parseInfo, program);
} }
@ -122,7 +123,15 @@ namespace ICSharpCode.SharpDevelop.Tests
public T ResolveVB<T>(string program, string expression, int line) where T : ResolveResult public T ResolveVB<T>(string program, string expression, int line) where T : ResolveResult
{ {
ResolveResult rr = ResolveVB(program, expression, line); ResolveResult rr = ResolveVB(program, expression, line, 0, ExpressionContext.Default);
Assert.IsNotNull(rr, "Resolve returned null (expression=" + expression + ")");
Assert.AreEqual(typeof(T), rr.GetType());
return (T)rr;
}
public T ResolveVB<T>(string program, string expression, int line, int column, ExpressionContext context) where T : ResolveResult
{
ResolveResult rr = ResolveVB(program, expression, line, column, context);
Assert.IsNotNull(rr, "Resolve returned null (expression=" + expression + ")"); Assert.IsNotNull(rr, "Resolve returned null (expression=" + expression + ")");
Assert.AreEqual(typeof(T), rr.GetType()); Assert.AreEqual(typeof(T), rr.GetType());
return (T)rr; return (T)rr;
@ -175,7 +184,7 @@ End Class
End Sub End Sub
End Class End Class
"; ";
ResolveResult result = ResolveVB(program, "a", 4); LocalResolveResult result = ResolveVB<LocalResolveResult>(program, "a", 4);
Assert.IsNotNull(result, "result"); Assert.IsNotNull(result, "result");
ArrayList arr = result.GetCompletionData(lastPC); ArrayList arr = result.GetCompletionData(lastPC);
Assert.IsNotNull(arr, "arr"); Assert.IsNotNull(arr, "arr");
@ -890,7 +899,7 @@ Class A
End Class End Class
"; ";
MemberResolveResult result = ResolveVB<MemberResolveResult>(program, "GetRectangleArea(r1)", 5); MemberResolveResult result = ResolveVB<MemberResolveResult>(program, "GetRectangleArea(r1)", 5);
Assert.AreEqual("A.GetRectangleArea", result.ResolvedMember.FullyQualifiedName); Assert.AreEqual("RootNamespace.A.GetRectangleArea", result.ResolvedMember.FullyQualifiedName);
IMethod m = (IMethod)result.ResolvedMember; IMethod m = (IMethod)result.ResolvedMember;
Assert.IsTrue(m.IsStatic); Assert.IsTrue(m.IsStatic);
@ -1117,15 +1126,15 @@ Class B
End Class End Class
"; ";
MemberResolveResult mrr = ResolveVB<MemberResolveResult>(program, "mybase.new(\"bb\")", 4); MemberResolveResult mrr = ResolveVB<MemberResolveResult>(program, "mybase.new(\"bb\")", 4);
Assert.AreEqual("B", mrr.ResolvedMember.DeclaringType.FullyQualifiedName); Assert.AreEqual("RootNamespace.B", mrr.ResolvedMember.DeclaringType.FullyQualifiedName);
Assert.IsTrue(((IMethod)mrr.ResolvedMember).IsConstructor); Assert.IsTrue(((IMethod)mrr.ResolvedMember).IsConstructor);
ResolveResult result = ResolveVB<VBBaseOrThisReferenceInConstructorResolveResult>(program, "mybase", 4); ResolveResult result = ResolveVB<VBBaseOrThisReferenceInConstructorResolveResult>(program, "mybase", 4);
Assert.AreEqual("B", result.ResolvedType.FullyQualifiedName); Assert.AreEqual("RootNamespace.B", result.ResolvedType.FullyQualifiedName);
Assert.IsTrue(ContainsMember(result.GetCompletionData(result.CallingClass.ProjectContent), mrr.ResolvedMember.FullyQualifiedName)); Assert.IsTrue(ContainsMember(result.GetCompletionData(result.CallingClass.ProjectContent), mrr.ResolvedMember.FullyQualifiedName));
result = ResolveVB<BaseResolveResult>(program, "mybase", 7); result = ResolveVB<BaseResolveResult>(program, "mybase", 7);
Assert.AreEqual("B", result.ResolvedType.FullyQualifiedName); Assert.AreEqual("RootNamespace.B", result.ResolvedType.FullyQualifiedName);
Assert.IsFalse(ContainsMember(result.GetCompletionData(result.CallingClass.ProjectContent), mrr.ResolvedMember.FullyQualifiedName)); Assert.IsFalse(ContainsMember(result.GetCompletionData(result.CallingClass.ProjectContent), mrr.ResolvedMember.FullyQualifiedName));
} }
@ -1424,7 +1433,7 @@ Class F
End Class End Class
"; ";
MemberResolveResult result = ResolveVB<MemberResolveResult>(program, "CancelButton", 5); MemberResolveResult result = ResolveVB<MemberResolveResult>(program, "CancelButton", 5);
Assert.AreEqual("F.cancelButton", result.ResolvedMember.FullyQualifiedName); Assert.AreEqual("RootNamespace.F.cancelButton", result.ResolvedMember.FullyQualifiedName);
result = ResolveVB<MemberResolveResult>(program, "MyBase.CancelButton", 5); result = ResolveVB<MemberResolveResult>(program, "MyBase.CancelButton", 5);
Assert.AreEqual("System.Windows.Forms.Form.CancelButton", result.ResolvedMember.FullyQualifiedName); Assert.AreEqual("System.Windows.Forms.Form.CancelButton", result.ResolvedMember.FullyQualifiedName);
@ -2290,5 +2299,21 @@ class TestClass {
ResolveResult result2 = Resolve(program, "A[0]", 2, 1, ExpressionContext.ObjectCreation); ResolveResult result2 = Resolve(program, "A[0]", 2, 1, ExpressionContext.ObjectCreation);
Assert.IsTrue(result2.IsReferenceTo(result.ResolvedClass)); Assert.IsTrue(result2.IsReferenceTo(result.ResolvedClass));
} }
[Test]
public void SD2_1436()
{
string program = @"Interface ITest
End Interface
Module Program
Public Delegate Sub NestedBug(a as ITest)
End Module";
TypeResolveResult result = ResolveVB<TypeResolveResult>(program, "ITest", 5, 40, ExpressionContext.Default);
Assert.AreEqual("RootNamespace.ITest", result.ResolvedClass.FullyQualifiedName);
result = ResolveVB<TypeResolveResult>(program, "ITest", 5, 40, ExpressionContext.Type);
Assert.AreEqual("RootNamespace.ITest", result.ResolvedClass.FullyQualifiedName);
}
} }
} }

9
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs

@ -23,6 +23,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
ICompilationUnit cu; ICompilationUnit cu;
Stack<string> currentNamespace = new Stack<string>(); Stack<string> currentNamespace = new Stack<string>();
Stack<DefaultClass> currentClass = new Stack<DefaultClass>(); Stack<DefaultClass> currentClass = new Stack<DefaultClass>();
public string VBRootNamespace { get; set; }
public ICompilationUnit Cu { public ICompilationUnit Cu {
get { get {
@ -158,7 +159,13 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
if (compilationUnit == null) { if (compilationUnit == null) {
return null; return null;
} }
compilationUnit.AcceptChildren(this, data); if (!string.IsNullOrEmpty(VBRootNamespace)) {
currentNamespace.Push(VBRootNamespace);
compilationUnit.AcceptChildren(this, data);
currentNamespace.Pop();
} else {
compilationUnit.AcceptChildren(this, data);
}
return cu; return cu;
} }

Loading…
Cancel
Save