diff options
| author | Ulf Magnusson <ulfalizer@gmail.com> | 2015-06-10 21:32:23 +0200 |
|---|---|---|
| committer | Ulf Magnusson <ulfalizer@gmail.com> | 2015-06-10 23:11:01 +0200 |
| commit | 799c2e630948144ccc58be0be1ca5c1c3369fc09 (patch) | |
| tree | 4cffa227d9af4e8ec7b86306e88a86e83107784e /kconfiglib.py | |
| parent | d6d4d5adb75aa8eff9fcf55fbb5d749d5f461774 (diff) | |
Clean up dependency propagation a bit.
- Break out common 'all_referenced_syms' and 'deps_from_containing'
calculations. Hadn't noticed they had converged.
- Calculate 'orig_deps' directly for Menus instead of juggling stuff back
and forth.
- Remove a useless 'if'. _make_and() already equates None with "y".
- Rearrange blocks, put prompt stuff first.
- Clarify that the parse_properties() handles propagation of
dependencies.
That's some very old code...
Diffstat (limited to 'kconfiglib.py')
| -rw-r--r-- | kconfiglib.py | 75 |
1 files changed, 33 insertions, 42 deletions
diff --git a/kconfiglib.py b/kconfiglib.py index 50c3e27..281cded 100644 --- a/kconfiglib.py +++ b/kconfiglib.py @@ -1095,7 +1095,8 @@ class Config(object): line_feeder.get_linenr()) def _parse_properties(self, line_feeder, stmt, deps, visible_if_deps): - """Parsing of properties for symbols, menus, choices, and comments.""" + """Parsing of properties for symbols, menus, choices, and comments. + Takes care of propagating dependencies from enclosing menus and ifs.""" def parse_val_and_cond(tokens, line, filename, linenr): """Parses '<expr1> if <expr2>' constructs, where the 'if' part is @@ -1141,7 +1142,7 @@ class Config(object): parsed_deps = self._parse_expr(tokens, stmt, line, filename, linenr) if isinstance(stmt, (Menu, Comment)): - stmt.dep_expr = _make_and(stmt.dep_expr, parsed_deps) + stmt.orig_deps = _make_and(stmt.orig_deps, parsed_deps) else: depends_on_expr = _make_and(depends_on_expr, parsed_deps) @@ -1309,27 +1310,35 @@ class Config(object): self.end_line_tokens = tokens break - # Propagate dependencies from enclosing menus and ifs. + # Done parsing properties. Now propagate 'depends on' and enclosing + # menu/if dependencies to expressions. - # For menus and comments.. - if isinstance(stmt, (Menu, Comment)): - stmt.orig_deps = stmt.dep_expr - stmt.deps_from_containing = deps - stmt.dep_expr = _make_and(stmt.dep_expr, deps) + # The set of symbols referenced directly by the statement plus all + # symbols referenced by enclosing menus and ifs + stmt.all_referenced_syms = stmt.referenced_syms | _get_expr_syms(deps) - stmt.all_referenced_syms = \ - stmt.referenced_syms | _get_expr_syms(deps) + # Save original dependencies from enclosing menus and ifs + stmt.deps_from_containing = deps - # For symbols and choices.. + if isinstance(stmt, (Menu, Comment)): + stmt.dep_expr = _make_and(stmt.orig_deps, deps) else: + # Symbol or Choice # See comment for 'menu_dep' stmt.menu_dep = depends_on_expr - # Propagate dependencies specified with 'depends on' to any new - # default expressions, prompts, and selections. ("New" since a - # symbol might be defined in multiple places and the dependencies - # should only apply to the local definition.) + # Propagate 'depends on' dependencies to any new default + # expressions, prompts, and selections. ("New" since a symbol might + # be defined in multiple places and the dependencies should only + # apply to the local definition.) + + if new_prompt is not None: + # 'visible if' dependencies from enclosing menus get propagated + # to prompts + prompt, cond_expr = new_prompt + cond_expr = _make_and(cond_expr, visible_if_deps) + new_prompt = (prompt, _make_and(cond_expr, depends_on_expr)) new_def_exprs = [(val_expr, _make_and(cond_expr, depends_on_expr)) for val_expr, cond_expr in new_def_exprs] @@ -1337,37 +1346,23 @@ class Config(object): new_selects = [(target, _make_and(cond_expr, depends_on_expr)) for target, cond_expr in new_selects] - if new_prompt is not None: - prompt, cond_expr = new_prompt - - # 'visible if' dependencies from enclosing menus get propagated - # to prompts - if visible_if_deps is not None: - cond_expr = _make_and(cond_expr, visible_if_deps) - - new_prompt = (prompt, _make_and(cond_expr, depends_on_expr)) - - # We save the original expressions -- before any menu and if - # conditions have been propagated -- so these can be retrieved - # later. + # Save the original expressions before any menu/if conditions have + # been propagated so they can be retrieved later - stmt.orig_def_exprs.extend(new_def_exprs) if new_prompt is not None: stmt.orig_prompts.append(new_prompt) - # Only symbols can select + stmt.orig_def_exprs.extend(new_def_exprs) + if isinstance(stmt, Symbol): + # Only symbols can select stmt.orig_selects.extend(new_selects) - # Save dependencies from enclosing menus and ifs - stmt.deps_from_containing = deps - - # The set of symbols referenced directly by the symbol/choice plus - # all symbols referenced by enclosing menus and ifs. - stmt.all_referenced_syms = \ - stmt.referenced_syms | _get_expr_syms(deps) + # Propagate menu/if dependencies to finalize the dependencies - # Propagate dependencies from enclosing menus and ifs + if new_prompt is not None: + stmt.prompts.append((new_prompt[0], + _make_and(new_prompt[1], deps))) stmt.def_exprs.extend([(val_expr, _make_and(cond_expr, deps)) for val_expr, cond_expr in new_def_exprs]) @@ -1377,10 +1372,6 @@ class Config(object): _make_and(stmt, _make_and(cond, deps))) - if new_prompt is not None: - prompt, cond_expr = new_prompt - stmt.prompts.append((prompt, _make_and(cond_expr, deps))) - # # Symbol table manipulation # |
