mirror of
https://github.com/golang/go
synced 2024-11-14 06:10:24 -07:00
go/types, types2: slightly simplify rangeKeyVal function
Compute the signature type of an iterator function argument only once. This eliminates the need for two separate toSig calls. Change-Id: Ifeb33d21e381010d2012d74eac045856f1cca312 Reviewed-on: https://go-review.googlesource.com/c/go/+/613635 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Tim King <taking@google.com>
This commit is contained in:
parent
ae8708f744
commit
f6c89abf89
@ -1010,10 +1010,6 @@ func rangeKeyVal(typ Type, allowVersion func(goVersion) bool) (key, val Type, ca
|
|||||||
bad := func(cause string) (Type, Type, string, bool) {
|
bad := func(cause string) (Type, Type, string, bool) {
|
||||||
return Typ[Invalid], Typ[Invalid], cause, false
|
return Typ[Invalid], Typ[Invalid], cause, false
|
||||||
}
|
}
|
||||||
toSig := func(t Type) *Signature {
|
|
||||||
sig, _ := coreType(t).(*Signature)
|
|
||||||
return sig
|
|
||||||
}
|
|
||||||
|
|
||||||
orig := typ
|
orig := typ
|
||||||
switch typ := arrayPtrDeref(coreType(typ)).(type) {
|
switch typ := arrayPtrDeref(coreType(typ)).(type) {
|
||||||
@ -1044,23 +1040,26 @@ func rangeKeyVal(typ Type, allowVersion func(goVersion) bool) (key, val Type, ca
|
|||||||
if !buildcfg.Experiment.RangeFunc && allowVersion != nil && !allowVersion(go1_23) {
|
if !buildcfg.Experiment.RangeFunc && allowVersion != nil && !allowVersion(go1_23) {
|
||||||
return bad("requires go1.23 or later")
|
return bad("requires go1.23 or later")
|
||||||
}
|
}
|
||||||
assert(typ.Recv() == nil)
|
// check iterator arity
|
||||||
switch {
|
switch {
|
||||||
case typ.Params().Len() != 1:
|
case typ.Params().Len() != 1:
|
||||||
return bad("func must be func(yield func(...) bool): wrong argument count")
|
return bad("func must be func(yield func(...) bool): wrong argument count")
|
||||||
case toSig(typ.Params().At(0).Type()) == nil:
|
|
||||||
return bad("func must be func(yield func(...) bool): argument is not func")
|
|
||||||
case typ.Results().Len() != 0:
|
case typ.Results().Len() != 0:
|
||||||
return bad("func must be func(yield func(...) bool): unexpected results")
|
return bad("func must be func(yield func(...) bool): unexpected results")
|
||||||
}
|
}
|
||||||
cb := toSig(typ.Params().At(0).Type())
|
assert(typ.Recv() == nil)
|
||||||
assert(cb.Recv() == nil)
|
// check iterator argument type
|
||||||
|
cb, _ := coreType(typ.Params().At(0).Type()).(*Signature)
|
||||||
switch {
|
switch {
|
||||||
|
case cb == nil:
|
||||||
|
return bad("func must be func(yield func(...) bool): argument is not func")
|
||||||
case cb.Params().Len() > 2:
|
case cb.Params().Len() > 2:
|
||||||
return bad("func must be func(yield func(...) bool): yield func has too many parameters")
|
return bad("func must be func(yield func(...) bool): yield func has too many parameters")
|
||||||
case cb.Results().Len() != 1 || !isBoolean(cb.Results().At(0).Type()):
|
case cb.Results().Len() != 1 || !isBoolean(cb.Results().At(0).Type()):
|
||||||
return bad("func must be func(yield func(...) bool): yield func does not return bool")
|
return bad("func must be func(yield func(...) bool): yield func does not return bool")
|
||||||
}
|
}
|
||||||
|
assert(cb.Recv() == nil)
|
||||||
|
// determine key and value types, if any
|
||||||
if cb.Params().Len() >= 1 {
|
if cb.Params().Len() >= 1 {
|
||||||
key = cb.Params().At(0).Type()
|
key = cb.Params().At(0).Type()
|
||||||
}
|
}
|
||||||
|
@ -1028,10 +1028,6 @@ func rangeKeyVal(typ Type, allowVersion func(goVersion) bool) (key, val Type, ca
|
|||||||
bad := func(cause string) (Type, Type, string, bool) {
|
bad := func(cause string) (Type, Type, string, bool) {
|
||||||
return Typ[Invalid], Typ[Invalid], cause, false
|
return Typ[Invalid], Typ[Invalid], cause, false
|
||||||
}
|
}
|
||||||
toSig := func(t Type) *Signature {
|
|
||||||
sig, _ := coreType(t).(*Signature)
|
|
||||||
return sig
|
|
||||||
}
|
|
||||||
|
|
||||||
orig := typ
|
orig := typ
|
||||||
switch typ := arrayPtrDeref(coreType(typ)).(type) {
|
switch typ := arrayPtrDeref(coreType(typ)).(type) {
|
||||||
@ -1062,23 +1058,26 @@ func rangeKeyVal(typ Type, allowVersion func(goVersion) bool) (key, val Type, ca
|
|||||||
if !buildcfg.Experiment.RangeFunc && allowVersion != nil && !allowVersion(go1_23) {
|
if !buildcfg.Experiment.RangeFunc && allowVersion != nil && !allowVersion(go1_23) {
|
||||||
return bad("requires go1.23 or later")
|
return bad("requires go1.23 or later")
|
||||||
}
|
}
|
||||||
assert(typ.Recv() == nil)
|
// check iterator arity
|
||||||
switch {
|
switch {
|
||||||
case typ.Params().Len() != 1:
|
case typ.Params().Len() != 1:
|
||||||
return bad("func must be func(yield func(...) bool): wrong argument count")
|
return bad("func must be func(yield func(...) bool): wrong argument count")
|
||||||
case toSig(typ.Params().At(0).Type()) == nil:
|
|
||||||
return bad("func must be func(yield func(...) bool): argument is not func")
|
|
||||||
case typ.Results().Len() != 0:
|
case typ.Results().Len() != 0:
|
||||||
return bad("func must be func(yield func(...) bool): unexpected results")
|
return bad("func must be func(yield func(...) bool): unexpected results")
|
||||||
}
|
}
|
||||||
cb := toSig(typ.Params().At(0).Type())
|
assert(typ.Recv() == nil)
|
||||||
assert(cb.Recv() == nil)
|
// check iterator argument type
|
||||||
|
cb, _ := coreType(typ.Params().At(0).Type()).(*Signature)
|
||||||
switch {
|
switch {
|
||||||
|
case cb == nil:
|
||||||
|
return bad("func must be func(yield func(...) bool): argument is not func")
|
||||||
case cb.Params().Len() > 2:
|
case cb.Params().Len() > 2:
|
||||||
return bad("func must be func(yield func(...) bool): yield func has too many parameters")
|
return bad("func must be func(yield func(...) bool): yield func has too many parameters")
|
||||||
case cb.Results().Len() != 1 || !isBoolean(cb.Results().At(0).Type()):
|
case cb.Results().Len() != 1 || !isBoolean(cb.Results().At(0).Type()):
|
||||||
return bad("func must be func(yield func(...) bool): yield func does not return bool")
|
return bad("func must be func(yield func(...) bool): yield func does not return bool")
|
||||||
}
|
}
|
||||||
|
assert(cb.Recv() == nil)
|
||||||
|
// determine key and value types, if any
|
||||||
if cb.Params().Len() >= 1 {
|
if cb.Params().Len() >= 1 {
|
||||||
key = cb.Params().At(0).Type()
|
key = cb.Params().At(0).Type()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user