通过VS扩展找到项目中的特定模式

时间:2018-08-03 09:15:23

标签: .net vb.net visual-studio vsix

我目前正在寻找一种在我们的项目中查找特定模式的简便方法,因为我们的本地化确实很草率……如果解决方案是可以在错误列表中生成警告的Visual Studio扩展,那就太好了,这样每个团队成员都可以直接看到他/她缺少翻译。

我已开始使用以下示例研究扩展名:https://github.com/Microsoft/VSSDK-Extensibility-Samples/tree/master/ErrorList 但是我不确定这是否是正确的方法,以及如何将其与模式搜索结合而不是拼写错误。

任何帮助或想法都非常有用。

1 个答案:

答案 0 :(得分:0)

我可以帮助您在 Visual Studio错误列表中写错误(我在VS扩展中做到了),但是我不知道如何在项目中查找特定模式。要在 VS错误列表中编写内容,您需要使用 ErrorListProvider 。在我的实现中,我从 ErrorListProvider 继承并为“ ErrorWindowController”实现自己的行为。代码如下:

public class ErrorWindowController : ErrorListProvider
{

#region Constructor

/// <summary>
/// Instance Constructor
/// </summary>
/// <param name="aServiceProvider"></param>
public ErrorWindowController(IServiceProvider aIServiceProvider) : base(aIServiceProvider)
{
}

#endregion


#region Public Methods

// Use this to add a collection of custom errors in VS Error List
public void AddErrors(IEnumerable<ErrorModel> aErrors)
{
    SuspendRefresh();

    foreach (ErrorModel error in aErrors)
    {
      ErrorTask errorTask = new ErrorTask
      {
        ErrorCategory = error.Category,
        Document = error.FilePath,
        Text = error.Description,
        Line = error.Line - 1,
        Column = error.Column,
        Category = TaskCategory.BuildCompile,
        Priority = TaskPriority.High,
        HierarchyItem = error.HierarchyItem
      };
      errorTask.Navigate += ErrorTaskNavigate;
      Tasks.Add(errorTask);
    }

    BringToFront();
    ResumeRefresh();
}

// Remove all the errors from Error List which are depending of a project and this specific project is closed
// Or remove all the errors from Error List when the VS solution is closed
public void RemoveErrors(IVsHierarchy aHierarchy)
{
    SuspendRefresh();

    for (int i = Tasks.Count - 1; i >= 0; --i)
    {
      var errorTask = Tasks[i] as ErrorTask;
      aHierarchy.GetCanonicalName(Microsoft.VisualStudio.VSConstants.VSITEMID_ROOT, out string nameInHierarchy);
      errorTask.HierarchyItem.GetCanonicalName(Microsoft.VisualStudio.VSConstants.VSITEMID_ROOT, out string nameErrorTaskHierarchy);
      if (nameInHierarchy == nameErrorTaskHierarchy)
      {
        errorTask.Navigate -= ErrorTaskNavigate;
        Tasks.Remove(errorTask);
      }
    }

    ResumeRefresh();
}

// Remove all the errors from the Error List
public void Clear()
{
    Tasks.Clear();
}


#endregion


#region Private Methods

// This is optional
// Add navigation for your errors. 
private void ErrorTaskNavigate(object sender, EventArgs e)
{
  ErrorTask objErrorTask = (ErrorTask)sender;
  objErrorTask.Line += 1;
  bool bResult = Navigate(objErrorTask, new Guid(EnvDTE.Constants.vsViewKindCode));
  objErrorTask.Line -= 1;
}


#endregion
}

ErrorModel 非常简单:

public class ErrorModel
{
  #region Properties

  public string FilePath { get; set; }

  public int Line { get; set; }

  public int Column { get; set; }

  public TaskErrorCategory Category { get; set; }

  public string Description { get; set; }

  public IVsHierarchy HierarchyItem { get; set; }

  #endregion

}