2016-12-20 15 views
5

Stworzyłem Roslyn CodeAnalyzer i CodeFixProvider.Roslyn CodeFixProvider daje błąd VS 2015

Analizator działa poprawnie i tworzy regułę, ale gdy próbuję otworzyć popup pokazujący poprawkę, otrzymuję komunikat "Wystąpił jeden lub więcej błędów" Wyskakujące okienko VS.

Po raz pierwszy uruchomiłem go, działało dobrze, ale potem przestałem debugować i po tym dało mi to błąd, więc próbowałem na innym komputerze i znowu działało dobrze po raz pierwszy debugowane.

My Analyzer:

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())); 
    } 
} 

My 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; 
} 

Co Próbuję achive jest

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

Staje

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

Po naciśnięciu Ctrl +. na "stat" ... I to tutaj VS2015 daje błąd, po prostu nie pierwszy raz ...

+0

To oznacza, że ​​prawdopodobnie problem dotyczy poprawki kodu. Przejdź przez niego z debuggerem, a zobaczysz, że gdzieś wyrzuca wyjątek. –

+1

Użyj debugera, aby znaleźć rzeczywisty wyjątek. – SLaks

+0

Komunikat o wyjątku mówi "Nie można rzucić obiektu typu" System.Reflection.RuntimeMethodInfo ", aby wpisać" System.Reflection.ConstructorInfo "." nie jestem pewien, gdzie ta obsada jest wykonana – Joshlo

Odpowiedz

0

Nie jestem pewien, co było nie tak, ponieważ nie powiodło się w debugowaniu. wyglądał jak błąd VS podczas uruchamiania debugowania

2

Nie wiem dlaczego, ale odkryłem, że usunięcie folderu pomaga.

+0

Pracowałem dla mnie z tym samym problemem, ale w VS 2017 RC. Ścieżka w tym przypadku jest jednak inna: 'C: \ Users \ Maxim \ AppData \ Local \ Microsoft \ VisualStudio \ 15.0_10df9108Roslyn'' –

0

To również stało się ze mną. Próbowałem znaleźć odpowiedź na innych forach bez powodzenia. Moje obejście polegało na zwiększeniu numeru wersji vsixminifest.

Mam nadzieję, że to pomaga. Dzięki, Wilsade

Powiązane problemy