107 lines
2.3 KiB
Go
107 lines
2.3 KiB
Go
package types
|
|
|
|
import (
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func ParseFileFilters(filters []string) (FileFilters, error) {
|
|
ffs := FileFilters{}
|
|
for _, filter := range filters {
|
|
ff := FileFilter{}
|
|
if filter == "" {
|
|
return nil, GinkgoErrors.InvalidFileFilter(filter)
|
|
}
|
|
components := strings.Split(filter, ":")
|
|
if !(len(components) == 1 || len(components) == 2) {
|
|
return nil, GinkgoErrors.InvalidFileFilter(filter)
|
|
}
|
|
|
|
var err error
|
|
ff.Filename, err = regexp.Compile(components[0])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(components) == 2 {
|
|
lineFilters := strings.Split(components[1], ",")
|
|
for _, lineFilter := range lineFilters {
|
|
components := strings.Split(lineFilter, "-")
|
|
if len(components) == 1 {
|
|
line, err := strconv.Atoi(strings.TrimSpace(components[0]))
|
|
if err != nil {
|
|
return nil, GinkgoErrors.InvalidFileFilter(filter)
|
|
}
|
|
ff.LineFilters = append(ff.LineFilters, LineFilter{line, line + 1})
|
|
} else if len(components) == 2 {
|
|
line1, err := strconv.Atoi(strings.TrimSpace(components[0]))
|
|
if err != nil {
|
|
return nil, GinkgoErrors.InvalidFileFilter(filter)
|
|
}
|
|
line2, err := strconv.Atoi(strings.TrimSpace(components[1]))
|
|
if err != nil {
|
|
return nil, GinkgoErrors.InvalidFileFilter(filter)
|
|
}
|
|
ff.LineFilters = append(ff.LineFilters, LineFilter{line1, line2})
|
|
} else {
|
|
return nil, GinkgoErrors.InvalidFileFilter(filter)
|
|
}
|
|
}
|
|
}
|
|
ffs = append(ffs, ff)
|
|
}
|
|
return ffs, nil
|
|
}
|
|
|
|
type FileFilter struct {
|
|
Filename *regexp.Regexp
|
|
LineFilters LineFilters
|
|
}
|
|
|
|
func (f FileFilter) Matches(locations []CodeLocation) bool {
|
|
for _, location := range locations {
|
|
if f.Filename.MatchString(location.FileName) &&
|
|
f.LineFilters.Matches(location.LineNumber) {
|
|
return true
|
|
}
|
|
|
|
}
|
|
return false
|
|
}
|
|
|
|
type FileFilters []FileFilter
|
|
|
|
func (ffs FileFilters) Matches(locations []CodeLocation) bool {
|
|
for _, ff := range ffs {
|
|
if ff.Matches(locations) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
type LineFilter struct {
|
|
Min int
|
|
Max int
|
|
}
|
|
|
|
func (lf LineFilter) Matches(line int) bool {
|
|
return lf.Min <= line && line < lf.Max
|
|
}
|
|
|
|
type LineFilters []LineFilter
|
|
|
|
func (lfs LineFilters) Matches(line int) bool {
|
|
if len(lfs) == 0 {
|
|
return true
|
|
}
|
|
|
|
for _, lf := range lfs {
|
|
if lf.Matches(line) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|