@@ -354,13 +354,13 @@ func check(t Testing, gopath string, pass *analysis.Pass, diagnostics []analysis
354
354
// Any comment starting with "want" is treated
355
355
// as an expectation, even without following whitespace.
356
356
if rest := strings .TrimPrefix (text , "want" ); rest != text {
357
- expects , err := parseExpectations (rest )
357
+ lineDelta , expects , err := parseExpectations (rest )
358
358
if err != nil {
359
359
t .Errorf ("%s:%d: in 'want' comment: %s" , filename , linenum , err )
360
360
return
361
361
}
362
362
if expects != nil {
363
- want [key {filename , linenum }] = expects
363
+ want [key {filename , linenum + lineDelta }] = expects
364
364
}
365
365
}
366
366
}
@@ -526,13 +526,13 @@ func (ex expectation) String() string {
526
526
// parseExpectations parses the content of a "// want ..." comment
527
527
// and returns the expectations, a mixture of diagnostics ("rx") and
528
528
// facts (name:"rx").
529
- func parseExpectations (text string ) ([]expectation , error ) {
529
+ func parseExpectations (text string ) (lineDelta int , expects []expectation , err error ) {
530
530
var scanErr string
531
531
sc := new (scanner.Scanner ).Init (strings .NewReader (text ))
532
532
sc .Error = func (s * scanner.Scanner , msg string ) {
533
533
scanErr = msg // e.g. bad string escape
534
534
}
535
- sc .Mode = scanner .ScanIdents | scanner .ScanStrings | scanner .ScanRawStrings
535
+ sc .Mode = scanner .ScanIdents | scanner .ScanStrings | scanner .ScanRawStrings | scanner . ScanInts
536
536
537
537
scanRegexp := func (tok rune ) (* regexp.Regexp , error ) {
538
538
if tok != scanner .String && tok != scanner .RawString {
@@ -543,39 +543,44 @@ func parseExpectations(text string) ([]expectation, error) {
543
543
return regexp .Compile (pattern )
544
544
}
545
545
546
- var expects []expectation
547
546
for {
548
547
tok := sc .Scan ()
549
548
switch tok {
549
+ case '+' :
550
+ tok = sc .Scan ()
551
+ if tok != scanner .Int {
552
+ return 0 , nil , fmt .Errorf ("got +%s, want +Int" , scanner .TokenString (tok ))
553
+ }
554
+ lineDelta , _ = strconv .Atoi (sc .TokenText ())
550
555
case scanner .String , scanner .RawString :
551
556
rx , err := scanRegexp (tok )
552
557
if err != nil {
553
- return nil , err
558
+ return 0 , nil , err
554
559
}
555
560
expects = append (expects , expectation {"diagnostic" , "" , rx })
556
561
557
562
case scanner .Ident :
558
563
name := sc .TokenText ()
559
564
tok = sc .Scan ()
560
565
if tok != ':' {
561
- return nil , fmt .Errorf ("got %s after %s, want ':'" ,
566
+ return 0 , nil , fmt .Errorf ("got %s after %s, want ':'" ,
562
567
scanner .TokenString (tok ), name )
563
568
}
564
569
tok = sc .Scan ()
565
570
rx , err := scanRegexp (tok )
566
571
if err != nil {
567
- return nil , err
572
+ return 0 , nil , err
568
573
}
569
574
expects = append (expects , expectation {"fact" , name , rx })
570
575
571
576
case scanner .EOF :
572
577
if scanErr != "" {
573
- return nil , fmt .Errorf ("%s" , scanErr )
578
+ return 0 , nil , fmt .Errorf ("%s" , scanErr )
574
579
}
575
- return expects , nil
580
+ return lineDelta , expects , nil
576
581
577
582
default :
578
- return nil , fmt .Errorf ("unexpected %s" , scanner .TokenString (tok ))
583
+ return 0 , nil , fmt .Errorf ("unexpected %s" , scanner .TokenString (tok ))
579
584
}
580
585
}
581
586
}
0 commit comments