2016-12-20 7 views
5
私はロズリンCodeAnalyzerとCodeFixProviderを作成した

を与えます。ロスリンCodeFixProviderは、VS 2015のエラー

アナライザーは正常に動作し、ルールを作成しますが、修正を示すポップアップを開くときに「1つ以上のエラーが発生しました」 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; 
} 

私はachiveしようとしている何が

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

[Test] 
public void blah() 
{ 
    var stat = string.Empty; 
    Assert.AreEqual("", ""); 
} 
0になります

Ctrl +を押したとき。 「STAT」に...そして、それはVS2015は、エラーだけではない最初の時間...それが唯一のデバッグに失敗しているので、間違っていたかわからない

+0

。デバッガでステップ実行すると、どこかで例外がスローされることがわかります。 –

+1

実際の例外を見つけるには、デバッガを使用します。 – SLaks

+0

例外メッセージに「 'System.Reflection.ConstructorInfo'を入力するために、 'System.Reflection.RuntimeMethodInfo'タイプのオブジェクトをキャストできません」というメッセージが表示されます。しかし、そのキャストはどこに作られているかわからない – Joshlo

答えて

0

を与えることをここにあります。

2

をデバッグで実行しているとき、なぜ分からないのですが、私は%localappdata%\Microsoft\VisualStudio\14.0Expフォルダを削除することができますことを発見したVSのバグのように見えました。

+0

同じ問題がVS 2017 RCで私のために働いた。この場合のパスは 'C:\ Users \ Maxim \ AppData \ Local \ Microsoft \ VisualStudio \ 15.0_10df9108Roslyn'です。 –

0

また、私と一緒に起こりました。 私は運がない他のフォーラムで答えを見つけようとしました。 私の回避策は、vsixminifestのバージョン番号を増やしていました。

希望します。 おかげで、あなたのコードの修正で問題はおそらくあります意味 Wilsade