diff --git a/internal/dag/dag.go b/internal/dag/dag.go index 2e81627dbaf7..0ff3c70d4220 100644 --- a/internal/dag/dag.go +++ b/internal/dag/dag.go @@ -31,14 +31,21 @@ func (g *AcyclicGraph) DirectedGraph() Grapher { // Returns a Set that includes every Vertex yielded by walking down from the // provided starting Vertex v. -func (g *AcyclicGraph) Ancestors(v Vertex) (Set, error) { +func (g *AcyclicGraph) Ancestors(vs ...Vertex) (Set, error) { s := make(Set) memoFunc := func(v Vertex, d int) error { s.Add(v) return nil } - if err := g.DepthFirstWalk(g.downEdgesNoCopy(v), memoFunc); err != nil { + start := make(Set) + for _, v := range vs { + for _, dep := range g.downEdgesNoCopy(v) { + start.Add(dep) + } + } + + if err := g.DepthFirstWalk(start, memoFunc); err != nil { return nil, err } @@ -47,14 +54,21 @@ func (g *AcyclicGraph) Ancestors(v Vertex) (Set, error) { // Returns a Set that includes every Vertex yielded by walking up from the // provided starting Vertex v. -func (g *AcyclicGraph) Descendents(v Vertex) (Set, error) { +func (g *AcyclicGraph) Descendents(vs ...Vertex) (Set, error) { s := make(Set) memoFunc := func(v Vertex, d int) error { s.Add(v) return nil } - if err := g.ReverseDepthFirstWalk(g.upEdgesNoCopy(v), memoFunc); err != nil { + start := make(Set) + for _, v := range vs { + for _, dep := range g.upEdgesNoCopy(v) { + start.Add(dep) + } + } + + if err := g.ReverseDepthFirstWalk(start, memoFunc); err != nil { return nil, err } diff --git a/internal/terraform/transform_reference.go b/internal/terraform/transform_reference.go index 77549ad6084f..cd525e07e14f 100644 --- a/internal/terraform/transform_reference.go +++ b/internal/terraform/transform_reference.go @@ -437,17 +437,18 @@ func (m ReferenceMap) parentModuleDependsOn(g *Graph, depender graphNodeDependsO deps, fromParentModule := m.dependsOn(g, mod) for _, dep := range deps { - // add the dependency - res = append(res, dep) - - // and check any transitive resource dependencies for more resources - ans, _ := g.Ancestors(dep) - for _, v := range ans { - if isDependableResource(v) { - res = append(res, v) - } + if isDependableResource(dep) { + res = append(res, dep) } } + + ans, _ := g.Ancestors(deps...) + for _, v := range ans { + if isDependableResource(v) { + res = append(res, v) + } + } + fromModule = fromModule || fromParentModule }