Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions mockgen/internal/tests/aliased_embedded_interface/source.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package aliased_embedded_interface

import "go.uber.org/mock/mockgen/internal/tests/aliased_embedded_interface/subpkg"

type Embedder interface {
subpkg.Embedded
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package subpkg

import "time"

var _ = time.Time{}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package subpkg

import aliased_time_import "time"

// Embedded is embedded by an interface in the parent package. Its method
// references time.Time through an aliased import that lives only in this
// (alphabetically later) file. See uber-go/mock#254.
type Embedded interface {
Foo(t aliased_time_import.Time)
}
12 changes: 9 additions & 3 deletions mockgen/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -299,9 +299,15 @@ func (p *fileParser) parsePackage(path string) (*fileParser, error) {
for ni := range iterInterfaces(file) {
newP.importedInterfaces.Set(path, ni.name.Name, ni)
}
imports, _ := importsOfFile(file)
for pkgName, pkgI := range imports {
newP.imports[pkgName] = pkgI
// Collect imports from each file rather than the merged file:
// FilterImportDuplicates dedupes imports by path, which drops an alias
// that only appears in one file and makes it look like an unknown
// package during type resolution (#254).
for _, f := range pkg.Files {
imports, _ := importsOfFile(f)
for pkgName, pkgI := range imports {
newP.imports[pkgName] = pkgI
}
}
}
return newP, nil
Expand Down
11 changes: 11 additions & 0 deletions mockgen/parse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,17 @@ func checkGreeterImports(t *testing.T, imports map[string]importedPackage) {
}
}

func TestParseSourceWithAliasedImportInEmbeddedInterfacePackage(t *testing.T) {
// Regression test for #254. Source mode must resolve an embedded interface
// whose package aliases an import in an alphabetically-later file. Merging
// the package's files drops the alias, so parsing used to fail with
// `unknown package`.
_, err := sourceMode("internal/tests/aliased_embedded_interface/source.go")
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
}

func Benchmark_parseFile(b *testing.B) {
source := "internal/tests/performance/big_interface/big_interface.go"
for n := 0; n < b.N; n++ {
Expand Down