Browse Source

Fixed SD2-1446: Code completion lists private inner classes out of scope

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3525 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
c582a32862
  1. 122
      src/Main/Base/Test/InnerClassesResolverTests.cs
  2. 2
      src/Main/Base/Test/NRefactoryResolverTests.cs
  3. 2
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CtrlSpaceResolveHelper.cs
  4. 2
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs
  5. 4
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs

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

@ -32,6 +32,56 @@ namespace ICSharpCode.SharpDevelop.Tests @@ -32,6 +32,56 @@ namespace ICSharpCode.SharpDevelop.Tests
{
return nrrt.ResolveVB<T>(program, expression, line);
}
ArrayList CtrlSpace(string program, int line)
{
return nrrt.CtrlSpaceResolveCSharp(program, line, ExpressionContext.Default);
}
#endregion
#region Ctrl-Space tests
[Test]
public void CtrlSpaceIncludesInnerClass()
{
string program = @"class A {
class Inner { }
}";
Assert.IsTrue(IsInnerClassVisible(CtrlSpace(program, 3)));
}
[Test]
public void CtrlSpaceIncludesInheritedInnerClass()
{
string program = @"class A : Outer {
}
class Outer { protected class Inner { } }
";
Assert.IsTrue(IsInnerClassVisible(CtrlSpace(program, 2)));
}
[Test]
public void CtrlSpaceDoesNotIncludeInheritedPrivateInnerClass()
{
string program = @"class A : Outer {
}
class Outer { class Inner { } }
";
Assert.IsFalse(IsInnerClassVisible(CtrlSpace(program, 2)));
}
[Test]
public void CtrlSpaceIncludesInnerClassFromOtherPart()
{
string program = @"partial class A {
}
partial class A { class Inner { } }
";
Assert.IsTrue(IsInnerClassVisible(CtrlSpace(program, 2)));
}
#endregion
[Test]
@ -202,7 +252,7 @@ class A { @@ -202,7 +252,7 @@ class A {
public void InheritedInnerClass()
{
string program = @"class A {
class B { }
protected class B { }
}
class C : A {
void Main() {
@ -280,5 +330,75 @@ public sealed class GL { @@ -280,5 +330,75 @@ public sealed class GL {
Assert.IsNotNull(c);
Assert.AreEqual("GL.Enums.BeginMode", c.FullyQualifiedName);
}
[Test]
public void DoNotShowInaccessibleInnerClass()
{
string program = @"using System;
class C {
}
class Outer { private class Inner { } }
";
TypeResolveResult trr = Resolve<TypeResolveResult>(program, "Outer", 3);
ArrayList l = trr.GetCompletionData(trr.ResolvedClass.ProjectContent);
Assert.IsFalse(IsInnerClassVisible(l));
}
[Test]
public void ShowProtectedInnerClassFromDerivedClass()
{
string program = @"using System;
class Derived : Outer {
}
class Outer { protected class Inner {} }
";
TypeResolveResult trr = Resolve<TypeResolveResult>(program, "Outer", 3);
ArrayList l = trr.GetCompletionData(trr.ResolvedClass.ProjectContent);
Assert.IsTrue(IsInnerClassVisible(l));
}
[Test]
public void ShowProtectedInnerClassThroughForeignDerivedClass()
{
string program = @"using System;
class Derived : Outer {
}
class Derived2 : Outer { }
class Outer { protected class Inner {} }
";
TypeResolveResult trr = Resolve<TypeResolveResult>(program, "Derived2", 3);
ArrayList l = trr.GetCompletionData(trr.ResolvedClass.ProjectContent);
Assert.IsTrue(IsInnerClassVisible(l));
}
[Test]
public void DoNotShowProtectedInnerClassThroughUnrelatedClass()
{
string program = @"using System;
class Unrelated {
}
class Derived : Outer { }
class Outer { protected class Inner {} }
";
TypeResolveResult trr = Resolve<TypeResolveResult>(program, "Derived", 3);
ArrayList l = trr.GetCompletionData(trr.ResolvedClass.ProjectContent);
Assert.IsFalse(IsInnerClassVisible(l));
}
bool IsInnerClassVisible(ArrayList l)
{
foreach (object o in l) {
IClass c = o as IClass;
if (c != null && c.Name == "Inner")
return true;
}
return false;
}
}
}

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

@ -950,7 +950,7 @@ namespace Root.Child { @@ -950,7 +950,7 @@ namespace Root.Child {
Assert.AreEqual("Root.Alpha", result.ResolvedType.FullyQualifiedName);
}
ArrayList CtrlSpaceResolveCSharp(string program, int line, ExpressionContext context)
public ArrayList CtrlSpaceResolveCSharp(string program, int line, ExpressionContext context)
{
ParseInformation parseInfo = AddCompilationUnit(Parse("a.cs", program), "a.cs");

2
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CtrlSpaceResolveHelper.cs

@ -99,7 +99,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -99,7 +99,7 @@ namespace ICSharpCode.SharpDevelop.Dom
}
IClass currentClass = callingClass;
do {
foreach (IClass innerClass in currentClass.GetAccessibleTypes(currentClass)) {
foreach (IClass innerClass in currentClass.GetCompoundClass().GetAccessibleTypes(currentClass)) {
if (!result.Contains(innerClass))
result.Add(innerClass);
}

2
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs

@ -516,7 +516,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -516,7 +516,7 @@ namespace ICSharpCode.SharpDevelop.Dom
if (visitedTypes.Contains(currentClass))
break;
visitedTypes.Add(currentClass);
bool isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(currentClass);
bool isClassInInheritanceTree = callingClass != null ? callingClass.IsTypeInInheritanceTree(currentClass) : false;
foreach (IClass c in currentClass.InnerClasses) {
if (c.IsAccessible(callingClass, isClassInInheritanceTree)) {
types.Add(c);

4
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs

@ -451,9 +451,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -451,9 +451,7 @@ namespace ICSharpCode.SharpDevelop.Dom
{
ArrayList ar = GetCompletionData(projectContent.Language, true);
if (resolvedClass != null) {
foreach (IClass baseClass in resolvedClass.ClassInheritanceTree) {
ar.AddRange(baseClass.InnerClasses);
}
ar.AddRange(resolvedClass.GetCompoundClass().GetAccessibleTypes(CallingClass));
}
return ar;
}

Loading…
Cancel
Save