@@ -77,6 +77,63 @@ func TestGlobalSummaryMergesLocalIDsByText(t *testing.T) {
7777 }
7878}
7979
80+ func TestGlobalSummaryNameLookupsReturnEmptyStringForOutOfRangeIDs (t * testing.T ) {
81+ summary , err := NewGlobalSummary ([]* PackageMeta {buildGlobalDuplicateFactsPackage ()})
82+ if err != nil {
83+ t .Fatalf ("NewGlobalSummary: %v" , err )
84+ }
85+
86+ if got := summary .SymbolName (Symbol (len (summary .stringTable ))); got != "" {
87+ t .Fatalf ("SymbolName(out-of-range) = %q, want empty string" , got )
88+ }
89+ if got := summary .Name (Name (len (summary .stringTable ))); got != "" {
90+ t .Fatalf ("Name(out-of-range) = %q, want empty string" , got )
91+ }
92+ }
93+
94+ func TestGlobalSummaryDeduplicatesMergedFacts (t * testing.T ) {
95+ pkgA := buildGlobalDuplicateFactsPackage ()
96+ pkgB := buildGlobalDuplicateFactsPackage ()
97+
98+ summary , err := NewGlobalSummary ([]* PackageMeta {pkgA , pkgB })
99+ if err != nil {
100+ t .Fatalf ("NewGlobalSummary: %v" , err )
101+ }
102+
103+ main := mustLookupSymbol (t , summary , "pkg.main" )
104+ use := mustLookupSymbol (t , summary , "pkg.use" )
105+ typ := mustLookupSymbol (t , summary , "_llgo_pkg.T" )
106+ iface := mustLookupSymbol (t , summary , "_llgo_iface$I" )
107+ funcType := mustLookupSymbol (t , summary , "_llgo_func$M" )
108+ ifn := mustLookupSymbol (t , summary , "pkg.(*T).M" )
109+ tfn := mustLookupSymbol (t , summary , "pkg.T.M" )
110+ methodNames := summary .UseNamedMethod (use )
111+ if len (methodNames ) != 1 {
112+ t .Fatalf ("UseNamedMethod len = %d (%#v), want 1" , len (methodNames ), methodNames )
113+ }
114+ wantSig := MethodSig {Name : methodNames [0 ], MType : funcType }
115+
116+ if got := summary .OrdinaryEdges (main ); ! reflect .DeepEqual (got , []Symbol {use }) {
117+ t .Fatalf ("OrdinaryEdges(pkg.main) = %#v, want %#v" , got , []Symbol {use })
118+ }
119+ if got := summary .TypeChildren (typ ); ! reflect .DeepEqual (got , []Symbol {funcType }) {
120+ t .Fatalf ("TypeChildren(_llgo_pkg.T) = %#v, want %#v" , got , []Symbol {funcType })
121+ }
122+ if got := summary .InterfaceMethods (iface ); ! reflect .DeepEqual (got , []MethodSig {wantSig }) {
123+ t .Fatalf ("InterfaceMethods(_llgo_iface$I) = %#v, want %#v" , got , []MethodSig {wantSig })
124+ }
125+ if got := summary .UseIface (main ); ! reflect .DeepEqual (got , []Symbol {typ }) {
126+ t .Fatalf ("UseIface(pkg.main) = %#v, want %#v" , got , []Symbol {typ })
127+ }
128+ wantDemand := IfaceMethodDemand {Target : iface , Sig : wantSig }
129+ if got := summary .UseIfaceMethod (use ); ! reflect .DeepEqual (got , []IfaceMethodDemand {wantDemand }) {
130+ t .Fatalf ("UseIfaceMethod(pkg.use) = %#v, want %#v" , got , []IfaceMethodDemand {wantDemand })
131+ }
132+ if got := summary .MethodSlots (typ ); ! reflect .DeepEqual (got , []MethodSlot {{Sig : wantSig , IFn : ifn , TFn : tfn }}) {
133+ t .Fatalf ("MethodSlots(_llgo_pkg.T) = %#v" , got )
134+ }
135+ }
136+
80137func TestGlobalSummaryRejectsConflictingMethodSlots (t * testing.T ) {
81138 pkgA , _ := buildGlobalSummaryPkgB ()
82139
@@ -99,6 +156,28 @@ func TestGlobalSummaryRejectsConflictingMethodSlots(t *testing.T) {
99156 }
100157}
101158
159+ func buildGlobalDuplicateFactsPackage () * PackageMeta {
160+ b := NewBuilder ()
161+ main := b .Symbol ("pkg.main" )
162+ use := b .Symbol ("pkg.use" )
163+ typ := b .Symbol ("_llgo_pkg.T" )
164+ iface := b .Symbol ("_llgo_iface$I" )
165+ methodName := b .Name ("M" )
166+ funcType := b .Symbol ("_llgo_func$M" )
167+ ifn := b .Symbol ("pkg.(*T).M" )
168+ tfn := b .Symbol ("pkg.T.M" )
169+ sig := MethodSig {Name : methodName , MType : funcType }
170+
171+ b .AddEdge (main , use )
172+ b .AddTypeChild (typ , funcType )
173+ b .AddIfaceEntry (iface , []MethodSig {sig })
174+ b .AddUseIface (main , []Symbol {typ })
175+ b .AddUseIfaceMethod (use , []IfaceMethodDemand {{Target : iface , Sig : sig }})
176+ b .AddUseNamedMethod (use , []Name {methodName })
177+ b .AddMethodInfo (typ , []MethodSlot {{Sig : sig , IFn : ifn , TFn : tfn }})
178+ return b .Build ()
179+ }
180+
102181type globalSummaryRefs struct {
103182 intType Symbol
104183}
0 commit comments