From c586319978459e363984f9ae14c1c4353f9406b3 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Wed, 19 Jun 2024 12:30:38 +0800 Subject: [PATCH] typepatch fix: don't change patch pkg --- internal/lib/errors/errors.go | 51 +++++++++++++++++++++++++++++++++++ internal/typepatch/patch.go | 29 +++++++++++++++++++- 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/internal/lib/errors/errors.go b/internal/lib/errors/errors.go index 465fac108..5f95bdef3 100644 --- a/internal/lib/errors/errors.go +++ b/internal/lib/errors/errors.go @@ -15,3 +15,54 @@ */ package errors + +// llgo:skipall +import ( + _ "unsafe" +) + +// Unwrap returns the result of calling the Unwrap method on err, if err's +// type contains an Unwrap method returning error. +// Otherwise, Unwrap returns nil. +// +// Unwrap only calls a method of the form "Unwrap() error". +// In particular Unwrap does not unwrap errors returned by [Join]. +func Unwrap(err error) error { + u, ok := err.(interface { + Unwrap() error + }) + if !ok { + return nil + } + return u.Unwrap() +} + +// New returns an error that formats as the given text. +// Each call to New returns a distinct error value even if the text is identical. +func New(text string) error { + return &errorString{text} +} + +// errorString is a trivial implementation of error. +type errorString struct { + s string +} + +func (e *errorString) Error() string { + return e.s +} + +// ErrUnsupported indicates that a requested operation cannot be performed, +// because it is unsupported. For example, a call to [os.Link] when using a +// file system that does not support hard links. +// +// Functions and methods should not return this error but should instead +// return an error including appropriate context that satisfies +// +// errors.Is(err, errors.ErrUnsupported) +// +// either by directly wrapping ErrUnsupported or by implementing an Is method. +// +// Functions and methods should document the cases in which an error +// wrapping this will be returned. +var ErrUnsupported = New("unsupported operation") diff --git a/internal/typepatch/patch.go b/internal/typepatch/patch.go index 48feb73b9..e6f42e9af 100644 --- a/internal/typepatch/patch.go +++ b/internal/typepatch/patch.go @@ -43,6 +43,7 @@ type typesScope struct { isFunc bool } +/* type object struct { parent *types.Scope pos token.Pos @@ -54,6 +55,7 @@ type iface struct { tab unsafe.Pointer data unsafe.Pointer } +*/ const ( tagPatched = 0x17 @@ -77,11 +79,24 @@ func setScope(pkg *types.Package, scope *types.Scope) { p.scope = scope } +/* +func setPath(pkg *types.Package, path string) { + p := (*typesPackage)(unsafe.Pointer(pkg)) + p.path = path +} + +/* +func setPkg(o types.Object, pkg *types.Package) { + data := (*iface)(unsafe.Pointer(&o)).data + (*object)(data).pkg = pkg +} + func setPkgAndParent(o types.Object, pkg *types.Package, parent *types.Scope) { data := (*iface)(unsafe.Pointer(&o)).data (*object)(data).pkg = pkg (*object)(data).parent = parent } +*/ func getElems(scope *types.Scope) map[string]types.Object { s := (*typesScope)(unsafe.Pointer(scope)) @@ -105,11 +120,23 @@ func Pkg(pkg, alt *types.Package) *types.Package { altScope := alt.Scope() for name, o := range getElems(altScope) { - setPkgAndParent(o, &ret, &scope) + /* + switch o := o.(type) { + case *types.TypeName: + if t, ok := o.Type().(*types.Named); ok { + for i, n := 0, t.NumMethods(); i < n; i++ { + m := t.Method(i) + setPkg(m, &ret) + } + } + } + setPkgAndParent(o, &ret, &scope) + */ elems[name] = o } setElems(&scope, elems) setScope(&ret, &scope) setPatched(pkg) + // setPath(alt, ret.Path()) return &ret }