From c58ac3d0f0edf188e6ad7c8434a90567f661cc2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Mon, 25 Aug 2025 15:09:40 +0200 Subject: [PATCH 1/2] _codegen: copy package github.com/ernesto-jimenez/gogen/imports Copy code from dependency github.com/ernesto-jimenez/gogen/imports (which hasn't evolved since 2018) as package _codegen/internal/imports. This is imported from https://github.com/ernesto-jimenez/gogen at commit d7d4131e6607813977e78297a6060f360f056a97. See https://github.com/ernesto-jimenez/gogen/tree/d7d4131e6607813977e78297a6060f360f056a97/imports The license block is added to match the LICENSE file from the source repository. --- _codegen/internal/imports/imports.go | 108 +++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 _codegen/internal/imports/imports.go diff --git a/_codegen/internal/imports/imports.go b/_codegen/internal/imports/imports.go new file mode 100644 index 000000000..a0c7e2b6a --- /dev/null +++ b/_codegen/internal/imports/imports.go @@ -0,0 +1,108 @@ +/* +The MIT License (MIT) + +Copyright (c) 2015 Ernesto Jiménez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +package imports + +import ( + "go/types" + "os" + "path/filepath" + "strings" +) + +type Importer interface { + AddImportsFrom(t types.Type) + Imports() map[string]string +} + +// imports contains metadata about all the imports from a given package +type imports struct { + currentpkg string + imp map[string]string +} + +// AddImportsFrom adds imports used in the passed type +func (imp *imports) AddImportsFrom(t types.Type) { + switch el := t.(type) { + case *types.Basic: + case *types.Slice: + imp.AddImportsFrom(el.Elem()) + case *types.Pointer: + imp.AddImportsFrom(el.Elem()) + case *types.Named: + pkg := el.Obj().Pkg() + if pkg == nil { + return + } + if pkg.Name() == imp.currentpkg { + return + } + imp.imp[cleanImportPath(pkg.Path())] = pkg.Name() + case *types.Tuple: + for i := 0; i < el.Len(); i++ { + imp.AddImportsFrom(el.At(i).Type()) + } + default: + } +} + +func cleanImportPath(ipath string) string { + return gopathlessImportPath( + vendorlessImportPath(ipath), + ) +} + +func gopathlessImportPath(ipath string) string { + paths := strings.Split(os.Getenv("GOPATH"), ":") + for _, p := range paths { + ipath = strings.TrimPrefix(ipath, filepath.Join(p, "src")+string(filepath.Separator)) + } + return ipath +} + +// vendorlessImportPath returns the devendorized version of the provided import path. +// e.g. "foo/bar/vendor/a/b" => "a/b" +func vendorlessImportPath(ipath string) string { + // Devendorize for use in import statement. + if i := strings.LastIndex(ipath, "/vendor/"); i >= 0 { + return ipath[i+len("/vendor/"):] + } + if strings.HasPrefix(ipath, "vendor/") { + return ipath[len("vendor/"):] + } + return ipath +} + +// AddImportsFrom adds imports used in the passed type +func (imp *imports) Imports() map[string]string { + return imp.imp +} + +// New initializes a new structure to track packages imported by the currentpkg +func New(currentpkg string) Importer { + return &imports{ + currentpkg: currentpkg, + imp: make(map[string]string), + } +} From 242e746a97a57ce7c85eaa27ecf471eb97311188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Mon, 25 Aug 2025 15:23:08 +0200 Subject: [PATCH 2/2] _codegen: use our imported copy of github.com/ernesto-jimenez/gogen Use our imported copy of package github.com/ernesto-jimenez/gogen/imports to remove one external dependency. --- _codegen/go.mod | 2 -- _codegen/go.sum | 2 -- _codegen/main.go | 2 +- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/_codegen/go.mod b/_codegen/go.mod index 31a7e991c..c295a36ba 100644 --- a/_codegen/go.mod +++ b/_codegen/go.mod @@ -1,5 +1,3 @@ module github.com/stretchr/testify/_codegen go 1.11 - -require github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 diff --git a/_codegen/go.sum b/_codegen/go.sum index 1c1b88eb5..e69de29bb 100644 --- a/_codegen/go.sum +++ b/_codegen/go.sum @@ -1,2 +0,0 @@ -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607 h1:cTavhURetDkezJCvxFggiyLeP40Mrk/TtVg2+ycw1Es= -github.com/ernesto-jimenez/gogen v0.0.0-20180125220232-d7d4131e6607/go.mod h1:Cg4fM0vhYWOZdgM7RIOSTRNIc8/VT7CXClC3Ni86lu4= diff --git a/_codegen/main.go b/_codegen/main.go index e193a74a5..574985181 100644 --- a/_codegen/main.go +++ b/_codegen/main.go @@ -23,7 +23,7 @@ import ( "strings" "text/template" - "github.com/ernesto-jimenez/gogen/imports" + "github.com/stretchr/testify/_codegen/internal/imports" ) var (