aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcuiweixie <cuiweixie@gmail.com>2022-08-27 15:21:29 +0800
committerDaniel Martí <mvdan@mvdan.cc>2022-09-05 08:12:37 +0000
commit67e6542467321099c0ffcf77ee660e28ec211588 (patch)
tree7c5987451c9f45cadb3c54fd0f2f62ee4805e611 /src
parent40ced0c00b04a5b9832bb5b47c995c82854f26ae (diff)
downloadgo-67e6542467321099c0ffcf77ee660e28ec211588.tar.xz
go/ast: add Range token.Pos to RangeStmt
For #50429 Change-Id: Idb027244f901d9f482c894b5b979a054d0f07de5 Reviewed-on: https://go-review.googlesource.com/c/go/+/426091 Reviewed-by: Daniel Martí <mvdan@mvdan.cc> Reviewed-by: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Findley <rfindley@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/go/ast/ast.go1
-rw-r--r--src/go/parser/parser.go1
-rw-r--r--src/go/parser/parser_test.go30
3 files changed, 32 insertions, 0 deletions
diff --git a/src/go/ast/ast.go b/src/go/ast/ast.go
index 1e089b9e70..8d138fc72a 100644
--- a/src/go/ast/ast.go
+++ b/src/go/ast/ast.go
@@ -754,6 +754,7 @@ type (
Key, Value Expr // Key, Value may be nil
TokPos token.Pos // position of Tok; invalid if Key == nil
Tok token.Token // ILLEGAL if Key == nil, ASSIGN, DEFINE
+ Range token.Pos // position of "range" keyword
X Expr // value to range over
Body *BlockStmt
}
diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go
index 159834172a..1edc2e9a4d 100644
--- a/src/go/parser/parser.go
+++ b/src/go/parser/parser.go
@@ -2338,6 +2338,7 @@ func (p *parser) parseForStmt() ast.Stmt {
Value: value,
TokPos: as.TokPos,
Tok: as.Tok,
+ Range: as.Rhs[0].Pos(),
X: x,
Body: body,
}
diff --git a/src/go/parser/parser_test.go b/src/go/parser/parser_test.go
index a62dd553ce..ddb244902c 100644
--- a/src/go/parser/parser_test.go
+++ b/src/go/parser/parser_test.go
@@ -697,3 +697,33 @@ func TestScopeDepthLimit(t *testing.T) {
}
}
}
+
+// proposal #50429
+func TestRangePos(t *testing.T) {
+ testcases := []string{
+ "package p; func _() { for range x {} }",
+ "package p; func _() { for i = range x {} }",
+ "package p; func _() { for i := range x {} }",
+ "package p; func _() { for k, v = range x {} }",
+ "package p; func _() { for k, v := range x {} }",
+ }
+
+ for _, src := range testcases {
+ fset := token.NewFileSet()
+ f, err := ParseFile(fset, src, src, 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ ast.Inspect(f, func(x ast.Node) bool {
+ switch s := x.(type) {
+ case *ast.RangeStmt:
+ pos := fset.Position(s.Range)
+ if pos.Offset != strings.Index(src, "range") {
+ t.Errorf("%s: got offset %v, want %v", src, pos.Offset, strings.Index(src, "range"))
+ }
+ }
+ return true
+ })
+ }
+}