Roslyn CodeFixProvider给出了VS 2015错误

时间:2016-12-20 12:51:47

标签: c# visual-studio-2015 roslyn

我创建了一个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("", "");
}

按ctrl +时。关于“统计”...而且正是在这里VS2015给出了错误,而不是第一次......

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

不确定是什么问题,因为它只在调试中失败了。在debug

中运行时看起来像VS错误

答案 2 :(得分:0)

这也发生在我身上。 我试图在其他论坛找到一个没有运气的答案。 我的解决方法是增加vsixminifest版本号。

希望它有所帮助。 谢谢, Wilsade

相关问题