【问题标题】:Visual Studio - Subscribe Light Bulb click EventVisual Studio - 订阅灯泡点击事件
【发布时间】:2020-05-19 01:33:47
【问题描述】:

我正在为 Visual Studio 开发代码修复程序。我有一个“带有代码修复的分析器”项目,并且我已将自动生成的便携式项目转换为标准 C# 库项目。

在我的扩展程序中,代码修复会生成一个收集了数据的文件,问题是当我将鼠标悬停在灯泡修复建议上时会立即生成该文件,即执行我注册的代码修复。

// Register a code action that will invoke the fix.
context.RegisterCodeFix(
     CodeAction.Create(
        title: Title,
        createChangedDocument: c => MakeDataDrivenAsync(context.Document, methodDeclaration, c),
        equivalenceKey: Title),
      diagnostic);

我希望它仅在我单击建议(接受它)时生成文件。

这可能吗? 我正在考虑订阅建议点击事件,但我不知道如何,并且我没有找到表明这是可能的信息。

【问题讨论】:

    标签: c# visual-studio roslyn vsix


    【解决方案1】:

    我听从了 SLaks 的建议。它工作正常。 使用示例:

    SourceText st = SourceText.From(csv.GetStringDocument(), Encoding.UTF8);
    var additionalDoc = doc.Project.AddAdditionalDocument(filename, st, new List<string> { "_TestData" });
    return additionalDoc.Project.Solution;
    

    sourceroslyn.io

    缺点(或没有)是将文件添加到项目中(在我的情况下这很好)。

    【讨论】:

    • 如果将文件添加到项目中没有问题,这是一个很好的解决方案,是的。否则我有一个类似的问题,我希望某些代码仅在不在预览中时执行,我想出了一个CustomCodeAction,你可以see on my question here。也许这对您的解决方案还不够的未来读者有所帮助。
    • 我最终也这样做了@Wolfsblvt。谢谢你写它。我最初没有写那是因为它不是我最初问题的直接答案。这无疑是解决问题的最佳方法。
    • 是的,我也没有找到任何好的信息,这就是为什么我认为如果我发布我的解决方案会很酷,这样未来的人会找到它并可以获得帮助而无需搜索稀疏几个小时的来源。
    【解决方案2】:

    每当生成预览时,Roslyn API 都会执行您的代码修复。如果您使用 System.IO 生成文件,那么 Roslyn 几乎无能为力,但是如果您创建一个新文档并使用 Roslyn api 添加它,则该文件不会持久保存到磁盘,直到在 IDE 中执行代码修复(而不是在预览中)。请参阅MoveTypeEditor,它需要在当前项目中创建新文档才能将类型移入。

    【讨论】:

    • 只有当我生成的文档是代码时,对吧?我并没有真正生成代码。 (但很高兴知道它,非常有用)
    • 如果您的代码修复是在文件系统上创建文件,而 roslyn 对此一无所知,那么您将需要编写和扩展来创建与 roslyn 基础架构完全断开的灯泡会话。查看this 示例了解如何执行此操作。
    • 或者你可以创建一个AdditionalDocument
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2019-03-15
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多