Browse Source

Used new GetAccessibleMembers method in code completion.

newNRvisualizers
Mike Krüger 13 years ago
parent
commit
eb2d78e29a
  1. 43
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 76
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs
  3. 15
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs

43
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -2296,7 +2296,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2296,7 +2296,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var lookup = new MemberLookup(
ctx.CurrentTypeDefinition,
Compilation.MainAssembly
);
);
if (resolveResult is NamespaceResolveResult) {
var nr = (NamespaceResolveResult)resolveResult;
@ -2315,10 +2315,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2315,10 +2315,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
return namespaceContents.Result;
}
IType type = resolveResult.Type;
if (resolvedNode.Parent is PointerReferenceExpression && (type is PointerType)) {
type = ((PointerType)type).ElementType;
resolveResult = new OperatorResolveResult (((PointerType)type).ElementType, System.Linq.Expressions.ExpressionType.Extension, resolveResult);
}
//var typeDef = resolveResult.Type.GetDefinition();
@ -2352,7 +2351,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2352,7 +2351,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
resolveResult,
((IdentifierExpression)resolvedNode).Identifier,
out trr
)) {
)) {
if (currentMember != null && mrr.Member.IsStatic ^ currentMember.IsStatic) {
skipNonStaticMembers = true;
@ -2396,20 +2395,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2396,20 +2395,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (resolvedNode.Annotation<ObjectCreateExpression>() == null) {
//tags the created expression as part of an object create expression.
/*
var filteredList = new List<IMember>();
foreach (var member in type.GetMembers ()) {
filteredList.Add(member);
}
foreach (var member in filteredList) {
// Console.WriteLine ("add:" + member + "/" + member.IsStatic);
result.AddMember(member);
}*/
foreach (var member in lookup.GetAccessibleMembers (resolveResult)) {
if (member.EntityType == EntityType.Indexer || member.EntityType == EntityType.Operator || member.EntityType == EntityType.Constructor || member.EntityType == EntityType.Destructor) {
continue;
}
if (member.IsExplicitInterfaceImplementation) {
continue;
}
// Console.WriteLine ("member:" + member + member.IsShadowing);
if (!lookup.IsAccessible(member, isProtectedAllowed)) {
// Console.WriteLine ("skip access: " + member.FullName);
continue;
}
if (resolvedNode is BaseReferenceExpression && member.IsAbstract) {
continue;
}
@ -2433,18 +2433,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2433,18 +2433,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (member.EntityType == EntityType.Operator) {
continue;
}
if (member.IsExplicitInterfaceImplementation) {
continue;
}
if (member.IsShadowing) {
filteredList.RemoveAll(m => m.Name == member.Name);
}
filteredList.Add(member);
}
foreach (var member in filteredList) {
// Console.WriteLine ("add:" + member + "/" + member.IsStatic);
result.AddMember(member);
if (member is IMember) {
result.AddMember ((IMember)member);
} else {
if (resolveResult is TypeResolveResult || includeStaticMembers)
result.AddType ((IType)member, member.Name);
}
}
}

76
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs

@ -29,6 +29,7 @@ @@ -29,6 +29,7 @@
using System;
using NUnit.Framework;
using System.Diagnostics;
using System.Linq;
namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
{
@ -1345,5 +1346,80 @@ public class Foo @@ -1345,5 +1346,80 @@ public class Foo
Assert.IsNotNull (provider.Find ("Bar"), "'Bar' not found.");
});
}
[Test()]
public void TestImplicitShadowing ()
{
CodeCompletionBugTests.CombinedProviderTest (@"
using System;
namespace ConsoleApplication2
{
class A
{
public int Foo;
}
class B : A
{
public string Foo;
}
class Program
{
static void Main (string[] args)
{
var b = new B ();
$b.$
}
}
}", provider => {
int count = 0;
foreach (var data in provider.Data)
if (data.DisplayText == "Foo")
count += data.HasOverloads ? data.OverloadedData.Count () : 1;
Assert.AreEqual (1, count);
});
}
[Test()]
public void TestOverrideFiltering ()
{
CodeCompletionBugTests.CombinedProviderTest (@"
using System;
namespace ConsoleApplication2
{
class A
{
public virtual int Foo { set {} }
}
class B : A
{
public override int Foo {
set {
base.Foo = value;
}
}
}
class Program
{
static void Main (string[] args)
{
var b = new B ();
$b.$
}
}
}
", provider => {
int count = 0;
foreach (var data in provider.Data)
if (data.DisplayText == "Foo")
count += data.HasOverloads ? data.OverloadedData.Count () : 1;
Assert.AreEqual (1, count);
});
}
}
}

15
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs

@ -74,6 +74,9 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -74,6 +74,9 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
#region ICompletionData implementation
public void AddOverload (ICompletionData data)
{
if (overloadedData.Count == 0)
overloadedData.Add (this);
overloadedData.Add (data);
}
public CompletionCategory CompletionCategory {
@ -103,13 +106,17 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -103,13 +106,17 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
public bool HasOverloads {
get {
throw new NotImplementedException ();
return overloadedData.Count > 0;
}
}
List<ICompletionData> overloadedData = new List<ICompletionData> ();
public System.Collections.Generic.IEnumerable<ICompletionData> OverloadedData {
get;
set;
get {
return overloadedData;
}
set {
throw new NotImplementedException ();
}
}
#endregion

Loading…
Cancel
Save