IPSIS_S04_METHOD.tcl
152 lines
| 4.7 KiB
| application/x-tcl
|
TclLexer
r2 | #!/usr/bin/tclsh | |||
# Naming conventions for methods | ||||
set methodRegex [getParameter "method-regex" {^[a-z][A-Za-z1-9]*$}] | ||||
proc createMachine {machineName initState} { | ||||
set machine [dict create name $machineName state $initState identifier "" bracesCounter 0 bracketCounter 0 angleBracketCounter 0] | ||||
return $machine | ||||
} | ||||
proc isClassMacro {value} { | ||||
set classMacroRegexp [getParameter "classmacro-regex" {}] | ||||
set classMacros { | ||||
"Q_OBJECT" | ||||
} | ||||
set isClassMacroByRegexp 0 | ||||
if {[string length $classMacroRegexp] != 0} { | ||||
set isClassMacroByRegexp [regexp $classMacroRegexp $value] | ||||
} | ||||
return [expr ([lsearch $classMacros $value] != -1) || $isClassMacroByRegexp] | ||||
} | ||||
proc isCppType {type value} { | ||||
set cppTypes { | ||||
"bool" | ||||
"char" | ||||
"int" | ||||
"float" | ||||
"double" | ||||
"void" | ||||
"wchart" | ||||
"identifier" | ||||
} | ||||
set valueIsClassMacro 0 | ||||
if {$type == "identifier"} { | ||||
set valueIsClassMacro [isClassMacro $value] | ||||
} | ||||
return [expr ([lsearch $cppTypes $type] != -1) && !$valueIsClassMacro] | ||||
} | ||||
set tokenFilter { | ||||
namespace | ||||
class | ||||
struct | ||||
leftbrace | ||||
rightbrace | ||||
leftparen | ||||
rightparen | ||||
less | ||||
greater | ||||
semicolon | ||||
identifier | ||||
colon_colon | ||||
assign | ||||
pp_define | ||||
bool | ||||
char | ||||
int | ||||
float | ||||
double | ||||
void | ||||
wchart | ||||
} | ||||
foreach fileName [getSourceFileNames] { | ||||
set machines [list] | ||||
# Check the functions at the root of the file | ||||
lappend machines [createMachine "method" "root"] | ||||
set lastIdentifier "" | ||||
set lastIdentifier2 "" | ||||
set prev1 "" | ||||
set prev2 "" | ||||
foreach token [getTokens $fileName 1 0 -1 -1 $tokenFilter] { | ||||
set type [lindex $token 3] | ||||
set line [lindex $token 1] | ||||
# Retrieve identifier value | ||||
if {$type == "identifier"} { | ||||
set lastIdentifier2 $lastIdentifier | ||||
set lastIdentifier [lindex $token 0] | ||||
} | ||||
# Start a method state machine when coming accross a namespace or a | ||||
# class/struct | ||||
if {$type == "namespace" || $type == "class" || $type == "struct"} { | ||||
lappend machines [createMachine "method" "beforeLeftBrace"] | ||||
} | ||||
set machinesToKeep [list] | ||||
foreach m $machines { | ||||
set keepMachine 1 | ||||
dict with m { | ||||
# Method | ||||
if {$name == "method"} { | ||||
if {$state == "beforeLeftBrace"} { | ||||
if {$type == "leftbrace"} { | ||||
set state "root" | ||||
} elseif {$type == "semicolon"} { | ||||
set keepMachine 0 | ||||
} | ||||
} elseif {$state == "root"} { | ||||
if {[isCppType $prev2 $lastIdentifier2] && $prev1 == "identifier" && $type == "leftparen"} { | ||||
if {![regexp $methodRegex $lastIdentifier]} { | ||||
report $fileName $line "The method names should match the following regex: $methodRegex (found: $lastIdentifier)" | ||||
} | ||||
} elseif {$type == "leftbrace"} { | ||||
set state "consumeBraces" | ||||
incr bracesCounter | ||||
} elseif {$type == "less"} { | ||||
set state "consumeAngleBracket" | ||||
incr angleBracketCounter | ||||
} elseif {$type == "rightbrace"} { | ||||
# End of the state machine | ||||
set keepMachine 0 | ||||
} | ||||
} elseif {$state == "consumeBraces"} { | ||||
if {$type == "leftbrace"} { | ||||
incr bracesCounter | ||||
} elseif {$type == "rightbrace"} { | ||||
incr bracesCounter -1 | ||||
if {$bracesCounter == 0} { | ||||
set state "root" | ||||
} | ||||
} | ||||
} elseif {$state == "consumeAngleBracket"} { | ||||
if {$type == "less"} { | ||||
incr angleBracketCounter | ||||
} elseif {$type == "greater"} { | ||||
incr angleBracketCounter -1 | ||||
if {$angleBracketCounter == 0} { | ||||
set state "root" | ||||
} | ||||
} | ||||
} | ||||
} | ||||
} | ||||
if {$keepMachine} { | ||||
lappend machinesToKeep $m | ||||
} | ||||
} | ||||
set machines $machinesToKeep | ||||
set prev2 $prev1 | ||||
set prev1 $type | ||||
} | ||||
} | ||||