提交 dc50e011 编写于 作者: G Gen Lu

Remove TypeImportCompletionItem instead use CompletionItem directly

Now with caching in place, we are more tolerate for the extra time spent on constructing ImmutableDictionaries which mostly happens during the first run only.
上级 9d46d4bf
......@@ -12,7 +12,7 @@ namespace Microsoft.CodeAnalysis.Completion
/// One of many possible completions used to form the completion list presented to the user.
/// </summary>
[DebuggerDisplay("{DisplayText}")]
public class CompletionItem : IComparable<CompletionItem>
public sealed class CompletionItem : IComparable<CompletionItem>
{
/// <summary>
/// The text that is displayed to the user.
......@@ -97,16 +97,16 @@ public class CompletionItem : IComparable<CompletionItem>
/// <see cref="CachedEditorCompletionItem"/> is used for storing the item.
/// Not available to clients. Only used to improve perf by Completion subsystem on a case-by-case basis.
/// </summary>
internal virtual bool UseEditorCompletionItemCache => false;
internal bool UseEditorCompletionItemCache { get; }
/// <summary>
/// Storing converted completion item for target editor. Used if <see cref="UseEditorCompletionItemCache"/>
/// returns <see langword="true"/>
/// Not available to clients. Only used to improve perf by Completion subsystem on a case-by-case basis.
/// </summary>
internal virtual object CachedEditorCompletionItem { get; set; }
internal object CachedEditorCompletionItem { get; set; }
protected CompletionItem(
private CompletionItem(
string displayText,
string filterText,
string sortText,
......@@ -116,7 +116,8 @@ public class CompletionItem : IComparable<CompletionItem>
CompletionItemRules rules,
string displayTextPrefix,
string displayTextSuffix,
string inlineDescription)
string inlineDescription,
bool useEditorCompletionItemCache)
{
this.DisplayText = displayText ?? "";
this.DisplayTextPrefix = displayTextPrefix ?? "";
......@@ -128,6 +129,7 @@ public class CompletionItem : IComparable<CompletionItem>
this.Properties = properties ?? ImmutableDictionary<string, string>.Empty;
this.Tags = tags.NullToEmpty();
this.Rules = rules ?? CompletionItemRules.Default;
this.UseEditorCompletionItemCache = useEditorCompletionItemCache;
}
// binary back compat overload
......@@ -177,7 +179,34 @@ public class CompletionItem : IComparable<CompletionItem>
rules: rules,
displayTextPrefix: displayTextPrefix,
displayTextSuffix: displayTextSuffix,
inlineDescription: inlineDescription);
inlineDescription: inlineDescription,
useEditorCompletionItemCache: false);
}
internal static CompletionItem CreateInternal(
string displayText,
string filterText = null,
string sortText = null,
ImmutableDictionary<string, string> properties = null,
ImmutableArray<string> tags = default,
CompletionItemRules rules = null,
string displayTextPrefix = null,
string displayTextSuffix = null,
string inlineDescription = null,
bool useEditorCompletionItemCache = false)
{
return new CompletionItem(
span: default,
displayText: displayText,
filterText: filterText,
sortText: sortText,
properties: properties,
tags: tags,
rules: rules,
displayTextPrefix: displayTextPrefix,
displayTextSuffix: displayTextSuffix,
inlineDescription: inlineDescription,
useEditorCompletionItemCache: useEditorCompletionItemCache);
}
/// <summary>
......@@ -212,10 +241,11 @@ public class CompletionItem : IComparable<CompletionItem>
rules: rules,
displayTextPrefix: null,
displayTextSuffix: null,
inlineDescription: null);
inlineDescription: null,
useEditorCompletionItemCache: false);
}
protected virtual CompletionItem With(
private CompletionItem With(
Optional<TextSpan> span = default,
Optional<string> displayText = default,
Optional<string> filterText = default,
......@@ -225,7 +255,8 @@ public class CompletionItem : IComparable<CompletionItem>
Optional<CompletionItemRules> rules = default,
Optional<string> displayTextPrefix = default,
Optional<string> displayTextSuffix = default,
Optional<string> inlineDescription = default)
Optional<string> inlineDescription = default,
Optional<bool> useEditorCompletionItemCache = default)
{
var newSpan = span.HasValue ? span.Value : this.Span;
var newDisplayText = displayText.HasValue ? displayText.Value : this.DisplayText;
......@@ -237,6 +268,7 @@ public class CompletionItem : IComparable<CompletionItem>
var newRules = rules.HasValue ? rules.Value : this.Rules;
var newDisplayTextPrefix = displayTextPrefix.HasValue ? displayTextPrefix.Value : this.DisplayTextPrefix;
var newDisplayTextSuffix = displayTextSuffix.HasValue ? displayTextSuffix.Value : this.DisplayTextSuffix;
var newUseEditorCompletionItemCache = useEditorCompletionItemCache.HasValue ? useEditorCompletionItemCache.Value : this.UseEditorCompletionItemCache;
if (newSpan == this.Span &&
newDisplayText == this.DisplayText &&
......@@ -247,11 +279,13 @@ public class CompletionItem : IComparable<CompletionItem>
newRules == this.Rules &&
newDisplayTextPrefix == this.DisplayTextPrefix &&
newDisplayTextSuffix == this.DisplayTextSuffix &&
newInlineDescription == this.InlineDescription)
newInlineDescription == this.InlineDescription &&
newUseEditorCompletionItemCache == this.UseEditorCompletionItemCache)
{
return this;
}
// We don't keep CachedEditorCompletionItem around if any of the properies has changed.
return new CompletionItem(
displayText: newDisplayText,
filterText: newFilterText,
......@@ -262,7 +296,8 @@ public class CompletionItem : IComparable<CompletionItem>
rules: newRules,
displayTextPrefix: newDisplayTextPrefix,
displayTextSuffix: newDisplayTextSuffix,
inlineDescription: newInlineDescription);
inlineDescription: newInlineDescription,
useEditorCompletionItemCache: newUseEditorCompletionItemCache);
}
/// <summary>
......
......@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.AddImports;
......@@ -9,7 +10,6 @@
using Microsoft.CodeAnalysis.Experiments;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Internal.Log;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.Extensions.ContextQuery;
using Microsoft.CodeAnalysis.Text;
......@@ -87,7 +87,7 @@ private async Task AddCompletionItemsAsync(Document document, SyntaxContext cont
{
cancellationToken.ThrowIfCancellationRequested();
var declarationsInReference = ImmutableArray<TypeImportCompletionItem>.Empty;
var declarationsInReference = ImmutableArray<CompletionItem>.Empty;
if (reference is CompilationReference compilationReference)
{
declarationsInReference = await _typeImportCompletionService.GetAccessibleTopLevelTypesFromCompilationReferenceAsync(
......@@ -145,19 +145,21 @@ public override async Task<CompletionChange> GetChangeAsync(Document document, C
private async Task<Document> ComputeNewDocumentAsync(Document document, CompletionItem completionItem, CancellationToken cancellationToken)
{
var importCompletionItem = (TypeImportCompletionItem)completionItem;
var containingNamespace = TypeImportCompletionItem.GetContainingNamespace(completionItem);
Debug.Assert(containingNamespace != null);
var tree = await document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false);
var root = await tree.GetRootAsync(cancellationToken).ConfigureAwait(false);
var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
// Complete type name.
var textWithTypeName = root.GetText(text.Encoding).Replace(importCompletionItem.Span, importCompletionItem.DisplayText);
var textWithTypeName = root.GetText(text.Encoding).Replace(completionItem.Span, completionItem.DisplayText);
var documentWithTypeName = document.WithText(textWithTypeName);
// Annotate added node so we can move caret to proper location later.
var treeWithTypeName = await documentWithTypeName.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false);
var rootWithTypeName = await treeWithTypeName.GetRootAsync(cancellationToken).ConfigureAwait(false);
var addedSpan = new TextSpan(importCompletionItem.Span.Start, importCompletionItem.DisplayText.Length);
var addedSpan = new TextSpan(completionItem.Span.Start, completionItem.DisplayText.Length);
var addedNode = rootWithTypeName.FindNode(addedSpan);
var annotatedNode = addedNode.WithAdditionalAnnotations(_annotation);
var rootWithAnnotatedTypeName = rootWithTypeName.ReplaceNode(addedNode, annotatedNode);
......@@ -168,7 +170,7 @@ private async Task<Document> ComputeNewDocumentAsync(Document document, Completi
var optionSet = await documentWithAnnotatedTypeName.GetOptionsAsync(cancellationToken).ConfigureAwait(false);
var placeSystemNamespaceFirst = optionSet.GetOption(GenerationOptions.PlaceSystemNamespaceFirst, documentWithAnnotatedTypeName.Project.Language);
var compilation = await documentWithAnnotatedTypeName.Project.GetCompilationAsync(cancellationToken).ConfigureAwait(false);
var importNode = CreateImport(documentWithAnnotatedTypeName, importCompletionItem.ContainingNamespace);
var importNode = CreateImport(documentWithAnnotatedTypeName, containingNamespace);
var rootWithImport = addImportService.AddImport(compilation, rootWithAnnotatedTypeName, annotatedNode, importNode, placeSystemNamespaceFirst);
var documentWithImport = documentWithAnnotatedTypeName.WithSyntaxRoot(rootWithImport);
......@@ -183,32 +185,14 @@ private static SyntaxNode CreateImport(Document document, string namespaceName)
return syntaxGenerator.NamespaceImportDeclaration(namespaceName).WithAdditionalAnnotations(Formatter.Annotation);
}
protected override async Task<CompletionDescription> GetDescriptionWorkerAsync(
protected override Task<CompletionDescription> GetDescriptionWorkerAsync(
Document document, CompletionItem item, CancellationToken cancellationToken)
{
if (item is TypeImportCompletionItem importItem)
{
var compilation = await document.Project.GetCompilationAsync(cancellationToken).ConfigureAwait(false);
var symbol = compilation.GetTypeByMetadataName(importItem.MetadataName);
if (symbol != null)
{
var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
#if DEBUG
return CompletionDescription.FromText(DebugObject.DebugText);
return CompletionDescription.FromText(DebugObject.DebugText);
#else
return await CommonCompletionUtilities.CreateDescriptionAsync(
document.Project.Solution.Workspace,
semanticModel,
position: 0,
symbol,
importItem.OverloadCount,
supportedPlatforms: null,
cancellationToken).ConfigureAwait(false);
return TypeImportCompletionItem.GetCompletionDescriptionAsync(document, item, cancellationToken);
#endif
}
}
return CompletionDescription.Empty;
}
}
......
// 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.Collections.Immutable;
using System.Diagnostics;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis.Completion.Providers
{
internal class TypeImportCompletionItem : CompletionItem
internal static class TypeImportCompletionItem
{
public int TypeArity { get; }
public int OverloadCount { get; }
private const string GenericTypeNameManglingString = "`";
private static readonly string[] s_IntegerOneToNine = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
private static readonly string[] s_aritySuffixesOneToNine = { "`1", "`2", "`3", "`4", "`5", "`6", "`7", "`8", "`9" };
public string ContainingNamespace { get; }
private const string ContainingNamespaceName = nameof(ContainingNamespaceName);
private const string OverloadCountName = nameof(OverloadCountName);
private const string TypeArityName = nameof(TypeArityName);
private string _metadataName = null;
public string MetadataName
public static CompletionItem Create(INamedTypeSymbol typeSymbol, string containingNamespace, int overloadCount)
{
get
{
if (_metadataName == null)
{
_metadataName = ComposeAritySuffixedMetadataName(
GetFullyQualifiedName(this.ContainingNamespace, this.DisplayText),
this.TypeArity);
}
var builder = PooledDictionary<string, string>.GetInstance();
builder.Add(ContainingNamespaceName, containingNamespace);
return _metadataName;
if (overloadCount > 0)
{
builder.Add(OverloadCountName, GetInteger(overloadCount));
}
}
internal override bool UseEditorCompletionItemCache => true;
if (typeSymbol.Arity > 0)
{
builder.Add(TypeArityName, GetInteger(typeSymbol.Arity));
}
public static TypeImportCompletionItem Create(INamedTypeSymbol typeSymbol, string containingNamespace, int overloadCount)
{
// TODO: Suffix should be language specific, i.e. `(Of ...)` if triggered from VB.
return new TypeImportCompletionItem(
return CompletionItem.CreateInternal(
displayText: typeSymbol.Name,
filterText: typeSymbol.Name,
sortText: typeSymbol.Name,
span: default,
properties: null,
properties: builder.ToImmutableDictionaryAndFree(),
tags: GlyphTags.GetTags(typeSymbol.GetGlyph()),
rules: CompletionItemRules.Default,
displayTextPrefix: null,
displayTextSuffix: typeSymbol.Arity == 0 ? null : "<>",
inlineDescription: containingNamespace,
typeArity: typeSymbol.Arity,
containingNamespace: containingNamespace,
overloadCount: overloadCount);
useEditorCompletionItemCache: true);
}
protected override CompletionItem With(
Optional<TextSpan> span = default,
Optional<string> displayText = default,
Optional<string> filterText = default,
Optional<string> sortText = default,
Optional<ImmutableDictionary<string, string>> properties = default,
Optional<ImmutableArray<string>> tags = default,
Optional<CompletionItemRules> rules = default,
Optional<string> displayTextPrefix = default,
Optional<string> displayTextSuffix = default,
Optional<string> inlineDescription = default)
public static string GetContainingNamespace(CompletionItem item)
{
var newSpan = span.HasValue ? span.Value : this.Span;
var newDisplayText = displayText.HasValue ? displayText.Value : this.DisplayText;
var newFilterText = filterText.HasValue ? filterText.Value : this.FilterText;
var newSortText = sortText.HasValue ? sortText.Value : this.SortText;
var newInlineDescription = inlineDescription.HasValue ? inlineDescription.Value : this.InlineDescription;
var newProperties = properties.HasValue ? properties.Value : this.Properties;
var newTags = tags.HasValue ? tags.Value : this.Tags;
var newRules = rules.HasValue ? rules.Value : this.Rules;
var newDisplayTextPrefix = displayTextPrefix.HasValue ? displayTextPrefix.Value : this.DisplayTextPrefix;
var newDisplayTextSuffix = displayTextSuffix.HasValue ? displayTextSuffix.Value : this.DisplayTextSuffix;
if (newSpan == this.Span &&
newDisplayText == this.DisplayText &&
newFilterText == this.FilterText &&
newSortText == this.SortText &&
newProperties == this.Properties &&
newTags == this.Tags &&
newRules == this.Rules &&
newDisplayTextPrefix == this.DisplayTextPrefix &&
newDisplayTextSuffix == this.DisplayTextSuffix &&
newInlineDescription == this.InlineDescription)
return item.Properties.TryGetValue(ContainingNamespaceName, out var containingNamespace)
? containingNamespace
: null;
}
public static async Task<CompletionDescription> GetCompletionDescriptionAsync(Document document, CompletionItem item, CancellationToken cancellationToken)
{
var metadataName = GetMetadataName(item);
if (!string.IsNullOrEmpty(metadataName))
{
return this;
var compilation = await document.Project.GetCompilationAsync(cancellationToken).ConfigureAwait(false);
var symbol = compilation.GetTypeByMetadataName(metadataName);
if (symbol != null)
{
var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
var overloadCount = item.Properties.TryGetValue(TypeImportCompletionItem.OverloadCountName, out var count)
? int.Parse(count)
: 0;
return await CommonCompletionUtilities.CreateDescriptionAsync(
document.Project.Solution.Workspace,
semanticModel,
position: 0,
symbol,
overloadCount: overloadCount,
supportedPlatforms: null,
cancellationToken).ConfigureAwait(false);
}
}
return new TypeImportCompletionItem(
displayText: newDisplayText,
filterText: newFilterText,
span: newSpan,
sortText: newSortText,
properties: newProperties,
tags: newTags,
rules: newRules,
displayTextPrefix: newDisplayTextPrefix,
displayTextSuffix: newDisplayTextSuffix,
inlineDescription: newInlineDescription,
typeArity: this.TypeArity,
containingNamespace: this.ContainingNamespace,
overloadCount: this.OverloadCount);
return null;
}
private TypeImportCompletionItem(
string displayText,
string filterText,
string sortText,
TextSpan span,
ImmutableDictionary<string, string> properties,
ImmutableArray<string> tags,
CompletionItemRules rules,
string displayTextPrefix,
string displayTextSuffix,
string inlineDescription,
int typeArity,
string containingNamespace,
int overloadCount)
: base(displayText: displayText, filterText: filterText, sortText: sortText, span: span,
properties: properties, tags: tags, rules: rules, displayTextPrefix: displayTextPrefix,
displayTextSuffix: displayTextSuffix, inlineDescription: inlineDescription)
private static string GetInteger(int integer)
{
TypeArity = typeArity;
ContainingNamespace = containingNamespace;
OverloadCount = overloadCount;
Debug.Assert(integer > 0);
return (integer <= s_IntegerOneToNine.Length)
? s_IntegerOneToNine[integer - 1]
: integer.ToString(CultureInfo.InvariantCulture);
}
private const string GenericTypeNameManglingString = "`";
private static readonly string[] s_aritySuffixesOneToNine = { "`1", "`2", "`3", "`4", "`5", "`6", "`7", "`8", "`9" };
private static string GetAritySuffix(int arity)
{
Debug.Assert(arity > 0);
......@@ -145,5 +104,16 @@ private static string GetFullyQualifiedName(string namespaceName, string typeNam
private static string ComposeAritySuffixedMetadataName(string name, int arity)
=> arity == 0 ? name : name + GetAritySuffix(arity);
private static string GetMetadataName(CompletionItem item)
{
if (item.Properties.TryGetValue(ContainingNamespaceName, out var containingNamespace))
{
var arity = item.Properties.TryGetValue(TypeArityName, out var arityString) ? int.Parse(arityString) : 0;
return ComposeAritySuffixedMetadataName(GetFullyQualifiedName(containingNamespace, item.DisplayText), arity);
}
return null;
}
}
}
......@@ -17,14 +17,14 @@ namespace Microsoft.CodeAnalysis.Completion.Providers
{
internal interface ITypeImportCompletionService : IWorkspaceService
{
ImmutableArray<TypeImportCompletionItem> GetAccessibleTopLevelTypesFromPEReference(
ImmutableArray<CompletionItem> GetAccessibleTopLevelTypesFromPEReference(
Solution solution,
Compilation compilation,
PortableExecutableReference peReference,
ImmutableHashSet<string> excludedNamespaces,
CancellationToken cancellationToken);
Task<ImmutableArray<TypeImportCompletionItem>> GetAccessibleTopLevelTypesFromCompilationReferenceAsync(
Task<ImmutableArray<CompletionItem>> GetAccessibleTopLevelTypesFromCompilationReferenceAsync(
Solution solution,
Compilation compilation,
CompilationReference compilationReference,
......@@ -37,7 +37,7 @@ internal interface ITypeImportCompletionService : IWorkspaceService
/// support compilation.
/// For getting types from PE, use <see cref="GetAccessibleTopLevelTypesFromPEReference"/>.
/// </summary>
Task<ImmutableArray<TypeImportCompletionItem>> GetAccessibleTopLevelTypesFromProjectAsync(
Task<ImmutableArray<CompletionItem>> GetAccessibleTopLevelTypesFromProjectAsync(
Project project,
ImmutableHashSet<string> excludedNamespaces,
CancellationToken cancellationToken);
......@@ -80,7 +80,7 @@ public Service(ConcurrentDictionary<string, ReferenceCacheEntry> peReferenceCach
_projectItemsCache = projectReferenceCache;
}
public async Task<ImmutableArray<TypeImportCompletionItem>> GetAccessibleTopLevelTypesFromProjectAsync(
public async Task<ImmutableArray<CompletionItem>> GetAccessibleTopLevelTypesFromProjectAsync(
Project project,
ImmutableHashSet<string> excludedNamespaces,
CancellationToken cancellationToken)
......@@ -99,7 +99,7 @@ public Service(ConcurrentDictionary<string, ReferenceCacheEntry> peReferenceCach
return GetAccessibleTopLevelTypesWorker(project.Id, compilation.Assembly.GlobalNamespace, checksum, excludedNamespaces, isInternalsVisible: true, _projectItemsCache, cancellationToken);
}
public async Task<ImmutableArray<TypeImportCompletionItem>> GetAccessibleTopLevelTypesFromCompilationReferenceAsync(
public async Task<ImmutableArray<CompletionItem>> GetAccessibleTopLevelTypesFromCompilationReferenceAsync(
Solution solution,
Compilation compilation,
CompilationReference compilationReference,
......@@ -112,7 +112,7 @@ public Service(ConcurrentDictionary<string, ReferenceCacheEntry> peReferenceCach
if (!(compilation.GetAssemblyOrModuleSymbol(compilationReference) is IAssemblySymbol assemblySymbol))
{
return ImmutableArray<TypeImportCompletionItem>.Empty;
return ImmutableArray<CompletionItem>.Empty;
}
var isInternalsVisible = compilation.Assembly.IsSameAssemblyOrHasFriendAccessTo(assemblySymbol);
......@@ -122,7 +122,7 @@ public Service(ConcurrentDictionary<string, ReferenceCacheEntry> peReferenceCach
return GetAccessibleTopLevelTypesWorker(assemblyProject.Id, assemblySymbol.GlobalNamespace, checksum, excludedNamespaces, isInternalsVisible, _projectItemsCache, cancellationToken);
}
public ImmutableArray<TypeImportCompletionItem> GetAccessibleTopLevelTypesFromPEReference(
public ImmutableArray<CompletionItem> GetAccessibleTopLevelTypesFromPEReference(
Solution solution,
Compilation compilation,
PortableExecutableReference peReference,
......@@ -131,7 +131,7 @@ public Service(ConcurrentDictionary<string, ReferenceCacheEntry> peReferenceCach
{
if (!(compilation.GetAssemblyOrModuleSymbol(peReference) is IAssemblySymbol assemblySymbol))
{
return ImmutableArray<TypeImportCompletionItem>.Empty;
return ImmutableArray<CompletionItem>.Empty;
}
var key = GetReferenceKey(peReference);
......@@ -151,7 +151,7 @@ static string GetReferenceKey(PortableExecutableReference reference)
=> reference.FilePath ?? reference.Display;
}
private static ImmutableArray<TypeImportCompletionItem> GetAccessibleTopLevelTypesWorker<TKey>(
private static ImmutableArray<CompletionItem> GetAccessibleTopLevelTypesWorker<TKey>(
TKey key,
INamespaceSymbol rootNamespace,
Checksum checksum,
......@@ -161,8 +161,8 @@ static string GetReferenceKey(PortableExecutableReference reference)
CancellationToken cancellationToken)
{
var tick = Environment.TickCount;
var returned = ImmutableArray<TypeImportCompletionItem>.Empty;
var created = ImmutableArray<TypeImportCompletionItem>.Empty;
var returned = ImmutableArray<CompletionItem>.Empty;
var created = ImmutableArray<CompletionItem>.Empty;
#if DEBUG
try
#endif
......@@ -182,7 +182,7 @@ static string GetReferenceKey(PortableExecutableReference reference)
// Having fewer excluded names space in cache than in request means the cache contains items for all the types not excluded.
if (cacheEntry.ExcludedNamespaces.IsSubsetOf(excludedNamespaces))
{
returned = cacheEntry.CachedItems.WhereAsArray(item => !excludedNamespaces.Contains(item.ContainingNamespace));
returned = cacheEntry.CachedItems.WhereAsArray(item => !excludedNamespaces.Contains(TypeImportCompletionItem.GetContainingNamespace(item)));
return returned;
}
......@@ -196,7 +196,7 @@ static string GetReferenceKey(PortableExecutableReference reference)
cache[key] = new ReferenceCacheEntry(checksum, isInternalsVisible, excludedNamespacesToCache, itemsToCache);
created = itemsFromNamespacesToInclude;
returned = itemsToCache.WhereAsArray(item => !excludedNamespaces.Contains(item.ContainingNamespace));
returned = itemsToCache.WhereAsArray(item => !excludedNamespaces.Contains(TypeImportCompletionItem.GetContainingNamespace(item)));
return returned;
}
......@@ -223,12 +223,12 @@ static bool AccessibilityMatch(bool includeInternalTypes, bool isInternalsVisibl
}
}
private static ImmutableArray<TypeImportCompletionItem> GetCompletionItemsForTopLevelTypeDeclarations(
private static ImmutableArray<CompletionItem> GetCompletionItemsForTopLevelTypeDeclarations(
INamespaceSymbol rootNamespaceSymbol,
Func<string, bool> predicate,
bool isInternalsVisible)
{
var builder = ArrayBuilder<TypeImportCompletionItem>.GetInstance();
var builder = ArrayBuilder<CompletionItem>.GetInstance();
VisitNamespace(rootNamespaceSymbol, null, predicate, isInternalsVisible, builder);
return builder.ToImmutableAndFree();
......@@ -237,7 +237,7 @@ static bool AccessibilityMatch(bool includeInternalTypes, bool isInternalsVisibl
string containingNamespace,
Func<string, bool> predicate,
bool isInternalsVisible,
ArrayBuilder<TypeImportCompletionItem> builder)
ArrayBuilder<CompletionItem> builder)
{
containingNamespace = ConcatNamespace(containingNamespace, symbol.Name);
......@@ -347,7 +347,7 @@ public TypeOverloadInfo Aggregate(INamedTypeSymbol type)
Checksum checksum,
bool includeInternalTypes,
ImmutableHashSet<string> excludedNamespaces,
ImmutableArray<TypeImportCompletionItem> cachedItems)
ImmutableArray<CompletionItem> cachedItems)
{
IncludeInternalTypes = includeInternalTypes;
ExcludedNamespaces = excludedNamespaces;
......@@ -361,7 +361,7 @@ public TypeOverloadInfo Aggregate(INamedTypeSymbol type)
public ImmutableHashSet<string> ExcludedNamespaces { get; }
public ImmutableArray<TypeImportCompletionItem> CachedItems { get; }
public ImmutableArray<CompletionItem> CachedItems { get; }
}
}
}
*REMOVED*static Microsoft.CodeAnalysis.Completion.CompletionItem.Create(string displayText, string filterText = null, string sortText = null, System.Collections.Immutable.ImmutableDictionary<string, string> properties = null, System.Collections.Immutable.ImmutableArray<string> tags = default(System.Collections.Immutable.ImmutableArray<string>), Microsoft.CodeAnalysis.Completion.CompletionItemRules rules = null) -> Microsoft.CodeAnalysis.Completion.CompletionItem
Microsoft.CodeAnalysis.Completion.CompletionItem.CompletionItem(string displayText, string filterText, string sortText, Microsoft.CodeAnalysis.Text.TextSpan span, System.Collections.Immutable.ImmutableDictionary<string, string> properties, System.Collections.Immutable.ImmutableArray<string> tags, Microsoft.CodeAnalysis.Completion.CompletionItemRules rules, string displayTextPrefix, string displayTextSuffix, string inlineDescription) -> void
const Microsoft.CodeAnalysis.QuickInfo.QuickInfoSectionKinds.AnonymousTypes = "AnonymousTypes" -> string
const Microsoft.CodeAnalysis.QuickInfo.QuickInfoSectionKinds.Captures = "Captures" -> string
const Microsoft.CodeAnalysis.QuickInfo.QuickInfoSectionKinds.Description = "Description" -> string
......@@ -33,5 +32,4 @@ static Microsoft.CodeAnalysis.Completion.CompletionItem.Create(string displayTex
static Microsoft.CodeAnalysis.QuickInfo.QuickInfoItem.Create(Microsoft.CodeAnalysis.Text.TextSpan span, System.Collections.Immutable.ImmutableArray<string> tags = default(System.Collections.Immutable.ImmutableArray<string>), System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.QuickInfo.QuickInfoSection> sections = default(System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.QuickInfo.QuickInfoSection>), System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Text.TextSpan> relatedSpans = default(System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Text.TextSpan>)) -> Microsoft.CodeAnalysis.QuickInfo.QuickInfoItem
static Microsoft.CodeAnalysis.QuickInfo.QuickInfoSection.Create(string kind, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.TaggedText> taggedParts) -> Microsoft.CodeAnalysis.QuickInfo.QuickInfoSection
static Microsoft.CodeAnalysis.QuickInfo.QuickInfoService.GetService(Microsoft.CodeAnalysis.Document document) -> Microsoft.CodeAnalysis.QuickInfo.QuickInfoService
virtual Microsoft.CodeAnalysis.Completion.CompletionItem.With(Microsoft.CodeAnalysis.Optional<Microsoft.CodeAnalysis.Text.TextSpan> span = default(Microsoft.CodeAnalysis.Optional<Microsoft.CodeAnalysis.Text.TextSpan>), Microsoft.CodeAnalysis.Optional<string> displayText = default(Microsoft.CodeAnalysis.Optional<string>), Microsoft.CodeAnalysis.Optional<string> filterText = default(Microsoft.CodeAnalysis.Optional<string>), Microsoft.CodeAnalysis.Optional<string> sortText = default(Microsoft.CodeAnalysis.Optional<string>), Microsoft.CodeAnalysis.Optional<System.Collections.Immutable.ImmutableDictionary<string, string>> properties = default(Microsoft.CodeAnalysis.Optional<System.Collections.Immutable.ImmutableDictionary<string, string>>), Microsoft.CodeAnalysis.Optional<System.Collections.Immutable.ImmutableArray<string>> tags = default(Microsoft.CodeAnalysis.Optional<System.Collections.Immutable.ImmutableArray<string>>), Microsoft.CodeAnalysis.Optional<Microsoft.CodeAnalysis.Completion.CompletionItemRules> rules = default(Microsoft.CodeAnalysis.Optional<Microsoft.CodeAnalysis.Completion.CompletionItemRules>), Microsoft.CodeAnalysis.Optional<string> displayTextPrefix = default(Microsoft.CodeAnalysis.Optional<string>), Microsoft.CodeAnalysis.Optional<string> displayTextSuffix = default(Microsoft.CodeAnalysis.Optional<string>), Microsoft.CodeAnalysis.Optional<string> inlineDescription = default(Microsoft.CodeAnalysis.Optional<string>)) -> Microsoft.CodeAnalysis.Completion.CompletionItem
virtual Microsoft.CodeAnalysis.QuickInfo.QuickInfoService.GetQuickInfoAsync(Microsoft.CodeAnalysis.Document document, int position, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.CodeAnalysis.QuickInfo.QuickInfoItem>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册