summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Magnusson <ulfalizer@gmail.com>2015-06-10 21:32:23 +0200
committerUlf Magnusson <ulfalizer@gmail.com>2015-06-10 23:11:01 +0200
commit799c2e630948144ccc58be0be1ca5c1c3369fc09 (patch)
tree4cffa227d9af4e8ec7b86306e88a86e83107784e
parentd6d4d5adb75aa8eff9fcf55fbb5d749d5f461774 (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...
-rw-r--r--kconfiglib.py75
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
#