feat(parser): show match occurrences #76

Merged
张泊明518370910136 merged 4 commits from occurrences into master 2024-11-04 09:44:05 +08:00
Showing only changes of commit 94f361c46a - Show all commits

View File

@ -2,47 +2,53 @@ package clangtidy
import ( import (
"fmt" "fmt"
"sort"
"strings" "strings"
"github.com/joint-online-judge/JOJ3/pkg/utils"
) )
func GetResult(jsonMessages []JsonMessage, conf Conf) (int, string) { func GetResult(jsonMessages []JsonMessage, conf Conf) (int, string) {
score := conf.Score score := conf.Score
comment := "### Test results summary\n\n" comment := "### Test results summary\n\n"
categoryCount := map[string]int{} matchCount := make(map[string]int)
scoreChange := make(map[string]int)
for _, jsonMessage := range jsonMessages { for _, jsonMessage := range jsonMessages {
// checkName is commas separated string here // checkName is commas separated string here
checkName := jsonMessage.CheckName checkName := jsonMessage.CheckName
for _, match := range conf.Matches { for _, match := range conf.Matches {
for _, keyword := range match.Keywords { for _, keyword := range match.Keywords {
if strings.Contains(checkName, keyword) { if strings.Contains(checkName, keyword) {
score -= match.Score matchCount[keyword]++
scoreChange[keyword] += -match.Score
score += -match.Score
} }
} }
} }
checkNames := strings.Split(checkName, ",")
for _, checkName := range checkNames {
parts := strings.Split(checkName, "-")
if len(parts) > 0 {
category := parts[0]
// checkName might be: -warnings-as-errors
if category == "" {
continue
}
categoryCount[category] += 1
}
}
} }
sortedMap := utils.SortMap(categoryCount, type Result struct {
func(i, j utils.Pair[string, int]) bool { Keyword string
if i.Value == j.Value { Count int
return i.Key < j.Key ScoreChange int
} }
return i.Value > j.Value var results []Result
for keyword, count := range matchCount {
results = append(results, Result{
Keyword: keyword,
Count: count,
ScoreChange: scoreChange[keyword],
}) })
for i, kv := range sortedMap { }
comment += fmt.Sprintf("%d. %s: %d\n", i+1, kv.Key, kv.Value) sort.Slice(results, func(i, j int) bool {
if results[i].ScoreChange != results[j].ScoreChange {
return results[i].ScoreChange < results[j].ScoreChange
}
if results[i].Count != results[j].Count {
return results[i].Count > results[j].Count
}
return results[i].Keyword < results[j].Keyword
})
for i, result := range results {
comment += fmt.Sprintf("%d. `%s`: %d occurrences, %d point(s)\n",
i+1, result.Keyword, result.Count, result.ScoreChange)
} }
return score, comment return score, comment
} }