提交 80203a0e 编写于 作者: H Heejae Chang

move comment token retrieve API to new API

上级 9d7f3ee5
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.ComponentModel;
using System.Composition;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editor.Implementation.TodoComments;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Options.Providers;
using Microsoft.VisualStudio.LanguageServices.Implementation.Options;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Roslyn.Utilities;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.TaskList
{
[ExportOptionSerializer(TodoCommentOptions.OptionName), Shared]
internal class CommentTaskTokenSerializer : IOptionSerializer
{
// it seems VS doesn't give a way to get notified if this setting gets changed.
// so we will only read it once and keep using it until next vs run
private readonly string _taskTokenList;
private readonly ITaskList _taskList;
private readonly IOptionService _optionService;
private string _lastCommentTokenCache = null;
[ImportingConstructor]
public CommentTaskTokenSerializer(SVsServiceProvider serviceProvider)
public CommentTaskTokenSerializer(
SVsServiceProvider serviceProvider, IOptionService optionService)
{
var tokenInfo = serviceProvider.GetService(typeof(SVsTaskList)) as IVsCommentTaskInfo;
_optionService = optionService;
_taskList = serviceProvider.GetService(typeof(SVsTaskList)) as ITaskList;
_lastCommentTokenCache = GetTaskTokenList(_taskList);
// The SVsTaskList may not be available (e.g. during "devenv /build")
_taskTokenList = tokenInfo != null ? GetTaskTokenList(tokenInfo) : string.Empty;
if (_taskList != null)
{
_taskList.PropertyChanged += OnPropertyChanged;
}
}
public bool TryFetch(OptionKey optionKey, out object value)
......@@ -37,7 +44,7 @@ public bool TryFetch(OptionKey optionKey, out object value)
return false;
}
value = _taskTokenList;
value = _lastCommentTokenCache;
return true;
}
......@@ -47,44 +54,49 @@ public bool TryPersist(OptionKey optionKey, object value)
return false;
}
public static string GetTaskTokenList(IVsCommentTaskInfo tokenInfo)
private void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
int tokenCount;
if (Succeeded(tokenInfo.TokenCount(out tokenCount)) && tokenCount > 0)
if (e.PropertyName != nameof(ITaskList.CommentTokens))
{
var tokens = new IVsCommentTaskToken[tokenCount];
var tokensEnum = default(IVsEnumCommentTaskTokens);
if (Succeeded(tokenInfo.EnumTokens(out tokensEnum)))
{
uint count;
if (Succeeded(tokensEnum.Next((uint)tokenCount, tokens, out count)))
{
Contract.Requires(tokenCount == count);
string text;
var priority = new VSTASKPRIORITY[1];
var result = new List<string>();
foreach (var token in tokens)
{
if (Succeeded(token.Text(out text)) &&
Succeeded(token.Priority(priority)) &&
!string.IsNullOrWhiteSpace(text))
{
result.Add(string.Format("{0}:{1}", text, (int)priority[0]));
}
}
return string.Join("|", result);
}
}
return;
}
var commentString = GetTaskTokenList(_taskList);
var optionSet = _optionService.GetOptions();
var optionValue = optionSet.GetOption(TodoCommentOptions.TokenList);
if (optionValue == commentString)
{
return;
}
return string.Empty;
// cache last result
_lastCommentTokenCache = commentString;
// let people to know that comment string has changed
_optionService.SetOptions(optionSet.WithChangedOption(TodoCommentOptions.TokenList, _lastCommentTokenCache));
}
private static bool Succeeded(int hr)
private static string GetTaskTokenList(ITaskList taskList)
{
return hr == VSConstants.S_OK;
var commentTokens = taskList?.CommentTokens;
if (commentTokens == null || commentTokens.Count == 0)
{
return string.Empty;
}
var result = new List<string>();
foreach (var commentToken in commentTokens)
{
if (string.IsNullOrWhiteSpace(commentToken.Text))
{
continue;
}
result.Add($"{commentToken.Text}:{((int)commentToken.Priority).ToString()}");
}
return string.Join("|", result);
}
}
}
......@@ -20,7 +20,7 @@
namespace Microsoft.VisualStudio.LanguageServices.Implementation.TaskList
{
[Export(typeof(VisualStudioTodoTaskList))]
internal partial class VisualStudioTodoTaskList : AbstractVisualStudioTaskList, IVsTaskListEvents
internal partial class VisualStudioTodoTaskList : AbstractVisualStudioTaskList
{
private readonly Dictionary<object, IVsTaskItem[]> _todoItemMap = new Dictionary<object, IVsTaskItem[]>();
private readonly IOptionService _optionService;
......@@ -142,22 +142,6 @@ private void UpdateTodoTaskList()
}, TaggerConstants.MediumDelay, this.Listener.BeginAsyncOperation("RefreshTaskList"));
}
public int OnCommentTaskInfoChanged()
{
var tokenInfo = ServiceProvider.GetService(typeof(SVsTaskList)) as IVsCommentTaskInfo;
var commentString = CommentTaskTokenSerializer.GetTaskTokenList(tokenInfo);
var optionSet = _optionService.GetOptions();
var optionValue = optionSet.GetOption(TodoCommentOptions.TokenList);
if (optionValue == commentString)
{
return VSConstants.S_OK;
}
_optionService.SetOptions(optionSet.WithChangedOption(TodoCommentOptions.TokenList, commentString));
return VSConstants.S_OK;
}
internal void TestOnly_Enable()
{
if (!ErrorListInstalled)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册