Browse Source

- 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
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
c57c78e844
  1. 4
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs
  2. 38
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs
  3. 6
      src/Main/Base/Test/VBExpressionFinderTests.cs
  4. 5
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetExpressionFinder.cs

4
src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs

@ -41,7 +41,6 @@ namespace ICSharpCode.VBNetBinding @@ -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 @@ -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;
}

38
src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs

@ -33,7 +33,7 @@ namespace ICSharpCode.VBNetBinding @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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))

6
src/Main/Base/Test/VBExpressionFinderTests.cs

@ -139,6 +139,12 @@ End Class @@ -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

5
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetExpressionFinder.cs

@ -77,6 +77,9 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet @@ -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 @@ -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);

Loading…
Cancel
Save