diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 575d39785f..d090e8f102 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -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 } 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 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 if (resolvedNode.Annotation() == null) { //tags the created expression as part of an object create expression. - + /* var filteredList = new List(); 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 if (member.EntityType == EntityType.Operator) { continue; } - if (member.IsExplicitInterfaceImplementation) { - continue; - } - if (member.IsShadowing) { - filteredList.RemoveAll(m => m.Name == member.Name); + + if (member is IMember) { + result.AddMember ((IMember)member); + } else { + 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; } - + IEnumerable CreateCaseCompletionData(TextLocation location) { var unit = ParseStub("a: break;"); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs index 409112a298..d7b4b29013 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs @@ -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 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); + }); + } } } \ No newline at end of file diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index cdb5b8fa42..ae18efe4cd 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -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 public bool HasOverloads { get { - throw new NotImplementedException (); + return overloadedData.Count > 0; } } - + List overloadedData = new List (); public System.Collections.Generic.IEnumerable OverloadedData { - get; - set; + get { + return overloadedData; + } + set { + throw new NotImplementedException (); + } } #endregion