@@ -83,13 +83,33 @@ func processSarifAndSendResults(sarifPath string, commitUUID string, projectToke
8383func processSarif (sarif Sarif ) [][]map [string ]interface {} {
8484 var codacyIssues []map [string ]interface {}
8585 var payloads [][]map [string ]interface {}
86-
86+ var modifiedType string
8787 for _ , run := range sarif .Runs {
8888 var toolName = getToolName (strings .ToLower (run .Tool .Driver .Name ), run .Tool .Driver .Version )
8989 tool , patterns := loadsToolAndPatterns (toolName , false )
9090
9191 for _ , result := range run .Results {
92- modifiedType := tool .Prefix + strings .Replace (result .RuleID , "/" , "_" , - 1 )
92+ if toolName == "pmd" || toolName == "pmd-7" {
93+ var language string
94+ var ruleset string
95+ // Try to extract ruleset from tool.driver.rules if available
96+ rules := run .Tool .Driver .Rules [result .RuleIndex ]
97+ if rules .HelpURI != "" {
98+ if parts := strings .Split (rules .HelpURI , "pmd_rules_" ); len (parts ) > 1 {
99+ subParts := strings .SplitN (parts [1 ], "_" , 2 )
100+ if len (subParts ) == 2 {
101+ language = subParts [0 ]
102+ rulesetPart := strings .SplitN (subParts [1 ], ".html" , 2 )[0 ]
103+ ruleset = rulesetPart
104+ }
105+ }
106+ }
107+ modifiedType = fmt .Sprintf (tool .Prefix + "category_%s_%s_%s" , language , ruleset , result .RuleID )
108+
109+ } else {
110+ modifiedType = tool .Prefix + strings .Replace (result .RuleID , "/" , "_" , - 1 )
111+ }
112+
93113 pattern := getPatternByID (patterns , modifiedType )
94114 if pattern == nil {
95115 fmt .Printf ("Rule '%s' doesn't have a direct mapping on Codacy\n " , modifiedType )
0 commit comments