2016-12-20 5 views
5

Я создал 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 дает ошибку, а не в первый раз ...

+0

Это значит, что у вас есть проблема с исправлением кода. Пройдите через него с помощью отладчика, и вы обнаружите, что он выбрасывает исключение. –

+1

Используйте отладчик, чтобы найти фактическое исключение. – SLaks

+0

Сообщение об исключении говорит «Невозможно передать объект типа« System.Reflection.RuntimeMethodInfo »для ввода« System.Reflection.ConstructorInfo ».» не знаю, где это делается, хотя – Joshlo

ответ

0

Не уверен, что случилось, так как это не удалось отладить. выглядел как ошибка VS при работе в отладке

2

Не знаю почему, но я обнаружил, что удаление папки %localappdata%\Microsoft\VisualStudio\14.0Exp помогает.

+0

Работал для меня с той же проблемой, но в VS 2017 RC. Путь в этом случае отличается, однако: 'C: \ Users \ Maxim \ AppData \ Local \ Microsoft \ VisualStudio \ 15.0_10df9108Roslyn' –

0

Это также произошло со мной. Я попытался найти ответ на других форумах без везения. Мое обходное средство увеличивало число версий vsixminifest.

Надеюсь, что это поможет. Спасибо, Wilsade

Смежные вопросы