in dev/tools/controllerbuilder/pkg/toolbot/extracttoolmarkers.go [36:196]
func (x *ExtractToolMarkers) Extract(ctx context.Context, description string, src []byte, filters ...Filter) ([]*DataPoint, error) {
var dataPoints []*DataPoint
// Find file-scoped DataPoints
{
markers := []string{"+tool:"}
annotations, err := annotations.FindFileAnnotations(src, markers)
if err != nil {
return nil, err
}
for _, annotation := range annotations {
toolName := strings.TrimPrefix(annotation.Key, "+tool:")
dataPoint := &DataPoint{
Description: description,
Type: toolName,
Output: string(src),
}
for k, values := range annotation.Attributes {
for _, v := range values {
dataPoint.SetInput(k, v)
}
}
shouldAdd := true
for _, filter := range filters {
if !filter(dataPoint) {
shouldAdd = false
}
}
if shouldAdd {
dataPoints = append(dataPoints, dataPoint)
}
}
}
r := bytes.NewReader(src)
br := bufio.NewReader(r)
for {
rawLine, err := br.ReadString('\n')
if err != nil {
if err == io.EOF {
break
}
return nil, fmt.Errorf("scanning code: %w", err)
}
line := strings.TrimSpace(rawLine)
if strings.HasPrefix(line, "//") {
comment := strings.TrimPrefix(line, "//")
comment = strings.TrimSpace(comment)
if strings.HasPrefix(comment, "+kcc:proto=") {
klog.V(2).Infof("found tool line %q", comment)
toolName := "kcc-proto"
dataPoint := &DataPoint{
Description: description,
Type: toolName,
}
proto := strings.TrimPrefix(comment, "+kcc:proto=")
dataPoint.SetInput("proto.message", proto)
var bb bytes.Buffer
for {
line, err := br.ReadString('\n')
if err != nil {
if err == io.EOF {
break
}
return nil, fmt.Errorf("scanning code: %w", err)
}
bb.WriteString(line)
s := strings.TrimSpace(line)
if strings.HasPrefix(s, "}") {
break
}
}
dataPoint.Output = bb.String()
shouldAdd := true
for _, filter := range filters {
if !filter(dataPoint) {
shouldAdd = false
}
}
if shouldAdd {
dataPoints = append(dataPoints, dataPoint)
}
}
if strings.HasPrefix(comment, "+function-gen:special-mapper") {
klog.V(2).Infof("found tool line %q", comment)
toolName := "+function-gen:special-mapper"
dataPoint := &DataPoint{
Description: description,
Type: toolName,
}
var bb bytes.Buffer
// Include the tool directive
bb.WriteString(rawLine)
inHeader := true
openBrackets := 0
for {
rawLine, err := br.ReadString('\n')
if err != nil {
if err == io.EOF {
break
}
return nil, fmt.Errorf("scanning code: %w", err)
}
if inHeader {
line := strings.TrimSpace(rawLine)
if strings.HasPrefix(line, "//") {
toolLine := strings.TrimPrefix(line, "//")
toolLine = strings.TrimPrefix(toolLine, " ")
tokens := strings.SplitN(toolLine, ":", 2)
if len(tokens) == 2 {
dataPoint.SetInput(tokens[0], strings.TrimSpace(tokens[1]))
} else {
return nil, fmt.Errorf("cannot parse tool line %q", toolLine)
}
} else {
inHeader = false
}
}
bb.WriteString(rawLine)
if strings.HasSuffix(line, "{") {
openBrackets++
}
if strings.HasPrefix(line, "}") {
openBrackets--
if openBrackets == 0 {
break
}
}
}
dataPoint.Output = bb.String()
shouldAdd := true
for _, filter := range filters {
if !filter(dataPoint) {
shouldAdd = false
}
}
if shouldAdd {
dataPoints = append(dataPoints, dataPoint)
}
}
}
}
return dataPoints, nil
}