未验证 提交 93610417 编写于 作者: G Gen Lu 提交者: GitHub

Merge pull request #35616 from genlu/FixCommit

Fix commit of import completion
......@@ -49,8 +49,8 @@ internal class CompletionSource : ForegroundThreadAffinitizedObject, IAsyncCompl
private static readonly EditorOptionKey<bool> NonBlockingCompletionEditorOption = new EditorOptionKey<bool>(NonBlockingCompletion);
// Use CWT to cache data needed to create VSCompletionItem, so the table would be cleared when Roslyn completion item cache is cleared.
private static readonly ConditionalWeakTable<RoslynCompletionItem, VSCompletionItemData> s_roslynItemToVsItemData =
new ConditionalWeakTable<RoslynCompletionItem, VSCompletionItemData>();
private static readonly ConditionalWeakTable<RoslynCompletionItem, StrongBox<VSCompletionItemData>> s_roslynItemToVsItemData =
new ConditionalWeakTable<RoslynCompletionItem, StrongBox<VSCompletionItemData>>();
// Cache all the VS completion filters which essentially make them singletons.
// Because all items that should be filtered using the same filter button must
......@@ -322,7 +322,7 @@ public async Task<object> GetDescriptionAsync(IAsyncCompletionSession session, V
/// So as a compromise, we cache data that can be calculated from Roslyn completion item to avoid repeated
/// calculation cost for cached Roslyn completion items.
/// </summary>
private class VSCompletionItemData
private readonly struct VSCompletionItemData
{
public VSCompletionItemData(string displayText, ImageElement icon, ImmutableArray<AsyncCompletionData.CompletionFilter> filters, ImmutableArray<ImageElement> attributeIcons, string insertionText)
{
......@@ -348,55 +348,56 @@ public VSCompletionItemData(string displayText, ImageElement icon, ImmutableArra
Document document,
RoslynCompletionItem roslynItem)
{
if (roslynItem.IsCached && s_roslynItemToVsItemData.TryGetValue(roslynItem, out var itemData))
VSCompletionItemData itemData;
if (roslynItem.IsCached && s_roslynItemToVsItemData.TryGetValue(roslynItem, out var boxedItemData))
{
return new VSCompletionItem(
displayText: itemData.DisplayText,
source: this,
icon: itemData.Icon,
filters: itemData.Filters,
suffix: roslynItem.InlineDescription, // InlineDescription will be right-aligned in the selection popup
insertText: itemData.InsertionText,
sortText: roslynItem.SortText,
filterText: roslynItem.FilterText,
attributeIcons: itemData.AttributeIcons);
itemData = boxedItemData.Value;
}
else
{
var imageId = roslynItem.Tags.GetFirstGlyph().GetImageId();
var filters = GetFilters(roslynItem);
var imageId = roslynItem.Tags.GetFirstGlyph().GetImageId();
var filters = GetFilters(roslynItem);
// roslynItem generated by providers can contain an insertionText in a property bag.
// We will not use it but other providers may need it.
// We actually will calculate the insertion text once again when called TryCommit.
if (!roslynItem.Properties.TryGetValue(InsertionText, out var insertionText))
{
insertionText = roslynItem.DisplayText;
}
// roslynItem generated by providers can contain an insertionText in a property bag.
// We will not use it but other providers may need it.
// We actually will calculate the insertion text once again when called TryCommit.
if (!roslynItem.Properties.TryGetValue(InsertionText, out var insertionText))
{
insertionText = roslynItem.DisplayText;
}
var supportedPlatforms = SymbolCompletionItem.GetSupportedPlatforms(roslynItem, document.Project.Solution.Workspace);
var attributeImages = supportedPlatforms != null ? s_WarningImageAttributeImagesArray : ImmutableArray<ImageElement>.Empty;
var supportedPlatforms = SymbolCompletionItem.GetSupportedPlatforms(roslynItem, document.Project.Solution.Workspace);
var attributeImages = supportedPlatforms != null ? s_WarningImageAttributeImagesArray : ImmutableArray<ImageElement>.Empty;
itemData = new VSCompletionItemData(
displayText: roslynItem.GetEntireDisplayText(),
icon: new ImageElement(new ImageId(imageId.Guid, imageId.Id), roslynItem.DisplayText),
filters: filters,
attributeIcons: attributeImages,
insertionText: insertionText);
// It doesn't make sense to cache VS item data for those Roslyn items created from scratch for each session,
// since CWT uses object identity for comparison.
if (roslynItem.IsCached)
{
s_roslynItemToVsItemData.Add(roslynItem, new StrongBox<VSCompletionItemData>(itemData));
}
}
var item = new VSCompletionItem(
displayText: roslynItem.GetEntireDisplayText(),
displayText: itemData.DisplayText,
source: this,
icon: new ImageElement(new ImageId(imageId.Guid, imageId.Id), roslynItem.DisplayText),
filters: filters,
icon: itemData.Icon,
filters: itemData.Filters,
suffix: roslynItem.InlineDescription, // InlineDescription will be right-aligned in the selection popup
insertText: insertionText,
insertText: itemData.InsertionText,
sortText: roslynItem.SortText,
filterText: roslynItem.FilterText,
attributeIcons: attributeImages);
attributeIcons: itemData.AttributeIcons);
item.Properties.AddProperty(RoslynItem, roslynItem);
// It doesn't make sense to cache VS item data for those Roslyn items created from scratch for each session,
// since CWT uses object identity for comparison.
if (roslynItem.IsCached)
{
var data = new VSCompletionItemData(item.DisplayText, item.Icon, item.Filters, item.AttributeIcons, item.InsertText);
s_roslynItemToVsItemData.Add(roslynItem, data);
}
return item;
}
......
......@@ -4900,6 +4900,58 @@ class C
End Using
End Function
<WorkItem(35614, "https://github.com/dotnet/roslyn/issues/35614")>
<MemberData(NameOf(AllCompletionImplementations))>
<WpfTheory, Trait(Traits.Feature, Traits.Features.Completion)>
Public Async Function TestTypeImportCompletion(completionImplementation As CompletionImplementation) As Task
Using state = TestStateFactory.CreateCSharpTestState(completionImplementation,
<Document><![CDATA[
namespace NS1
{
class C
{
public void Foo()
{
Bar$$
}
}
}
namespace NS2
{
public class Bar { }
}
]]></Document>)
Dim expectedText = "
using NS2;
namespace NS1
{
class C
{
public void Foo()
{
Bar
}
}
}
namespace NS2
{
public class Bar { }
}
"
state.Workspace.Options = state.Workspace.Options.WithChangedOption(CompletionOptions.ShowItemsFromUnimportedNamespaces, LanguageNames.CSharp, True)
state.SendInvokeCompletionList()
Await state.AssertSelectedCompletionItem(displayText:="Bar", isHardSelected:=True, inlineDescription:="NS2")
state.SendTab()
Assert.Equal(expectedText, state.GetDocumentText())
End Using
End Function
Private Class MultipleChangeCompletionProvider
Inherits CompletionProvider
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册