Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fx.Private yields incorrect fx.Dotgraph visualization #1014

Open
rossb83 opened this issue Jan 5, 2023 · 2 comments
Open

fx.Private yields incorrect fx.Dotgraph visualization #1014

rossb83 opened this issue Jan 5, 2023 · 2 comments
Assignees

Comments

@rossb83
Copy link
Contributor

rossb83 commented Jan 5, 2023

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 rossb83 changed the title fx.Private yields incorrect fx.Dotgraph fx.Private yields incorrect fx.Dotgraph visualization Jan 5, 2023
@sywhang
Copy link
Contributor

sywhang commented Jan 5, 2023

@JacobOaks to take a look

@JacobOaks
Copy link
Contributor

JacobOaks commented Jan 5, 2023

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

No branches or pull requests

3 participants