bind: use types.Unalias for consistency In the previous CL go.dev/cl/740861, types.Unalias was mainly used to resolve aliases. However, (*Type).Underlying was also unnecessarily used. For consistency, stick to types.Unalias. Updates golang/go#70698 Change-Id: I8a541c5fd06c8f66c563666749a691cce8a0784a Reviewed-on: https://go-review.googlesource.com/c/mobile/+/741600 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> Auto-Submit: Alan Donovan <adonovan@google.com>
diff --git a/bind/gen.go b/bind/gen.go index 4c8e9bf..18c8037 100644 --- a/bind/gen.go +++ b/bind/gen.go
@@ -394,17 +394,10 @@ g.errorf("unsupported basic type: %s", t) } case *types.Slice: - switch e := t.Elem().Underlying().(type) { - case *types.Basic: - switch e.Kind() { - case types.Uint8: // Byte. - return "nbyteslice" - default: - g.errorf("unsupported slice type: %s", t) - } - default: - g.errorf("unsupported slice type: %s", t) + if isBytesSlice(t) { + return "nbyteslice" } + g.errorf("unsupported slice type: %s", t) case *types.Pointer: if _, ok := types.Unalias(t.Elem()).(*types.Named); ok { return g.cgoType(t.Elem()) @@ -504,10 +497,7 @@ } return false case *types.Slice: - switch e := t.Elem().Underlying().(type) { - case *types.Basic: - return e.Kind() == types.Uint8 - } + return isBytesSlice(t) case *types.Pointer: switch t := types.Unalias(t.Elem()).(type) { case *types.Named:
diff --git a/bind/gengo.go b/bind/gengo.go index b192a0a..e374b03 100644 --- a/bind/gengo.go +++ b/bind/gengo.go
@@ -111,17 +111,11 @@ g.Printf("%s := C.%s(%s)\n", toVar, g.cgoType(t), fromVar) } case *types.Slice: - switch e := types.Unalias(t.Elem()).(type) { - case *types.Basic: - switch e.Kind() { - case types.Uint8: // Byte. - g.Printf("%s := fromSlice(%s, %v)\n", toVar, fromVar, mode == modeRetained) - default: - g.errorf("unsupported type: %s", t) - } - default: - g.errorf("unsupported type: %s", t) + if isBytesSlice(t) { + g.Printf("%s := fromSlice(%s, %v)\n", toVar, fromVar, mode == modeRetained) + return } + g.errorf("unsupported type: %s", t) case *types.Pointer: // TODO(crawshaw): test *int // TODO(crawshaw): test **Generator @@ -395,17 +389,11 @@ g.Printf("%s := %s(%s)\n", toVar, t.Underlying().String(), fromVar) } case *types.Slice: - switch e := types.Unalias(t.Elem()).(type) { - case *types.Basic: - switch e.Kind() { - case types.Uint8: // Byte. - g.Printf("%s := toSlice(%s, %v)\n", toVar, fromVar, mode == modeRetained) - default: - g.errorf("unsupported type: %s", t) - } - default: - g.errorf("unsupported type: %s", t) + if isBytesSlice(t) { + g.Printf("%s := toSlice(%s, %v)\n", toVar, fromVar, mode == modeRetained) + return } + g.errorf("unsupported type: %s", t) case *types.Pointer: switch u := types.Unalias(t.Elem()).(type) { case *types.Named:
diff --git a/bind/genjava.go b/bind/genjava.go index 2b6b5d4..ce02bf7 100644 --- a/bind/genjava.go +++ b/bind/genjava.go
@@ -129,12 +129,8 @@ } return &java.Type{Kind: kind} case *types.Slice: - switch e := T.Elem().(type) { - case *types.Basic: - switch e.Kind() { - case types.Uint8: // Byte. - return &java.Type{Kind: java.Array, Elem: &java.Type{Kind: java.Byte}} - } + if isBytesSlice(T) { + return &java.Type{Kind: java.Array, Elem: &java.Type{Kind: java.Byte}} } return nil case *types.Named: @@ -907,17 +903,11 @@ g.Printf("%s _%s = (%s)%s;\n", g.cgoType(t), varName, g.cgoType(t), varName) } case *types.Slice: - switch e := types.Unalias(t.Elem()).(type) { - case *types.Basic: - switch e.Kind() { - case types.Uint8: // Byte. - g.Printf("nbyteslice _%s = go_seq_from_java_bytearray(env, %s, %d);\n", varName, varName, toCFlag(mode == modeRetained)) - default: - g.errorf("unsupported type: %s", t) - } - default: - g.errorf("unsupported type: %s", t) + if isBytesSlice(t) { + g.Printf("nbyteslice _%s = go_seq_from_java_bytearray(env, %s, %d);\n", varName, varName, toCFlag(mode == modeRetained)) + return } + g.errorf("unsupported type: %s", t) case *types.Named: switch u := t.Underlying().(type) { case *types.Interface: @@ -944,17 +934,11 @@ g.Printf("%s %s = (%s)%s;\n", g.jniType(t), toName, g.jniType(t), fromName) } case *types.Slice: - switch e := types.Unalias(t.Elem()).(type) { - case *types.Basic: - switch e.Kind() { - case types.Uint8: // Byte. - g.Printf("jbyteArray %s = go_seq_to_java_bytearray(env, %s, %d);\n", toName, fromName, toCFlag(mode == modeRetained)) - default: - g.errorf("unsupported type: %s", t) - } - default: - g.errorf("unsupported type: %s", t) + if isBytesSlice(t) { + g.Printf("jbyteArray %s = go_seq_to_java_bytearray(env, %s, %d);\n", toName, fromName, toCFlag(mode == modeRetained)) + return } + g.errorf("unsupported type: %s", t) case *types.Pointer: // TODO(crawshaw): test *int // TODO(crawshaw): test **Generator @@ -1262,14 +1246,8 @@ switch t := types.Unalias(t).(type) { case *types.Basic: case *types.Slice: - switch e := types.Unalias(t.Elem()).(type) { - case *types.Basic: - switch e.Kind() { - case types.Uint8: // Byte. - if mode == modeTransient { - g.Printf("go_seq_release_byte_array(env, %s, _%s.ptr);\n", varName, varName) - } - } + if isBytesSlice(t) && mode == modeTransient { + g.Printf("go_seq_release_byte_array(env, %s, _%s.ptr);\n", varName, varName) } } }
diff --git a/bind/genobjc.go b/bind/genobjc.go index a9381cd..683df99 100644 --- a/bind/genobjc.go +++ b/bind/genobjc.go
@@ -688,17 +688,11 @@ g.Printf("%s _%s = (%s)%s;\n", g.cgoType(t), varName, g.cgoType(t), varName) } case *types.Slice: - switch e := types.Unalias(t.Elem()).(type) { - case *types.Basic: - switch e.Kind() { - case types.Uint8: // Byte. - g.Printf("nbyteslice _%s = go_seq_from_objc_bytearray(%s, %d);\n", varName, varName, toCFlag(mode == modeRetained)) - default: - g.errorf("unsupported type: %s", t) - } - default: - g.errorf("unsupported type: %s", t) + if isBytesSlice(t) { + g.Printf("nbyteslice _%s = go_seq_from_objc_bytearray(%s, %d);\n", varName, varName, toCFlag(mode == modeRetained)) + return } + g.errorf("unsupported type: %s", t) case *types.Named: switch u := t.Underlying().(type) { case *types.Interface: @@ -755,17 +749,11 @@ g.Printf("%s %s = (%s)%s;\n", g.objcType(t), toName, g.objcType(t), fromName) } case *types.Slice: - switch e := types.Unalias(t.Elem()).(type) { - case *types.Basic: - switch e.Kind() { - case types.Uint8: // Byte. - g.Printf("NSData *%s = go_seq_to_objc_bytearray(%s, %d);\n", toName, fromName, toCFlag(mode == modeRetained)) - default: - g.errorf("unsupported type: %s", t) - } - default: - g.errorf("unsupported type: %s", t) + if isBytesSlice(t) { + g.Printf("NSData *%s = go_seq_to_objc_bytearray(%s, %d);\n", toName, fromName, toCFlag(mode == modeRetained)) + return } + g.errorf("unsupported type: %s", t) case *types.Pointer: switch t := types.Unalias(t.Elem()).(type) { case *types.Named: @@ -1035,18 +1023,12 @@ func (g *ObjcGen) genRelease(varName string, t types.Type, mode varMode) { switch t := types.Unalias(t).(type) { case *types.Slice: - switch e := types.Unalias(t.Elem()).(type) { - case *types.Basic: - switch e.Kind() { - case types.Uint8: // Byte. - if mode == modeTransient { - // If the argument was not mutable, go_seq_from_objc_bytearray created a copy. - // Free it here. - g.Printf("if (![%s isKindOfClass:[NSMutableData class]]) {\n", varName) - g.Printf(" free(_%s.ptr);\n", varName) - g.Printf("}\n") - } - } + if isBytesSlice(t) && mode == modeTransient { + // If the argument was not mutable, go_seq_from_objc_bytearray created a copy. + // Free it here. + g.Printf("if (![%s isKindOfClass:[NSMutableData class]]) {\n", varName) + g.Printf(" free(_%s.ptr);\n", varName) + g.Printf("}\n") } } } @@ -1290,7 +1272,7 @@ } func (g *ObjcGen) objcParamType(t types.Type) string { - switch typ := t.Underlying().(type) { + switch typ := types.Unalias(t).(type) { case *types.Basic: switch typ.Kind() { case types.String, types.UntypedString:
diff --git a/bind/types.go b/bind/types.go index 9091076..4642d74 100644 --- a/bind/types.go +++ b/bind/types.go
@@ -143,7 +143,7 @@ } func isNullableType(t types.Type) bool { - t = t.Underlying() + t = types.Unalias(t) return types.AssignableTo(types.Typ[types.UntypedNil].Underlying(), t) || t.String() == "string" // string is mapped to NSString*, which is nullable } @@ -171,3 +171,8 @@ e := typePkgFirstElem(t) return e == "Java" || e == "ObjC" } + +func isBytesSlice(t *types.Slice) bool { + e, ok := types.Unalias(t.Elem()).(*types.Basic) + return ok && e.Kind() == types.Byte +}