Skip to content

Commit 574ceaa

Browse files
committed
bind: support go/types.Alias
Now the godebug directive 'gotypesalias=0' was removed from Go 1.27, gobind has to support types.Alias of go/types. This change fixes the issue by handling types.Alias. Updates golang/go#29559 Updates golang/go#69772 Fixes golang/go#70698 Change-Id: I65745e1468f7e99e1d7362d4ad11352521fad973 Reviewed-on: https://go-review.googlesource.com/c/mobile/+/740861 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Alan Donovan <adonovan@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
1 parent 40bd9ac commit 574ceaa

15 files changed

Lines changed: 398 additions & 57 deletions

bind/bind_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ var updateFlag = flag.Bool("update", false, "Update the golden files.")
3737

3838
var tests = []string{
3939
"", // The universe package with the error type.
40+
"testdata/aliases.go",
4041
"testdata/basictypes.go",
4142
"testdata/structs.go",
4243
"testdata/interfaces.go",

bind/gen.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ func (g *Generator) errorf(format string, args ...interface{}) {
366366
// cgoType returns the name of a Cgo type suitable for converting a value of
367367
// the given type.
368368
func (g *Generator) cgoType(t types.Type) string {
369-
switch t := t.(type) {
369+
switch t := types.Unalias(t).(type) {
370370
case *types.Basic:
371371
switch t.Kind() {
372372
case types.Bool, types.UntypedBool:
@@ -394,7 +394,7 @@ func (g *Generator) cgoType(t types.Type) string {
394394
g.errorf("unsupported basic type: %s", t)
395395
}
396396
case *types.Slice:
397-
switch e := t.Elem().(type) {
397+
switch e := t.Elem().Underlying().(type) {
398398
case *types.Basic:
399399
switch e.Kind() {
400400
case types.Uint8: // Byte.
@@ -406,7 +406,7 @@ func (g *Generator) cgoType(t types.Type) string {
406406
g.errorf("unsupported slice type: %s", t)
407407
}
408408
case *types.Pointer:
409-
if _, ok := t.Elem().(*types.Named); ok {
409+
if _, ok := types.Unalias(t.Elem()).(*types.Named); ok {
410410
return g.cgoType(t.Elem())
411411
}
412412
g.errorf("unsupported pointer to type: %s", t)
@@ -488,7 +488,7 @@ func (g *Generator) isSupported(t types.Type) bool {
488488
if isErrorType(t) || isWrapperType(t) {
489489
return true
490490
}
491-
switch t := t.(type) {
491+
switch t := types.Unalias(t).(type) {
492492
case *types.Basic:
493493
switch t.Kind() {
494494
case types.Bool, types.UntypedBool,
@@ -504,12 +504,12 @@ func (g *Generator) isSupported(t types.Type) bool {
504504
}
505505
return false
506506
case *types.Slice:
507-
switch e := t.Elem().(type) {
507+
switch e := t.Elem().Underlying().(type) {
508508
case *types.Basic:
509509
return e.Kind() == types.Uint8
510510
}
511511
case *types.Pointer:
512-
switch t := t.Elem().(type) {
512+
switch t := types.Unalias(t.Elem()).(type) {
513513
case *types.Named:
514514
return g.validPkg(t.Obj().Pkg())
515515
}

bind/gengo.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func (g *goGen) genFuncBody(o *types.Func, selectorLHS string) {
9999
}
100100

101101
func (g *goGen) genWrite(toVar, fromVar string, t types.Type, mode varMode) {
102-
switch t := t.(type) {
102+
switch t := types.Unalias(t).(type) {
103103
case *types.Basic:
104104
switch t.Kind() {
105105
case types.String:
@@ -111,7 +111,7 @@ func (g *goGen) genWrite(toVar, fromVar string, t types.Type, mode varMode) {
111111
g.Printf("%s := C.%s(%s)\n", toVar, g.cgoType(t), fromVar)
112112
}
113113
case *types.Slice:
114-
switch e := t.Elem().(type) {
114+
switch e := types.Unalias(t.Elem()).(type) {
115115
case *types.Basic:
116116
switch e.Kind() {
117117
case types.Uint8: // Byte.
@@ -125,7 +125,7 @@ func (g *goGen) genWrite(toVar, fromVar string, t types.Type, mode varMode) {
125125
case *types.Pointer:
126126
// TODO(crawshaw): test *int
127127
// TODO(crawshaw): test **Generator
128-
switch t := t.Elem().(type) {
128+
switch t := types.Unalias(t.Elem()).(type) {
129129
case *types.Named:
130130
g.genToRefNum(toVar, fromVar)
131131
default:
@@ -384,7 +384,7 @@ func (g *goGen) genInterface(obj *types.TypeName) {
384384
}
385385

386386
func (g *goGen) genRead(toVar, fromVar string, typ types.Type, mode varMode) {
387-
switch t := typ.(type) {
387+
switch t := types.Unalias(typ).(type) {
388388
case *types.Basic:
389389
switch t.Kind() {
390390
case types.String:
@@ -395,7 +395,7 @@ func (g *goGen) genRead(toVar, fromVar string, typ types.Type, mode varMode) {
395395
g.Printf("%s := %s(%s)\n", toVar, t.Underlying().String(), fromVar)
396396
}
397397
case *types.Slice:
398-
switch e := t.Elem().(type) {
398+
switch e := types.Unalias(t.Elem()).(type) {
399399
case *types.Basic:
400400
switch e.Kind() {
401401
case types.Uint8: // Byte.
@@ -407,7 +407,7 @@ func (g *goGen) genRead(toVar, fromVar string, typ types.Type, mode varMode) {
407407
g.errorf("unsupported type: %s", t)
408408
}
409409
case *types.Pointer:
410-
switch u := t.Elem().(type) {
410+
switch u := types.Unalias(t.Elem()).(type) {
411411
case *types.Named:
412412
o := u.Obj()
413413
oPkg := o.Pkg()
@@ -471,7 +471,7 @@ func (g *goGen) genRead(toVar, fromVar string, typ types.Type, mode varMode) {
471471
func (g *goGen) typeString(typ types.Type) string {
472472
pkg := g.Pkg
473473

474-
switch t := typ.(type) {
474+
switch t := types.Unalias(typ).(type) {
475475
case *types.Named:
476476
obj := t.Obj()
477477
if obj.Pkg() == nil { // e.g. error type is *types.Named.
@@ -490,7 +490,7 @@ func (g *goGen) typeString(typ types.Type) string {
490490
g.errorf("unsupported named type %s / %T", t, t)
491491
}
492492
case *types.Pointer:
493-
switch t := t.Elem().(type) {
493+
switch t := types.Unalias(t.Elem()).(type) {
494494
case *types.Named:
495495
return fmt.Sprintf("*%s", g.typeString(t))
496496
default:

bind/genjava.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ func isJavaPrimitive(T types.Type) bool {
610610

611611
// jniType returns a string that can be used as a JNI type.
612612
func (g *JavaGen) jniType(T types.Type) string {
613-
switch T := T.(type) {
613+
switch T := types.Unalias(T).(type) {
614614
case *types.Basic:
615615
switch T.Kind() {
616616
case types.Bool, types.UntypedBool:
@@ -644,7 +644,7 @@ func (g *JavaGen) jniType(T types.Type) string {
644644
return "jbyteArray"
645645

646646
case *types.Pointer:
647-
if _, ok := T.Elem().(*types.Named); ok {
647+
if _, ok := types.Unalias(T.Elem()).(*types.Named); ok {
648648
return g.jniType(T.Elem())
649649
}
650650
g.errorf("unsupported pointer to type: %s", T)
@@ -697,15 +697,15 @@ func (g *JavaGen) javaType(T types.Type) string {
697697
} else if isJavaType(T) {
698698
return classNameFor(T)
699699
}
700-
switch T := T.(type) {
700+
switch T := types.Unalias(T).(type) {
701701
case *types.Basic:
702702
return g.javaBasicType(T)
703703
case *types.Slice:
704704
elem := g.javaType(T.Elem())
705705
return elem + "[]"
706706

707707
case *types.Pointer:
708-
if _, ok := T.Elem().(*types.Named); ok {
708+
if _, ok := types.Unalias(T.Elem()).(*types.Named); ok {
709709
return g.javaType(T.Elem())
710710
}
711711
g.errorf("unsupported pointer to type: %s", T)
@@ -898,7 +898,7 @@ func (g *JavaGen) genCRetClear(varName string, t types.Type, exc string) {
898898
}
899899

900900
func (g *JavaGen) genJavaToC(varName string, t types.Type, mode varMode) {
901-
switch t := t.(type) {
901+
switch t := types.Unalias(t).(type) {
902902
case *types.Basic:
903903
switch t.Kind() {
904904
case types.String:
@@ -907,7 +907,7 @@ func (g *JavaGen) genJavaToC(varName string, t types.Type, mode varMode) {
907907
g.Printf("%s _%s = (%s)%s;\n", g.cgoType(t), varName, g.cgoType(t), varName)
908908
}
909909
case *types.Slice:
910-
switch e := t.Elem().(type) {
910+
switch e := types.Unalias(t.Elem()).(type) {
911911
case *types.Basic:
912912
switch e.Kind() {
913913
case types.Uint8: // Byte.
@@ -933,7 +933,7 @@ func (g *JavaGen) genJavaToC(varName string, t types.Type, mode varMode) {
933933
}
934934

935935
func (g *JavaGen) genCToJava(toName, fromName string, t types.Type, mode varMode) {
936-
switch t := t.(type) {
936+
switch t := types.Unalias(t).(type) {
937937
case *types.Basic:
938938
switch t.Kind() {
939939
case types.String:
@@ -944,7 +944,7 @@ func (g *JavaGen) genCToJava(toName, fromName string, t types.Type, mode varMode
944944
g.Printf("%s %s = (%s)%s;\n", g.jniType(t), toName, g.jniType(t), fromName)
945945
}
946946
case *types.Slice:
947-
switch e := t.Elem().(type) {
947+
switch e := types.Unalias(t.Elem()).(type) {
948948
case *types.Basic:
949949
switch e.Kind() {
950950
case types.Uint8: // Byte.
@@ -958,7 +958,7 @@ func (g *JavaGen) genCToJava(toName, fromName string, t types.Type, mode varMode
958958
case *types.Pointer:
959959
// TODO(crawshaw): test *int
960960
// TODO(crawshaw): test **Generator
961-
switch t := t.Elem().(type) {
961+
switch t := types.Unalias(t.Elem()).(type) {
962962
case *types.Named:
963963
g.genFromRefnum(toName, fromName, t, t.Obj())
964964
default:
@@ -1259,10 +1259,10 @@ func (g *JavaGen) genJNIFuncBody(o *types.Func, sName string, jm *java.Func, isj
12591259

12601260
// genRelease cleans up arguments that weren't copied in genJavaToC.
12611261
func (g *JavaGen) genRelease(varName string, t types.Type, mode varMode) {
1262-
switch t := t.(type) {
1262+
switch t := types.Unalias(t).(type) {
12631263
case *types.Basic:
12641264
case *types.Slice:
1265-
switch e := t.Elem().(type) {
1265+
switch e := types.Unalias(t.Elem()).(type) {
12661266
case *types.Basic:
12671267
switch e.Kind() {
12681268
case types.Uint8: // Byte.
@@ -1364,7 +1364,7 @@ func (g *JavaGen) GenH() error {
13641364
}
13651365

13661366
func (g *JavaGen) jniCallType(t types.Type) string {
1367-
switch t := t.(type) {
1367+
switch t := types.Unalias(t).(type) {
13681368
case *types.Basic:
13691369
switch t.Kind() {
13701370
case types.Bool, types.UntypedBool:
@@ -1391,7 +1391,7 @@ func (g *JavaGen) jniCallType(t types.Type) string {
13911391
case *types.Slice:
13921392
return "Object"
13931393
case *types.Pointer:
1394-
if _, ok := t.Elem().(*types.Named); ok {
1394+
if _, ok := types.Unalias(t.Elem()).(*types.Named); ok {
13951395
return g.jniCallType(t.Elem())
13961396
}
13971397
g.errorf("unsupported pointer to type: %s", t)
@@ -1411,7 +1411,7 @@ func (g *JavaGen) jniSigType(T types.Type) string {
14111411
if isErrorType(T) {
14121412
return "Ljava/lang/Exception;"
14131413
}
1414-
switch T := T.(type) {
1414+
switch T := types.Unalias(T).(type) {
14151415
case *types.Basic:
14161416
switch T.Kind() {
14171417
case types.Bool, types.UntypedBool:
@@ -1441,7 +1441,7 @@ func (g *JavaGen) jniSigType(T types.Type) string {
14411441
case *types.Slice:
14421442
return "[" + g.jniSigType(T.Elem())
14431443
case *types.Pointer:
1444-
if _, ok := T.Elem().(*types.Named); ok {
1444+
if _, ok := types.Unalias(T.Elem()).(*types.Named); ok {
14451445
return g.jniSigType(T.Elem())
14461446
}
14471447
g.errorf("unsupported pointer to type: %s", T)

bind/genobjc.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ func (g *ObjcGen) genSetter(oName string, f *types.Var) {
679679
}
680680

681681
func (g *ObjcGen) genWrite(varName string, t types.Type, mode varMode) {
682-
switch t := t.(type) {
682+
switch t := types.Unalias(t).(type) {
683683
case *types.Basic:
684684
switch t.Kind() {
685685
case types.String:
@@ -688,7 +688,7 @@ func (g *ObjcGen) genWrite(varName string, t types.Type, mode varMode) {
688688
g.Printf("%s _%s = (%s)%s;\n", g.cgoType(t), varName, g.cgoType(t), varName)
689689
}
690690
case *types.Slice:
691-
switch e := t.Elem().(type) {
691+
switch e := types.Unalias(t.Elem()).(type) {
692692
case *types.Basic:
693693
switch e.Kind() {
694694
case types.Uint8: // Byte.
@@ -744,7 +744,7 @@ func (g *ObjcGen) genRefRead(toName, fromName string, t types.Type) {
744744
}
745745

746746
func (g *ObjcGen) genRead(toName, fromName string, t types.Type, mode varMode) {
747-
switch t := t.(type) {
747+
switch t := types.Unalias(t).(type) {
748748
case *types.Basic:
749749
switch t.Kind() {
750750
case types.String:
@@ -755,7 +755,7 @@ func (g *ObjcGen) genRead(toName, fromName string, t types.Type, mode varMode) {
755755
g.Printf("%s %s = (%s)%s;\n", g.objcType(t), toName, g.objcType(t), fromName)
756756
}
757757
case *types.Slice:
758-
switch e := t.Elem().(type) {
758+
switch e := types.Unalias(t.Elem()).(type) {
759759
case *types.Basic:
760760
switch e.Kind() {
761761
case types.Uint8: // Byte.
@@ -767,7 +767,7 @@ func (g *ObjcGen) genRead(toName, fromName string, t types.Type, mode varMode) {
767767
g.errorf("unsupported type: %s", t)
768768
}
769769
case *types.Pointer:
770-
switch t := t.Elem().(type) {
770+
switch t := types.Unalias(t.Elem()).(type) {
771771
case *types.Named:
772772
g.genRefRead(toName, fromName, types.NewPointer(t))
773773
default:
@@ -1033,9 +1033,9 @@ func (g *ObjcGen) genInterfaceMethodProxy(obj *types.TypeName, m *types.Func) {
10331033

10341034
// genRelease cleans up arguments that weren't copied in genWrite.
10351035
func (g *ObjcGen) genRelease(varName string, t types.Type, mode varMode) {
1036-
switch t := t.(type) {
1036+
switch t := types.Unalias(t).(type) {
10371037
case *types.Slice:
1038-
switch e := t.Elem().(type) {
1038+
switch e := types.Unalias(t.Elem()).(type) {
10391039
case *types.Basic:
10401040
switch e.Kind() {
10411041
case types.Uint8: // Byte.
@@ -1290,15 +1290,13 @@ func (g *ObjcGen) refTypeBase(typ types.Type) string {
12901290
}
12911291

12921292
func (g *ObjcGen) objcParamType(t types.Type) string {
1293-
1294-
switch typ := t.(type) {
1293+
switch typ := t.Underlying().(type) {
12951294
case *types.Basic:
12961295
switch typ.Kind() {
12971296
case types.String, types.UntypedString:
12981297
return "NSString* _Nullable"
12991298
}
13001299
}
1301-
13021300
return g.objcType(t)
13031301

13041302
}
@@ -1309,7 +1307,7 @@ func (g *ObjcGen) objcType(typ types.Type) string {
13091307
return "NSError* _Nullable"
13101308
}
13111309

1312-
switch typ := typ.(type) {
1310+
switch typ := types.Unalias(typ).(type) {
13131311
case *types.Basic:
13141312
switch typ.Kind() {
13151313
case types.Bool, types.UntypedBool:
@@ -1354,7 +1352,7 @@ func (g *ObjcGen) objcType(typ types.Type) string {
13541352
g.errorf("unsupported type: %s", typ)
13551353
return "TODO"
13561354
case *types.Pointer:
1357-
if _, ok := typ.Elem().(*types.Named); ok {
1355+
if _, ok := types.Unalias(typ.Elem()).(*types.Named); ok {
13581356
return g.objcType(typ.Elem()) + "* _Nullable"
13591357
}
13601358
g.errorf("unsupported pointer to type: %s", typ)

bind/testdata/aliases.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright 2026 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package aliases
6+
7+
type AByte = byte
8+
type AByteSlice = []AByte
9+
type S struct{}
10+
type AStruct = S
11+
type AStructPtr = *AStruct
12+
13+
func TakesAByte(a AByte) {}
14+
func TakesAByteSlice(a []AByte) {}
15+
func TakesAByteSliceAlias(a AByteSlice) {}
16+
func TakesAStructPtr(a *AStruct) {}
17+
func TakesAStructPtrAlias(a AStructPtr) {}

0 commit comments

Comments
 (0)