summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/test/packages.py4
-rw-r--r--lib/spack/spack/util/package_hash.py15
2 files changed, 19 insertions, 0 deletions
diff --git a/lib/spack/spack/test/packages.py b/lib/spack/spack/test/packages.py
index c811f9040e..299c56481e 100644
--- a/lib/spack/spack/test/packages.py
+++ b/lib/spack/spack/test/packages.py
@@ -98,6 +98,10 @@ class TestPackage(object):
assert spec1.package.content_hash(content=content1) != \
spec2.package.content_hash(content=content2)
+ def test_parse_dynamic_function_call(self):
+ spec = Spec("hash-test4").concretized()
+ spec.package.content_hash()
+
# Below tests target direct imports of spack packages from the
# spack.pkg namespace
def test_import_package(self):
diff --git a/lib/spack/spack/util/package_hash.py b/lib/spack/spack/util/package_hash.py
index f689aa9710..adea1a498b 100644
--- a/lib/spack/spack/util/package_hash.py
+++ b/lib/spack/spack/util/package_hash.py
@@ -41,8 +41,23 @@ class RemoveDirectives(ast.NodeTransformer):
self.spec = spec
def is_directive(self, node):
+ """Check to determine if the node is a valid directive
+
+ Directives are assumed to be represented in the AST as a named function
+ call expression. This means that they will NOT be represented by a
+ named function call within a function call expression (e.g., as
+ callbacks are sometimes represented).
+
+ Args:
+ node (AST): the AST node being checked
+
+ Returns:
+ (bool): ``True`` if the node represents a known directive,
+ ``False`` otherwise
+ """
return (isinstance(node, ast.Expr) and
node.value and isinstance(node.value, ast.Call) and
+ isinstance(node.value.func, ast.Name) and
node.value.func.id in spack.directives.__all__)
def is_spack_attr(self, node):