提交 222bff64 编写于 作者: D Dustin Campbell

Clean up C# extern alias completion provider

上级 a8ba6656
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // 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.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Completion; using Microsoft.CodeAnalysis.Completion;
using Microsoft.CodeAnalysis.Completion.Providers;
using Microsoft.CodeAnalysis.CSharp.Extensions; using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
...@@ -15,23 +12,30 @@ ...@@ -15,23 +12,30 @@
namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
{ {
internal class ExternAliasCompletionProvider : AbstractCompletionProvider internal class ExternAliasCompletionProvider : CompletionListProvider
{ {
public override bool IsTriggerCharacter(SourceText text, int characterPosition, OptionSet options) public override bool IsTriggerCharacter(SourceText text, int characterPosition, OptionSet options)
{ {
return CompletionUtilities.IsTriggerCharacter(text, characterPosition, options); return CompletionUtilities.IsTriggerCharacter(text, characterPosition, options);
} }
protected override async Task<IEnumerable<CompletionItem>> GetItemsWorkerAsync(Document document, int position, CompletionTriggerInfo triggerInfo, CancellationToken cancellationToken) public override async Task ProduceCompletionListAsync(CompletionListContext context)
{ {
var document = context.Document;
var position = context.Position;
var cancellationToken = context.CancellationToken;
var tree = await document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); var tree = await document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false);
if (tree.IsInNonUserCode(position, cancellationToken)) if (tree.IsInNonUserCode(position, cancellationToken))
{ {
return null; return;
} }
var targetToken = tree.FindTokenOnLeftOfPosition(position, cancellationToken).GetPreviousTokenIfTouchingWord(position); var targetToken = tree
.FindTokenOnLeftOfPosition(position, cancellationToken)
.GetPreviousTokenIfTouchingWord(position);
if (targetToken.IsKind(SyntaxKind.AliasKeyword) && targetToken.Parent.IsKind(SyntaxKind.ExternAliasDirective)) if (targetToken.IsKind(SyntaxKind.AliasKeyword) && targetToken.Parent.IsKind(SyntaxKind.ExternAliasDirective))
{ {
var compilation = await document.Project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); var compilation = await document.Project.GetCompilationAsync(cancellationToken).ConfigureAwait(false);
...@@ -40,16 +44,22 @@ protected override async Task<IEnumerable<CompletionItem>> GetItemsWorkerAsync(D ...@@ -40,16 +44,22 @@ protected override async Task<IEnumerable<CompletionItem>> GetItemsWorkerAsync(D
if (aliases.Any()) if (aliases.Any())
{ {
var root = await tree.GetRootAsync(cancellationToken).ConfigureAwait(false); var root = await tree.GetRootAsync(cancellationToken).ConfigureAwait(false);
var usedAliases = root.ChildNodes().OfType<ExternAliasDirectiveSyntax>().Where(e => !e.Identifier.IsMissing).Select(e => e.Identifier.ValueText); var usedAliases = root.ChildNodes().OfType<ExternAliasDirectiveSyntax>()
.Where(e => !e.Identifier.IsMissing)
.Select(e => e.Identifier.ValueText);
aliases.RemoveRange(usedAliases); aliases.RemoveRange(usedAliases);
aliases.Remove(MetadataReferenceProperties.GlobalAlias); aliases.Remove(MetadataReferenceProperties.GlobalAlias);
var textChangeSpan = CompletionUtilities.GetTextChangeSpan(await document.GetTextAsync(cancellationToken).ConfigureAwait(false), position);
return aliases.Select(e => var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
new CompletionItem(this, e, textChangeSpan, glyph: Glyph.Namespace)); var filterSpan = CompletionUtilities.GetTextChangeSpan(text, position);
foreach (var alias in aliases)
{
context.AddItem(new CompletionItem(this, alias, filterSpan, glyph: Glyph.Namespace));
}
} }
} }
return SpecializedCollections.EmptyEnumerable<CompletionItem>();
} }
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册