From 7827464f0a6b159420d00ef2c9ceecd8d2d05b1c Mon Sep 17 00:00:00 2001 From: Ravi Chande Date: Mon, 10 Jul 2017 10:09:14 -0700 Subject: [PATCH] Suggest names for aliases --- ...nNameCompletionProvider.DeclarationInfo.cs | 17 +++++++++---- .../DeclarationNameCompletionProvider.cs | 24 +++++++++++++++---- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/Features/CSharp/Portable/Completion/CompletionProviders/DeclarationNameCompletionProvider.DeclarationInfo.cs b/src/Features/CSharp/Portable/Completion/CompletionProviders/DeclarationNameCompletionProvider.DeclarationInfo.cs index 9e72134aa96..06f3daf6b4f 100644 --- a/src/Features/CSharp/Portable/Completion/CompletionProviders/DeclarationNameCompletionProvider.DeclarationInfo.cs +++ b/src/Features/CSharp/Portable/Completion/CompletionProviders/DeclarationNameCompletionProvider.DeclarationInfo.cs @@ -24,17 +24,20 @@ internal struct NameDeclarationInfo ImmutableArray possibleSymbolKinds, Accessibility accessibility, DeclarationModifiers declarationModifiers, - ITypeSymbol type) + ITypeSymbol type, + IAliasSymbol alias) { PossibleSymbolKinds = possibleSymbolKinds; DeclaredAccessibility = accessibility; Modifiers = declarationModifiers; Type = type; + Alias = alias; } public ImmutableArray PossibleSymbolKinds { get; } public DeclarationModifiers Modifiers { get; } public ITypeSymbol Type { get; } + public IAliasSymbol Alias { get; } public Accessibility DeclaredAccessibility { get; } internal static async Task GetDeclarationInfo(Document document, int position, CancellationToken cancellationToken) @@ -136,11 +139,15 @@ internal static async Task GetDeclarationInfo(Document docu return default(NameDeclarationInfo); } + var alias = semanticModel.GetAliasInfo(typeSyntax, cancellationToken); + var type = semanticModel.GetTypeInfo(typeSyntax, cancellationToken).Type; + return new NameDeclarationInfo( possibleDeclarationComputer(GetDeclarationModifiers(modifiers.Value)), GetAccessibility(modifiers.Value), GetDeclarationModifiers(modifiers.Value), - semanticModel.GetTypeInfo(typeSyntax, cancellationToken).Type); + type, + alias); } private static NameDeclarationInfo IsLastTokenOfType( @@ -178,7 +185,8 @@ internal static async Task GetDeclarationInfo(Document docu possibleDeclarationComputer(GetDeclarationModifiers(modifiers.Value)), GetAccessibility(modifiers.Value), GetDeclarationModifiers(modifiers.Value), - semanticModel.GetTypeInfo(typeSyntax, cancellationToken).Type); + semanticModel.GetTypeInfo(typeSyntax, cancellationToken).Type, + semanticModel.GetAliasInfo(typeSyntax, cancellationToken)); } private static bool IsFieldDeclaration(SyntaxToken token, SemanticModel semanticModel, @@ -224,7 +232,8 @@ internal static async Task GetDeclarationInfo(Document docu ImmutableArray.Create(SymbolKind.TypeParameter), Accessibility.NotApplicable, new DeclarationModifiers(), - type: null); + type: null, + alias: null); return true; } diff --git a/src/Features/CSharp/Portable/Completion/CompletionProviders/DeclarationNameCompletionProvider.cs b/src/Features/CSharp/Portable/Completion/CompletionProviders/DeclarationNameCompletionProvider.cs index 5cc70b72448..9440b83d95e 100644 --- a/src/Features/CSharp/Portable/Completion/CompletionProviders/DeclarationNameCompletionProvider.cs +++ b/src/Features/CSharp/Portable/Completion/CompletionProviders/DeclarationNameCompletionProvider.cs @@ -12,6 +12,7 @@ using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Simplification; using Microsoft.CodeAnalysis.Text; +using Roslyn.Utilities; using static Microsoft.CodeAnalysis.Diagnostics.Analyzers.NamingStyles.SymbolSpecification; namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers @@ -37,14 +38,12 @@ public override async Task ProvideCompletionsAsync(CompletionContext completionC } var nameInfo = await NameDeclarationInfo.GetDeclarationInfo(document, position, cancellationToken).ConfigureAwait(false); - - if (!IsValidType(nameInfo.Type)) + var baseNames = GetBaseNames(semanticModel, nameInfo); + if (baseNames == default) { return; } - var type = UnwrapType(nameInfo.Type, semanticModel.Compilation); - var baseNames = NameGenerator.GetBaseNames(type); var recommendedNames = await GetRecommendedNamesAsync(baseNames, nameInfo, context, document, cancellationToken).ConfigureAwait(false); int sortValue = 0; foreach (var (name, kind) in recommendedNames) @@ -57,6 +56,23 @@ public override async Task ProvideCompletionsAsync(CompletionContext completionC completionContext.SuggestionModeItem = CommonCompletionItem.Create(CSharpFeaturesResources.Name, CompletionItemRules.Default); } + private ImmutableArray> GetBaseNames(SemanticModel semanticModel, NameDeclarationInfo nameInfo) + { + if (nameInfo.Alias != null) + { + return ImmutableArray.Create(SpecializedCollections.SingletonEnumerable(nameInfo.Alias.Name)); + } + + if (!IsValidType(nameInfo.Type)) + { + return default; + } + + var type = UnwrapType(nameInfo.Type, semanticModel.Compilation); + var baseNames = NameGenerator.GetBaseNames(type); + return baseNames; + } + private bool IsValidType(ITypeSymbol type) { if (type == null) -- GitLab