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 17 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 @@ -102,6 +102,9 @@ namespace VBNetBinding.Parser
p.Parse();
NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(projectContent);
if (projectContent.Project != null) {
visitor.VBRootNamespace = ((IProject)projectContent.Project).RootNamespace;
}
visitor.Specials = p.Lexer.SpecialTracker.CurrentSpecials;
visitor.VisitCompilationUnit(p.CompilationUnit, null);
visitor.Cu.FileName = fileName;
@ -109,16 +112,6 @@ namespace VBNetBinding.Parser @@ -109,16 +112,6 @@ namespace VBNetBinding.Parser
RetrieveRegions(visitor.Cu, p.Lexer.SpecialTracker);
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;
}

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

@ -32,9 +32,9 @@ namespace ICSharpCode.SharpDevelop.Tests @@ -32,9 +32,9 @@ namespace ICSharpCode.SharpDevelop.Tests
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

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

@ -28,9 +28,9 @@ namespace ICSharpCode.SharpDevelop.Tests @@ -28,9 +28,9 @@ namespace ICSharpCode.SharpDevelop.Tests
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

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

@ -65,11 +65,12 @@ namespace ICSharpCode.SharpDevelop.Tests @@ -65,11 +65,12 @@ namespace ICSharpCode.SharpDevelop.Tests
pc.Language = LanguageProperties.VBNet;
lastPC = pc;
NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(pc);
visitor.VBRootNamespace = "RootNamespace";
visitor.VisitCompilationUnit(p.CompilationUnit, null);
visitor.Cu.FileName = fileName;
Assert.AreEqual(0, p.Errors.Count, "Parse error preparing compilation unit");
visitor.Cu.ErrorsDuringCompile = p.Errors.Count > 0;
foreach (IClass c in visitor.Cu.Classes) {
foreach (DefaultClass c in visitor.Cu.Classes) {
pc.AddClassToNamespaceList(c);
}
@ -95,12 +96,12 @@ namespace ICSharpCode.SharpDevelop.Tests @@ -95,12 +96,12 @@ namespace ICSharpCode.SharpDevelop.Tests
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");
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);
}
@ -122,7 +123,15 @@ namespace ICSharpCode.SharpDevelop.Tests @@ -122,7 +123,15 @@ namespace ICSharpCode.SharpDevelop.Tests
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.AreEqual(typeof(T), rr.GetType());
return (T)rr;
@ -175,7 +184,7 @@ End Class @@ -175,7 +184,7 @@ End Class
End Sub
End Class
";
ResolveResult result = ResolveVB(program, "a", 4);
LocalResolveResult result = ResolveVB<LocalResolveResult>(program, "a", 4);
Assert.IsNotNull(result, "result");
ArrayList arr = result.GetCompletionData(lastPC);
Assert.IsNotNull(arr, "arr");
@ -890,7 +899,7 @@ Class A @@ -890,7 +899,7 @@ Class A
End Class
";
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;
Assert.IsTrue(m.IsStatic);
@ -1117,15 +1126,15 @@ Class B @@ -1117,15 +1126,15 @@ Class B
End Class
";
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);
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));
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));
}
@ -1424,7 +1433,7 @@ Class F @@ -1424,7 +1433,7 @@ Class F
End Class
";
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);
Assert.AreEqual("System.Windows.Forms.Form.CancelButton", result.ResolvedMember.FullyQualifiedName);
@ -2290,5 +2299,21 @@ class TestClass { @@ -2290,5 +2299,21 @@ class TestClass {
ResolveResult result2 = Resolve(program, "A[0]", 2, 1, ExpressionContext.ObjectCreation);
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 @@ -23,6 +23,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
ICompilationUnit cu;
Stack<string> currentNamespace = new Stack<string>();
Stack<DefaultClass> currentClass = new Stack<DefaultClass>();
public string VBRootNamespace { get; set; }
public ICompilationUnit Cu {
get {
@ -158,7 +159,13 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -158,7 +159,13 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
if (compilationUnit == 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;
}

Loading…
Cancel
Save