Exemplo n.º 1
0
        public async Task <SignatureHelp> GetSignatureHelp(int position)
        {
            var document   = this.host.GetDocument(this.documentId);
            var signature  = new SignatureHelp();
            var invocation = await GetInvocation(document, position).ConfigureAwait(false);

            if (invocation == null)
            {
                return(null);
            }

            var methods = GetMethodOverloads(invocation.SemanticModel, invocation.Node);

            if (methods == null)
            {
                return(null);
            }

            foreach (var comma in invocation.ArgumentList.Arguments.GetSeparators())
            {
                if (comma.Span.Start > invocation.Position)
                {
                    break;
                }

                signature.ActiveParameter += 1;
            }

            var signatureHelpItemList = new List <SignatureHelpItem>();

            var bestScore = int.MinValue;
            SignatureHelpItem bestScoredItem = null;

            var types = invocation.ArgumentList.Arguments
                        .Select(argument => invocation.SemanticModel.GetTypeInfo(argument.Expression));

            foreach (var method in methods)
            {
                var buildItem = BuildItem(method, invocation.SemanticModel, position);
                signatureHelpItemList.Add(buildItem);
                var score = InvocationScore(method, types);
                if (score <= bestScore)
                {
                    continue;
                }

                bestScore      = score;
                bestScoredItem = buildItem;
            }

            if (bestScoredItem == null)
            {
                return(null);
            }

            signature.ActiveSignature    = signatureHelpItemList.IndexOf(bestScoredItem);
            signature.SignatureHelpItems = signatureHelpItemList;
            return(signature);
        }
Exemplo n.º 2
0
        public OverloadProvider(SignatureHelp signature)
        {
            this.signature = signature;
            if (signature.ActiveSignature > 0)
            {
                this.selectedIndex = signature.ActiveSignature;
            }

            this.BuildContent();
        }