handle some block comment to detect generated files (#1161)

This commit is contained in:
Soichiro Kashima 2020-05-26 01:36:46 +09:00 committed by GitHub
parent 6684c8b25c
commit 71b2f04e88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 45 additions and 30 deletions

View File

@ -1,9 +1,9 @@
package processors
import (
"bufio"
"fmt"
"os"
"go/parser"
"go/token"
"path/filepath"
"strings"
@ -113,37 +113,15 @@ func (p *AutogeneratedExclude) getOrCreateFileSummary(i *result.Issue) (*ageFile
}
func getDoc(filePath string) (string, error) {
file, err := os.Open(filePath)
fset := token.NewFileSet()
syntax, err := parser.ParseFile(fset, filePath, nil, parser.PackageClauseOnly|parser.ParseComments)
if err != nil {
return "", errors.Wrap(err, "failed to open file")
return "", errors.Wrap(err, "failed to parse file")
}
defer file.Close()
scanner := bufio.NewScanner(file)
// Issue 954: Some lines can be very long, e.g. auto-generated
// embedded resources. Reported on file of 86.2KB.
const (
maxSize = 10 * 1024 * 1024 // 10MB should be enough
initialSize = 4096 // same as startBufSize in bufio
)
scanner.Buffer(make([]byte, initialSize), maxSize)
var docLines []string
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if strings.HasPrefix(line, "//") {
text := strings.TrimSpace(strings.TrimPrefix(line, "//"))
docLines = append(docLines, text)
} else if line == "" || strings.HasPrefix(line, "package") {
// go to next line
} else {
break
}
}
if err := scanner.Err(); err != nil {
return "", errors.Wrap(err, "failed to scan file")
for _, c := range syntax.Comments {
docLines = append(docLines, strings.TrimSpace(c.Text()))
}
return strings.Join(docLines, "\n"), nil

View File

@ -78,12 +78,23 @@ func TestGetDoc(t *testing.T) {
doc: `first line
second line
third line
this text also
and this text also`,
},
{
fpath: filepath.Join("testdata", "autogen_exclude_doc.go"),
doc: `DO NOT EDIT`,
},
{
fpath: filepath.Join("testdata", "autogen_exclude_block_comment.go"),
doc: `* first line
*
* second line
* third line
and this text also
this type of block comment also
this one line comment also`,
},
}
for _, tc := range testCases {
@ -92,3 +103,11 @@ and this text also`,
assert.Equal(t, tc.doc, doc)
}
}
// Issue 954: Some lines can be very long, e.g. auto-generated
// embedded resources. Reported on file of 86.2KB.
func TestGetDocFileWithLongLine(t *testing.T) {
fpath := filepath.Join("testdata", "autogen_exclude_long_line.go")
_, err := getDoc(fpath)
assert.NoError(t, err)
}

View File

@ -3,5 +3,5 @@
// third line
package testdata // no this text
package testdata // this text also
// and this text also

View File

@ -0,0 +1,16 @@
/*
* first line
*
* second line
* third line
*/
// and this text also
/*
this type of block comment also
*/
/* this one line comment also */
package testdata

File diff suppressed because one or more lines are too long