Я создал roslyn CodeAnalyzer и CodeFixProvider.Roslyn CodeFixProvider дает ошибку VS 2015
Анализатор работает нормально и создает правило, но когда я пытаюсь открыть всплывающее окно с указанием исправления, я получаю сообщение «Произошла одна или несколько ошибок» Вс всплывающее окно.
Первый раз, когда я запустил его, он работал нормально, но затем я остановил отладку, после чего он дал мне эту ошибку, поэтому я попробовал на другом компьютере, и снова он отлично работал в первый раз, когда я отлаживался.
Мой анализатор:
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 дает ошибку, а не в первый раз ...
Это значит, что у вас есть проблема с исправлением кода. Пройдите через него с помощью отладчика, и вы обнаружите, что он выбрасывает исключение. –
Используйте отладчик, чтобы найти фактическое исключение. – SLaks
Сообщение об исключении говорит «Невозможно передать объект типа« System.Reflection.RuntimeMethodInfo »для ввода« System.Reflection.ConstructorInfo ».» не знаю, где это делается, хотя – Joshlo