public static CompletionItem Create( string displayText, string displayTextSuffix, DeclarationModifiers modifiers, int line, ISymbol symbol, SyntaxToken token, int descriptionPosition, CompletionItemRules rules ) { var props = ImmutableDictionary <string, string> .Empty .Add("Line", line.ToString()) .Add("Modifiers", modifiers.ToString()) .Add("TokenSpanEnd", token.Span.End.ToString()); return(SymbolCompletionItem.CreateWithSymbolId( displayText: displayText, displayTextSuffix: displayTextSuffix, symbols: ImmutableArray.Create(symbol), contextPosition: descriptionPosition, properties: props, rules: rules, isComplexTextEdit: true )); }
public override async Task ProvideCompletionsAsync(CompletionContext context) { var document = context.Document; var position = context.Position; var cancellationToken = context.CancellationToken; var workspace = document.Project.Solution.Workspace; var semanticModel = await document.GetSemanticModelForSpanAsync(new TextSpan(position, length : 0), cancellationToken).ConfigureAwait(false); var typeAndLocation = GetInitializedType(document, semanticModel, position, cancellationToken); if (typeAndLocation == null) { return; } var initializedType = typeAndLocation.Item1 as INamedTypeSymbol; var initializerLocation = typeAndLocation.Item2; if (initializedType == null) { return; } if (await IsExclusiveAsync(document, position, cancellationToken).ConfigureAwait(false)) { context.IsExclusive = true; } var enclosing = semanticModel.GetEnclosingNamedType(position, cancellationToken); // Find the members that can be initialized. If we have a NamedTypeSymbol, also get the overridden members. IEnumerable <ISymbol> members = semanticModel.LookupSymbols(position, initializedType); members = members.Where(m => IsInitializable(m, enclosing) && m.CanBeReferencedByName && IsLegalFieldOrProperty(m, enclosing) && !m.IsImplicitlyDeclared); // Filter out those members that have already been typed var alreadyTypedMembers = GetInitializedMembers(semanticModel.SyntaxTree, position, cancellationToken); var uninitializedMembers = members.Where(m => !alreadyTypedMembers.Contains(m.Name)); uninitializedMembers = uninitializedMembers.Where(m => m.IsEditorBrowsable(document.ShouldHideAdvancedMembers(), semanticModel.Compilation)); var text = await semanticModel.SyntaxTree.GetTextAsync(cancellationToken).ConfigureAwait(false); foreach (var uninitializedMember in uninitializedMembers) { context.AddItem(SymbolCompletionItem.CreateWithSymbolId( displayText: EscapeIdentifier(uninitializedMember), displayTextSuffix: "", insertionText: null, symbols: ImmutableArray.Create(uninitializedMember), contextPosition: initializerLocation.SourceSpan.Start, rules: s_rules)); } }
public override async Task ProvideCompletionsAsync(CompletionContext context) { var document = context.Document; var position = context.Position; var cancellationToken = context.CancellationToken; var semanticModel = await document.ReuseExistingSpeculativeModelAsync(position, cancellationToken).ConfigureAwait(false); if (GetInitializedType(document, semanticModel, position, cancellationToken) is not var(type, initializerLocation)) { return; } if (type is ITypeParameterSymbol typeParameterSymbol) { type = typeParameterSymbol.GetNamedTypeSymbolConstraint(); } if (type is not INamedTypeSymbol initializedType) { return; } if (await IsExclusiveAsync(document, position, cancellationToken).ConfigureAwait(false)) { context.IsExclusive = true; } var enclosing = semanticModel.GetEnclosingNamedType(position, cancellationToken); Contract.ThrowIfNull(enclosing); // Find the members that can be initialized. If we have a NamedTypeSymbol, also get the overridden members. IEnumerable <ISymbol> members = semanticModel.LookupSymbols(position, initializedType); members = members.Where(m => IsInitializable(m, enclosing) && m.CanBeReferencedByName && IsLegalFieldOrProperty(m) && !m.IsImplicitlyDeclared); // Filter out those members that have already been typed var alreadyTypedMembers = GetInitializedMembers(semanticModel.SyntaxTree, position, cancellationToken); var uninitializedMembers = members.Where(m => !alreadyTypedMembers.Contains(m.Name)); uninitializedMembers = uninitializedMembers.Where(m => m.IsEditorBrowsable(context.CompletionOptions.HideAdvancedMembers, semanticModel.Compilation)); foreach (var uninitializedMember in uninitializedMembers) { context.AddItem(SymbolCompletionItem.CreateWithSymbolId( displayText: EscapeIdentifier(uninitializedMember), displayTextSuffix: "", insertionText: null, symbols: ImmutableArray.Create(uninitializedMember), contextPosition: initializerLocation.SourceSpan.Start, rules: s_rules)); } }
private CompletionItem CreateCompletionItem(INamedTypeSymbol symbol, TSyntaxContext context) { var(displayText, suffix, insertionText) = GetDisplayAndSuffixAndInsertionText(symbol, context); return(SymbolCompletionItem.CreateWithSymbolId( displayText: displayText, displayTextSuffix: suffix, insertionText: insertionText, symbols: ImmutableArray.Create(symbol), contextPosition: context.Position, properties: GetProperties(symbol, context), rules: CompletionItemRules.Default)); }
private CompletionItem CreateCompletionItem( INamedTypeSymbol symbol, SyntaxContext context) { var displayAndInsertionText = GetDisplayAndInsertionText(symbol, context); return(SymbolCompletionItem.CreateWithSymbolId( displayText: displayAndInsertionText.Item1, insertionText: displayAndInsertionText.Item2, symbol: symbol, contextPosition: context.Position, properties: GetProperties(symbol, context), rules: CompletionItemRules.Default)); }
protected override CompletionItem CreateItem( string displayText, string insertionText, List <ISymbol> symbols, SyntaxContext context, bool preselect, SupportedPlatformData supportedPlatformData) { return(SymbolCompletionItem.CreateWithSymbolId( displayText: displayText, insertionText: insertionText, filterText: GetFilterText(symbols[0], displayText, context), contextPosition: context.Position, symbols: symbols, supportedPlatforms: supportedPlatformData, matchPriority: MatchPriority.Preselect, // Always preselect rules: GetCompletionItemRules(symbols, context))); }
protected virtual CompletionItem CreateItem( CompletionContext completionContext, string displayText, string displayTextSuffix, string insertionText, List <ISymbol> symbols, SyntaxContext context, bool preselect, SupportedPlatformData supportedPlatformData) { return(SymbolCompletionItem.CreateWithSymbolId( displayText: displayText, displayTextSuffix: displayTextSuffix, insertionText: insertionText, filterText: GetFilterText(symbols[0], displayText, context), contextPosition: context.Position, symbols: symbols, supportedPlatforms: supportedPlatformData, rules: GetCompletionItemRules(symbols) .WithMatchPriority(preselect ? MatchPriority.Preselect : MatchPriority.Default) .WithSelectionBehavior(context.IsRightSideOfNumericType ? CompletionItemSelectionBehavior.SoftSelection : CompletionItemSelectionBehavior.Default))); }
public override async Task ProvideCompletionsAsync(CompletionContext context) { var document = context.Document; var position = context.Position; var cancellationToken = context.CancellationToken; var semanticModel = await document.ReuseExistingSpeculativeModelAsync(position, cancellationToken).ConfigureAwait(false); if (GetInitializedType(document, semanticModel, position, cancellationToken) is not var(type, initializerLocation)) { return; } if (type is ITypeParameterSymbol typeParameterSymbol) { type = typeParameterSymbol.GetNamedTypeSymbolConstraint(); } if (type is not INamedTypeSymbol initializedType) { return; } if (await IsExclusiveAsync(document, position, cancellationToken).ConfigureAwait(false)) { context.IsExclusive = true; } var enclosing = semanticModel.GetEnclosingNamedType(position, cancellationToken); Contract.ThrowIfNull(enclosing); // Find the members that can be initialized. If we have a NamedTypeSymbol, also get the overridden members. IEnumerable <ISymbol> members = semanticModel.LookupSymbols(position, initializedType); members = members.Where(m => IsInitializable(m, enclosing) && m.CanBeReferencedByName && IsLegalFieldOrProperty(m) && !m.IsImplicitlyDeclared); // Filter out those members that have already been typed var alreadyTypedMembers = GetInitializedMembers(semanticModel.SyntaxTree, position, cancellationToken); var uninitializedMembers = members.Where(m => !alreadyTypedMembers.Contains(m.Name)); // Sort the members by name so if we preselect one, it'll be stable uninitializedMembers = uninitializedMembers.Where(m => m.IsEditorBrowsable(context.CompletionOptions.HideAdvancedMembers, semanticModel.Compilation)) .OrderBy(m => m.Name); var firstUnitializedRequiredMember = true; foreach (var uninitializedMember in uninitializedMembers) { var rules = s_rules; // We'll hard select the first required member to make it a bit easier to type out an object initializer // with a bunch of members. if (firstUnitializedRequiredMember && uninitializedMember.IsRequired()) { rules = rules.WithSelectionBehavior(CompletionItemSelectionBehavior.HardSelection).WithMatchPriority(MatchPriority.Preselect); firstUnitializedRequiredMember = false; } context.AddItem(SymbolCompletionItem.CreateWithSymbolId( displayText: EscapeIdentifier(uninitializedMember), displayTextSuffix: "", insertionText: null, symbols: ImmutableArray.Create(uninitializedMember), contextPosition: initializerLocation.SourceSpan.Start, inlineDescription: uninitializedMember.IsRequired() ? FeaturesResources.Required : null, rules: rules)); } }