public int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
        {
            if (pguidCmdGroup == _vSStd97CmdIDGuid && nCmdID == (uint)VSConstants.VSStd97CmdID.GotoDefn)
            {
                TextView.TextBuffer.Properties.TryGetProperty <ITextDocument>(typeof(ITextDocument), out ITextDocument textDoc);

                if (PackageCompletionSource.IsInRangeForPackageCompletion(TextView.TextSnapshot, TextView.Caret.Position.BufferPosition.Position, out Span targetSpan, out string packageName, out string packageVersion, out string completionType))
                {
                    if (PackageExistsOnNuGet(packageName, packageVersion, out string url))
                    {
                        System.Diagnostics.Process.Start(url);
                        return(VSConstants.S_OK);
                    }
                }

                IWorkspace        workspace   = _workspaceManager.GetWorkspace(textDoc.FilePath);
                List <Definition> definitions = workspace.ResolveDefinition(textDoc.FilePath, TextView.TextSnapshot.GetText(), TextView.Caret.Position.BufferPosition.Position);

                if (definitions.Count == 1)
                {
                    DTE dte = ServiceProvider.GlobalProvider.GetService(typeof(DTE)) as DTE;
                    dte.MainWindow.Activate();

                    using (var state = new NewDocumentStateScope(Microsoft.VisualStudio.Shell.Interop.__VSNEWDOCUMENTSTATE.NDS_Provisional, Guid.Parse(ProjectFileToolsPackage.PackageGuidString)))
                    {
                        EnvDTE.Window w = dte.ItemOperations.OpenFile(definitions[0].File, EnvDTE.Constants.vsViewKindTextView);

                        if (definitions[0].Line.HasValue)
                        {
                            ((EnvDTE.TextSelection)dte.ActiveDocument.Selection).GotoLine(definitions[0].Line.Value, true);
                        }
                    }

                    return(VSConstants.S_OK);
                }

                else if (definitions.Count > 1)
                {
                    IFindAllReferencesService farService = (IFindAllReferencesService)Package.GetGlobalService(typeof(SVsFindAllReferences));
                    FarDataSource             dataSource = new FarDataSource(1);
                    dataSource.Snapshots[0] = new FarDataSnapshot(definitions);

                    IFindAllReferencesWindow farWindow   = farService.StartSearch(definitions[0].Type);
                    ITableManager            _farManager = farWindow.Manager;
                    _farManager.AddSource(dataSource);

                    dataSource.Sink.IsStable = false;
                    dataSource.Sink.AddSnapshot(dataSource.Snapshots[0]);
                    dataSource.Sink.IsStable = true;

                    return(VSConstants.S_OK);
                }
            }

            return(Next?.Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut) ?? (int)Microsoft.VisualStudio.OLE.Interop.Constants.OLECMDERR_E_NOTSUPPORTED);
        }
Ejemplo n.º 2
0
        private static int?HandleGoToDefinitionOnNuGetPackage(XmlInfo info, ITextDocument textDoc, ITextView textView, IWorkspaceManager workspaceManager)
        {
            if (PackageCompletionSource.TryGetPackageInfoFromXml(info, out string packageName, out string packageVersion) && PackageExistsOnNuGet(packageName, packageVersion, out string url))
            {
                System.Diagnostics.Process.Start(url);
                return(VSConstants.S_OK);
            }

            return(null);
        }
Ejemplo n.º 3
0
        public async Task <QuickInfoItem> GetQuickInfoItemAsync(IAsyncQuickInfoSession session, CancellationToken cancellationToken)
        {
            if (!session.TextView.TextBuffer.Properties.TryGetProperty(typeof(ITextDocument), out ITextDocument textDoc))
            {
                return(null);
            }

            SnapshotPoint?triggerPoint = session.GetTriggerPoint(session.TextView.TextSnapshot);

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

            int pos = triggerPoint.Value.Position;

            if (!PackageCompletionSource.IsInRangeForPackageCompletion(session.TextView.TextSnapshot, pos, out Span s, out string packageId, out string packageVersion, out string type))
            {
                XmlInfo info = XmlTools.GetXmlInfo(session.TextView.TextSnapshot, pos);

                if (info != null)
                {
                    IWorkspace    workspace      = workspace = _workspaceManager.GetWorkspace(textDoc.FilePath);
                    string        evaluatedValue = workspace.GetEvaluatedPropertyValue(info.AttributeValue);
                    ITrackingSpan target         = session.TextView.TextSnapshot.CreateTrackingSpan(new Span(info.AttributeValueStart, info.AttributeValueLength), SpanTrackingMode.EdgeNegative);

                    if (info.AttributeName == "Condition")
                    {
                        try
                        {
                            bool isTrue = workspace.EvaluateCondition(info.AttributeValue);
                            evaluatedValue = $"Expanded value: {evaluatedValue}\nEvaluation result: {isTrue}";
                            await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

                            return(new QuickInfoItem(target, evaluatedValue));
                        }
                        catch (Exception ex)
                        {
                            Debug.Fail(ex.ToString());
                        }
                    }
                    else
                    {
                        evaluatedValue = $"Value(s):\n    {string.Join("\n    ", evaluatedValue.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))}";
                        await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

                        return(new QuickInfoItem(target, evaluatedValue));
                    }
                }
            }
Ejemplo n.º 4
0
        public bool TryCreateOrUpdate(ITextView textView, SnapshotSpan span, PackageGlyphTag existingTag, out TagSpan <PackageGlyphTag> tag, out Span valueSpan)
        {
            if (!PackageCompletionSource.IsInRangeForPackageCompletion(span.Snapshot, span.Start, out valueSpan, out string name, out string ver, out string type))
            {
                tag = null;
                return(false);
            }

            double?lineHeight;

            try
            {
                lineHeight = textView.LineHeight;
            }
            catch { lineHeight = null; }

            string text = span.Snapshot.GetText();
            int    targetFrameworkElementStartIndex  = text.IndexOf("<TargetFramework>", StringComparison.OrdinalIgnoreCase);
            int    targetFrameworksElementStartIndex = text.IndexOf("<TargetFrameworks>", StringComparison.OrdinalIgnoreCase);
            string tfm = "netcoreapp1.0";

            if (targetFrameworksElementStartIndex > -1)
            {
                int    closeTfms = text.IndexOf("</TargetFrameworks>", targetFrameworksElementStartIndex);
                int    realStart = targetFrameworksElementStartIndex + "<TargetFrameworks>".Length;
                string allTfms   = text.Substring(realStart, closeTfms - realStart);
                tfm = allTfms.Split(';')[0];
            }
            else if (targetFrameworkElementStartIndex > -1)
            {
                int closeTfm  = text.IndexOf("</TargetFramework>", targetFrameworkElementStartIndex);
                int realStart = targetFrameworkElementStartIndex + "<TargetFramework>".Length;
                tfm = text.Substring(realStart, closeTfm - realStart);
            }

            PackageGlyphTag t = existingTag ?? new PackageGlyphTag(PositionAffinity.Predecessor, textView);

            t.PackageIcon.Source = WpfUtil.MonikerToBitmap(KnownMonikers.NuGet, (int)(lineHeight ?? 16));
            IssueIconQuery(name, ver, tfm, t);
            if (lineHeight.HasValue)
            {
                t.Wrapper.Height = lineHeight.Value;
            }
            tag = new TagSpan <PackageGlyphTag>(new SnapshotSpan(span.Snapshot, Span.FromBounds(valueSpan.Start, valueSpan.Start)), t);
            return(true);
        }
Ejemplo n.º 5
0
        public void AugmentQuickInfoSession(IQuickInfoSession session, IList <object> quickInfoContent, out ITrackingSpan applicableToSpan)
        {
            SnapshotPoint?triggerPoint = session.GetTriggerPoint(session.TextView.TextSnapshot);

            if (!triggerPoint.HasValue)
            {
                applicableToSpan = null;
                return;
            }

            int pos = triggerPoint.Value.Position;

            if (PackageCompletionSource.IsInRangeForPackageCompletion(session.TextView.TextSnapshot, pos, out Span s, out string packageId, out string packageVersion, out string type))
            {
                string text = session.TextView.TextBuffer.CurrentSnapshot.GetText();
                int    targetFrameworkElementStartIndex  = text.IndexOf("<TargetFramework>", StringComparison.OrdinalIgnoreCase);
                int    targetFrameworksElementStartIndex = text.IndexOf("<TargetFrameworks>", StringComparison.OrdinalIgnoreCase);
                string tfm = "netcoreapp1.0";

                if (targetFrameworksElementStartIndex > -1)
                {
                    int    closeTfms = text.IndexOf("</TargetFrameworks>", targetFrameworksElementStartIndex);
                    int    realStart = targetFrameworksElementStartIndex + "<TargetFrameworks>".Length;
                    string allTfms   = text.Substring(realStart, closeTfms - realStart);
                    tfm = allTfms.Split(';')[0];
                }
                else if (targetFrameworkElementStartIndex > -1)
                {
                    int closeTfm  = text.IndexOf("</TargetFramework>", targetFrameworkElementStartIndex);
                    int realStart = targetFrameworkElementStartIndex + "<TargetFramework>".Length;
                    tfm = text.Substring(realStart, closeTfm - realStart);
                }

                applicableToSpan = session.TextView.TextBuffer.CurrentSnapshot.CreateTrackingSpan(s, SpanTrackingMode.EdgeInclusive);
                quickInfoContent.Add(new PackageInfoControl(packageId, packageVersion, tfm, _searchManager));
                return;
            }

            applicableToSpan = null;
        }