fx icon indicating copy to clipboard operation
fx copied to clipboard

fx.Private yields incorrect fx.Dotgraph visualization

Open rossb83 opened this issue 2 years ago • 2 comments

Describe the bug The fx.Dotgraph displayed when visualizing the dependency graph is incorrect when using the new fx.Private variable.

To Reproduce For the following code it prints as expected "foo\nbar" meaning ModuleB has a dependency on ModuleA and ModuleC has a dependency on AnotherModuleA.

package main

import (
	"fmt"
	"go.uber.org/fx"
)

type A struct{ text string }
type B struct{ a *A }
type C struct{ a *A }

func NewA() *A           { return &A{"foo"} }
func AnotherNewA() *A    { return &A{"bar"} }
func NewB(a *A) *B       { return &B{a: a} }
func NewC(a *A, b *B) *C { return &C{a: a} }

var ModuleA = fx.Provide(NewA)
var AnotherModuleA = fx.Provide(fx.Annotate(AnotherNewA, fx.ResultTags(`name:"anotherA"`)))
var ModuleB = fx.Provide(NewB)
var ModuleC = fx.Provide(NewC)

func main() {
	fx.New(
		ModuleA,
		ModuleB,
		AnotherModuleA,
		fx.Module(
			"submodule",
			fx.Provide(
				fx.Annotate(func(a *A) *A {
					return a
				}, fx.ParamTags(`name:"anotherA"`)), fx.Private),
			ModuleC,
		),
		fx.Invoke(func(b *B, c *C, g fx.DotGraph) {
			fmt.Println(b.a.text)
			fmt.Println(c.a.text)
		}),
	)
}

Yet the fx.DotGraph printed looks like this where the incorrect edge is highlighted in red. graphviz (3)

Expected behavior My expectation is the dotgraph look like this again the corrected edge is highlighted in red. graphviz (4)

Additional Context While this bug is a subtle point, the visualization helps a lot when using new features like fx.Private to determine usage is correctly understood and seeing an incorrect visualization creates confusion and makes the user think they are the ones doing something wrong.

rossb83 avatar Jan 05 '23 10:01 rossb83

@JacobOaks to take a look

sywhang avatar Jan 05 '23 16:01 sywhang

Hey there,

Thanks for reporting this. There are actually a couple issues with the graph visualization in addition to this at the moment. For example, decorators aren't represented, and neither are modules. I've reproduced your bug and filed an internal ticket to update the graph visualization code and fix these issues, ref: GO-1797.

JacobOaks avatar Jan 05 '23 16:01 JacobOaks