return packagePrefix(obj.Pkg(), check.qualifier) + obj.Name()
}
- obj := cycle[start]
- objName := name(obj)
// If obj is a type alias, mark it as valid (not broken) in order to avoid follow-on errors.
+ obj := cycle[start]
tname, _ := obj.(*TypeName)
if tname != nil && tname.IsAlias() {
// If we use Alias nodes, it is initialized with Typ[Invalid].
// report a more concise error for self references
if len(cycle) == 1 {
if tname != nil {
- check.errorf(obj, InvalidDeclCycle, "invalid recursive type: %s refers to itself", objName)
+ check.errorf(obj, InvalidDeclCycle, "invalid recursive type: %s refers to itself", name(obj))
} else {
- check.errorf(obj, InvalidDeclCycle, "invalid cycle in declaration: %s refers to itself", objName)
+ check.errorf(obj, InvalidDeclCycle, "invalid cycle in declaration: %s refers to itself", name(obj))
}
return
}
err := check.newError(InvalidDeclCycle)
if tname != nil {
- err.addf(obj, "invalid recursive type %s", objName)
+ err.addf(obj, "invalid recursive type %s", name(obj))
} else {
- err.addf(obj, "invalid cycle in declaration of %s", objName)
- }
- // "cycle[i] refers to cycle[j]" for (i,j) = (s, s+1), (s+1, s+2), ..., (n, 0), (0,1), ..., (s-1,s) for len(cycle) = n, s = start.
- n := len(cycle)
- rotate := func(i int) int { return (i + start) % n }
- for i := range n {
- obj := cycle[rotate(i)]
- next := cycle[rotate(i+1)]
+ err.addf(obj, "invalid cycle in declaration of %s", name(obj))
+ }
+ // "cycle[i] refers to cycle[j]" for (i,j) = (s,s+1), (s+1,s+2), ..., (n-1,0), (0,1), ..., (s-1,s) for len(cycle) = n, s = start.
+ for i := range cycle {
+ next := cycle[(start+i+1)%len(cycle)]
err.addf(obj, "%s refers to %s", name(obj), name(next))
+ obj = next
}
err.report()
}
err := check.newError(InvalidInitCycle)
err.addf(obj, "initialization cycle for %s", obj.Name())
- // "cycle[i] refers to cycle[j]" for (i,j) = (0, n-1), (n-1, n-2), ..., (1,0) for len(cycle) = n.
+ // "cycle[i] refers to cycle[j]" for (i,j) = (0,n-1), (n-1,n-2), ..., (1,0) for len(cycle) = n.
for j := len(cycle) - 1; j >= 0; j-- {
- err.addf(obj, "%s refers to %s", obj.Name(), cycle[j].Name())
- obj = cycle[j]
+ next := cycle[j]
+ err.addf(obj, "%s refers to %s", obj.Name(), next.Name())
+ obj = next
}
err.report()
}
// name returns the (possibly qualified) object name.
// This is needed because with generic types, cycles
// may refer to imported types. See go.dev/issue/50788.
- // TODO(gri) Thus functionality is used elsewhere. Factor it out.
+ // TODO(gri) This functionality is used elsewhere. Factor it out.
name := func(obj Object) string {
return packagePrefix(obj.Pkg(), check.qualifier) + obj.Name()
}
- obj := cycle[start]
- objName := name(obj)
// If obj is a type alias, mark it as valid (not broken) in order to avoid follow-on errors.
+ obj := cycle[start]
tname, _ := obj.(*TypeName)
if tname != nil && tname.IsAlias() {
// If we use Alias nodes, it is initialized with Typ[Invalid].
// report a more concise error for self references
if len(cycle) == 1 {
if tname != nil {
- check.errorf(obj, InvalidDeclCycle, "invalid recursive type: %s refers to itself", objName)
+ check.errorf(obj, InvalidDeclCycle, "invalid recursive type: %s refers to itself", name(obj))
} else {
- check.errorf(obj, InvalidDeclCycle, "invalid cycle in declaration: %s refers to itself", objName)
+ check.errorf(obj, InvalidDeclCycle, "invalid cycle in declaration: %s refers to itself", name(obj))
}
return
}
err := check.newError(InvalidDeclCycle)
if tname != nil {
- err.addf(obj, "invalid recursive type %s", objName)
+ err.addf(obj, "invalid recursive type %s", name(obj))
} else {
- err.addf(obj, "invalid cycle in declaration of %s", objName)
+ err.addf(obj, "invalid cycle in declaration of %s", name(obj))
}
-
- // "cycle[i] refers to cycle[j]" for (i,j) = (s, s+1), (s+1, s+2), ..., (n, 0), (0,1), ..., (s-1,s) for len(cycle) = n, s = start.
- n := len(cycle)
- rotate := func(i int) int { return (i + start) % n }
- for i := range n {
- obj := cycle[rotate(i)]
- next := cycle[rotate(i+1)]
+ // "cycle[i] refers to cycle[j]" for (i,j) = (s,s+1), (s+1,s+2), ..., (n-1,0), (0,1), ..., (s-1,s) for len(cycle) = n, s = start.
+ for i := range cycle {
+ next := cycle[(start+i+1)%len(cycle)]
err.addf(obj, "%s refers to %s", name(obj), name(next))
+ obj = next
}
err.report()
}
err := check.newError(InvalidInitCycle)
err.addf(obj, "initialization cycle for %s", obj.Name())
- // "cycle[i] refers to cycle[j]" for (i,j) = (0, n-1), (n-1, n-2), ..., (1,0) for len(cycle) = n.
+ // "cycle[i] refers to cycle[j]" for (i,j) = (0,n-1), (n-1,n-2), ..., (1,0) for len(cycle) = n.
for j := len(cycle) - 1; j >= 0; j-- {
- err.addf(obj, "%s refers to %s", obj.Name(), cycle[j].Name())
- obj = cycle[j]
+ next := cycle[j]
+ err.addf(obj, "%s refers to %s", obj.Name(), next.Name())
+ obj = next
}
err.report()
}