Hallo, im Gegensatz zu den anderen "visit" Methoden macht mir das "visit_If" ein paar Schwierigkeiten und es wäre großartig wenn man mir ein paar Tips geben könnte... Also, aktuell habe ich einen NodeVisitor der für Klassen, Methoden und Funktion das LOC speichern (inklusive Kommentaren). Der Lösungsweg ist hier noch einfach (Beispiel für eine Klasse): def visit_ClassDef(self, node): """ called when the AST library has detected a class definition in Python """ newClass = Class(node.name, node.lineno) self.objects.append(newClass) self.stack.append(newClass) self.generic_visit(node) self.stack.pop() newClass.lines = self.lineNr - newClass.lineNr Die letzte Zeile liefert mir die Berechnung für LOC - im generic_visit wird self.lineNr ständig aktualisiert. Leider haut das nicht hin für if/elif/else (visit_If). Alle drei entsprechen dem selben Typ und sind quasi ineinander geschachtelt und nicht etwa auf der gleichen Hierarchy Ebene. Das hat zur Folge: * daß das LOC für "else" stimmt * daß das LOC für "elif" das "LOC" von "else" enthält * daß das LOC für "if" das LOC" von "else" und "elif" enthält. Hier der analoge code wie bei der Klasse - aber wie gesagt - das LOC passt eben nicht: def visit_If(self, node): object = ControlStatement(ControlStatement.IF, node.lineno, node.col_offset) if len(self.stack) > 0: object.parent = self.stack[-1] if isinstance(self.stack[-1], Function) or isinstance(self.stack[-1], Method): self.stack[-1].cstms += 1 self.objects.append(object) ast.NodeVisitor.generic_visit(self, node) object.lines = self.lineNr - object.lineNr Hat da jemand eine Idee/Vorschläge? Schon mal Danke im Voraus, Thomas
participants (1)
-
Thomas Lehmann