-- go.mod --
module example.com
go 1.18
-- template/template.go --
package template
// Test of repeated use of wildcard in pattern.
// NB: multiple patterns would be required to handle variants such as
// s[:len(s)], s[x:len(s)], etc, since a wildcard can't match nothing at all.
// TODO(adonovan): support multiple templates in a single pass.
func before(s string) string { return s[:len(s)] }
func after(s string) string { return s }
-- in/c1/c1.go --
package C1
import "strings"
func example() {
x := "foo"
println(x[:len(x)])
// Match, but the transformation is not sound w.r.t. possible side effects.
println(strings.Repeat("*", 3)[:len(strings.Repeat("*", 3))])
// No match, since second use of wildcard doesn't match first.
println(strings.Repeat("*", 3)[:len(strings.Repeat("*", 2))])
// Recursive match demonstrating bottom-up rewrite:
// only after the inner replacement occurs does the outer syntax match.
println((x[:len(x)])[:len(x[:len(x)])])
// -> (x[:len(x)])
// -> x
}
-- out/c1/c1.go --
package C1
import "strings"
func example() {
x := "foo"
println(x)
// Match, but the transformation is not sound w.r.t. possible side effects.
println(strings.Repeat("*", 3))
// No match, since second use of wildcard doesn't match first.
println(strings.Repeat("*", 3)[:len(strings.Repeat("*", 2))])
// Recursive match demonstrating bottom-up rewrite:
// only after the inner replacement occurs does the outer syntax match.
println(x)
// -> (x[:len(x)])
// -> x
}