From 584eb443b7ed30ee5f828e4f276a7a193adf6d70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Mon, 22 Oct 2012 10:44:48 +0200 Subject: [PATCH] [Completion] Fixed completion bug. --- .../Completion/CSharpCompletionEngine.cs | 12 ++++++---- .../Parser/CSharpParser.cs | 18 ++++++++------- .../CodeCompletionAccessibleTests.cs | 23 +++++++++++++++++++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 9b26140558..94d81f9f04 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -1113,12 +1113,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion location.Line, location.Column + 2, n => n is Expression || n is AstType || n is NamespaceDeclaration - ); + ); rr = ResolveExpression(node); } // namespace name case - if (node is NamespaceDeclaration) - return null; + var ns = node as NamespaceDeclaration; + if (ns != null) { + var last = ns.Identifiers.LastOrDefault (); + if (last != null && location < last.EndLocation) + return null; + } if (node is Identifier && node.Parent is ForeachStatement) { var foreachStmt = (ForeachStatement)node.Parent; foreach (var possibleName in GenerateNameProposals (foreachStmt.VariableType)) { @@ -1228,7 +1232,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return t.GetAllBaseTypeDefinitions().Any(bt => bt.Equals(attribute)) ? t : null; }; } - if (node != null || state.CurrentTypeDefinition != null || isInGlobalDelegate) { + if (node != null && !(node is NamespaceDeclaration) || state.CurrentTypeDefinition != null || isInGlobalDelegate) { AddTypesAndNamespaces(wrapper, state, node, typePred); wrapper.Result.Add(factory.CreateLiteralCompletionData("global")); diff --git a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs index 6f74ab4f78..3cc4c1afee 100644 --- a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs +++ b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs @@ -405,15 +405,17 @@ namespace ICSharpCode.NRefactory.CSharp AstNode insertPos = null; while (memberName != null) { Identifier newIdent = Identifier.Create (memberName.Name, Convert (memberName.Location)); - namespaceDecl.InsertChildBefore (insertPos, newIdent, Roles.Identifier); - insertPos = newIdent; - - if (!memberName.DotLocation.IsNull) { - var dotToken = new CSharpTokenNode (Convert (memberName.DotLocation), Roles.Dot); - namespaceDecl.InsertChildBefore (insertPos, dotToken, Roles.Dot); - insertPos = dotToken; + // HACK for a parser 'bug' - sometimes it generates "" identifiers in namespace names (on certain bugs in the input file) + if (newIdent.Name != "") { + namespaceDecl.InsertChildBefore (insertPos, newIdent, Roles.Identifier); + insertPos = newIdent; + + if (!memberName.DotLocation.IsNull) { + var dotToken = new CSharpTokenNode (Convert (memberName.DotLocation), Roles.Dot); + namespaceDecl.InsertChildBefore (insertPos, dotToken, Roles.Dot); + insertPos = dotToken; + } } - memberName = memberName.Left; } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs index d7b4b29013..20278c4fd1 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs @@ -1421,5 +1421,28 @@ namespace ConsoleApplication2 Assert.AreEqual (1, count); }); } + + + /// + /// Bug 5648 - Types are displayed even when cannot be used + /// + [Test()] + public void TestBug5648 () + { + CodeCompletionBugTests.CombinedProviderTest (@" +using System; + +namespace N +{ + $e$ +} +", provider => { + Assert.IsNotNull (provider.Find ("enum"), "'enum' not found."); + Assert.IsNotNull (provider.Find ("namespace"), "'namespace' not found."); + Assert.IsNotNull (provider.Find ("public"), "'public' not found."); + Assert.IsNull (provider.Find ("CharEnumerator"), "'CharEnumerator' found."); + Assert.IsNull (provider.Find ("Console"), "'Console' found."); + }); + } } } \ No newline at end of file