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)); } } }