-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathRULE_A_3_avoid_too_deep_blocks.py
146 lines (114 loc) · 2.45 KB
/
RULE_A_3_avoid_too_deep_blocks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
"""
Avoid too deep blocks(4).
If the block depth in the function is more than 4, it reports a violation.
== Violation ==
void f() {
{{{{{ <== Violation. Too deep. it's more than 4 blocks
}}}}}
}
== Good ==
void f() {
{{{{ <== OK!
}}}}
}
"""
from nsiqcppstyle_reporter import *
from nsiqcppstyle_rulehelper import *
from nsiqcppstyle_rulemanager import *
from nsiqunittest.nsiqcppstyle_unittestbase import *
depth = 0
reported = False
def RunRule(lexer, contextStack):
global depth
global reported
t = lexer.GetCurToken()
if t.type == "LBRACE":
depth += 1
if depth > 5 and not reported:
nsiqcppstyle_reporter.Error(
t,
__name__,
"Do not make too deep block(%d) ({). It makes not readable code" % depth,
)
reported = True
elif t.type == "RBRACE":
depth -= 1
def RunFunctionScopeRule(lexer, fullName, decl, contextStack, context):
global depth
global reported
reported = False
depth = 0
ruleManager.AddFunctionNameRule(RunFunctionScopeRule)
ruleManager.AddFunctionScopeRule(RunRule)
##########################################################################
# Unit Test
##########################################################################
class testRule(nct):
def setUpRule(self):
ruleManager.AddFunctionNameRule(RunFunctionScopeRule)
ruleManager.AddFunctionScopeRule(RunRule)
def test1(self):
self.Analyze(
"thisfile.c",
"""
void func1() {
{{{{{{{
}}}}}}}
}
""",
)
self.ExpectError(__name__)
def test2(self):
self.Analyze(
"thisfile.c",
"""
void func1() {
{{{
#define {{{{ }}}
}}}}
}
""",
)
self.ExpectSuccess(__name__)
def test3(self):
self.Analyze(
"thisfile.c",
"""
void func(void)
{
if (...)
{ // depth-1
{ // depth-2
{ // depth-3
{ // depth-4
printf("...");
}
}
}
}
}
""",
)
self.ExpectSuccess(__name__)
def test4(self):
self.Analyze(
"thisfile.c",
"""
void func(void)
{
if (...)
{ // depth-1
{ // depth-2
{ // depth-3
{ // depth-4
{ // depth-5
printf("...");
}
}
}
}
}
}
""",
)
self.ExpectError(__name__)