Exemplo n.º 1
0
        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));
            }
        }
Exemplo n.º 3
0
        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));
            }
        }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 6
0
 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)));
 }
Exemplo n.º 7
0
 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));
            }
        }