Roslyn CodeFixProvider 给出 VS 2015 错误
Roslyn CodeFixProvider gives VS 2015 error
我已经创建了一个 roslyn CodeAnalyzer 和一个 CodeFixProvider。
分析器运行良好,并创建了规则,但是当我尝试打开显示修复的弹出窗口时,我得到一个 "One or more errors occurred" 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+ 时。在 "stat"... VS2015 就是在这里给出错误,这不是第一次...
不确定哪里出了问题,因为它只是在调试时失败了。当 运行 在 debug
时看起来像一个 VS bug
不知道为什么,但我发现删除 %localappdata%\Microsoft\VisualStudio.0Exp
文件夹会有帮助。
我也遇到过。
我试图在其他论坛中找到答案,但没有运气。
我的解决方法是增加 vsixminifest 版本号。
希望对您有所帮助。
谢谢,
威尔萨德
我已经创建了一个 roslyn CodeAnalyzer 和一个 CodeFixProvider。
分析器运行良好,并创建了规则,但是当我尝试打开显示修复的弹出窗口时,我得到一个 "One or more errors occurred" 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+ 时。在 "stat"... VS2015 就是在这里给出错误,这不是第一次...
不确定哪里出了问题,因为它只是在调试时失败了。当 运行 在 debug
时看起来像一个 VS bug不知道为什么,但我发现删除 %localappdata%\Microsoft\VisualStudio.0Exp
文件夹会有帮助。
我也遇到过。 我试图在其他论坛中找到答案,但没有运气。 我的解决方法是增加 vsixminifest 版本号。
希望对您有所帮助。 谢谢, 威尔萨德