diff options
Diffstat (limited to 'bitbake/lib/bb/codeparser.py')
-rw-r--r-- | bitbake/lib/bb/codeparser.py | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/bitbake/lib/bb/codeparser.py b/bitbake/lib/bb/codeparser.py index 116481559a..6e34eff999 100644 --- a/bitbake/lib/bb/codeparser.py +++ b/bitbake/lib/bb/codeparser.py | |||
@@ -1,6 +1,7 @@ | |||
1 | import ast | 1 | import ast |
2 | import codegen | 2 | import codegen |
3 | import logging | 3 | import logging |
4 | import collections | ||
4 | import os.path | 5 | import os.path |
5 | import bb.utils, bb.data | 6 | import bb.utils, bb.data |
6 | from itertools import chain | 7 | from itertools import chain |
@@ -35,7 +36,7 @@ def check_indent(codestr): | |||
35 | 36 | ||
36 | class CodeParserCache(MultiProcessCache): | 37 | class CodeParserCache(MultiProcessCache): |
37 | cache_file_name = "bb_codeparser.dat" | 38 | cache_file_name = "bb_codeparser.dat" |
38 | CACHE_VERSION = 3 | 39 | CACHE_VERSION = 4 |
39 | 40 | ||
40 | def __init__(self): | 41 | def __init__(self): |
41 | MultiProcessCache.__init__(self) | 42 | MultiProcessCache.__init__(self) |
@@ -122,7 +123,11 @@ class PythonParser(): | |||
122 | name = self.called_node_name(node.func) | 123 | name = self.called_node_name(node.func) |
123 | if name in self.getvars or name in self.containsfuncs: | 124 | if name in self.getvars or name in self.containsfuncs: |
124 | if isinstance(node.args[0], ast.Str): | 125 | if isinstance(node.args[0], ast.Str): |
125 | self.references.add(node.args[0].s) | 126 | varname = node.args[0].s |
127 | if name in self.containsfuncs and isinstance(node.args[1], ast.Str): | ||
128 | self.contains[varname].add(node.args[1].s) | ||
129 | else: | ||
130 | self.references.add(node.args[0].s) | ||
126 | else: | 131 | else: |
127 | self.warn(node.func, node.args[0]) | 132 | self.warn(node.func, node.args[0]) |
128 | elif name in self.execfuncs: | 133 | elif name in self.execfuncs: |
@@ -148,6 +153,7 @@ class PythonParser(): | |||
148 | 153 | ||
149 | def __init__(self, name, log): | 154 | def __init__(self, name, log): |
150 | self.var_execs = set() | 155 | self.var_execs = set() |
156 | self.contains = collections.defaultdict(set) | ||
151 | self.execs = set() | 157 | self.execs = set() |
152 | self.references = set() | 158 | self.references = set() |
153 | self.log = BufferedLogger('BitBake.Data.%s' % name, logging.DEBUG, log) | 159 | self.log = BufferedLogger('BitBake.Data.%s' % name, logging.DEBUG, log) |
@@ -161,14 +167,15 @@ class PythonParser(): | |||
161 | if h in codeparsercache.pythoncache: | 167 | if h in codeparsercache.pythoncache: |
162 | self.references = codeparsercache.pythoncache[h]["refs"] | 168 | self.references = codeparsercache.pythoncache[h]["refs"] |
163 | self.execs = codeparsercache.pythoncache[h]["execs"] | 169 | self.execs = codeparsercache.pythoncache[h]["execs"] |
170 | self.contains = codeparsercache.pythoncache[h]["contains"] | ||
164 | return | 171 | return |
165 | 172 | ||
166 | if h in codeparsercache.pythoncacheextras: | 173 | if h in codeparsercache.pythoncacheextras: |
167 | self.references = codeparsercache.pythoncacheextras[h]["refs"] | 174 | self.references = codeparsercache.pythoncacheextras[h]["refs"] |
168 | self.execs = codeparsercache.pythoncacheextras[h]["execs"] | 175 | self.execs = codeparsercache.pythoncacheextras[h]["execs"] |
176 | self.contains = codeparsercache.pythoncacheextras[h]["contains"] | ||
169 | return | 177 | return |
170 | 178 | ||
171 | |||
172 | code = compile(check_indent(str(node)), "<string>", "exec", | 179 | code = compile(check_indent(str(node)), "<string>", "exec", |
173 | ast.PyCF_ONLY_AST) | 180 | ast.PyCF_ONLY_AST) |
174 | 181 | ||
@@ -181,6 +188,7 @@ class PythonParser(): | |||
181 | codeparsercache.pythoncacheextras[h] = {} | 188 | codeparsercache.pythoncacheextras[h] = {} |
182 | codeparsercache.pythoncacheextras[h]["refs"] = self.references | 189 | codeparsercache.pythoncacheextras[h]["refs"] = self.references |
183 | codeparsercache.pythoncacheextras[h]["execs"] = self.execs | 190 | codeparsercache.pythoncacheextras[h]["execs"] = self.execs |
191 | codeparsercache.pythoncacheextras[h]["contains"] = self.contains | ||
184 | 192 | ||
185 | class ShellParser(): | 193 | class ShellParser(): |
186 | def __init__(self, name, log): | 194 | def __init__(self, name, log): |