提交 ae8af158 编写于 作者: C CyrusNajmabadi

Fix test code.

上级 ca369ee8
// 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;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Completion;
......@@ -20,6 +22,12 @@ protected AbstractCSharpCompletionProviderTests(CSharpTestWorkspaceFixture works
{
}
internal override CompletionServiceWithProviders CreateCompletionService(
TestWorkspace workspace, ImmutableArray<CompletionProvider> exclusiveProviders)
{
return new CSharpCompletionService(workspace, exclusiveProviders);
}
protected override async Task VerifyWorkerAsync(string code, int position, string expectedItemOrNull, string expectedDescriptionOrNull, SourceCodeKind sourceCodeKind, bool usePreviousCharAsTrigger, bool checkForAbsence, bool experimental, int? glyph)
{
await VerifyAtPositionAsync(code, position, usePreviousCharAsTrigger, expectedItemOrNull, expectedDescriptionOrNull, sourceCodeKind, checkForAbsence, experimental, glyph);
......@@ -138,7 +146,8 @@ protected async Task VerifySendEnterThroughToEnterAsync(string initialMarkup, st
var document = workspace.CurrentSolution.GetDocument(documentId);
var position = hostDocument.CursorPosition.Value;
var completionList = await GetCompletionListAsync(document, position, CompletionTrigger.Default);
var service = await GetCompletionServiceAsync();
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>();
......@@ -166,7 +175,8 @@ private async Task VerifyTextualTriggerCharacterWorkerAsync(string markup, bool
var options = workspace.Options.WithChangedOption(CompletionOptions.TriggerOnTypingLetters, LanguageNames.CSharp, triggerOnLetter);
var trigger = CompletionTrigger.CreateInsertionTrigger(text[position]);
var isTextualTriggerCharacterResult = CompletionProvider.ShouldTriggerCompletion(text, position + 1, trigger, options);
var service = await GetCompletionServiceAsync();
var isTextualTriggerCharacterResult = service.ShouldTriggerCompletion(text, position + 1, trigger, options: options);
if (expectedTriggerCharacter)
{
......@@ -205,7 +215,8 @@ protected async Task VerifyCommitCharactersAsync(string initialMarkup, string te
var document = workspace.CurrentSolution.GetDocument(documentId);
var position = hostDocument.CursorPosition.Value;
var completionList = await GetCompletionListAsync(document, position, CompletionTrigger.Default);
var service = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(service, document, position, CompletionTrigger.Default);
var item = completionList.Items.First(i => i.DisplayText.StartsWith(textTypedSoFar));
var completionRules = CompletionHelper.GetHelper(document);
......
......@@ -434,7 +434,8 @@ class C
var provider = new CrefCompletionProvider();
var hostDocument = workspace.DocumentWithCursor;
var document = workspace.CurrentSolution.GetDocument(hostDocument.Id);
var completionList = await GetCompletionListAsync(provider, document, hostDocument.CursorPosition.Value, CompletionTrigger.Default);
var service = await GetCompletionServiceAsync();
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;
......@@ -17,6 +20,11 @@ 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();
......@@ -576,7 +584,8 @@ void foo()
var document = workspace.CurrentSolution.GetDocument(hostDocument.Id);
var triggerInfo = CompletionTrigger.CreateInsertionTrigger('a');
var completionList = await GetCompletionListAsync(document, position, triggerInfo);
var service = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(service, document, position, triggerInfo);
var item = completionList.Items.First();
var completionRules = CompletionHelper.GetHelper(document);
......@@ -777,7 +786,8 @@ private async Task VerifyExclusiveAsync(string markup, bool exclusive)
var document = workspace.CurrentSolution.GetDocument(hostDocument.Id);
var triggerInfo = CompletionTrigger.CreateInsertionTrigger('a');
var completionList = await GetCompletionListContextAsync(document, position, triggerInfo);
var service = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(service, document, position, triggerInfo);
if (completionList != null)
{
......
......@@ -2126,10 +2126,11 @@ public override void set_Bar(int bay, int value)
var document = solution.GetDocument(documentId);
var triggerInfo = CompletionTrigger.Default;
var completionList = await GetCompletionListAsync(document, position, triggerInfo);
var service = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(service, document, position, triggerInfo);
var completionItem = completionList.Items.First(i => CompareItems(i.DisplayText, "Bar[int bay]"));
var customCommitCompletionProvider = CompletionProvider as ICustomCommitCompletionProvider;
var customCommitCompletionProvider = service.ExclusiveProviders?[0] as ICustomCommitCompletionProvider;
if (customCommitCompletionProvider != null)
{
var textView = testWorkspace.GetTestDocument(documentId).GetTextView();
......@@ -2385,10 +2386,11 @@ public override bool Equals(object obj)
var document = solution.GetDocument(documentId);
var triggerInfo = CompletionTrigger.Default;
var completionList = await GetCompletionListAsync(document, position, triggerInfo);
var service = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(service, document, position, triggerInfo);
var completionItem = completionList.Items.First(i => CompareItems(i.DisplayText, "Equals(object obj)"));
var customCommitCompletionProvider = CompletionProvider as ICustomCommitCompletionProvider;
var customCommitCompletionProvider = service.ExclusiveProviders?[0] as ICustomCommitCompletionProvider;
if (customCommitCompletionProvider != null)
{
var textView = testWorkspace.GetTestDocument(documentId).GetTextView();
......@@ -2443,10 +2445,11 @@ public override bool Equals(object obj)
var document = solution.GetDocument(documentId);
var triggerInfo = CompletionTrigger.Default;
var completionList = await GetCompletionListAsync(document, cursorPosition, triggerInfo);
var service = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(service, document, cursorPosition, triggerInfo);
var completionItem = completionList.Items.First(i => CompareItems(i.DisplayText, "Equals(object obj)"));
var customCommitCompletionProvider = CompletionProvider as ICustomCommitCompletionProvider;
var customCommitCompletionProvider = service.ExclusiveProviders?[0] as ICustomCommitCompletionProvider;
if (customCommitCompletionProvider != null)
{
var textView = testWorkspace.GetTestDocument(documentId).GetTextView();
......@@ -2545,7 +2548,9 @@ static void Main(string[] args)
var provider = new OverrideCompletionProvider();
var testDocument = workspace.Documents.Single();
var document = workspace.CurrentSolution.GetDocument(testDocument.Id);
var completionList = await GetCompletionListAsync(provider, document, testDocument.CursorPosition.Value, CompletionTrigger.Default);
var service = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(service, document, testDocument.CursorPosition.Value, CompletionTrigger.Default);
var oldTree = await document.GetSyntaxTreeAsync();
......
......@@ -580,7 +580,8 @@ private async Task VerifyWorkerAsync(string markup, bool isBuilder)
private async Task CheckResultsAsync(Document document, int position, bool isBuilder)
{
var triggerInfo = CompletionTrigger.CreateInsertionTrigger('a');
var completionList = await GetCompletionListAsync(document, position, triggerInfo);
var service = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(service, document, position, triggerInfo);
if (isBuilder)
{
......
......@@ -28,7 +28,6 @@ public abstract class AbstractCompletionProviderTests<TWorkspaceFixture> : TestB
where TWorkspaceFixture : TestWorkspaceFixture, new()
{
protected readonly Mock<ICompletionSession> MockCompletionSession;
internal CompletionProvider CompletionProvider;
protected TWorkspaceFixture WorkspaceFixture;
protected AbstractCompletionProviderTests(TWorkspaceFixture workspaceFixture)
......@@ -36,7 +35,6 @@ protected AbstractCompletionProviderTests(TWorkspaceFixture workspaceFixture)
MockCompletionSession = new Mock<ICompletionSession>(MockBehavior.Strict);
this.WorkspaceFixture = workspaceFixture;
this.CompletionProvider = CreateCompletionProvider();
}
public override void Dispose()
......@@ -53,20 +51,29 @@ protected static async Task<bool> CanUseSpeculativeSemanticModelAsync(Document d
return !service.GetMemberBodySpanForSpeculativeBinding(node).IsEmpty;
}
internal static CompletionService GetCompletionService(Document document)
internal async Task<CompletionServiceWithProviders> GetCompletionServiceAsync()
{
return CompletionService.GetService(document);
var workspace = await this.WorkspaceFixture.GetWorkspaceAsync();
return CreateCompletionService(workspace, ImmutableArray.Create(CreateCompletionProvider()));
}
internal abstract CompletionServiceWithProviders CreateCompletionService(
TestWorkspace workspace, ImmutableArray<CompletionProvider> exclusiveProviders);
internal static CompletionHelper GetCompletionHelper(Document document)
{
return CompletionHelper.GetHelper(document);
}
internal static async Task<CompletionContext> GetCompletionListContextAsync(CompletionProvider provider, Document document, int position, CompletionTrigger triggerInfo, OptionSet options = null)
internal static async Task<CompletionContext> GetCompletionListContextAsync(
CompletionService service,
CompletionProvider provider,
Document document,
int position,
CompletionTrigger triggerInfo,
OptionSet options = null)
{
options = options ?? document.Project.Solution.Workspace.Options;
var service = document.Project.LanguageServices.GetService<CompletionService>();
var text = await document.GetTextAsync();
var span = service.GetDefaultItemSpan(text, position);
var context = new CompletionContext(provider, document, position, span, triggerInfo, options, CancellationToken.None);
......@@ -74,26 +81,15 @@ internal static async Task<CompletionContext> GetCompletionListContextAsync(Comp
return context;
}
internal Task<CompletionContext> GetCompletionListContextAsync(Document document, int position, CompletionTrigger triggerInfo, OptionSet options = null)
{
return GetCompletionListContextAsync(this.CompletionProvider, document, position, triggerInfo, options);
}
internal static async Task<CompletionList> GetCompletionListAsync(CompletionProvider provider, Document document, int position, CompletionTrigger triggerInfo, OptionSet options = null)
{
var service = GetCompletionService(document);
var context = await GetCompletionListContextAsync(provider, document, position, triggerInfo, options);
var text = await document.GetTextAsync();
var span = service.GetDefaultItemSpan(text, position);
return CompletionList.Create(span, context.Items.ToImmutableArray(), service.GetRules(), context.SuggestionModeItem);
}
internal Task<CompletionList> GetCompletionListAsync(Document document, int position, CompletionTrigger triggerInfo, OptionSet options = null)
internal Task<CompletionList> GetCompletionListAsync(
CompletionService service,
Document document, int position, CompletionTrigger triggerInfo, OptionSet options = null)
{
return GetCompletionListAsync(this.CompletionProvider, document, position, triggerInfo, options);
return service.GetCompletionsAsync(document, position, triggerInfo, options: options);
}
private async Task CheckResultsAsync(Document document, int position, string expectedItemOrNull, string expectedDescriptionOrNull, bool usePreviousCharAsTrigger, bool checkForAbsence, Glyph? glyph)
private async Task CheckResultsAsync(
Document document, int position, string expectedItemOrNull, string expectedDescriptionOrNull, bool usePreviousCharAsTrigger, bool checkForAbsence, Glyph? glyph)
{
var code = (await document.GetTextAsync()).ToString();
......@@ -104,8 +100,8 @@ private async Task CheckResultsAsync(Document document, int position, string exp
trigger = CompletionTrigger.CreateInsertionTrigger(insertedCharacter: code.ElementAt(position - 1));
}
var completionList = await GetCompletionListAsync(document, position, trigger);
var completionService = document.Project.LanguageServices.GetService<CompletionService>();
var completionService = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(completionService, document, position, trigger);
var items = completionList == null ? default(ImmutableArray<CompletionItem>) : completionList.Items;
if (checkForAbsence)
......@@ -308,10 +304,11 @@ private async Task VerifyCustomCommitProviderCheckResultsAsync(Document document
{
var textBuffer = (await WorkspaceFixture.GetWorkspaceAsync()).Documents.Single().TextBuffer;
var items = (await GetCompletionListAsync(document, position, CompletionTrigger.Default)).Items;
var service = await GetCompletionServiceAsync();
var items = (await GetCompletionListAsync(service, document, position, CompletionTrigger.Default)).Items;
var firstItem = items.First(i => CompareItems(i.DisplayText, itemToCommit));
var customCommitCompletionProvider = CompletionProvider as ICustomCommitCompletionProvider;
var customCommitCompletionProvider = service.ExclusiveProviders?[0] as ICustomCommitCompletionProvider;
if (customCommitCompletionProvider != null)
{
var completionRules = GetCompletionHelper(document);
......@@ -320,11 +317,12 @@ private async Task VerifyCustomCommitProviderCheckResultsAsync(Document document
}
else
{
await VerifyCustomCommitWorkerAsync(document, firstItem, codeBeforeCommit, expectedCodeAfterCommit, commitChar);
await VerifyCustomCommitWorkerAsync(service, document, firstItem, codeBeforeCommit, expectedCodeAfterCommit, commitChar);
}
}
internal virtual async Task VerifyCustomCommitWorkerAsync(
internal async Task VerifyCustomCommitWorkerAsync(
CompletionServiceWithProviders service,
Document document,
CompletionItem completionItem,
string codeBeforeCommit,
......@@ -343,10 +341,9 @@ private async Task VerifyCustomCommitProviderCheckResultsAsync(Document document
return;
}
var service = CompletionService.GetService(document);
var commit = service.GetChangeAsync(document, completionItem, commitChar).Result;
var commit = await service.GetChangeAsync(document, completionItem, commitChar, CancellationToken.None);
var text = document.GetTextAsync().Result;
var text = await document.GetTextAsync();
var newText = text.WithChanges(commit.TextChanges);
var newDoc = document.WithText(newText);
document.Project.Solution.Workspace.TryApplyChanges(newDoc.Project.Solution);
......@@ -415,7 +412,8 @@ private async Task VerifyProviderCommitCheckResultsAsync(Document document, int
var textBuffer = (await WorkspaceFixture.GetWorkspaceAsync()).Documents.Single().TextBuffer;
var textSnapshot = textBuffer.CurrentSnapshot.AsText();
var items = (await GetCompletionListAsync(document, position, CompletionTrigger.Default)).Items;
var service = await GetCompletionServiceAsync();
var items = (await GetCompletionListAsync(service, document, position, CompletionTrigger.Default)).Items;
var firstItem = items.First(i => CompareItems(i.DisplayText, itemToCommit));
var completionRules = GetCompletionHelper(document);
......@@ -445,11 +443,10 @@ private async Task VerifyProviderCommitCheckResultsAsync(Document document, int
Assert.Equal(expectedCodeAfterCommit, text.ToString());
}
protected async Task VerifyItemInEditorBrowsableContextsAsync(string markup, string referencedCode, string item, int expectedSymbolsSameSolution, int expectedSymbolsMetadataReference,
string sourceLanguage, string referencedLanguage, bool hideAdvancedMembers = false)
protected async Task VerifyItemInEditorBrowsableContextsAsync(
string markup, string referencedCode, string item, int expectedSymbolsSameSolution, int expectedSymbolsMetadataReference,
string sourceLanguage, string referencedLanguage, bool hideAdvancedMembers = false)
{
CompletionProvider = CreateCompletionProvider();
await VerifyItemWithMetadataReferenceAsync(markup, referencedCode, item, expectedSymbolsMetadataReference, sourceLanguage, referencedLanguage, hideAdvancedMembers);
await VerifyItemWithProjectReferenceAsync(markup, referencedCode, item, expectedSymbolsSameSolution, sourceLanguage, referencedLanguage, hideAdvancedMembers);
......@@ -538,7 +535,8 @@ private Task VerifyItemInSameProjectAsync(string markup, string referencedCode,
return VerifyItemWithReferenceWorkerAsync(xmlString, expectedItem, expectedSymbols, hideAdvancedMembers);
}
private async Task VerifyItemWithReferenceWorkerAsync(string xmlString, string expectedItem, int expectedSymbols, bool hideAdvancedMembers)
private async Task VerifyItemWithReferenceWorkerAsync(
string xmlString, string expectedItem, int expectedSymbols, bool hideAdvancedMembers)
{
using (var testWorkspace = await TestWorkspace.CreateAsync(xmlString))
{
......@@ -552,8 +550,8 @@ private async Task VerifyItemWithReferenceWorkerAsync(string xmlString, string e
var triggerInfo = CompletionTrigger.Default;
var completionList = await GetCompletionListAsync(document, position, triggerInfo);
var completionService = document.Project.LanguageServices.GetService<CompletionService>();
var completionService = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(completionService, document, position, triggerInfo);
if (expectedSymbols >= 1)
{
......@@ -596,7 +594,8 @@ protected Task VerifyItemWithMscorlib45Async(string markup, string expectedItem,
return VerifyItemWithMscorlib45WorkerAsync(xmlString, expectedItem, expectedDescription);
}
private async Task VerifyItemWithMscorlib45WorkerAsync(string xmlString, string expectedItem, string expectedDescription)
private async Task VerifyItemWithMscorlib45WorkerAsync(
string xmlString, string expectedItem, string expectedDescription)
{
using (var testWorkspace = await TestWorkspace.CreateAsync(xmlString))
{
......@@ -606,8 +605,8 @@ private async Task VerifyItemWithMscorlib45WorkerAsync(string xmlString, string
var document = solution.GetDocument(documentId);
var triggerInfo = CompletionTrigger.Default;
var completionList = await GetCompletionListAsync(document, position, triggerInfo);
var completionService = document.Project.LanguageServices.GetService<CompletionService>();
var completionService = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(completionService, document, position, triggerInfo);
var item = completionList.Items.FirstOrDefault(i => i.DisplayText == expectedItem);
Assert.Equal(expectedDescription, (await completionService.GetDescriptionAsync(document, item)).Text);
......@@ -638,8 +637,8 @@ protected async Task VerifyItemInLinkedFilesAsync(string xmlString, string expec
var document = solution.GetDocument(currentContextDocumentId);
var triggerInfo = CompletionTrigger.Default;
var completionList = await GetCompletionListAsync(document, position, triggerInfo);
var completionService = document.Project.LanguageServices.GetService<CompletionService>();
var completionService = await GetCompletionServiceAsync();
var completionList = await GetCompletionListAsync(completionService, document, position, triggerInfo);
var item = completionList.Items.Single(c => c.DisplayText == expectedItem);
Assert.NotNull(item);
......
......@@ -52,7 +52,7 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense
Dim languageServices = Me.Workspace.CurrentSolution.Projects.First().LanguageServices
Dim language = languageServices.Language
If (extraCompletionProviders IsNot Nothing) Then
If extraCompletionProviders IsNot Nothing Then
Dim completionService = DirectCast(languageServices.GetService(Of CompletionService), CompletionServiceWithProviders)
completionService.SetTestProviders(extraCompletionProviders.Select(Function(lz) lz.Value).ToList())
End If
......
' 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.Collections.Immutable
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Completion
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Completion
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Completion
Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.CompletionProviders
Public MustInherit Class AbstractVisualBasicCompletionProviderTests
......@@ -14,6 +16,10 @@ 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
Return New VisualBasicCompletionService(workspace, exclusiveProviders)
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 Threading.Tasks.Task
' Script/interactive support removed for now.
' TODO: Re-enable these when interactive is back in the product.
......@@ -111,7 +117,8 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.Complet
Dim document = workspace.CurrentSolution.GetDocument(documentId)
Dim position = hostDocument.CursorPosition.Value
Dim completionList = Await GetCompletionListAsync(document, position, CompletionTrigger.Default)
Dim service = Await GetCompletionServiceAsync()
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)
......@@ -131,7 +138,8 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.Complet
Dim document = workspace.CurrentSolution.GetDocument(documentId)
Dim position = hostDocument.CursorPosition.Value
Dim completionList = Await GetCompletionListAsync(document, position, CompletionTrigger.Default)
Dim service = Await GetCompletionServiceAsync()
Dim completionList = Await GetCompletionListAsync(service, document, position, CompletionTrigger.Default)
Dim item = completionList.Items.First()
Dim helper = CompletionHelper.GetHelper(document)
......@@ -197,7 +205,10 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.Complet
Dim text = document.TextBuffer.CurrentSnapshot.AsText()
Dim options = workspace.Options.WithChangedOption(CompletionOptions.TriggerOnTypingLetters, LanguageNames.VisualBasic, triggerOnLetter)
Dim trigger = CompletionTrigger.CreateInsertionTrigger(text(position))
Dim isTextualTriggerCharacterResult = CompletionProvider.ShouldTriggerCompletion(text, position + 1, trigger, options)
Dim completionService = Await GetCompletionServiceAsync()
Dim isTextualTriggerCharacterResult = completionService.ShouldTriggerCompletion(
text, position + 1, trigger, options:=options)
If expectedTriggerCharacter Then
Dim assertText = "'" & text.ToString(New TextSpan(position, 1)) & "' expected to be textual trigger character"
......
......@@ -429,10 +429,10 @@ End Class]]></a>.Value.NormalizeLineEndings()
' This verifies that the provider is asking for a speculative SemanticModel
' by walking to the node the documentation is attached to.
Dim provider = New CrefCompletionProvider()
Dim hostDocument = workspace.DocumentWithCursor
Dim document = workspace.CurrentSolution.GetDocument(hostDocument.Id)
Dim completionList = Await GetCompletionListAsync(provider, document, hostDocument.CursorPosition.Value, CompletionTrigger.Default)
Dim service = Await GetCompletionServiceAsync()
Dim completionList = Await GetCompletionListAsync(service, document, hostDocument.CursorPosition.Value, CompletionTrigger.Default)
End Using
End Function
......
......@@ -643,10 +643,9 @@ 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 completionList = Await GetCompletionListAsync(document, position, CompletionTrigger.Default)
Dim service = Await GetCompletionServiceAsync()
Dim completionList = Await GetCompletionListAsync(service, document, position, CompletionTrigger.Default)
AssertEx.Any(completionList.Items, Function(c) c.DisplayText = "Workcover")
End Using
End Function
......
......@@ -406,8 +406,8 @@ End Program</Document>
Dim hostDocument = workspace.Documents.First()
Dim caretPosition = hostDocument.CursorPosition.Value
Dim document = workspace.CurrentSolution.GetDocument(hostDocument.Id)
Dim completionList = Await GetCompletionListContextAsync(document, caretPosition, CompletionTrigger.Default)
Dim service = Await GetCompletionServiceAsync()
Dim completionList = Await GetCompletionListAsync(service, document, caretPosition, CompletionTrigger.Default)
Assert.True(completionList Is Nothing OrElse completionList.IsExclusive, "Expected always exclusive")
End Using
End Function
......
......@@ -1746,7 +1746,8 @@ public class C
Dim caretPosition = hostDocument.CursorPosition.Value
Dim document = workspace.CurrentSolution.GetDocument(hostDocument.Id)
Dim completionList = Await GetCompletionListAsync(document, caretPosition, CompletionTrigger.Default)
Dim service = Await GetCompletionServiceAsync()
Dim completionList = Await GetCompletionListAsync(service, document, caretPosition, CompletionTrigger.Default)
Assert.False(completionList.Items.Any(Function(c) c.DisplayText = "e"))
End Using
End Function
......
......@@ -334,7 +334,8 @@ End Class
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 completionList = Await GetCompletionListAsync(document, position, triggerInfo.Value, options)
Dim service = Await GetCompletionServiceAsync()
Dim completionList = Await GetCompletionListAsync(service, document, position, triggerInfo.Value, options)
If isBuilder Then
Assert.NotNull(completionList)
......
......@@ -50,8 +50,9 @@ internal class CSharpCompletionService : CommonCompletionService
private readonly Workspace _workspace;
public CSharpCompletionService(Workspace workspace)
: base(workspace)
public CSharpCompletionService(
Workspace workspace, ImmutableArray<CompletionProvider>? exclusiveProviders = null)
: base(workspace, exclusiveProviders)
{
_workspace = workspace;
}
......
......@@ -20,8 +20,10 @@ namespace Microsoft.CodeAnalysis.Completion
{
internal abstract partial class CommonCompletionService : CompletionServiceWithProviders
{
protected CommonCompletionService(Workspace workspace)
: base(workspace)
protected CommonCompletionService(
Workspace workspace,
ImmutableArray<CompletionProvider>? exclusiveProviders)
: base(workspace, exclusiveProviders)
{
}
......
......@@ -36,12 +36,23 @@ public sealed class CompletionList
/// </summary>
public CompletionItem SuggestionModeItem { get; }
private CompletionList(TextSpan defaultSpan, ImmutableArray<CompletionItem> items, CompletionRules rules, CompletionItem suggestionModeItem)
/// <summary>
/// For testing purposes only.
/// </summary>
internal bool IsExclusive { get; }
private CompletionList(
TextSpan defaultSpan,
ImmutableArray<CompletionItem> items,
CompletionRules rules,
CompletionItem suggestionModeItem,
bool isExclusive)
{
this.DefaultSpan = defaultSpan;
this.Items = items.IsDefault ? ImmutableArray<CompletionItem>.Empty : items;
this.Rules = rules ?? CompletionRules.Default;
this.SuggestionModeItem = suggestionModeItem;
this.IsExclusive = isExclusive;
}
/// <summary>
......@@ -58,7 +69,18 @@ private CompletionList(TextSpan defaultSpan, ImmutableArray<CompletionItem> item
CompletionRules rules = null,
CompletionItem suggestionModeItem = null)
{
return new CompletionList(defaultSpan, FixItemSpans(items, defaultSpan), rules, suggestionModeItem);
return Create(defaultSpan, items, rules, suggestionModeItem, isExclusive: false);
}
internal static CompletionList Create(
TextSpan defaultSpan,
ImmutableArray<CompletionItem> items,
CompletionRules rules,
CompletionItem suggestionModeItem,
bool isExclusive)
{
return new CompletionList(
defaultSpan, FixItemSpans(items, defaultSpan), rules, suggestionModeItem, isExclusive);
}
private static ImmutableArray<CompletionItem> FixItemSpans(ImmutableArray<CompletionItem> items, TextSpan defaultSpan)
......@@ -130,7 +152,8 @@ public CompletionList WithSuggestionModeItem(CompletionItem suggestionModeItem)
/// <summary>
/// The default <see cref="CompletionList"/> returned when no items are found to populate the list.
/// </summary>
public static readonly CompletionList Empty
= new CompletionList(default(TextSpan), default(ImmutableArray<CompletionItem>), CompletionRules.Default, null);
public static readonly CompletionList Empty = new CompletionList(
default(TextSpan), default(ImmutableArray<CompletionItem>), CompletionRules.Default,
suggestionModeItem: null, isExclusive: false);
}
}
......@@ -32,11 +32,24 @@ public abstract class CompletionServiceWithProviders : CompletionService, IEqual
private readonly Workspace _workspace;
/// <summary>
/// Internal for testing purposes.
/// </summary>
internal readonly ImmutableArray<CompletionProvider>? ExclusiveProviders;
private IEnumerable<Lazy<CompletionProvider, CompletionProviderMetadata>> _importedProviders;
protected CompletionServiceWithProviders(Workspace workspace)
: this(workspace, null)
{
}
internal CompletionServiceWithProviders(
Workspace workspace,
ImmutableArray<CompletionProvider>? exclusiveProviders = null)
{
_workspace = workspace;
ExclusiveProviders = exclusiveProviders;
_rolesToProviders = new Dictionary<ImmutableHashSet<string>, ImmutableArray<CompletionProvider>>(this);
_createRoleProviders = CreateRoleProviders;
}
......@@ -74,6 +87,7 @@ protected virtual ImmutableArray<CompletionProvider> GetBuiltInProviders()
}
private ImmutableArray<CompletionProvider> _testProviders = ImmutableArray<CompletionProvider>.Empty;
private object p;
internal void SetTestProviders(IEnumerable<CompletionProvider> testProviders)
{
......@@ -87,18 +101,29 @@ internal void SetTestProviders(IEnumerable<CompletionProvider> testProviders)
private ImmutableArray<CompletionProvider> CreateRoleProviders(ImmutableHashSet<string> roles)
{
var builtin = GetBuiltInProviders();
var imported = GetImportedProviders()
.Where(lz => lz.Metadata.Roles == null || lz.Metadata.Roles.Length == 0 || roles.Overlaps(lz.Metadata.Roles))
.Select(lz => lz.Value);
var providers = builtin.Concat(imported).Concat(_testProviders);
var providers = GetAllProviders(roles);
foreach (var provider in providers)
{
_nameToProvider[provider.Name] = provider;
}
return providers;
}
private ImmutableArray<CompletionProvider> GetAllProviders(ImmutableHashSet<string> roles)
{
if (ExclusiveProviders.HasValue)
{
return ExclusiveProviders.Value;
}
var builtin = GetBuiltInProviders();
var imported = GetImportedProviders()
.Where(lz => lz.Metadata.Roles == null || lz.Metadata.Roles.Length == 0 || roles.Overlaps(lz.Metadata.Roles))
.Select(lz => lz.Value);
var providers = builtin.Concat(imported).Concat(_testProviders);
return providers.ToImmutableArray();
}
......@@ -193,7 +218,9 @@ internal protected CompletionProvider GetProvider(CompletionItem item)
if (firstExclusiveList != null)
{
return MergeAndPruneCompletionLists(SpecializedCollections.SingletonEnumerable(firstExclusiveList), defaultItemSpan);
return MergeAndPruneCompletionLists(
SpecializedCollections.SingletonEnumerable(firstExclusiveList), defaultItemSpan,
isExclusive: true);
}
// If no exclusive providers provided anything, then go through the remaining
......@@ -230,10 +257,11 @@ internal protected CompletionProvider GetProvider(CompletionItem item)
// groups are properly ordered based on the original providers.
allProvidersAndLists.Sort((p1, p2) => completionProviderToIndex[p1.Provider] - completionProviderToIndex[p2.Provider]);
return MergeAndPruneCompletionLists(allProvidersAndLists, defaultItemSpan);
return MergeAndPruneCompletionLists(allProvidersAndLists, defaultItemSpan, isExclusive: false);
}
private CompletionList MergeAndPruneCompletionLists(IEnumerable<CompletionContext> completionLists, TextSpan contextSpan)
private CompletionList MergeAndPruneCompletionLists(
IEnumerable<CompletionContext> completionLists, TextSpan contextSpan, bool isExclusive)
{
var displayNameToItemsMap = new Dictionary<string, List<CompletionItem>>();
CompletionItem suggestionModeItem = null;
......@@ -261,7 +289,8 @@ private CompletionList MergeAndPruneCompletionLists(IEnumerable<CompletionContex
var totalItems = displayNameToItemsMap.Values.Flatten().ToList();
totalItems.Sort();
return CompletionList.Create(contextSpan, totalItems.ToImmutableArray(), this.GetRules(), suggestionModeItem);
return CompletionList.Create(
contextSpan, totalItems.ToImmutableArray(), this.GetRules(), suggestionModeItem);
}
private void AddToDisplayMap(
......@@ -365,7 +394,8 @@ public override bool ShouldTriggerCompletion(SourceText text, int caretPosition,
return providers.Any(p => p.ShouldTriggerCompletion(text, caretPosition, trigger, options));
}
public override async Task<CompletionChange> GetChangeAsync(Document document, CompletionItem item, char? commitKey, CancellationToken cancellationToken)
public override async Task<CompletionChange> GetChangeAsync(
Document document, CompletionItem item, char? commitKey, CancellationToken cancellationToken)
{
var provider = GetProvider(item);
if (provider != null)
......
......@@ -45,8 +45,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion
Private ReadOnly _workspace As Workspace
Public Sub New(workspace As Workspace)
MyBase.New(workspace)
Public Sub New(workspace As Workspace,
Optional exclusiveProviders As ImmutableArray(Of CompletionProvider) ? = Nothing)
MyBase.New(workspace, exclusiveProviders)
_workspace = workspace
End Sub
......
......@@ -57,7 +57,7 @@ Namespace Microsoft.VisualStudio.LanguageServices.UnitTests.DebuggerIntelliSense
Dim languageServices = Me.Workspace.CurrentSolution.Projects.First().LanguageServices
Dim language = languageServices.Language
If (extraCompletionProviders IsNot Nothing) Then
If extraCompletionProviders IsNot Nothing Then
Dim completionService = DirectCast(languageServices.GetService(Of CompletionService), CommonCompletionService)
completionService.SetTestProviders(extraCompletionProviders.Select(Function(lz) lz.Value).ToList())
End If
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册