diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs index 30ff62ef7c..39bde1dbc9 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs @@ -34,19 +34,17 @@ namespace ICSharpCode.VBNetBinding List data = new List(); if (expressionResult.Context != ExpressionContext.Global && expressionResult.Context != ExpressionContext.TypeDeclaration) { - if (string.IsNullOrEmpty(expressionResult.Expression) || IdentifierExpected(expressionResult.Tag)) { - data = new NRefactoryResolver(LanguageProperties.VBNet) - .CtrlSpace(editor.Caret.Line, editor.Caret.Column, info, editor.Document.Text, expressionResult.Context, ((NRefactoryCompletionItemList)result).ContainsItemsFromAllNamespaces); + if (expressionResult.Context == ExpressionContext.Importable && expressionResult.Expression.Equals("Imports", StringComparison.OrdinalIgnoreCase)) { + expressionResult.Expression = "Global"; + } + var rr = resolver.Resolve(expressionResult, info, editor.Document.Text); + + if (rr == null) { + if (IdentifierExpected(expressionResult.Tag)) + data = new NRefactoryResolver(LanguageProperties.VBNet) + .CtrlSpace(editor.Caret.Line, editor.Caret.Column, info, editor.Document.Text, expressionResult.Context, ((NRefactoryCompletionItemList)result).ContainsItemsFromAllNamespaces); } else { - if (expressionResult.Context == ExpressionContext.Importable && expressionResult.Expression.Equals("Imports", StringComparison.OrdinalIgnoreCase)) { - expressionResult.Expression = "Global"; - } - var rr = resolver.Resolve(expressionResult, info, editor.Document.Text); - - if (rr == null) - return result; - - data = rr.GetCompletionData(info.CompilationUnit.ProjectContent, ((NRefactoryCompletionItemList)result).ContainsItemsFromAllNamespaces); + data = rr.GetCompletionData(info.CompilationUnit.ProjectContent, ((NRefactoryCompletionItemList)result).ContainsItemsFromAllNamespaces) ?? data; } } diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs index 775d4306ee..1e395bb763 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs @@ -46,6 +46,10 @@ namespace ICSharpCode.VBNetBinding editor.Document.Remove(editor.SelectionStart, editor.SelectionLength); } + if (ch == ' ') { + + } + VBNetExpressionFinder ef = new VBNetExpressionFinder(ParserService.GetParseInformation(editor.FileName)); ExpressionResult result; @@ -65,13 +69,13 @@ namespace ICSharpCode.VBNetBinding editor.ShowCompletionWindow(CompletionDataHelper.GenerateCompletionData(result, editor, ch)); return CodeCompletionKeyPressResult.Completed; case ' ': + editor.Document.Insert(editor.Caret.Offset, " "); result = ef.FindExpression(editor.Document.Text, editor.Caret.Offset); - if (HasKeywordsOnly((BitArray)result.Tag) && ExpressionContext.IdentifierExpected != result.Context) { + if (!LiteralMayFollow((BitArray)result.Tag) && !OperatorMayFollow((BitArray)result.Tag) && ExpressionContext.IdentifierExpected != result.Context) { LoggingService.Debug("CC: After space, result=" + result + ", context=" + result.Context); editor.ShowCompletionWindow(CompletionDataHelper.GenerateCompletionData(result, editor, ch)); - return CodeCompletionKeyPressResult.Completed; } - break; + return CodeCompletionKeyPressResult.EatKey; default: if (CodeCompletionOptions.CompleteWhenTyping) { int cursor = editor.Caret.Offset; @@ -97,6 +101,27 @@ namespace ICSharpCode.VBNetBinding return CodeCompletionKeyPressResult.None; } + bool OperatorMayFollow(BitArray array) + { + if (array == null) + return false; + + return array[Tokens.Xor]; + } + + bool LiteralMayFollow(BitArray array) + { + if (array == null) + return false; + + for (int i = 0; i < array.Length; i++) { + if (array[i] && i >= Tokens.LiteralString && i <= Tokens.LiteralDate) + return true; + } + + return false; + } + bool HasKeywordsOnly(BitArray array) { if (array == null) diff --git a/src/AddIns/BackendBindings/VBNetBinding/Test/CodeCompletionTests.cs b/src/AddIns/BackendBindings/VBNetBinding/Test/CodeCompletionTests.cs index 394ae3b2a9..75e5ef568e 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Test/CodeCompletionTests.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Test/CodeCompletionTests.cs @@ -36,7 +36,7 @@ namespace ICSharpCode.VBNetBinding.Tests [Test] public void TestOptions() { - TestKeyPress("Option", "", ' ', CodeCompletionKeyPressResult.Completed, + TestKeyPress("Option", "", ' ', CodeCompletionKeyPressResult.EatKey, list => { Assert.IsTrue(list.Items.Any()); Assert.IsTrue(list.Items.All(item => item.Image == ClassBrowserIconService.Keyword)); @@ -49,7 +49,7 @@ namespace ICSharpCode.VBNetBinding.Tests [Test] public void TestOptionCompare() { - TestKeyPress("Option Compare", "", ' ', CodeCompletionKeyPressResult.Completed, + TestKeyPress("Option Compare", "", ' ', CodeCompletionKeyPressResult.EatKey, list => { Assert.IsTrue(list.Items.Any()); Assert.IsTrue(list.Items.All(item => item.Image == ClassBrowserIconService.Keyword)); diff --git a/src/Main/Base/Test/VBExpressionFinderTests.cs b/src/Main/Base/Test/VBExpressionFinderTests.cs index 823b4d3e51..2a4508570e 100644 --- a/src/Main/Base/Test/VBExpressionFinderTests.cs +++ b/src/Main/Base/Test/VBExpressionFinderTests.cs @@ -135,7 +135,7 @@ End Class } [Test] - public void ContextAfterDimIdentifier() + public void ContextAfterDimIdentifierSpace() { ContextTest(program4, " a ", 3, ExpressionContext.MethodBody); }