예제 #1
0
        private string GetFormattedContracts(CSharpMember semanticMember)
        {
            Contract.Requires(semanticMember != null);
            Contract.Requires(semanticMember.IsMethod || semanticMember.IsConstructor || semanticMember.IsProperty || semanticMember.IsIndexer);

            if (semanticMember.IsProperty || semanticMember.IsIndexer)
            {
                IMethodContract setter, getter;
                if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetPropertyContract(semanticMember, out getter, out setter))
                {
                    return(null);
                }
                return(IntellisenseContractsHelper.FormatPropertyContracts(getter, setter));
            }

            //Can we get our contracts?
            IMethodContract methodContracts;

            if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetMethodContract(semanticMember, out methodContracts))
            {
                return(null);
            }

            //Can we get our formatted contracts?
            return(IntellisenseContractsHelper.FormatContracts(methodContracts));
        }
예제 #2
0
        private string GetFormattedContracts(ISymbol semanticMember)
        {
            Contract.Requires(semanticMember != null);
            Contract.Requires(semanticMember.Kind == SymbolKind.Method || semanticMember.Kind == SymbolKind.Property);

            if (semanticMember.Kind == SymbolKind.Property)
            {
                IMethodContract setter, getter;
                if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetPropertyContract(semanticMember, out getter, out setter))
                {
                    return(null);
                }
                return(IntellisenseContractsHelper.FormatPropertyContracts(getter, setter));
            }

            //Can we get our contracts?
            IMethodContract methodContracts;

            if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetMethodContract(semanticMember, out methodContracts))
            {
                return(null);
            }

            //Can we get our formatted contracts?
            return(IntellisenseContractsHelper.FormatContracts(methodContracts));
        }
예제 #3
0
        private string[] GetContractsForOverloads(Microsoft.RestrictedUsage.CSharp.Semantics.CSharpMember[] overloads)
        {
            Contract.Requires(overloads != null);
            Contract.Requires(Contract.ForAll(overloads, o => o == null || o.IsConstructor || o.IsMethod || o.IsProperty || o.IsIndexer));

            var result = new string[overloads.Length];

            for (int i = 0; i < overloads.Length; i++)
            {
                var mem = overloads[i];
                //Can we get our contracts?
                if (mem == null)
                {
                    continue;
                }

                if (mem.IsConstructor || mem.IsMethod)
                {
                    IMethodContract methodContracts;
                    if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetMethodContract(mem, out methodContracts))
                    {
                        continue;
                    }

                    result[i] = IntellisenseContractsHelper.FormatContracts(methodContracts);
                }
                else if (mem.IsProperty || mem.IsIndexer)
                {
                    IMethodContract getter, setter;

                    if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetPropertyContract(mem, out getter, out setter))
                    {
                        continue;
                    }

                    result[i] = IntellisenseContractsHelper.FormatPropertyContracts(getter, setter);
                }
            }
            return(result);
        }
예제 #4
0
        private string[] GetContractsForOverloads(ISymbol[] overloads)
        {
            Contract.Requires(overloads != null);
            Contract.Requires(Contract.ForAll(overloads, o => o == null || o.Kind == SymbolKind.Method || o.Kind == SymbolKind.Property));

            var result = new string[overloads.Length];

            for (int i = 0; i < overloads.Length; i++)
            {
                var mem = overloads[i];
                //Can we get our contracts?
                if (mem == null)
                {
                    continue;
                }

                if (mem.Kind == SymbolKind.Method)
                {
                    IMethodContract methodContracts;
                    if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetMethodContract(mem, out methodContracts))
                    {
                        continue;
                    }

                    result[i] = IntellisenseContractsHelper.FormatContracts(methodContracts);
                }
                else if (mem.Kind == SymbolKind.Property)
                {
                    IMethodContract getter, setter;

                    if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetPropertyContract(mem, out getter, out setter))
                    {
                        continue;
                    }

                    result[i] = IntellisenseContractsHelper.FormatPropertyContracts(getter, setter);
                }
            }
            return(result);
        }
예제 #5
0
        public void AugmentQuickInfoSession(IQuickInfoSession session, IList <object> quickInfoContent, out ITrackingSpan applicableToSpan)
        {
            if (session == null)
            {
                applicableToSpan = null;
                return;
            }

            var span = applicableToSpan = session.ApplicableToSpan;

            if (quickInfoContent == null)
            {
                return;
            }

            //Wrap our method body in a safty net that checks for exceptions
            ContractsPackageAccessor.Current.Logger.PublicEntry(() => {
                //Record our start time for preformance considerations
                var startTime = DateTime.Now;

                //Is our session valid?
                if (session == null)
                {
                    return;
                }

                //Can we get our trigger point?
                var triggerPoint = session.GetTriggerPoint(_textBuffer);
                if (triggerPoint == null)
                {
                    return;
                }

                //Can we get our snapshot?
                var workingSnapshot = _textBuffer.CurrentSnapshot;
                if (workingSnapshot == null)
                {
                    return;
                }

                //Can we get our SourceFile?
                var sourceFile = _textViewTracker.LatestSourceFile;
                if (sourceFile == null)
                {
                    return;
                }

                //Can we get our ParseTree?
                var parseTree = sourceFile.GetParseTree();
                if (parseTree == null)
                {
                    return;
                }

                //Can we get our compilation?
                var comp = _textViewTracker.LatestCompilation;
                if (comp == null)
                {
                    return;
                }

                //Is the model ready?
                if (!parseTree.IsModelReady() || _textViewTracker.IsLatestCompilationStale || _textViewTracker.IsLatestSourceFileStale)
                {
                    //Ask for a new model
                    ContractsPackageAccessor.Current.AskForNewVSModel(_textBuffer);

                    //Return a message saying we aren't ready yet
                    ContractsPackageAccessor.Current.Logger.WriteToLog("The VS model is out of date! Aborting contract lookup.");
                    return;//"(VS isn't ready for possible contract lookup yet. Please try again in a few seconds.)";
                }

                //Proceed cautiously
                string formattedContracts;
                try {
                    //Can we get a call node?
                    var targetNode = IntellisenseContractsHelper.GetTargetAtTriggerPoint(triggerPoint, workingSnapshot, parseTree);
                    if (targetNode == null)
                    {
                        return;
                    }

                    //Can we get our semantic member?
                    var semanticMember = IntellisenseContractsHelper.GetSemanticMember(targetNode, comp, sourceFile);
                    if (semanticMember == null)
                    {
                        return;
                    }

                    //Can we get our contracts?
                    formattedContracts = GetFormattedContracts(semanticMember);
                    if (formattedContracts == null)
                    {
                        return;
                    }

                    if (span == null)
                    {
                        span = workingSnapshot.CreateTrackingSpan(triggerPoint.GetPosition(workingSnapshot), 1, SpanTrackingMode.EdgeInclusive);
                    }
                    //Give up on our contracts if we get an exception
                } catch (IllFormedSemanticModelException) {
                    return;
                } catch (InvalidOperationException e) {
                    if (!e.Message.Contains(ContractsPackageAccessor.InvalidOperationExceptionMessage_TheSnapshotIsOutOfDate))
                    {
                        throw e;
                    }
                    else
                    {
                        this._textViewTracker.IsLatestCompilationStale = true;
                        return;
                    }
                } catch (System.Runtime.InteropServices.COMException e) {
                    // various reasons for ComExceptions:
                    //  - binding failed
                    //  - project unavailable
                    if (e.Message.EndsWith("out of date"))
                    {
                        this._textViewTracker.IsLatestCompilationStale = true;
                    }
                    return;
                }

                //Append our formatted contract info
                quickInfoContent.Add(formattedContracts);
                //Print our elapsed time for preformance considerations
                var elapseTime = DateTime.Now - startTime;
                ContractsPackageAccessor.Current.Logger.WriteToLog("Time to compute quickinfo: " + elapseTime.Milliseconds + "ms");
            }, "AugmentQuickInfoSession");

            if (span != null)
            {
                applicableToSpan = span;
            }
        }
예제 #6
0
        public void AugmentSignatureHelpSession(ISignatureHelpSession session, IList <ISignature> signatures)
        {
            ContractsPackageAccessor.Current.Logger.PublicEntry(() => {
                //Record our start time for preformance considerations
                var startTime = DateTime.Now;

                //Do we have signatures?
                if (signatures == null || signatures.Count < 1)
                {
                    return;
                }

                //Do we have a well-formed session?
                if (session == null || session.TextView == null || session.TextView.TextBuffer == null)
                {
                    return;
                }

                //Can we get our trigger point?
                var triggerPoint = session.GetTriggerPoint(_textBuffer);
                if (triggerPoint == null)
                {
                    return;
                }

                //Can we get our snapshot?
                var workingSnapshot = _textBuffer.CurrentSnapshot;
                if (workingSnapshot == null)
                {
                    return;
                }

                //Can we get our SourceFile?
                var sourceFile = _textViewTracker.LatestSourceFile;
                if (sourceFile == null)
                {
                    return;
                }

                //Can we get our ParseTree?
                var parseTree = sourceFile.GetParseTree();
                if (parseTree == null)
                {
                    return;
                }

                //Can we get our compilation?
                var comp = _textViewTracker.LatestCompilation;
                if (comp == null)
                {
                    return;
                }

                //Is the model ready?
                if (!parseTree.IsModelReady() || _textViewTracker.IsLatestCompilationStale || _textViewTracker.IsLatestSourceFileStale)
                {
                    //Ask for a new model
                    ContractsPackageAccessor.Current.AskForNewVSModel(_textBuffer);

                    //Return a message saying we aren't ready yet
                    ContractsPackageAccessor.Current.Logger.WriteToLog("The VS model is out of date! Aborting contract lookup.");
                    return;//"(VS isn't ready for possible contract lookup yet. Please try again in a few seconds.)";
                }

                string[] contractContents = null;

                //Proceed cautiously
                try
                {
                    //Can we get a call node?
                    var callNode = IntellisenseContractsHelper.GetAnyCallNodeAboveTriggerPoint(triggerPoint, workingSnapshot, parseTree);
                    if (callNode == null || comp == null || sourceFile == null)
                    {
                        return;
                    }

                    //Can we get our semantic member?
                    var semanticMember = IntellisenseContractsHelper.GetSemanticMember(callNode, comp, sourceFile);
                    if (semanticMember == null)
                    {
                        return;
                    }

                    var declType = semanticMember.ContainingType;
                    // find all members of the same name (virt/non-virt)

                    var overloads = GetSignatureOverloads(declType, signatures, semanticMember);

                    contractContents = GetContractsForOverloads(overloads);


                    //Give up on our contracts if we get an exception
                }
                catch (IllFormedSemanticModelException)
                {
                    return;
                }
                catch (InvalidOperationException e)
                {
                    if (!e.Message.Contains(ContractsPackageAccessor.InvalidOperationExceptionMessage_TheSnapshotIsOutOfDate))
                    {
                        throw e;
                    }
                    else
                    {
                        this._textViewTracker.IsLatestCompilationStale = true;
                        return;
                    }
                }
                catch (System.Runtime.InteropServices.COMException)
                {
                    // various reasons for COMException
                    // - binding failed
                    // - project unavailable
                    // - ...
                    return;
                }

                //Enumerate the signatures and append our custom content
                for (int i = 0; i < signatures.Count; i++)
                {
                    var sig = signatures[i];

                    if (contractContents != null && !String.IsNullOrEmpty(contractContents[i]))
                    {
                        signatures[i] = new SignatureWithContracts(sig, contractContents[i]);
                    }
                }

                //Print our elapsed time for preformance considerations
                var elapseTime = DateTime.Now - startTime;
                ContractsPackageAccessor.Current.Logger.WriteToLog("Time to compute quickinfo: " + elapseTime.Milliseconds + "ms");
            }, "AugmentSignatureHelpSession");
        }