提交 731b9049 编写于 作者: D David Barbet

Address review feedback.

上级 716ab2ad
......@@ -4,7 +4,6 @@
using System;
using System.Collections.Immutable;
using System.ComponentModel.Composition;
using System.Composition;
using System.Text.RegularExpressions;
using System.Threading;
......@@ -69,7 +68,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerAfterSpaceOrStartOfWordCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.SpaceTriggerCharacter;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.SpaceTriggerCharacter;
protected override async Task<bool> ShouldDisplayCommandCompletionsAsync(SyntaxTree tree, int position, CancellationToken cancellationToken)
{
......
......@@ -12,7 +12,7 @@
namespace Microsoft.CodeAnalysis.Editor.Completion.CompletionProviders
{
internal abstract class ReplCompletionProvider : CommonCompletionProvider
internal abstract class ReplCompletionProvider : LSPCompletionProvider
{
protected abstract Task<bool> ShouldDisplayCommandCompletionsAsync(SyntaxTree tree, int position, CancellationToken cancellationToken);
protected abstract string GetCompletionString(string commandName);
......
......@@ -63,8 +63,6 @@ public override bool ShouldTriggerCompletion(SourceText text, int caretPosition,
return true;
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => ImmutableHashSet.Create(':', '\\', '/', '"');
private static string GetPathThroughLastSlash(string quotedPath, int quotedPathStart, int position)
{
Contract.ThrowIfTrue(quotedPath[0] != '"');
......
......@@ -25,7 +25,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
[ExportCompletionProvider(nameof(AttributeNamedParameterCompletionProvider), LanguageNames.CSharp)]
[ExtensionOrder(After = nameof(FirstBuiltInCompletionProvider))]
[Shared]
internal class AttributeNamedParameterCompletionProvider : CommonCompletionProvider
internal class AttributeNamedParameterCompletionProvider : LSPCompletionProvider
{
private const string EqualsString = "=";
private const string SpaceEqualsString = " =";
......@@ -44,7 +44,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters;
public override async Task ProvideCompletionsAsync(CompletionContext context)
{
......
......@@ -69,7 +69,7 @@ internal static bool IsTriggerCharacter(SourceText text, int characterPosition,
return false;
}
internal static ImmutableHashSet<char> PossibleTriggerCharacters => ImmutableHashSet.Create('.', '#', '>', ':');
internal static ImmutableHashSet<char> CommonTriggerCharacters { get; } = ImmutableHashSet.Create('.', '#', '>', ':');
internal static bool IsTriggerAfterSpaceOrStartOfWordCharacter(SourceText text, int characterPosition, OptionSet options)
{
......
......@@ -72,7 +72,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters;
public override async Task ProvideCompletionsAsync(CompletionContext context)
{
......
......@@ -26,7 +26,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
[ExportCompletionProvider(nameof(DeclarationNameCompletionProvider), LanguageNames.CSharp)]
[ExtensionOrder(After = nameof(TupleNameCompletionProvider))]
[Shared]
internal partial class DeclarationNameCompletionProvider : CommonCompletionProvider
internal partial class DeclarationNameCompletionProvider : LSPCompletionProvider
{
[ImportingConstructor]
public DeclarationNameCompletionProvider()
......@@ -38,7 +38,7 @@ internal override bool IsInsertionTrigger(SourceText text, int insertedCharacter
return CompletionUtilities.IsTriggerAfterSpaceOrStartOfWordCharacter(text, insertedCharacterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.SpaceTriggerCharacter;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.SpaceTriggerCharacter;
public override async Task ProvideCompletionsAsync(CompletionContext completionContext)
{
......
......@@ -26,7 +26,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
[ExportCompletionProvider(nameof(EnumAndCompletionListTagCompletionProvider), LanguageNames.CSharp)]
[ExtensionOrder(After = nameof(CSharpSuggestionModeCompletionProvider))]
[Shared]
internal partial class EnumAndCompletionListTagCompletionProvider : CommonCompletionProvider
internal partial class EnumAndCompletionListTagCompletionProvider : LSPCompletionProvider
{
[ImportingConstructor]
public EnumAndCompletionListTagCompletionProvider()
......@@ -50,7 +50,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
(options.GetOption(CompletionOptions.TriggerOnTypingLetters, LanguageNames.CSharp) && CompletionUtilities.IsStartingNewWord(text, characterPosition));
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => ImmutableHashSet.Create(' ', '[', '(', '~');
internal override ImmutableHashSet<char> TriggerCharacters { get; } = ImmutableHashSet.Create(' ', '[', '(', '~');
public override async Task ProvideCompletionsAsync(CompletionContext context)
{
......
......@@ -22,7 +22,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
[ExportCompletionProvider(nameof(ExplicitInterfaceMemberCompletionProvider), LanguageNames.CSharp)]
[ExtensionOrder(After = nameof(SymbolCompletionProvider))]
[Shared]
internal partial class ExplicitInterfaceMemberCompletionProvider : CommonCompletionProvider
internal partial class ExplicitInterfaceMemberCompletionProvider : LSPCompletionProvider
{
private const string InsertionTextOnOpenParen = nameof(InsertionTextOnOpenParen);
......@@ -49,7 +49,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return text[characterPosition] == '.';
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => ImmutableHashSet.Create('.');
internal override ImmutableHashSet<char> TriggerCharacters { get; } = ImmutableHashSet.Create('.');
public override async Task ProvideCompletionsAsync(CompletionContext context)
{
......
......@@ -35,7 +35,7 @@ public ExplicitInterfaceTypeCompletionProvider()
internal override bool IsInsertionTrigger(SourceText text, int insertedCharacterPosition, OptionSet options)
=> CompletionUtilities.IsTriggerAfterSpaceOrStartOfWordCharacter(text, insertedCharacterPosition, options);
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.SpaceTriggerCharacter;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.SpaceTriggerCharacter;
protected override (string displayText, string suffix, string insertionText) GetDisplayAndSuffixAndInsertionText(ISymbol symbol, SyntaxContext context)
=> CompletionUtilities.GetDisplayAndSuffixAndInsertionText(symbol, context);
......
......@@ -21,7 +21,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
[ExportCompletionProvider(nameof(ExternAliasCompletionProvider), LanguageNames.CSharp)]
[ExtensionOrder(After = nameof(SnippetCompletionProvider))]
[Shared]
internal class ExternAliasCompletionProvider : CommonCompletionProvider
internal class ExternAliasCompletionProvider : LSPCompletionProvider
{
[ImportingConstructor]
public ExternAliasCompletionProvider()
......@@ -33,7 +33,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters;
public override async Task ProvideCompletionsAsync(CompletionContext context)
{
......
......@@ -31,7 +31,7 @@ public ExtensionMethodImportCompletionProvider()
internal override bool IsInsertionTrigger(SourceText text, int characterPosition, OptionSet options)
=> CompletionUtilities.IsTriggerCharacter(text, characterPosition, options);
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters;
protected override ImmutableArray<string> GetImportedNamespaces(
SyntaxNode location,
......
......@@ -29,7 +29,7 @@ public TypeImportCompletionProvider()
internal override bool IsInsertionTrigger(SourceText text, int characterPosition, OptionSet options)
=> CompletionUtilities.IsTriggerCharacter(text, characterPosition, options);
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters;
protected override ImmutableArray<string> GetImportedNamespaces(
SyntaxNode location,
......
......@@ -173,7 +173,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters;
protected override async Task<CSharpSyntaxContext> CreateContextAsync(Document document, int position, CancellationToken cancellationToken)
{
......
......@@ -27,7 +27,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
[ExportCompletionProvider(nameof(NamedParameterCompletionProvider), LanguageNames.CSharp)]
[ExtensionOrder(After = nameof(AttributeNamedParameterCompletionProvider))]
[Shared]
internal partial class NamedParameterCompletionProvider : CommonCompletionProvider, IEqualityComparer<IParameterSymbol>
internal partial class NamedParameterCompletionProvider : LSPCompletionProvider, IEqualityComparer<IParameterSymbol>
{
private const string ColonString = ":";
......@@ -46,7 +46,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters;
public override async Task ProvideCompletionsAsync(CompletionContext context)
{
......
......@@ -35,7 +35,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerAfterSpaceOrStartOfWordCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.SpaceTriggerCharacter;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.SpaceTriggerCharacter;
protected override SyntaxNode GetObjectCreationNewExpression(SyntaxTree tree, int position, CancellationToken cancellationToken)
{
......
......@@ -98,7 +98,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerCharacter(text, characterPosition, options) || text[characterPosition] == ' ';
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters.Add(' ');
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters.Add(' ');
protected override Tuple<ITypeSymbol, Location> GetInitializedType(
Document document, SemanticModel semanticModel, int position, CancellationToken cancellationToken)
......
......@@ -42,7 +42,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerAfterSpaceOrStartOfWordCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.SpaceTriggerCharacter;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.SpaceTriggerCharacter;
protected override SyntaxToken GetToken(CompletionItem completionItem, SyntaxTree tree, CancellationToken cancellationToken)
{
......
......@@ -55,7 +55,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return ch == ' ' || (CompletionUtilities.IsStartingNewWord(text, characterPosition) && options.GetOption(CompletionOptions.TriggerOnTypingLetters, LanguageNames.CSharp));
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.SpaceTriggerCharacter;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.SpaceTriggerCharacter;
protected override bool IsPartial(IMethodSymbol method)
{
......
......@@ -53,7 +53,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
options.GetOption(CompletionOptions.TriggerOnTypingLetters, LanguageNames.CSharp));
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.SpaceTriggerCharacter;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.SpaceTriggerCharacter;
protected override SyntaxNode GetPartialTypeSyntaxNode(SyntaxTree tree, int position, CancellationToken cancellationToken)
{
......
......@@ -21,7 +21,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
[ExportCompletionProvider(nameof(PropertySubpatternCompletionProvider), LanguageNames.CSharp)]
[ExtensionOrder(After = nameof(InternalsVisibleToCompletionProvider))]
[Shared]
internal class PropertySubpatternCompletionProvider : CommonCompletionProvider
internal class PropertySubpatternCompletionProvider : LSPCompletionProvider
{
[ImportingConstructor]
public PropertySubpatternCompletionProvider()
......@@ -102,7 +102,7 @@ protected override Task<CompletionDescription> GetDescriptionWorkerAsync(Documen
internal override bool IsInsertionTrigger(SourceText text, int characterPosition, OptionSet options)
=> CompletionUtilities.IsTriggerCharacter(text, characterPosition, options) || text[characterPosition] == ' ';
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters.Add(' ');
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters.Add(' ');
private static SyntaxToken TryGetOpenBraceOrCommaInPropertyPatternClause(SyntaxTree tree, int position, CancellationToken cancellationToken)
{
......
......@@ -27,7 +27,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
[ExportCompletionProvider(nameof(SnippetCompletionProvider), LanguageNames.CSharp)]
[ExtensionOrder(After = nameof(CrefCompletionProvider))]
[Shared]
internal sealed class SnippetCompletionProvider : CommonCompletionProvider
internal sealed class SnippetCompletionProvider : LSPCompletionProvider
{
internal override bool IsSnippetProvider => true;
......@@ -41,7 +41,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters;
public override async Task ProvideCompletionsAsync(CompletionContext context)
{
......
......@@ -22,7 +22,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
[ExportCompletionProvider(nameof(SpeculativeTCompletionProvider), LanguageNames.CSharp)]
[ExtensionOrder(After = nameof(KeywordCompletionProvider))]
[Shared]
internal class SpeculativeTCompletionProvider : CommonCompletionProvider
internal class SpeculativeTCompletionProvider : LSPCompletionProvider
{
[ImportingConstructor]
public SpeculativeTCompletionProvider()
......@@ -34,7 +34,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters;
public override async Task ProvideCompletionsAsync(CompletionContext context)
{
......
......@@ -44,7 +44,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return CompletionUtilities.IsTriggerCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => CompletionUtilities.PossibleTriggerCharacters;
internal override ImmutableHashSet<char> TriggerCharacters { get; } = CompletionUtilities.CommonTriggerCharacters;
protected override async Task<bool> IsSemanticTriggerCharacterAsync(Document document, int characterPosition, CancellationToken cancellationToken)
{
......
......@@ -23,7 +23,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
[ExportCompletionProvider(nameof(TupleNameCompletionProvider), LanguageNames.CSharp)]
[ExtensionOrder(After = nameof(XmlDocCommentCompletionProvider))]
[Shared]
internal class TupleNameCompletionProvider : CommonCompletionProvider
internal class TupleNameCompletionProvider : LSPCompletionProvider
{
private const string ColonString = ":";
......
......@@ -39,7 +39,7 @@ internal override bool IsInsertionTrigger(SourceText text, int characterPosition
return c == '<' || c == '"' || CompletionUtilities.IsTriggerAfterSpaceOrStartOfWordCharacter(text, characterPosition, options);
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => ImmutableHashSet.Create('<', '"', ' ');
internal override ImmutableHashSet<char> TriggerCharacters { get; } = ImmutableHashSet.Create('<', '"', ' ');
protected override async Task<IEnumerable<CompletionItem>> GetItemsWorkerAsync(
Document document, int position,
......
......@@ -72,11 +72,5 @@ internal virtual Task<CompletionChange> GetChangeAsync(Document document, Comple
/// True if the provider produces items show be shown in expanded list only.
/// </summary>
internal virtual bool IsExpandItemProvider => false;
/// <summary>
/// Defines the set of possible non-identifier trigger characters for this completion provider.
/// Used by the LSP server to determine the trigger character set for completion.
/// </summary>
internal virtual ImmutableHashSet<char> PossibleTriggerCharacters => ImmutableHashSet<char>.Empty;
}
}
......@@ -237,7 +237,5 @@ public virtual TextSpan GetDefaultCompletionListSpan(SourceText text, int caretP
return bestItems.ToImmutableAndFree().SelectAsArray(itemWithPatternMatch => itemWithPatternMatch.Item1);
}
internal virtual ImmutableArray<CompletionProvider> GetCompletionProviders() => ImmutableArray<CompletionProvider>.Empty;
}
}
......@@ -11,10 +11,10 @@
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Completion.Providers;
using Microsoft.CodeAnalysis.ExtractMethod;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.Utilities;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
......@@ -80,10 +80,7 @@ protected virtual ImmutableArray<CompletionProvider> GetBuiltInProviders()
return _importedProviders;
}
internal override ImmutableArray<CompletionProvider> GetCompletionProviders()
{
return GetAllProviders(ImmutableHashSet<string>.Empty);
}
private ImmutableArray<CompletionProvider> _testProviders = ImmutableArray<CompletionProvider>.Empty;
private ImmutableArray<CompletionProvider> CreateRoleProviders(ImmutableHashSet<string> roles)
{
......@@ -227,7 +224,7 @@ private CompletionProvider GetProviderByName(string providerName)
if (ShouldTriggerCompletion(text, caretPosition, trigger, roles, options))
{
triggeredProviders = providers.Where(p => p.ShouldTriggerCompletion(text, caretPosition, trigger, options)).ToImmutableArrayOrEmpty();
Debug.Assert(ValidatePossibleTriggerCharacterSet(triggeredProviders, document, text, caretPosition));
Debug.Assert(ValidatePossibleTriggerCharacterSet(trigger.Kind, triggeredProviders, document, text, caretPosition));
if (triggeredProviders.Length == 0)
{
triggeredProviders = providers;
......@@ -291,9 +288,16 @@ private CompletionProvider GetProviderByName(string providerName)
(expandItemsAvailableFromTriggeredProviders || expandItemsAvailableFromAugmentingProviders));
}
private bool ValidatePossibleTriggerCharacterSet(IEnumerable<CompletionProvider> triggeredProviders, Document document, SourceText text, int caretPosition)
private bool ValidatePossibleTriggerCharacterSet(CompletionTriggerKind completionTriggerKind, IEnumerable<CompletionProvider> triggeredProviders,
Document document, SourceText text, int caretPosition)
{
var syntaxFactsService = document.Project.LanguageServices.GetService<ISyntaxFactsService>();
// Only validate on insertion triggers.
if (completionTriggerKind != CompletionTriggerKind.Insertion)
{
return true;
}
var syntaxFactsService = document.GetLanguageService<ISyntaxFactsService>();
if (caretPosition > 0 && syntaxFactsService != null)
{
// The trigger character has already been inserted before the current caret position.
......@@ -307,11 +311,13 @@ private bool ValidatePossibleTriggerCharacterSet(IEnumerable<CompletionProvider>
}
// Only verify against built in providers. 3rd party ones do not necessarily implement the possible trigger characters API.
triggeredProviders = triggeredProviders.Where(p => GetBuiltInProviders().Contains(p));
foreach (var provider in triggeredProviders)
{
Debug.Assert(provider.PossibleTriggerCharacters.Contains(character),
$"the character {character} is not a valid trigger character for {provider.Name}");
if (provider is LSPCompletionProvider lspProvider)
{
Debug.Assert(lspProvider.TriggerCharacters.Contains(character),
$"the character {character} is not a valid trigger character for {lspProvider.Name}");
}
}
}
......
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Collections.Immutable;
namespace Microsoft.CodeAnalysis.Completion
{
internal abstract class LSPCompletionProvider : CommonCompletionProvider
{
/// <summary>
/// Defines the set of possible non-identifier trigger characters for this completion provider.
/// Used by the LSP server to determine the trigger character set for completion.
/// </summary>
internal virtual ImmutableHashSet<char> TriggerCharacters { get; } = ImmutableHashSet<char>.Empty;
}
}
......@@ -9,7 +9,7 @@
namespace Microsoft.CodeAnalysis.Completion.Providers
{
abstract class AbstractCrefCompletionProvider : CommonCompletionProvider
abstract class AbstractCrefCompletionProvider : LSPCompletionProvider
{
protected const string HideAdvancedMembers = nameof(HideAdvancedMembers);
......
......@@ -16,7 +16,7 @@ namespace Microsoft.CodeAnalysis.Completion.Providers
{
using static DocumentationCommentXmlNames;
internal abstract class AbstractDocCommentCompletionProvider<TSyntax> : CommonCompletionProvider
internal abstract class AbstractDocCommentCompletionProvider<TSyntax> : LSPCompletionProvider
where TSyntax : SyntaxNode
{
// Tag names
......
......@@ -16,7 +16,7 @@
namespace Microsoft.CodeAnalysis.Completion.Providers
{
internal abstract class AbstractInternalsVisibleToCompletionProvider : CommonCompletionProvider
internal abstract class AbstractInternalsVisibleToCompletionProvider : LSPCompletionProvider
{
private const string ProjectGuidKey = nameof(ProjectGuidKey);
......@@ -48,7 +48,7 @@ internal override bool IsInsertionTrigger(SourceText text, int insertedCharacter
return false;
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => ImmutableHashSet.Create('\"');
internal override ImmutableHashSet<char> TriggerCharacters { get; } = ImmutableHashSet.Create('\"');
public override async Task ProvideCompletionsAsync(CompletionContext context)
{
......
......@@ -16,7 +16,7 @@
namespace Microsoft.CodeAnalysis.Completion.Providers
{
internal abstract partial class AbstractKeywordCompletionProvider<TContext> : CommonCompletionProvider
internal abstract partial class AbstractKeywordCompletionProvider<TContext> : LSPCompletionProvider
{
private readonly ImmutableArray<IKeywordRecommender<TContext>> _keywordRecommenders;
......
......@@ -15,7 +15,7 @@
namespace Microsoft.CodeAnalysis.Completion.Providers
{
internal abstract partial class AbstractMemberInsertingCompletionProvider : CommonCompletionProvider
internal abstract partial class AbstractMemberInsertingCompletionProvider : LSPCompletionProvider
{
private readonly SyntaxAnnotation _annotation = new SyntaxAnnotation();
private readonly SyntaxAnnotation _otherAnnotation = new SyntaxAnnotation();
......
......@@ -15,7 +15,7 @@
namespace Microsoft.CodeAnalysis.Completion.Providers
{
internal abstract class AbstractObjectInitializerCompletionProvider : CommonCompletionProvider
internal abstract class AbstractObjectInitializerCompletionProvider : LSPCompletionProvider
{
protected abstract Tuple<ITypeSymbol, Location> GetInitializedType(Document document, SemanticModel semanticModel, int position, CancellationToken cancellationToken);
protected abstract HashSet<string> GetInitializedMembers(SyntaxTree tree, int position, CancellationToken cancellationToken);
......
......@@ -16,7 +16,7 @@
namespace Microsoft.CodeAnalysis.Completion.Providers
{
internal abstract partial class AbstractPartialTypeCompletionProvider : CommonCompletionProvider
internal abstract partial class AbstractPartialTypeCompletionProvider : LSPCompletionProvider
{
protected AbstractPartialTypeCompletionProvider()
{
......
......@@ -26,7 +26,7 @@
namespace Microsoft.CodeAnalysis.Completion.Providers
{
internal abstract class AbstractSymbolCompletionProvider : CommonCompletionProvider
internal abstract class AbstractSymbolCompletionProvider : LSPCompletionProvider
{
// PERF: Many CompletionProviders derive AbstractSymbolCompletionProvider and therefore
// compute identical contexts. This actually shows up on the 2-core typing test.
......
......@@ -22,7 +22,7 @@
namespace Microsoft.CodeAnalysis.Completion.Providers
{
internal abstract class AbstractImportCompletionProvider : CommonCompletionProvider
internal abstract class AbstractImportCompletionProvider : LSPCompletionProvider
{
protected abstract Task<SyntaxContext> CreateContextAsync(Document document, int position, CancellationToken cancellationToken);
protected abstract ImmutableArray<string> GetImportedNamespaces(SyntaxNode location, SemanticModel semanticModel, CancellationToken cancellationToken);
......
......@@ -9,7 +9,7 @@
namespace Microsoft.CodeAnalysis.Completion.SuggestionMode
{
internal abstract class SuggestionModeCompletionProvider : CommonCompletionProvider
internal abstract class SuggestionModeCompletionProvider : LSPCompletionProvider
{
protected abstract Task<CompletionItem> GetSuggestionModeItemAsync(Document document, int position, TextSpan span, CompletionTrigger triggerInfo, CancellationToken cancellationToken);
......
......@@ -56,8 +56,6 @@ public override bool ShouldTriggerCompletion(SourceText text, int caretPosition,
return false;
}
internal override ImmutableHashSet<char> PossibleTriggerCharacters => ImmutableHashSet.Create('\\', '[', '(', '{');
private bool IsTriggerCharacter(char ch)
{
switch (ch)
......
......@@ -2,49 +2,64 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Host;
using Microsoft.VisualStudio.LanguageServer.Protocol;
using Microsoft.CodeAnalysis.Completion;
using LSP = Microsoft.VisualStudio.LanguageServer.Protocol;
namespace Microsoft.CodeAnalysis.LanguageServer.Handler
{
[Shared]
[ExportLspMethod(Methods.InitializeName)]
internal class InitializeHandler : IRequestHandler<InitializeParams, InitializeResult>
[ExportLspMethod(LSP.Methods.InitializeName)]
internal class InitializeHandler : IRequestHandler<LSP.InitializeParams, LSP.InitializeResult>
{
private readonly ImmutableArray<Lazy<CompletionProvider, Completion.Providers.CompletionProviderMetadata>> _completionProviders;
[ImportingConstructor]
public InitializeHandler()
public InitializeHandler([ImportMany] IEnumerable<Lazy<CompletionProvider, Completion.Providers.CompletionProviderMetadata>> completionProviders)
{
_completionProviders = completionProviders
.Where(lz => lz.Metadata.Language == LanguageNames.CSharp || lz.Metadata.Language == LanguageNames.VisualBasic)
.ToImmutableArray();
}
public Task<InitializeResult> HandleRequestAsync(Solution solution, InitializeParams request, ClientCapabilities clientCapabilities, CancellationToken cancellationToken)
public Task<LSP.InitializeResult> HandleRequestAsync(Solution solution, LSP.InitializeParams request, LSP.ClientCapabilities clientCapabilities, CancellationToken cancellationToken)
{
var csharpCompletionService = solution.Workspace.Services.GetRequiredLanguageService<Completion.CompletionService>(LanguageNames.CSharp);
var vbCompletionService = solution.Workspace.Services.GetRequiredLanguageService<Completion.CompletionService>(LanguageNames.VisualBasic);
var allProviders = csharpCompletionService.GetCompletionProviders().Concat(vbCompletionService.GetCompletionProviders());
var triggerCharacters = allProviders.SelectMany(p => p.PossibleTriggerCharacters).Distinct().Select(c => c.ToString()).ToArray();
var triggerCharacters = _completionProviders.SelectMany(lz => GetTriggerCharacters(lz.Value)).Distinct().Select(c => c.ToString()).ToArray();
return Task.FromResult(new InitializeResult
return Task.FromResult(new LSP.InitializeResult
{
Capabilities = new ServerCapabilities
Capabilities = new LSP.ServerCapabilities
{
DefinitionProvider = true,
RenameProvider = true,
ImplementationProvider = true,
CompletionProvider = new CompletionOptions { ResolveProvider = true, TriggerCharacters = triggerCharacters },
SignatureHelpProvider = new SignatureHelpOptions { TriggerCharacters = new[] { "(", "," } },
CompletionProvider = new LSP.CompletionOptions { ResolveProvider = true, TriggerCharacters = triggerCharacters },
SignatureHelpProvider = new LSP.SignatureHelpOptions { TriggerCharacters = new[] { "(", "," } },
DocumentSymbolProvider = true,
WorkspaceSymbolProvider = true,
DocumentFormattingProvider = true,
DocumentRangeFormattingProvider = true,
DocumentOnTypeFormattingProvider = new DocumentOnTypeFormattingOptions { FirstTriggerCharacter = "}", MoreTriggerCharacter = new[] { ";", "\n" } },
DocumentOnTypeFormattingProvider = new LSP.DocumentOnTypeFormattingOptions { FirstTriggerCharacter = "}", MoreTriggerCharacter = new[] { ";", "\n" } },
DocumentHighlightProvider = true,
}
});
}
private static ImmutableHashSet<char> GetTriggerCharacters(CompletionProvider provider)
{
if (provider is LSPCompletionProvider lspProvider)
{
return lspProvider.TriggerCharacters;
}
return ImmutableHashSet<char>.Empty;
}
}
}
......@@ -16,11 +16,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Private Const OfSuffix = "(Of"
Private Const GenericSuffix = OfSuffix + " " & UnicodeEllipsis & ")"
Friend ReadOnly DefaultTriggerChars As ImmutableHashSet(Of Char) = ImmutableHashSet.Create("."c, "["c, "#"c, " "c, "="c, "<"c, "{"c)
Friend ReadOnly CommonTriggerChars As ImmutableHashSet(Of Char) = ImmutableHashSet.Create("."c, "["c, "#"c, " "c, "="c, "<"c, "{"c)
Friend ReadOnly DefaultTriggerCharsAndParen As ImmutableHashSet(Of Char) = DefaultTriggerChars.Add("("c)
Friend ReadOnly CommonTriggerCharsAndParen As ImmutableHashSet(Of Char) = CommonTriggerChars.Add("("c)
Friend ReadOnly SpaceTriggerChars As ImmutableHashSet(Of Char) = DefaultTriggerChars.Add(" "c)
Friend ReadOnly SpaceTriggerChar As ImmutableHashSet(Of Char) = CommonTriggerChars.Add(" "c)
Public Function GetCompletionItemSpan(text As SourceText, position As Integer) As TextSpan
Return CommonCompletionUtilities.GetWordSpan(
......@@ -47,7 +47,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Public Function IsDefaultTriggerCharacter(text As SourceText, characterPosition As Integer, options As OptionSet) As Boolean
Dim ch = text(characterPosition)
If DefaultTriggerChars.Contains(ch) Then
If CommonTriggerChars.Contains(ch) Then
Return True
End If
......@@ -59,7 +59,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return _
ch = "("c OrElse
DefaultTriggerChars.Contains(ch) OrElse
CommonTriggerChars.Contains(ch) OrElse
IsStartingNewWord(text, characterPosition, options)
End Function
......
......@@ -36,7 +36,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return CompletionUtilities.IsDefaultTriggerCharacter(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.DefaultTriggerChars
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.CommonTriggerChars
<ImportingConstructor>
Public Sub New()
......
......@@ -97,7 +97,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
options.GetOption(CompletionOptions.TriggerOnTypingLetters, LanguageNames.VisualBasic)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = ImmutableHashSet.Create(" "c, "("c, "="c)
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = ImmutableHashSet.Create(" "c, "("c, "="c)
Private Function GetTypeFromSymbol(symbol As ISymbol) As ITypeSymbol
Dim symbolType = If(TryCast(symbol, IFieldSymbol)?.Type,
......
......@@ -54,7 +54,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return CompletionUtilities.IsDefaultTriggerCharacter(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.DefaultTriggerChars
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.CommonTriggerChars
Private Function GetTopLevelIdentifiersAsync(
context As VisualBasicSyntaxContext,
......
......@@ -31,7 +31,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return CompletionUtilities.IsDefaultTriggerCharacter(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.DefaultTriggerChars
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.CommonTriggerChars
Protected Overrides Function IsExclusive() As Boolean
Return True
......
......@@ -33,7 +33,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return CompletionUtilities.IsDefaultTriggerCharacterOrParen(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.DefaultTriggerChars
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.CommonTriggerChars
Protected Overrides Function CreateContextAsync(document As Document, position As Integer, cancellationToken As CancellationToken) As Task(Of SyntaxContext)
Return ImportCompletionProviderHelper.CreateContextAsync(document, position, cancellationToken)
......
......@@ -28,7 +28,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return CompletionUtilities.IsDefaultTriggerCharacterOrParen(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.DefaultTriggerCharsAndParen
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.CommonTriggerCharsAndParen
Protected Overrides Function CreateContextAsync(document As Document, position As Integer, cancellationToken As CancellationToken) As Task(Of SyntaxContext)
Return ImportCompletionProviderHelper.CreateContextAsync(document, position, cancellationToken)
......
......@@ -34,7 +34,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return CompletionUtilities.IsDefaultTriggerCharacterOrParen(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.DefaultTriggerCharsAndParen
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.CommonTriggerCharsAndParen
Private Shared ReadOnly s_tupleRules As CompletionItemRules = CompletionItemRules.Default.
WithCommitCharacterRule(CharacterSetModificationRule.Create(CharacterSetModificationKind.Remove, ":"c))
......
......@@ -19,7 +19,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
<ExtensionOrder(After:=NameOf(EnumCompletionProvider))>
<[Shared]>
Partial Friend Class NamedParameterCompletionProvider
Inherits CommonCompletionProvider
Inherits LSPCompletionProvider
Friend Const s_colonEquals As String = ":="
......@@ -31,7 +31,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return CompletionUtilities.IsDefaultTriggerCharacter(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.DefaultTriggerChars
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.CommonTriggerChars
Public Overrides Async Function ProvideCompletionsAsync(context As CompletionContext) As Task
Try
......
......@@ -28,7 +28,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return CompletionUtilities.IsTriggerAfterSpaceOrStartOfWordCharacter(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.SpaceTriggerChars
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.SpaceTriggerChar
Protected Overrides Function GetObjectCreationNewExpression(tree As SyntaxTree, position As Integer, cancellationToken As CancellationToken) As SyntaxNode
Dim newExpression As SyntaxNode = Nothing
......
......@@ -97,7 +97,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return text(characterPosition) = "."c
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = ImmutableHashSet.Create("."c)
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = ImmutableHashSet.Create("."c)
Protected Overrides Function IsExclusiveAsync(document As Document, position As Integer, cancellationToken As CancellationToken) As Task(Of Boolean)
' Object initializers are explicitly indicated by "With", so we're always exclusive.
......
......@@ -59,7 +59,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return CompletionUtilities.IsTriggerAfterSpaceOrStartOfWordCharacter(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.SpaceTriggerChars
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.SpaceTriggerChar
Public Overrides Function TryDetermineModifiers(startToken As SyntaxToken,
text As SourceText, startLine As Integer,
......
......@@ -45,7 +45,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return CompletionUtilities.IsDefaultTriggerCharacter(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.DefaultTriggerChars
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.CommonTriggerChars
Protected Overrides Function GetPartialTypeSyntaxNode(tree As SyntaxTree, position As Integer, cancellationToken As CancellationToken) As SyntaxNode
Dim statement As TypeStatementSyntax = Nothing
......
......@@ -32,7 +32,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Return CompletionUtilities.IsDefaultTriggerCharacterOrParen(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.DefaultTriggerCharsAndParen
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.CommonTriggerCharsAndParen
Protected Overrides Async Function IsSemanticTriggerCharacterAsync(document As Document, characterPosition As Integer, cancellationToken As CancellationToken) As Task(Of Boolean)
If document Is Nothing Then
......
......@@ -34,7 +34,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
IsTriggerAfterSpaceOrStartOfWordCharacter(text, characterPosition, options)
End Function
Friend Overrides ReadOnly Property PossibleTriggerCharacters As ImmutableHashSet(Of Char) = ImmutableHashSet.Create("<"c, "/"c, """"c, " "c)
Friend Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = ImmutableHashSet.Create("<"c, "/"c, """"c, " "c)
Public Function GetPreviousTokenIfTouchingText(token As SyntaxToken, position As Integer) As SyntaxToken
Return If(token.IntersectsWith(position) AndAlso IsText(token),
......
......@@ -35,11 +35,5 @@ internal override bool IsInsertionTrigger(SourceText text, int insertedCharacter
{
return _provider.IsInsertionTrigger(text, insertedCharacterPosition, options);
}
/// <summary>
/// Pulled from https://github.com/dotnet/fsharp/blob/master/vsintegration/src/FSharp.Editor/Completion/FileSystemCompletion.fs#L140
/// but this is incredibly fragile.
/// </summary>
internal override ImmutableHashSet<char> PossibleTriggerCharacters => ImmutableHashSet.Create('"', '\\', ',', '/');
}
}
......@@ -23,7 +23,7 @@ Imports Microsoft.VisualStudio.Text.Editor
Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Snippets
<ExportCompletionProviderMef1("SnippetCompletionProvider", LanguageNames.VisualBasic)>
Partial Friend Class SnippetCompletionProvider
Inherits CommonCompletionProvider
Inherits LSPCompletionProvider
Implements ICustomCommitCompletionProvider
Private ReadOnly _threadingContext As IThreadingContext
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册