compiler: implement method-set based AssignableTo and Implements (#5304)

* reflect: implement method-set based AssignableTo and Implements

Based on the design from #4376 by aykevl.
Fixes #4277, fixes #3580.

Co-authored-by: Ayke van Laethem <aykevanlaethem@gmail.com>

* builder: update expected binary sizes for reflect changes

* Make interface checks similar to invoke, allowing typeImplementsMethodSet and method info to be dropped when reflect is not present

* Add more tests that BigGo reflect tests

* Even more pruning

* Add go/token and net/url to passing tests

* Prune even further, I am less happy with this, though

* Update size test now that we are smaller

* Skip some tests

* elide method lists

* format, oops

* fix tests

* Add a panic, pull out constant to keep in sync

* Add debug info

* Remove code that was leftover from a previous refactor

---------

Co-authored-by: Ayke van Laethem <aykevanlaethem@gmail.com>
This commit is contained in:
Jake Bailey
2026-04-17 12:57:03 -07:00
committed by GitHub
parent b792c10680
commit 5ba8766cbc
16 changed files with 853 additions and 438 deletions
+64
View File
@@ -439,6 +439,70 @@ offset for int64 matches: true
offset for complex128 matches: true
type assertion succeeded for unreferenced type
interface implements
concrete implements:
myReader → Reader: true
*myReader → Reader: true
myWriter → Writer: false
*myWriter → Writer: true
myReadWriter → Reader: true
myReadWriter → Writer: false
myReadWriter → ReadWriter: false
*myReadWriter → Reader: true
*myReadWriter → Writer: true
*myReadWriter → ReadWriter: true
myReader → Closer: false
*myReadWriter → Closer: false
errorValue → error: true
errorValue → Stringer: false
myErrorStringer → error: true
myErrorStringer → Stringer: true
myReader → interface{}: true
int → interface{}: true
interface implements interface:
ReadWriter → Reader: true
ReadWriter → Writer: true
Reader → ReadWriter: false
Writer → ReadWriter: false
ReadCloser → Reader: true
ReadCloser → Closer: true
ReadCloser → Writer: false
Reader → ReadCloser: false
Reader → Reader: true
ReadWriter → ReadWriter: true
error → Stringer: false
Stringer → error: false
Reader → interface{}: true
ReadWriter → interface{}: true
assignable to:
int → int: true
string → string: true
int → string: false
int → int64: false
myReader → Reader: true
*myWriter → Writer: true
myWriter → Writer: false
*myReadWriter → ReadWriter: true
ReadWriter → Reader: true
Reader → ReadWriter: false
int → interface{}: true
Reader → interface{}: true
unexported method interface:
*notAnExpr → exprLike: true
notAnExpr → exprLike: true
*notAnExpr → exprLike (AssignableTo): true
channel direction:
chan int → <-chan int: true
<-chan int → chan int: false
named types:
*int → IntPtr: true
IntPtr → *int: true
IntPtr → IntPtr1: false
Ch → <-chan interface{}: true
value set interface:
Set[0] to BarNode: 10
Set[1] still FooNode: 2
alignment / offset:
struct{[0]func(); byte}: true