#!/usr/bin/tclsh # namespace names should be recalled at the end of the namespace # namespace mynamespace { # } // mynamespace proc createNamespaceDict {} { return [dict create state "waitingForIdentifier" identifier "" bracesCounter 0] } foreach fileName [getSourceFileNames] { set namespaces [list] foreach token [getTokens $fileName 1 0 -1 -1 {namespace identifier leftbrace rightbrace semicolon cppcomment}] { set type [lindex $token 3] set namespacesToKeep [list] foreach n $namespaces { set keepNamespace 1 dict with n { if {$state == "waitingForIdentifier" && $type == "identifier"} { set state "waitingForLeftBrace" set identifier [lindex $token 0] } elseif {$state == "waitingForLeftBrace"} { if {$type == "semicolon"} { # Wasn't a namespace, remove the dict set keepNamespace 0 } elseif {$type == "leftbrace"} { set bracesCounter 0 set state "waitingForRightBrace" } } elseif {$state == "waitingForRightBrace"} { if {$type == "leftbrace"} { incr bracesCounter } elseif {$type == "rightbrace"} { if {$bracesCounter > 0} { incr bracesCounter -1 } else { set state "waitingForComment" } } } elseif {$state == "waitingForComment"} { if {$type == "cppcomment"} { set commentValue [lindex $token 0] # Check that the comment report the namespace name if {![regexp "\\m$identifier\\M" $commentValue]} { set line [lindex $token 1] set commentValue [string trim $commentValue] report $fileName $line "The namespace $identifier should have been recalled in the comment here (// $identifier). Comment found: $commentValue" } } else { # There should have been a comment here set line [lindex $token 1] report $fileName $line "The namespace $identifier should have been recalled in a comment here (// $identifier)" } # Namespace processed, remove it from the list set keepNamespace 0 } } if {$keepNamespace} { lappend namespacesToKeep $n } } set namespaces $namespacesToKeep # If the token is a namespace keyword, add a namespace dict for the next # foreach if {$type == "namespace"} { lappend namespaces [createNamespaceDict] } } }