Skip to content

Commit bfd61fb

Browse files
committed
KeywordBear: Simplify and optimize using regex
Earlier we looped over each keyword and over each file. We now use regex with the OR condition, so that just 1 regex parse over the whole file is needed.
1 parent 35140b4 commit bfd61fb

File tree

1 file changed

+16
-27
lines changed

1 file changed

+16
-27
lines changed

bears/general/KeywordBear.py

+16-27
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import re
2+
13
from coalib.bearlib import deprecate_settings
24
from coalib.bears.LocalBear import LocalBear
35
from coalib.results.Result import RESULT_SEVERITY, Result
@@ -19,32 +21,19 @@ def run(self, filename, file, keywords: list):
1921
A list of keywords to search for (case insensitive).
2022
Usual examples are TODO and FIXME.
2123
'''
22-
results = list()
23-
24-
for i in range(len(keywords)):
25-
keywords[i] = keywords[i].lower()
24+
keywords_regex = re.compile(
25+
'(' + '|'.join(re.escape(key) for key in keywords) + ')',
26+
re.IGNORECASE)
2627

2728
for line_number, line in enumerate(file):
28-
for keyword in keywords:
29-
results += self.check_line_for_keyword(line.lower(),
30-
filename,
31-
line_number,
32-
keyword)
33-
34-
return results
35-
36-
def check_line_for_keyword(self, line, filename, line_number, keyword):
37-
pos = line.find(keyword)
38-
if pos != -1:
39-
return [Result.from_values(
40-
origin=self,
41-
message="The line contains the keyword `{}`."
42-
.format(keyword),
43-
file=filename,
44-
line=line_number + 1,
45-
column=pos + 1,
46-
end_line=line_number + 1,
47-
end_column=pos + len(keyword) + 1,
48-
severity=RESULT_SEVERITY.INFO)]
49-
50-
return []
29+
for keyword in keywords_regex.finditer(line):
30+
yield Result.from_values(
31+
origin=self,
32+
message="The line contains the keyword '{}'."
33+
.format(keyword.group()),
34+
file=filename,
35+
line=line_number + 1,
36+
column=keyword.start() + 1,
37+
end_line=line_number + 1,
38+
end_column=keyword.end() + 1,
39+
severity=RESULT_SEVERITY.INFO)

0 commit comments

Comments
 (0)