@@ -82,10 +82,10 @@ func countServiceSQLInList(sql string) int {
8282}
8383
8484type recordingGraphStore struct {
85- t * testing.T
86- ops []string
87- nextID uint
88- nodesByFP map [string ][]model.Node
85+ t * testing.T
86+ ops []string
87+ nextID uint
88+ nodesByFP map [string ][]model.Node
8989 edges []model.Edge
9090 upsertedEdges [][]model.Edge
9191}
@@ -604,6 +604,64 @@ func TestBuild_UsesRepoLocalPackageClauseForGoImportAssertions(t *testing.T) {
604604 t .Fatalf ("expected implements edge from %d to contracts.Service %d, got %+v" , impl .ID , iface .ID , edges )
605605}
606606
607+ func TestBuild_SuppressesRepoLocalPackageClauseCorrectionOnConflict (t * testing.T ) {
608+ db , err := gorm .Open (sqlite .Open (":memory:" ), & gorm.Config {Logger : gormlogger .Discard })
609+ if err != nil {
610+ t .Fatalf ("open db: %v" , err )
611+ }
612+ st := gormstore .New (db )
613+ if err := st .AutoMigrate (); err != nil {
614+ t .Fatalf ("migrate: %v" , err )
615+ }
616+
617+ svc := & GraphService {Store : st , DB : db , Walkers : map [string ]* treesitter.Walker {".go" : treesitter .NewWalker (treesitter .GoSpec )}, Logger : slog .Default ()}
618+
619+ tmpDir := t .TempDir ()
620+ mustMkdir := func (rel string ) {
621+ if err := os .MkdirAll (filepath .Join (tmpDir , rel ), 0o755 ); err != nil {
622+ t .Fatalf ("mkdir %s: %v" , rel , err )
623+ }
624+ }
625+ mustWrite := func (rel , content string ) {
626+ if err := os .WriteFile (filepath .Join (tmpDir , rel ), []byte (content ), 0o644 ); err != nil {
627+ t .Fatalf ("write %s: %v" , rel , err )
628+ }
629+ }
630+ mustWrite ("go.mod" , "module github.com/example/project\n \n go 1.25.0\n " )
631+ mustMkdir ("internal/api" )
632+ mustMkdir ("mainpkg" )
633+ mustWrite ("internal/api/a.go" , "package contracts\n \n type Service interface {\n \t Run()\n }\n " )
634+ mustWrite ("internal/api/b.go" , "package other\n \n type Service interface {\n \t Run()\n }\n " )
635+ mustWrite ("mainpkg/main.go" , "package mainpkg\n \n import dep \" github.com/example/project/internal/api\" \n \n type MyType struct{}\n \n func (MyType) Run() {}\n \n var _ dep.Service = MyType{}\n " )
636+
637+ ctx := context .Background ()
638+ if _ , err := svc .Build (ctx , BuildOptions {Dir : tmpDir }); err != nil {
639+ t .Fatalf ("Build: %v" , err )
640+ }
641+
642+ impl , err := st .GetNode (ctx , "mainpkg.MyType" )
643+ if err != nil || impl == nil {
644+ t .Fatalf ("GetNode impl: node=%v err=%v" , impl , err )
645+ }
646+ iface , err := st .GetNode (ctx , "contracts.Service" )
647+ if err != nil || iface == nil {
648+ t .Fatalf ("GetNode iface: node=%v err=%v" , iface , err )
649+ }
650+ otherIface , err := st .GetNode (ctx , "other.Service" )
651+ if err != nil || otherIface == nil {
652+ t .Fatalf ("GetNode other iface: node=%v err=%v" , otherIface , err )
653+ }
654+ edges , err := st .GetEdgesFrom (ctx , impl .ID )
655+ if err != nil {
656+ t .Fatalf ("GetEdgesFrom: %v" , err )
657+ }
658+ for _ , edge := range edges {
659+ if edge .Kind == model .EdgeKindImplements && (edge .ToNodeID == iface .ID || edge .ToNodeID == otherIface .ID ) {
660+ t .Fatalf ("expected conflicting package clauses to suppress alias correction, got implements edge %+v" , edge )
661+ }
662+ }
663+ }
664+
607665func TestNewParsedBuildNodeBatch_DropsRawContentAndOnlyBuildsSourceLinesWhenNeeded (t * testing.T ) {
608666 typ := reflect .TypeFor [parsedBuildNodeBatch ]()
609667 if _ , ok := typ .FieldByName ("content" ); ok {
0 commit comments