3 Stimmen

Endlosschleife bei der Codeanalyse mit FxCop Introspection

Ich versuche, eine benutzerdefinierte FxCop-Codeanalyseregel zu schreiben zu schreiben, die Entwickler vor Methoden warnt, die zu tief verschachtelte Codeblöcke enthalten, und sie auffordert, das Chaos zu beseitigen.

ex. Ich versuche, die folgende Situation zu vermeiden:

if(condition)
{
   foreach(var item in items)
   {
       if(anotherCondition)
       {
           for(var product in item.Products)
           {
               // even more nested statement blocks...
           }
       }
   }
}

Ich erhalte einen Stackoverflow, wenn ich die VisitBlock(Block block) Methode
die die Tiefe des Blocks zählt, denn offenbar gibt es eine zyklische Referenz von einer der Eigenschaften des Blocks auf den Block selbst. d.h. für ein gewisses i ist folgendes wahr: block.Statements[i] == block

Warum gibt es einen solchen zyklischen Bezug? Wie kann man ihn vermeiden? Vielen Dank!

0voto

Paul Punkte 1727

Nach weiteren Recherchen habe ich herausgefunden, dass ich eigentlich ZWEI Hauptprobleme hatte

  1. Die VisitXXX-Methoden besuchen keine Knoten in einem abstrakten Syntaxbaum der Quellcode sondern besuchen tatsächlich Knoten in der generierten AWL. Vergleichen Sie einfach die generierten AWL-Anweisungen pro Methode und die generierten Anweisungen pro method.Body.
    Ich frage mich, was wir hätten erreichen können, wenn FxCop uns einen echten AST-Besucher zur Verfügung stellen könnte?
  2. Um meine anfängliche Frage zu beantworten: Um Entwickler davon abzuhalten, zu viele verschachtelte Codeblöcke zu schreiben, sollten wir den Methodencode einfach selbst scannen, d.h. die Start- und Endzeile innerhalb der SourceContext Eigenschaft der method.Body und behalten Sie den Überblick über alle '{' und '}', die wir finden. Erhöhen Sie den Zähler für '{' und verringern Sie ihn für '}'. Das sollte doch funktionieren, oder?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X