diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index fc90f4ed52..7c57cd61b3 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -171,7 +171,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } var resolveResult = ResolveExpression (expr.Item1, expr.Item2, expr.Item3); - if (resolveResult == null) return null; if (expr.Item2 is AstType) @@ -1775,6 +1774,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } else { isProtectedAllowed = currentType != null && typeDef != null ? currentType.Resolve (ctx).GetDefinition ().GetAllBaseTypeDefinitions ().Any (bt => bt.Equals (typeDef)) : false; } + if (resolveResult is TypeResolveResult && type.Kind == TypeKind.Enum) { foreach (var field in type.GetFields ()) { result.AddMember (field); @@ -1790,27 +1790,34 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var mrr = (MemberResolveResult)resolveResult; includeStaticMembers = mrr.Member.Name == mrr.Type.Name; } + if (resolveResult is TypeResolveResult && (resolvedNode is IdentifierExpression || resolvedNode is MemberReferenceExpression)) + includeStaticMembers = true; // Console.WriteLine ("type:" + type +"/"+type.GetType ()); -// Console.WriteLine ("IS PROT ALLOWED:" + isProtectedAllowed); +// Console.WriteLine ("IS PROT ALLOWED:" + isProtectedAllowed + " static: "+ includeStaticMembers); // Console.WriteLine (resolveResult); +// Console.WriteLine ("node:" + resolvedNode); // Console.WriteLine (currentMember != null ? currentMember.IsStatic : "currentMember == null"); if (resolvedNode.Annotation () == null) { //tags the created expression as part of an object create expression. foreach (var member in type.GetMembers ()) { +// Console.WriteLine ("member:" + member); if (!lookup.IsAccessible (member, isProtectedAllowed)) { - // Console.WriteLine ("skip access: " + member.FullName); +// Console.WriteLine ("skip access: " + member.FullName); continue; } if (resolvedNode is BaseReferenceExpression && member.IsAbstract) continue; - - if (!includeStaticMembers && member.IsStatic && !(resolveResult is TypeResolveResult)) { - // Console.WriteLine ("skip static member: " + member.FullName); + bool memberIsStatic = member.IsStatic; + if (!includeStaticMembers && memberIsStatic && !(resolveResult is TypeResolveResult)) { +// Console.WriteLine ("skip static member: " + member.FullName); continue; } - if (!member.IsStatic && (resolveResult is TypeResolveResult)) { - // Console.WriteLine ("skip non static member: " + member.FullName); + var field = member as IField; + if (field != null) + memberIsStatic |= field.IsConst; + + if (!memberIsStatic && (resolveResult is TypeResolveResult)) { continue; } @@ -1818,7 +1825,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion continue; if (member.EntityType == EntityType.Operator) continue; - // Console.WriteLine ("add : "+ member.FullName + " --- " + member.IsStatic); + +// Console.WriteLine ("add : "+ member.FullName + " --- " + member.IsStatic); result.AddMember (member); } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs index b45c807829..614bb6941a 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs @@ -1166,5 +1166,24 @@ $$ Assert.IsNotNull (provider.Find ("Test"), "class 'Test' not found."); } + /// + /// Bug 3320 - Constants accessed by class name do not show in completion list + /// + [Test()] + public void TestBug3320 () + { + CodeCompletionBugTests.CombinedProviderTest (@" +public class Foo +{ + public const int Bar = 5; + + public void DoStuff() + { + $Foo.$ + } +}", provider => { + Assert.IsNotNull (provider.Find ("Bar"), "'Bar' not found."); + }); + } } } \ No newline at end of file