diff --git a/internal/parsers/clangtidy/parser.go b/internal/parsers/clangtidy/parser.go index a763954..51661ed 100644 --- a/internal/parsers/clangtidy/parser.go +++ b/internal/parsers/clangtidy/parser.go @@ -9,8 +9,8 @@ import ( ) type Match struct { - Keyword []string - Score int + Keywords []string + Score int } type Conf struct { @@ -41,9 +41,10 @@ func Parse(executorResult stage.ExecutorResult, conf Conf) stage.ParserResult { } } } + score, comment := GetResult(formattedMessages, conf) return stage.ParserResult{ - Score: GetScore(formattedMessages, conf), - Comment: GetComment(formattedMessages), + Score: score, + Comment: comment, } } diff --git a/internal/parsers/clangtidy/score.go b/internal/parsers/clangtidy/score.go index f6fa39e..f1027d5 100644 --- a/internal/parsers/clangtidy/score.go +++ b/internal/parsers/clangtidy/score.go @@ -5,32 +5,9 @@ import ( "strings" ) -func contains(arr []string, element string) bool { - for i := range arr { - // TODO: The keyword in json report might also be an array, need to split it - if strings.Contains(arr[i], element) { - return true - } - } - return false -} - -func GetScore(jsonMessages []JsonMessage, conf Conf) int { - fullmark := conf.Score - for _, jsonMessage := range jsonMessages { - keyword := jsonMessage.CheckName - for _, match := range conf.Matches { - if contains(match.Keyword, keyword) { - fullmark -= match.Score - break - } - } - } - return fullmark -} - -func GetComment(jsonMessages []JsonMessage) string { - res := "### Test results summary\n\n" +func GetResult(jsonMessages []JsonMessage, conf Conf) (int, string) { + score := conf.Score + comment := "### Test results summary\n\n" keys := [...]string{ "codequality-unchecked-malloc-result", "codequality-no-global-variables", @@ -56,22 +33,29 @@ func GetComment(jsonMessages []JsonMessage) string { mapping[key] = 0 } for _, jsonMessage := range jsonMessages { - keyword := jsonMessage.CheckName - flag := true - for key := range mapping { - if strings.Contains(keyword, key) { - mapping[key] += 1 - flag = false - break + checkName := jsonMessage.CheckName + for _, match := range conf.Matches { + for _, keyword := range match.Keywords { + // TODO: The keyword in json report might also be an array, need to split it + if strings.Contains(checkName, keyword) { + score -= match.Score + } } } - if flag { + listed := false + for key := range mapping { + if strings.Contains(checkName, key) { + mapping[key] += 1 + listed = true + } + } + if !listed { mapping["others"] += 1 } } for i, key := range keys { - res = fmt.Sprintf("%s%d. %s: %d\n", res, i+1, key, mapping[key]) + comment = fmt.Sprintf("%s%d. %s: %d\n", comment, i+1, key, mapping[key]) } - return res + return score, comment }