Browse Source

fixed some code completion bugs

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@6122 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
fa4738ee2a
  1. 22
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs
  2. 31
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs
  3. 4
      src/AddIns/BackendBindings/VBNetBinding/Test/CodeCompletionTests.cs
  4. 2
      src/Main/Base/Test/VBExpressionFinderTests.cs

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

@ -34,19 +34,17 @@ namespace ICSharpCode.VBNetBinding @@ -34,19 +34,17 @@ namespace ICSharpCode.VBNetBinding
List<ICompletionEntry> data = new List<ICompletionEntry>();
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;
}
}

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

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

4
src/AddIns/BackendBindings/VBNetBinding/Test/CodeCompletionTests.cs

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

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

@ -135,7 +135,7 @@ End Class @@ -135,7 +135,7 @@ End Class
}
[Test]
public void ContextAfterDimIdentifier()
public void ContextAfterDimIdentifierSpace()
{
ContextTest(program4, " a ", 3, ExpressionContext.MethodBody);
}

Loading…
Cancel
Save