From c57c78e844862b6f2708511fea97a5a727127307 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Tue, 13 Jul 2010 15:26:20 +0000 Subject: [PATCH] - added New Keyword in Type context - disabled completion inside strings - fixed completion after "Dim x |" git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@6119 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/CompletionDataHelper.cs | 4 +- .../Project/Src/VBNetCompletionBinding.cs | 38 +++++++++++-------- src/Main/Base/Test/VBExpressionFinderTests.cs | 6 +++ .../Src/VBNet/VBNetExpressionFinder.cs | 5 ++- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs index 4be1415089..30ff62ef7c 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs @@ -41,7 +41,6 @@ namespace ICSharpCode.VBNetBinding 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) @@ -51,12 +50,11 @@ namespace ICSharpCode.VBNetBinding } } - bool addedKeywords = false; if (expressionResult.Tag != null && (expressionResult.Context != ExpressionContext.Importable) && pressedKey != '.') { AddVBNetKeywords(data, (BitArray)expressionResult.Tag); - if (((BitArray)expressionResult.Tag)[Tokens.New]) + if (!((BitArray)expressionResult.Tag)[Tokens.New] && expressionResult.Context == ExpressionContext.Type) data.Add(new KeywordEntry("New")); addedKeywords = true; } diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs index 34fd62d485..775d4306ee 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs @@ -33,7 +33,7 @@ namespace ICSharpCode.VBNetBinding public CodeCompletionKeyPressResult HandleKeyPress(ITextEditor editor, char ch) { - if (IsInComment(editor)) + if (IsInComment(editor) || IsInString(editor)) return CodeCompletionKeyPressResult.None; if (editor.SelectionLength > 0) { @@ -59,10 +59,6 @@ namespace ICSharpCode.VBNetBinding return CodeCompletionKeyPressResult.Completed; } break; - case '"': - case '\n': - case ')': - break; case '.': result = ef.FindExpression(editor.Document.Text, editor.Caret.Offset); LoggingService.Debug("CC: After dot, result=" + result + ", context=" + result.Context); @@ -70,7 +66,7 @@ namespace ICSharpCode.VBNetBinding return CodeCompletionKeyPressResult.Completed; case ' ': result = ef.FindExpression(editor.Document.Text, editor.Caret.Offset); - if (HasKeywordsOnly(result.Tag as BitArray) || result.Context == ExpressionContext.Importable || result.Context == ExpressionContext.Type || result.Context == ExpressionContext.ObjectCreation) { + if (HasKeywordsOnly((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; @@ -88,7 +84,7 @@ namespace ICSharpCode.VBNetBinding result = ef.FindExpression(editor.Document.Text, cursor); - if ((result.Context != ExpressionContext.IdentifierExpected) && + if ((result.Context != ExpressionContext.IdentifierExpected && char.IsLetter(ch)) && (!char.IsLetterOrDigit(prevChar) && prevChar != '.')) { LoggingService.Debug("CC: Beginning to type a word, result=" + result + ", context=" + result.Context); editor.ShowCompletionWindow(CompletionDataHelper.GenerateCompletionData(result, editor, ch)); @@ -114,13 +110,16 @@ namespace ICSharpCode.VBNetBinding return true; } - bool IsInComment(ITextEditor editor) + void GetCommentOrStringState(ITextEditor editor, out bool inString, out bool inComment) { ILexer lexer = ParserFactory.CreateLexer(SupportedLanguage.VBNet, editor.Document.CreateReader()); Token t = lexer.NextToken(); bool inXml = false; + inString = false; + inComment = false; + while (t.Location < editor.Caret.Position) { t = lexer.NextToken(); @@ -134,14 +133,11 @@ namespace ICSharpCode.VBNetBinding } if (inXml) { - return true; + // TODO } else { string lineText = editor.Document.GetLine(editor.Caret.Line).Text; - bool inString = false; - bool inComment = false; - - for (int i = 0; i < lineText.Length; i++) { + for (int i = 0; i < editor.Caret.Column - 1; i++) { char ch = lineText[i]; if (!inComment && ch == '"') @@ -149,11 +145,23 @@ namespace ICSharpCode.VBNetBinding if (!inString && ch == '\'') inComment = true; } - - return inComment; } } + bool IsInString(ITextEditor editor) + { + bool inString, inComment; + GetCommentOrStringState(editor, out inString, out inComment); + return inString; + } + + bool IsInComment(ITextEditor editor) + { + bool inString, inComment; + GetCommentOrStringState(editor, out inString, out inComment); + return inComment; + } + public bool CtrlSpace(ITextEditor editor) { if (IsInComment(editor)) diff --git a/src/Main/Base/Test/VBExpressionFinderTests.cs b/src/Main/Base/Test/VBExpressionFinderTests.cs index 82aa8835bf..823b4d3e51 100644 --- a/src/Main/Base/Test/VBExpressionFinderTests.cs +++ b/src/Main/Base/Test/VBExpressionFinderTests.cs @@ -139,6 +139,12 @@ End Class { ContextTest(program4, " a ", 3, ExpressionContext.MethodBody); } + + [Test] + public void ContextAfterDim() + { + ContextTest(program4, "Dim ", "Dim".Length, ExpressionContext.IdentifierExpected); + } #endregion #region FindFull diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetExpressionFinder.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetExpressionFinder.cs index 3eb5781bb2..ceeab83e02 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetExpressionFinder.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetExpressionFinder.cs @@ -77,6 +77,9 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet p.Advance(); } + if (p.IsIdentifierExpected) + context = ExpressionContext.IdentifierExpected; + BitArray expectedSet; try { @@ -86,7 +89,7 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet } if (p.NextTokenIsPotentialStartOfExpression) - return new ExpressionResult("", DomRegion.Empty, GetContext(block), expectedSet); + return new ExpressionResult("", DomRegion.Empty, context, expectedSet); int lastExpressionStartOffset = LocationToOffset(block.lastExpressionStart);