Browse Source

Used new GetAccessibleMembers method in code completion.

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

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

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

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

@ -29,6 +29,7 @@
using System; using System;
using NUnit.Framework; using NUnit.Framework;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
namespace ICSharpCode.NRefactory.CSharp.CodeCompletion namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
{ {
@ -1345,5 +1346,80 @@ public class Foo
Assert.IsNotNull (provider.Find ("Bar"), "'Bar' not found."); 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
#region ICompletionData implementation #region ICompletionData implementation
public void AddOverload (ICompletionData data) public void AddOverload (ICompletionData data)
{ {
if (overloadedData.Count == 0)
overloadedData.Add (this);
overloadedData.Add (data);
} }
public CompletionCategory CompletionCategory { public CompletionCategory CompletionCategory {
@ -103,13 +106,17 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
public bool HasOverloads { public bool HasOverloads {
get { get {
throw new NotImplementedException (); return overloadedData.Count > 0;
} }
} }
List<ICompletionData> overloadedData = new List<ICompletionData> ();
public System.Collections.Generic.IEnumerable<ICompletionData> OverloadedData { public System.Collections.Generic.IEnumerable<ICompletionData> OverloadedData {
get; get {
set; return overloadedData;
}
set {
throw new NotImplementedException ();
}
} }
#endregion #endregion

Loading…
Cancel
Save