Roslyn CodeFixProvider导致VS 2015错误

5
我创建了一个Roslyn CodeAnalyzer和CodeFixProvider。
分析器运行良好,并创建规则,但是当我尝试打开显示修复的弹出窗口时,会出现“一个或多个错误发生”的VS弹出窗口。
第一次运行它时,它工作正常,但是之后我停止了调试,然后它给了我那个错误,所以我在另一台电脑上尝试,再次第一次调试时它正常工作。
我的分析器:
private static void Analyze(SyntaxNodeAnalysisContext context)
{
    var localDeclaration = (LocalDeclarationStatementSyntax)context.Node;

    foreach (var variable in localDeclaration.Declaration.Variables)
    {
        var initializer = variable.Initializer;
        if (initializer == null) return;
    }

    var node = context.Node;

    while (node.Kind() != SyntaxKind.MethodDeclaration)
    {
        node = node.Parent;
    }

    var method = (MethodDeclarationSyntax)node;

    if (method.AttributeLists.Any(x => x.Attributes.Any(y => y.Name is IdentifierNameSyntax && ((IdentifierNameSyntax)y.Name).Identifier.Text.ToLower().Contains("test"))))
    {
        context.ReportDiagnostic(Diagnostic.Create(Rule, context.Node.GetLocation()));
    }
}

我的 CodeFixProvider

private async Task<Document> AddAssertionsAsync(Document document, LocalDeclarationStatementSyntax localDeclaration, CancellationToken cancellationToken)
{
    var editor = await DocumentEditor.CreateAsync(document, cancellationToken);

    var assert = SyntaxFactory.IdentifierName("Assert");
    var areEqual = SyntaxFactory.IdentifierName("AreEqual");

    var memberAccess = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, assert,
            areEqual);

    var firstArgument = SyntaxFactory.Argument(SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(@"")));
    var secondArgument = SyntaxFactory.Argument(SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(@"")));

    var argumentList = SyntaxFactory.SeparatedList<ArgumentSyntax>(
        new SyntaxNodeOrToken[] {
            firstArgument,
            SyntaxFactory.Token(SyntaxKind.CommaToken),
            secondArgument
        });

    var assertToken =
        SyntaxFactory.ExpressionStatement(
        SyntaxFactory.InvocationExpression(memberAccess,
        SyntaxFactory.ArgumentList(argumentList)));

    editor.InsertAfter(localDeclaration, assertToken);
    var newDocument = editor.GetChangedDocument();

    return newDocument;
}

我想要实现的目标是

[Test]
public void blah()
{
    var stat = string.Empty;
}

成为
[Test]
public void blah()
{
    var stat = string.Empty;
    Assert.AreEqual("", "");
}

当您在“stat”上按下ctrl + .时......就是在这里,VS2015会给出错误提示,但不是第一次......

这意味着你的代码可能存在问题。使用调试器逐步执行代码,你会发现它在某个地方抛出了异常。 - Jeroen Vannevel
1
使用调试器查找实际异常。 - SLaks
异常消息显示“无法将类型为'System.Reflection.RuntimeMethodInfo'的对象转换为类型'System.Reflection.ConstructorInfo'。”不确定在哪里进行了该转换。 - Joshlo
3个回答

2

我不知道为什么,但我发现删除%localappdata%\Microsoft\VisualStudio\14.0Exp文件夹会有所帮助。


我也遇到了同样的问题,但是在VS 2017 RC中解决了。不过,在这种情况下路径是不同的:C:\Users\Maxim\AppData\Local\Microsoft\VisualStudio\15.0_10df9108Roslyn - Maxim Kamalov

0
不确定出了什么问题,因为只有在调试时才失败。看起来像是在调试模式下运行时的一个VS错误。

0

我也遇到了相同的问题。 我在其他论坛上尝试寻找答案,但都没有成功。 我的解决方法是增加 vsixminifest 版本号。

希望能对您有所帮助。 谢谢, Wilsade


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接