go/expect: allow multi-line expectations
This allows for multi-line comments where a new line is allowed between expectations. It also allows trailing new lines and commas in expectation lists. Change-Id: I714f8ad483a0238281f26ceb74ce9e73d922af69 Reviewed-on: https://go-review.googlesource.com/c/151718 Reviewed-by: Rebecca Stambler <rstambler@golang.org>
This commit is contained in:
parent
c5b00d9557
commit
e015b91f26
|
@ -77,6 +77,7 @@ func parse(fset *token.FileSet, base token.Pos, text string) ([]*Note, error) {
|
||||||
var scanErr error
|
var scanErr error
|
||||||
s := new(scanner.Scanner).Init(strings.NewReader(text))
|
s := new(scanner.Scanner).Init(strings.NewReader(text))
|
||||||
s.Mode = scanner.GoTokens
|
s.Mode = scanner.GoTokens
|
||||||
|
s.Whitespace ^= 1 << '\n' // don't skip new lines
|
||||||
s.Error = func(s *scanner.Scanner, msg string) {
|
s.Error = func(s *scanner.Scanner, msg string) {
|
||||||
scanErr = fmt.Errorf("%v:%s", fset.Position(base+token.Pos(s.Position.Offset)), msg)
|
scanErr = fmt.Errorf("%v:%s", fset.Position(base+token.Pos(s.Position.Offset)), msg)
|
||||||
}
|
}
|
||||||
|
@ -100,10 +101,13 @@ func parseComment(s *scanner.Scanner) ([]*Note, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
var tok rune = scanner.EOF
|
||||||
|
if n != nil {
|
||||||
notes = append(notes, n)
|
notes = append(notes, n)
|
||||||
tok := s.Scan()
|
tok = s.Scan()
|
||||||
|
}
|
||||||
switch tok {
|
switch tok {
|
||||||
case ',':
|
case ',', '\n':
|
||||||
// continue
|
// continue
|
||||||
case scanner.EOF:
|
case scanner.EOF:
|
||||||
return notes, nil
|
return notes, nil
|
||||||
|
@ -114,7 +118,11 @@ func parseComment(s *scanner.Scanner) ([]*Note, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseNote(s *scanner.Scanner) (*Note, error) {
|
func parseNote(s *scanner.Scanner) (*Note, error) {
|
||||||
if tok := s.Scan(); tok != scanner.Ident {
|
tok := s.Scan()
|
||||||
|
if tok == scanner.EOF || tok == '\n' {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
if tok != scanner.Ident {
|
||||||
return nil, fmt.Errorf("expected identifier, got %s", scanner.TokenString(tok))
|
return nil, fmt.Errorf("expected identifier, got %s", scanner.TokenString(tok))
|
||||||
}
|
}
|
||||||
n := &Note{
|
n := &Note{
|
||||||
|
@ -122,19 +130,17 @@ func parseNote(s *scanner.Scanner) (*Note, error) {
|
||||||
Name: s.TokenText(),
|
Name: s.TokenText(),
|
||||||
}
|
}
|
||||||
switch s.Peek() {
|
switch s.Peek() {
|
||||||
case ',', scanner.EOF:
|
case ',', '\n', scanner.EOF:
|
||||||
// no argument list present
|
// no argument list present
|
||||||
return n, nil
|
return n, nil
|
||||||
case '(':
|
case '(':
|
||||||
// parse the argument list
|
s.Scan() // consume the '('
|
||||||
if tok := s.Scan(); tok != '(' {
|
for s.Peek() == '\n' {
|
||||||
return nil, fmt.Errorf("expected ( got %s", scanner.TokenString(tok))
|
s.Scan() // consume all '\n'
|
||||||
}
|
}
|
||||||
// special case the empty argument list
|
// special case the empty argument list
|
||||||
if s.Peek() == ')' {
|
if s.Peek() == ')' {
|
||||||
if tok := s.Scan(); tok != ')' {
|
s.Scan() // consume the ')'
|
||||||
return nil, fmt.Errorf("expected ) got %s", scanner.TokenString(tok))
|
|
||||||
}
|
|
||||||
n.Args = []interface{}{} // @name() is represented by a non-nil empty slice.
|
n.Args = []interface{}{} // @name() is represented by a non-nil empty slice.
|
||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
|
@ -147,15 +153,13 @@ func parseNote(s *scanner.Scanner) (*Note, error) {
|
||||||
n.Args = append(n.Args, arg)
|
n.Args = append(n.Args, arg)
|
||||||
switch s.Peek() {
|
switch s.Peek() {
|
||||||
case ')':
|
case ')':
|
||||||
if tok := s.Scan(); tok != ')' {
|
s.Scan() // consume the ')'
|
||||||
return nil, fmt.Errorf("expected ) got %s", scanner.TokenString(tok))
|
|
||||||
}
|
|
||||||
return n, nil
|
return n, nil
|
||||||
case ',':
|
case ',':
|
||||||
if tok := s.Scan(); tok != ',' {
|
s.Scan() // consume the ','
|
||||||
return nil, fmt.Errorf("expected , got %s", scanner.TokenString(tok))
|
for s.Peek() == '\n' {
|
||||||
|
s.Scan() // consume all '\n'
|
||||||
}
|
}
|
||||||
// continue
|
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unexpected %s parsing argument list", scanner.TokenString(s.Scan()))
|
return nil, fmt.Errorf("unexpected %s parsing argument list", scanner.TokenString(s.Scan()))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue