提交 6f2c4949 编写于 作者: C CyrusNajmabadi

Fixup completion tests to properly call through the CompletionService.

上级 ae8af158
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
......@@ -10,7 +9,6 @@
using Microsoft.CodeAnalysis.CSharp.Completion;
using Microsoft.CodeAnalysis.Editor.UnitTests.Completion;
using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Text;
using Xunit;
......@@ -23,7 +21,7 @@ protected AbstractCSharpCompletionProviderTests(CSharpTestWorkspaceFixture works
}
internal override CompletionServiceWithProviders CreateCompletionService(
TestWorkspace workspace, ImmutableArray<CompletionProvider> exclusiveProviders)
Workspace workspace, ImmutableArray<CompletionProvider> exclusiveProviders)
{
return new CSharpCompletionService(workspace, exclusiveProviders);
}
......@@ -146,15 +144,14 @@ protected async Task VerifySendEnterThroughToEnterAsync(string initialMarkup, st
var document = workspace.CurrentSolution.GetDocument(documentId);
var position = hostDocument.CursorPosition.Value;
var service = await GetCompletionServiceAsync();
workspace.Options = workspace.Options.WithChangedOption(
CSharpCompletionOptions.AddNewLineOnEnterAfterFullyTypedWord, sendThroughEnterEnabled);
var service = GetCompletionService(workspace);
var completionList = await GetCompletionListAsync(service, document, position, CompletionTrigger.Default);
var item = completionList.Items.First(i => i.DisplayText.StartsWith(textTypedSoFar));
var optionService = workspace.Services.GetService<IOptionService>();
var options = optionService.GetOptions().WithChangedOption(CSharpCompletionOptions.AddNewLineOnEnterAfterFullyTypedWord, sendThroughEnterEnabled);
optionService.SetOptions(options);
var completionRules = CompletionHelper.GetHelper(document);
var completionRules = CompletionHelper.GetHelper(document, service);
Assert.Equal(expected, completionRules.SendEnterThroughToEditor(item, textTypedSoFar, workspace.Options));
}
}
......@@ -175,7 +172,7 @@ private async Task VerifyTextualTriggerCharacterWorkerAsync(string markup, bool
var options = workspace.Options.WithChangedOption(CompletionOptions.TriggerOnTypingLetters, LanguageNames.CSharp, triggerOnLetter);
var trigger = CompletionTrigger.CreateInsertionTrigger(text[position]);
var service = await GetCompletionServiceAsync();
var service = GetCompletionService(workspace);
var isTextualTriggerCharacterResult = service.ShouldTriggerCompletion(text, position + 1, trigger, options: options);
if (expectedTriggerCharacter)
......@@ -215,11 +212,11 @@ protected async Task VerifyCommitCharactersAsync(string initialMarkup, string te
var document = workspace.CurrentSolution.GetDocument(documentId);
var position = hostDocument.CursorPosition.Value;
var service = await GetCompletionServiceAsync();
var service = GetCompletionService(workspace);
var completionList = await GetCompletionListAsync(service, document, position, CompletionTrigger.Default);
var item = completionList.Items.First(i => i.DisplayText.StartsWith(textTypedSoFar));
var completionRules = CompletionHelper.GetHelper(document);
var completionRules = CompletionHelper.GetHelper(document, service);
foreach (var ch in validChars)
{
......
......@@ -434,7 +434,7 @@ class C
var provider = new CrefCompletionProvider();
var hostDocument = workspace.DocumentWithCursor;
var document = workspace.CurrentSolution.GetDocument(hostDocument.Id);
var service = await GetCompletionServiceAsync();
var service = GetCompletionService(workspace);
var completionList = await GetCompletionListAsync(service, document, hostDocument.CursorPosition.Value, CompletionTrigger.Default);
}
}
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Completion;
using Microsoft.CodeAnalysis.CSharp.Completion;
using Microsoft.CodeAnalysis.CSharp.Completion.Providers;
using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
using Roslyn.Test.Utilities;
......@@ -20,11 +16,6 @@ public ObjectInitializerCompletionProviderTests(CSharpTestWorkspaceFixture works
{
}
internal override CompletionServiceWithProviders CreateCompletionService(TestWorkspace workspace, ImmutableArray<CompletionProvider> exclusiveProviders)
{
return new CSharpCompletionService(workspace, exclusiveProviders);
}
internal override CompletionProvider CreateCompletionProvider()
{
return new ObjectInitializerCompletionProvider();
......@@ -584,11 +575,11 @@ void foo()
var document = workspace.CurrentSolution.GetDocument(hostDocument.Id);
var triggerInfo = CompletionTrigger.CreateInsertionTrigger('a');
var service = await GetCompletionServiceAsync();
var service = GetCompletionService(workspace);
var completionList = await GetCompletionListAsync(service, document, position, triggerInfo);
var item = completionList.Items.First();
var completionRules = CompletionHelper.GetHelper(document);
var completionRules = CompletionHelper.GetHelper(document, service);
Assert.False(completionRules.SendEnterThroughToEditor(item, string.Empty, workspace.Options), "Expected false from SendEnterThroughToEditor()");
}
......@@ -786,7 +777,7 @@ private async Task VerifyExclusiveAsync(string markup, bool exclusive)
var document = workspace.CurrentSolution.GetDocument(hostDocument.Id);
var triggerInfo = CompletionTrigger.CreateInsertionTrigger('a');
var service = await GetCompletionServiceAsync();
var service = GetCompletionService(workspace);
var completionList = await GetCompletionListAsync(service, document, position, triggerInfo);
if (completionList != null)
......
......@@ -2126,7 +2126,7 @@ public override void set_Bar(int bay, int value)
var document = solution.GetDocument(documentId);
var triggerInfo = CompletionTrigger.Default;
var service = await GetCompletionServiceAsync();
var service = GetCompletionService(testWorkspace);
var completionList = await GetCompletionListAsync(service, document, position, triggerInfo);
var completionItem = completionList.Items.First(i => CompareItems(i.DisplayText, "Bar[int bay]"));
......@@ -2386,7 +2386,7 @@ public override bool Equals(object obj)
var document = solution.GetDocument(documentId);
var triggerInfo = CompletionTrigger.Default;
var service = await GetCompletionServiceAsync();
var service = GetCompletionService(testWorkspace);
var completionList = await GetCompletionListAsync(service, document, position, triggerInfo);
var completionItem = completionList.Items.First(i => CompareItems(i.DisplayText, "Equals(object obj)"));
......@@ -2445,7 +2445,7 @@ public override bool Equals(object obj)
var document = solution.GetDocument(documentId);
var triggerInfo = CompletionTrigger.Default;
var service = await GetCompletionServiceAsync();
var service = GetCompletionService(testWorkspace);
var completionList = await GetCompletionListAsync(service, document, cursorPosition, triggerInfo);
var completionItem = completionList.Items.First(i => CompareItems(i.DisplayText, "Equals(object obj)"));
......@@ -2544,22 +2544,24 @@ static void Main(string[] args)
override $$
}
}";
var workspace = await TestWorkspace.CreateAsync(LanguageNames.CSharp, new CSharpCompilationOptions(OutputKind.ConsoleApplication), new CSharpParseOptions(), text);
var provider = new OverrideCompletionProvider();
var testDocument = workspace.Documents.Single();
var document = workspace.CurrentSolution.GetDocument(testDocument.Id);
using (var workspace = await TestWorkspace.CreateAsync(LanguageNames.CSharp, new CSharpCompilationOptions(OutputKind.ConsoleApplication), new CSharpParseOptions(), text))
{
var provider = new OverrideCompletionProvider();
var testDocument = workspace.Documents.Single();
var document = workspace.CurrentSolution.GetDocument(testDocument.Id);
var service = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(service, document, testDocument.CursorPosition.Value, CompletionTrigger.Default);
var service = GetCompletionService(workspace);
var completionList = await GetCompletionListAsync(service, document, testDocument.CursorPosition.Value, CompletionTrigger.Default);
var oldTree = await document.GetSyntaxTreeAsync();
var oldTree = await document.GetSyntaxTreeAsync();
var commit = await provider.GetChangeAsync(document, completionList.Items.First(i => i.DisplayText == "ToString()"), ' ');
var changes = commit.TextChanges;
var commit = await provider.GetChangeAsync(document, completionList.Items.First(i => i.DisplayText == "ToString()"), ' ');
var changes = commit.TextChanges;
// If we left the trailing trivia of the close curly of Main alone,
// there should only be one change: the replacement of "override " with a method.
Assert.Equal(changes.Single().Span, TextSpan.FromBounds(136, 145));
// If we left the trailing trivia of the close curly of Main alone,
// there should only be one change: the replacement of "override " with a method.
Assert.Equal(changes.Single().Span, TextSpan.FromBounds(136, 145));
}
}
}
}
\ No newline at end of file
......@@ -580,8 +580,10 @@ private async Task VerifyWorkerAsync(string markup, bool isBuilder)
private async Task CheckResultsAsync(Document document, int position, bool isBuilder)
{
var triggerInfo = CompletionTrigger.CreateInsertionTrigger('a');
var service = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(service, document, position, triggerInfo);
var service = GetCompletionService(document.Project.Solution.Workspace);
var completionList = await service.GetContextAsync(
service.ExclusiveProviders?[0], document, position, triggerInfo,
options: null, cancellationToken: CancellationToken.None);
if (isBuilder)
{
......
......@@ -29,7 +29,8 @@ protected CompletionHelper(CompletionService completionService)
_rules = CompletionService.GetRules();
}
public static CompletionHelper GetHelper(Workspace workspace, string language)
public static CompletionHelper GetHelper(
Workspace workspace, string language, CompletionService completionService)
{
var ls = workspace.Services.GetLanguageServices(language);
if (ls != null)
......@@ -37,10 +38,9 @@ public static CompletionHelper GetHelper(Workspace workspace, string language)
var factory = ls.GetService<CompletionHelperFactory>();
if (factory != null)
{
return factory.CreateCompletionHelper();
return factory.CreateCompletionHelper(completionService);
}
var completionService = ls.GetService<CompletionService>();
if (completionService != null)
{
return new CompletionHelper(completionService);
......@@ -50,9 +50,9 @@ public static CompletionHelper GetHelper(Workspace workspace, string language)
return null;
}
public static CompletionHelper GetHelper(Document document)
public static CompletionHelper GetHelper(Document document, CompletionService service)
{
return GetHelper(document.Project.Solution.Workspace, document.Project.Language);
return GetHelper(document.Project.Solution.Workspace, document.Project.Language, service);
}
public IReadOnlyList<TextSpan> GetHighlightedSpans(CompletionItem completionItem, string filterText)
......@@ -446,9 +446,10 @@ protected bool IsObjectCreationItem(CompletionItem item)
return item.Tags.Contains(CompletionTags.ObjectCreation);
}
public static async Task<TextChange> GetTextChangeAsync(Document document, CompletionItem item, char? commitKey = null, CancellationToken cancellationToken = default(CancellationToken))
public static async Task<TextChange> GetTextChangeAsync(
CompletionService service, Document document, CompletionItem item,
char? commitKey = null, CancellationToken cancellationToken = default(CancellationToken))
{
var service = CompletionService.GetService(document);
var change = await service.GetChangeAsync(document, item, commitKey, cancellationToken).ConfigureAwait(false);
// normally the items that produce multiple changes are not expecting to trigger the behaviors that rely on looking at the text
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.CodeAnalysis.Completion;
using Microsoft.CodeAnalysis.Host;
namespace Microsoft.CodeAnalysis.Editor
{
internal abstract class CompletionHelperFactory : ILanguageService
{
public abstract CompletionHelper CreateCompletionHelper();
public abstract CompletionHelper CreateCompletionHelper(CompletionService completionService);
}
}
\ No newline at end of file
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Threading;
using Microsoft.CodeAnalysis.Editor.Commands;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.Completion
{
......
......@@ -13,6 +13,7 @@
using Microsoft.VisualStudio.Text;
using Roslyn.Utilities;
using System.Threading;
using Microsoft.CodeAnalysis.Shared.Extensions;
namespace Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.Completion
{
......@@ -273,7 +274,8 @@ private CompletionHelper GetCompletionHelper()
var document = this.SubjectBuffer.CurrentSnapshot.GetOpenDocumentInCurrentContextWithChanges();
if (document != null)
{
return CompletionHelper.GetHelper(document);
return CompletionHelper.GetHelper(
document, document.GetLanguageService<CompletionService>());
}
return null;
......
......@@ -36,7 +36,7 @@ public override async Task<CompletionDescription> GetDescriptionAsync(Document d
var description = await this.CompletionService.GetDescriptionAsync(document, this.Item, cancellationToken).ConfigureAwait(false);
var parts = description.TaggedParts;
var change = await CompletionHelper.GetTextChangeAsync(document, this.Item, '\t').ConfigureAwait(false);
var change = await CompletionHelper.GetTextChangeAsync(this.CompletionService, document, this.Item, '\t').ConfigureAwait(false);
var insertionText = change.NewText;
var note = string.Empty;
......
......@@ -12,7 +12,6 @@
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using VSCompletion = Microsoft.VisualStudio.Language.Intellisense.Completion;
using Microsoft.CodeAnalysis.Snippets;
namespace Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.Completion.Presentation
{
......@@ -205,7 +204,8 @@ private CompletionHelper GetCompletionHelper()
var document = _subjectBuffer.CurrentSnapshot.GetOpenDocumentInCurrentContextWithChanges();
if (document != null)
{
_completionHelper = CompletionHelper.GetHelper(document);
_completionHelper = CompletionHelper.GetHelper(document,
document.Project.LanguageServices.GetService<CompletionService>());
}
}
......
......@@ -51,18 +51,17 @@ protected static async Task<bool> CanUseSpeculativeSemanticModelAsync(Document d
return !service.GetMemberBodySpanForSpeculativeBinding(node).IsEmpty;
}
internal async Task<CompletionServiceWithProviders> GetCompletionServiceAsync()
internal CompletionServiceWithProviders GetCompletionService(Workspace workspace)
{
var workspace = await this.WorkspaceFixture.GetWorkspaceAsync();
return CreateCompletionService(workspace, ImmutableArray.Create(CreateCompletionProvider()));
}
internal abstract CompletionServiceWithProviders CreateCompletionService(
TestWorkspace workspace, ImmutableArray<CompletionProvider> exclusiveProviders);
Workspace workspace, ImmutableArray<CompletionProvider> exclusiveProviders);
internal static CompletionHelper GetCompletionHelper(Document document)
internal static CompletionHelper GetCompletionHelper(Document document, CompletionService service)
{
return CompletionHelper.GetHelper(document);
return CompletionHelper.GetHelper(document, service);
}
internal static async Task<CompletionContext> GetCompletionListContextAsync(
......@@ -100,7 +99,7 @@ internal static CompletionHelper GetCompletionHelper(Document document)
trigger = CompletionTrigger.CreateInsertionTrigger(insertedCharacter: code.ElementAt(position - 1));
}
var completionService = await GetCompletionServiceAsync();
var completionService = GetCompletionService(document.Project.Solution.Workspace);
var completionList = await GetCompletionListAsync(completionService, document, position, trigger);
var items = completionList == null ? default(ImmutableArray<CompletionItem>) : completionList.Items;
......@@ -302,16 +301,17 @@ protected virtual async Task VerifyCustomCommitProviderWorkerAsync(string codeBe
private async Task VerifyCustomCommitProviderCheckResultsAsync(Document document, string codeBeforeCommit, int position, string itemToCommit, string expectedCodeAfterCommit, char? commitChar)
{
var textBuffer = (await WorkspaceFixture.GetWorkspaceAsync()).Documents.Single().TextBuffer;
var workspace = await WorkspaceFixture.GetWorkspaceAsync();
var textBuffer = workspace.Documents.Single().TextBuffer;
var service = await GetCompletionServiceAsync();
var service = GetCompletionService(workspace);
var items = (await GetCompletionListAsync(service, document, position, CompletionTrigger.Default)).Items;
var firstItem = items.First(i => CompareItems(i.DisplayText, itemToCommit));
var customCommitCompletionProvider = service.ExclusiveProviders?[0] as ICustomCommitCompletionProvider;
if (customCommitCompletionProvider != null)
{
var completionRules = GetCompletionHelper(document);
var completionRules = GetCompletionHelper(document, service);
var textView = (await WorkspaceFixture.GetWorkspaceAsync()).Documents.Single().GetTextView();
VerifyCustomCommitWorker(customCommitCompletionProvider, firstItem, completionRules, textView, textBuffer, codeBeforeCommit, expectedCodeAfterCommit, commitChar);
}
......@@ -333,7 +333,7 @@ private async Task VerifyCustomCommitProviderCheckResultsAsync(Document document
string actualExpectedCode = null;
MarkupTestFile.GetPosition(expectedCodeAfterCommit, out actualExpectedCode, out expectedCaretPosition);
CompletionHelper completionRules = GetCompletionHelper(document);
CompletionHelper completionRules = GetCompletionHelper(document, service);
if (commitChar.HasValue && !completionRules.IsCommitCharacter(completionItem, commitChar.Value, string.Empty))
{
......@@ -409,21 +409,22 @@ private async Task VerifyCustomCommitProviderCheckResultsAsync(Document document
private async Task VerifyProviderCommitCheckResultsAsync(Document document, int position, string itemToCommit, string expectedCodeAfterCommit, char? commitCharOpt, string textTypedSoFar)
{
var textBuffer = (await WorkspaceFixture.GetWorkspaceAsync()).Documents.Single().TextBuffer;
var workspace = await WorkspaceFixture.GetWorkspaceAsync();
var textBuffer = workspace.Documents.Single().TextBuffer;
var textSnapshot = textBuffer.CurrentSnapshot.AsText();
var service = await GetCompletionServiceAsync();
var service = GetCompletionService(workspace);
var items = (await GetCompletionListAsync(service, document, position, CompletionTrigger.Default)).Items;
var firstItem = items.First(i => CompareItems(i.DisplayText, itemToCommit));
var completionRules = GetCompletionHelper(document);
var completionRules = GetCompletionHelper(document, service);
var commitChar = commitCharOpt ?? '\t';
var text = await document.GetTextAsync();
if (commitChar == '\t' || completionRules.IsCommitCharacter(firstItem, commitChar, textTypedSoFar))
{
var textChange = CompletionHelper.GetTextChangeAsync(document, firstItem, commitChar).Result;
var textChange = CompletionHelper.GetTextChangeAsync(service, document, firstItem, commitChar).Result;
// Adjust TextChange to include commit character, so long as it isn't TAB.
if (commitChar != '\t')
......@@ -550,7 +551,7 @@ private Task VerifyItemInSameProjectAsync(string markup, string referencedCode,
var triggerInfo = CompletionTrigger.Default;
var completionService = await GetCompletionServiceAsync();
var completionService = GetCompletionService(testWorkspace);
var completionList = await GetCompletionListAsync(completionService, document, position, triggerInfo);
if (expectedSymbols >= 1)
......@@ -605,7 +606,7 @@ protected Task VerifyItemWithMscorlib45Async(string markup, string expectedItem,
var document = solution.GetDocument(documentId);
var triggerInfo = CompletionTrigger.Default;
var completionService = await GetCompletionServiceAsync();
var completionService = GetCompletionService(testWorkspace);
var completionList = await GetCompletionListAsync(completionService, document, position, triggerInfo);
var item = completionList.Items.FirstOrDefault(i => i.DisplayText == expectedItem);
......@@ -637,7 +638,7 @@ protected async Task VerifyItemInLinkedFilesAsync(string xmlString, string expec
var document = solution.GetDocument(currentContextDocumentId);
var triggerInfo = CompletionTrigger.Default;
var completionService = await GetCompletionServiceAsync();
var completionService = GetCompletionService(testWorkspace);
var completionList = await GetCompletionListAsync(completionService, document, position, triggerInfo);
var item = completionList.Items.Single(c => c.DisplayText == expectedItem);
......
......@@ -47,7 +47,9 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense
Private Sub TestMatches(v As String, wordsToMatch() As String)
Using New CultureContext("tr-TR")
Dim helper = CompletionHelper.GetHelper(New TestWorkspace, LanguageNames.CSharp)
Dim workspace = New TestWorkspace
Dim helper = CompletionHelper.GetHelper(workspace, LanguageNames.CSharp,
workspace.Services.GetLanguageServices(LanguageNames.CSharp).GetService(Of CompletionService))
For Each word In wordsToMatch
Dim item = CompletionItem.Create(word)
Assert.True(helper.MatchesFilterText(item, v, CompletionTrigger.Default, CompletionFilterReason.TypeChar), $"Expected item {word} does not match {v}")
......@@ -57,7 +59,9 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense
Private Sub TestNotMatches(v As String, wordsToNotMatch() As String)
Using New CultureContext("tr-TR")
Dim helper = CompletionHelper.GetHelper(New TestWorkspace, LanguageNames.CSharp)
Dim workspace = New TestWorkspace
Dim helper = CompletionHelper.GetHelper(workspace, LanguageNames.CSharp,
workspace.Services.GetLanguageServices(LanguageNames.CSharp).GetService(Of CompletionService))
For Each word In wordsToNotMatch
Dim item = CompletionItem.Create(word)
Assert.False(helper.MatchesFilterText(item, v, CompletionTrigger.Default, CompletionFilterReason.TypeChar), $"Unexpected item {word} matches {v}")
......
......@@ -13,21 +13,17 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.Completion
Implements ILanguageServiceFactory
Public Function CreateLanguageService(languageServices As HostLanguageServices) As ILanguageService Implements ILanguageServiceFactory.CreateLanguageService
Dim completionService = languageServices.GetService(Of CompletionService)
Return New VisualBasicCompletionHelperFactory(completionService)
Return New VisualBasicCompletionHelperFactory()
End Function
Private Class VisualBasicCompletionHelperFactory
Inherits CompletionHelperFactory
Private _completionService As CompletionService
Public Sub New(completionService As CompletionService)
_completionService = completionService
Public Sub New()
End Sub
Public Overrides Function CreateCompletionHelper() As CompletionHelper
Return New VisualBasicCompletionHelper(_completionService)
Public Overrides Function CreateCompletionHelper(service As CompletionService) As CompletionHelper
Return New VisualBasicCompletionHelper(service)
End Function
End Class
End Class
......
......@@ -16,7 +16,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.Complet
MyBase.New(workspaceFixture)
End Sub
Friend Overrides Function CreateCompletionService(workspace As TestWorkspace, exclusiveProviders As ImmutableArray(Of CompletionProvider)) As CompletionServiceWithProviders
Friend Overrides Function CreateCompletionService(workspace As Workspace, exclusiveProviders As ImmutableArray(Of CompletionProvider)) As CompletionServiceWithProviders
Return New VisualBasicCompletionService(workspace, exclusiveProviders)
End Function
......@@ -79,7 +79,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.Complet
Await MyBase.VerifyWorkerAsync(code, position, expectedItemOrNull, expectedDescriptionOrNull, sourceCodeKind, usePreviousCharAsTrigger, checkForAbsence, experimental:=experimental, glyph:=glyph)
End Function
Private Function VerifyAtEndOfFileAsync(code As String, position As Integer, expectedItemOrNull As String, expectedDescriptionOrNull As String, sourceCodeKind As SourceCodeKind, usePreviousCharAsTrigger As Boolean, checkForAbsence As Boolean, glyph As Integer?, experimental As Boolean) As Threading.Tasks.Task
Protected Function VerifyAtEndOfFileAsync(code As String, position As Integer, expectedItemOrNull As String, expectedDescriptionOrNull As String, sourceCodeKind As SourceCodeKind, usePreviousCharAsTrigger As Boolean, checkForAbsence As Boolean, glyph As Integer?, experimental As Boolean) As Threading.Tasks.Task
Return VerifyAtEndOfFileAsync(code, position, String.Empty, expectedItemOrNull, expectedDescriptionOrNull, sourceCodeKind, usePreviousCharAsTrigger, checkForAbsence, glyph, experimental)
End Function
......@@ -117,11 +117,11 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.Complet
Dim document = workspace.CurrentSolution.GetDocument(documentId)
Dim position = hostDocument.CursorPosition.Value
Dim service = Await GetCompletionServiceAsync()
Dim service = GetCompletionService(workspace)
Dim completionList = Await GetCompletionListAsync(service, document, position, CompletionTrigger.Default)
Dim item = completionList.Items.First(Function(i) i.DisplayText.StartsWith(textTypedSoFar))
Dim helper = CompletionHelper.GetHelper(document)
Dim helper = CompletionHelper.GetHelper(document, service)
Assert.Equal(expected, helper.SendEnterThroughToEditor(item, textTypedSoFar, workspace.Options))
End Using
End Function
......@@ -138,11 +138,11 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.Complet
Dim document = workspace.CurrentSolution.GetDocument(documentId)
Dim position = hostDocument.CursorPosition.Value
Dim service = Await GetCompletionServiceAsync()
Dim service = GetCompletionService(workspace)
Dim completionList = Await GetCompletionListAsync(service, document, position, CompletionTrigger.Default)
Dim item = completionList.Items.First()
Dim helper = CompletionHelper.GetHelper(document)
Dim helper = CompletionHelper.GetHelper(document, service)
For Each ch In chars
Assert.True(helper.IsCommitCharacter(item, ch, textTypedSoFar), $"Expected '{ch}' to be a commit character")
......@@ -206,7 +206,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.Complet
Dim options = workspace.Options.WithChangedOption(CompletionOptions.TriggerOnTypingLetters, LanguageNames.VisualBasic, triggerOnLetter)
Dim trigger = CompletionTrigger.CreateInsertionTrigger(text(position))
Dim completionService = Await GetCompletionServiceAsync()
Dim completionService = GetCompletionService(workspace)
Dim isTextualTriggerCharacterResult = completionService.ShouldTriggerCompletion(
text, position + 1, trigger, options:=options)
......
......@@ -431,7 +431,7 @@ End Class]]></a>.Value.NormalizeLineEndings()
Dim hostDocument = workspace.DocumentWithCursor
Dim document = workspace.CurrentSolution.GetDocument(hostDocument.Id)
Dim service = Await GetCompletionServiceAsync()
Dim service = GetCompletionService(workspace)
Dim completionList = Await GetCompletionListAsync(service, document, hostDocument.CursorPosition.Value, CompletionTrigger.Default)
End Using
End Function
......
......@@ -643,7 +643,7 @@ End Interface
Using workspace = Await TestWorkspace.CreateAsync(element)
Dim position = workspace.Documents.Single().CursorPosition.Value
Dim document = workspace.CurrentSolution.GetDocument(workspace.Documents.Single().Id)
Dim service = Await GetCompletionServiceAsync()
Dim service = GetCompletionService(workspace)
Dim completionList = Await GetCompletionListAsync(service, document, position, CompletionTrigger.Default)
AssertEx.Any(completionList.Items, Function(c) c.DisplayText = "Workcover")
End Using
......
......@@ -406,7 +406,7 @@ End Program</Document>
Dim hostDocument = workspace.Documents.First()
Dim caretPosition = hostDocument.CursorPosition.Value
Dim document = workspace.CurrentSolution.GetDocument(hostDocument.Id)
Dim service = Await GetCompletionServiceAsync()
Dim service = GetCompletionService(workspace)
Dim completionList = Await GetCompletionListAsync(service, document, caretPosition, CompletionTrigger.Default)
Assert.True(completionList Is Nothing OrElse completionList.IsExclusive, "Expected always exclusive")
End Using
......
......@@ -1746,7 +1746,7 @@ public class C
Dim caretPosition = hostDocument.CursorPosition.Value
Dim document = workspace.CurrentSolution.GetDocument(hostDocument.Id)
Dim service = Await GetCompletionServiceAsync()
Dim service = GetCompletionService(workspace)
Dim completionList = Await GetCompletionListAsync(service, document, caretPosition, CompletionTrigger.Default)
Assert.False(completionList.Items.Any(Function(c) c.DisplayText = "e"))
End Using
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.Threading
Imports System.Threading.Tasks
Imports System.Xml.Linq
Imports Microsoft.CodeAnalysis.Completion
......@@ -328,21 +329,21 @@ End Class
Await CheckResultsAsync(document2, position, isBuilder, triggerInfo, options)
End If
End Using
End Function
Private Async Function CheckResultsAsync(document As Document, position As Integer, isBuilder As Boolean, triggerInfo As CompletionTrigger?, options As OptionSet) As Task
triggerInfo = If(triggerInfo, CompletionTrigger.CreateInsertionTrigger("a"c))
Dim service = Await GetCompletionServiceAsync()
Dim completionList = Await GetCompletionListAsync(service, document, position, triggerInfo.Value, options)
Dim service = GetCompletionService(document.Project.Solution.Workspace)
Dim context = Await service.GetContextAsync(
service.ExclusiveProviders?(0), document, position, triggerInfo.Value, options, CancellationToken.None)
If isBuilder Then
Assert.NotNull(completionList)
Assert.NotNull(completionList.SuggestionModeItem)
Assert.NotNull(context)
Assert.NotNull(context.SuggestionModeItem)
Else
If completionList IsNot Nothing Then
Assert.True(completionList.SuggestionModeItem Is Nothing, "group.Builder = " & If(completionList.SuggestionModeItem IsNot Nothing, completionList.SuggestionModeItem.DisplayText, "null"))
If context IsNot Nothing Then
Assert.True(context.SuggestionModeItem Is Nothing, "group.Builder = " & If(context.SuggestionModeItem IsNot Nothing, context.SuggestionModeItem.DisplayText, "null"))
End If
End If
End Function
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Completion
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces
Imports Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.CompletionProviders
......@@ -17,6 +18,11 @@ Namespace Tests
Return New XmlDocCommentCompletionProvider()
End Function
Protected Overrides Async Function VerifyWorkerAsync(code As String, position As Integer, expectedItemOrNull As String, expectedDescriptionOrNull As String, sourceCodeKind As SourceCodeKind, usePreviousCharAsTrigger As Boolean, checkForAbsence As Boolean, experimental As Boolean, glyph As Integer?) As Task
Await VerifyAtPositionAsync(code, position, expectedItemOrNull, expectedDescriptionOrNull, sourceCodeKind, usePreviousCharAsTrigger, checkForAbsence, glyph, experimental)
Await VerifyAtEndOfFileAsync(code, position, expectedItemOrNull, expectedDescriptionOrNull, sourceCodeKind, usePreviousCharAsTrigger, checkForAbsence, glyph, experimental)
End Function
Private Async Function VerifyItemsExistAsync(markup As String, ParamArray items() As String) As Task
For Each item In items
Await VerifyItemExistsAsync(markup, item)
......@@ -340,7 +346,9 @@ Class C
End Class
"
Await VerifyItemExistsAsync(text, "foo", usePreviousCharAsTrigger:=True)
Await VerifyItemExistsAsync(
text, "foo",
usePreviousCharAsTrigger:=True)
End Function
<WorkItem(638805, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/638805")>
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
......
......@@ -205,7 +205,9 @@ internal protected CompletionProvider GetProvider(CompletionItem item)
var completionLists = new List<CompletionContext>();
foreach (var provider in triggeredProviders)
{
var completionList = await GetProviderCompletionsAsync(provider, document, caretPosition, defaultItemSpan, trigger, options, cancellationToken).ConfigureAwait(false);
var completionList = await GetContextAsync(
provider, document, caretPosition, trigger,
options, defaultItemSpan, cancellationToken).ConfigureAwait(false);
if (completionList != null)
{
completionLists.Add(completionList);
......@@ -240,7 +242,7 @@ internal protected CompletionProvider GetProvider(CompletionItem item)
var nonUsedNonExclusiveLists = new List<CompletionContext>();
foreach (var provider in nonUsedProviders)
{
var completionList = await GetProviderCompletionsAsync(provider, document, caretPosition, defaultItemSpan, trigger, options, cancellationToken).ConfigureAwait(false);
var completionList = await GetContextAsync(provider, document, caretPosition, trigger, options, defaultItemSpan, cancellationToken).ConfigureAwait(false);
if (completionList != null && !completionList.IsExclusive)
{
nonUsedNonExclusiveLists.Add(completionList);
......@@ -290,7 +292,8 @@ internal protected CompletionProvider GetProvider(CompletionItem item)
totalItems.Sort();
return CompletionList.Create(
contextSpan, totalItems.ToImmutableArray(), this.GetRules(), suggestionModeItem);
contextSpan, totalItems.ToImmutableArray(), this.GetRules(), suggestionModeItem,
isExclusive);
}
private void AddToDisplayMap(
......@@ -350,16 +353,38 @@ protected virtual CompletionItem GetBetterItem(CompletionItem item, CompletionIt
return result;
}
private static async Task<CompletionContext> GetProviderCompletionsAsync(
// Internal for testing purposes only.
internal async Task<CompletionContext> GetContextAsync(
CompletionProvider provider,
Document document,
int position,
TextSpan defaultFilterSpan,
CompletionTrigger triggerInfo,
OptionSet options,
CancellationToken cancellationToken)
{
var context = new CompletionContext(provider, document, position, defaultFilterSpan, triggerInfo, options, cancellationToken);
return await GetContextAsync(
provider, document, position, triggerInfo,
options, defaultSpan: null, cancellationToken: cancellationToken).ConfigureAwait(false);
}
private async Task<CompletionContext> GetContextAsync(
CompletionProvider provider,
Document document,
int position,
CompletionTrigger triggerInfo,
OptionSet options,
TextSpan? defaultSpan,
CancellationToken cancellationToken)
{
options = options ?? document.Project.Solution.Workspace.Options;
if (defaultSpan == null)
{
var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
defaultSpan = this.GetDefaultItemSpan(text, position);
}
var context = new CompletionContext(provider, document, position, defaultSpan.Value, triggerInfo, options, cancellationToken);
await provider.ProvideCompletionsAsync(context).ConfigureAwait(false);
return context;
}
......
......@@ -40,7 +40,8 @@ private static ICurrentWorkingDirectoryDiscoveryService GetFileSystemDiscoverySe
private static readonly ImmutableArray<CharacterSetModificationRule> s_filterRules = ImmutableArray<CharacterSetModificationRule>.Empty;
private static readonly CompletionItemRules s_rules = CompletionItemRules.Create(filterCharacterRules: s_filterRules, commitCharacterRules: s_commitRules);
private static readonly CompletionItemRules s_rules = CompletionItemRules.Create(
filterCharacterRules: s_filterRules, commitCharacterRules: s_commitRules, enterKeyRule: EnterKeyRule.Never);
public override async Task ProvideCompletionsAsync(CompletionContext context)
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册