Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# -------------------------------------------------------------------------
#
# Part of the CodeChecker project, under the Apache License v2.0 with
# LLVM Exceptions. See LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
# -------------------------------------------------------------------------
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# -------------------------------------------------------------------------
#
# Part of the CodeChecker project, under the Apache License v2.0 with
# LLVM Exceptions. See LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
# -------------------------------------------------------------------------

from typing import List

from codechecker_report_converter.report import Report
from codechecker_report_converter.report.hash import (
HashType,
get_report_hash,
)

from ..analyzer_result import AnalyzerResultBase
from .parser import PMDParser


class AnalyzerResult(AnalyzerResultBase):
"""Transform analyzer result of PMD JSON."""

TOOL_NAME = "pmd"
NAME = "PMD"
URL = "https://pmd.github.io/"

def get_reports(self, file_path: str) -> List[Report]:
"""Get reports from the given PMD JSON file."""
return PMDParser().get_reports(file_path)

def _add_report_hash(self, report: Report):
report.report_hash = get_report_hash(
report,
HashType.PATH_SENSITIVE,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# -------------------------------------------------------------------------
#
# Part of the CodeChecker project, under the Apache License v2.0 with
# LLVM Exceptions. See LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
# -------------------------------------------------------------------------

import json
import os
from typing import List

from codechecker_report_converter.report import (
BugPathEvent,
Report,
get_or_create_file,
)


class PMDParser:
"""Parser for PMD JSON output."""

def __init__(self):
self._file_cache = {}

def get_reports(self, file_path: str) -> List[Report]:
reports: List[Report] = []

with open(file_path, "r", encoding="utf-8") as file:
data = json.load(file)

for file_entry in data.get("files", []):
filename = os.path.abspath(file_entry["filename"])

for violation in file_entry.get("violations", []):
line = violation.get("beginline", 1)
column = violation.get("begincolumn", 1)
message = violation.get("description", "")
checker_name = violation.get("rule", "unknown")

report = Report(
get_or_create_file(filename, self._file_cache),
line,
column,
message,
checker_name,
bug_path_events=[],
)

report.bug_path_events.append(
BugPathEvent(
message,
report.file,
report.line,
report.column,
)
)

report.category = violation.get("ruleset", "unknown")
reports.append(report)

return reports
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
public class Main {
public static void main(String[] args) {
int j;
if (1 == 1)
j = 42;
int i = 1 / 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>diagnostics</key>
<array>
<dict>
<key>category</key>
<string>Code Style</string>
<key>check_name</key>
<string>NoPackage</string>
<key>description</key>
<string>All classes, interfaces, enums and annotations must belong to a named package</string>
<key>location</key>
<dict>
<key>col</key>
<integer>8</integer>
<key>file</key>
<string>Main.java</string>
<key>line</key>
<integer>1</integer>
</dict>
<key>severity</key>
<string>warning</string>
</dict>
<dict>
<key>category</key>
<string>Code Style</string>
<key>check_name</key>
<string>ShortClassName</string>
<key>description</key>
<string>Avoid short class names like Main</string>
<key>location</key>
<dict>
<key>col</key>
<integer>8</integer>
<key>file</key>
<string>Main.java</string>
<key>line</key>
<integer>1</integer>
</dict>
<key>severity</key>
<string>warning</string>
</dict>
<dict>
<key>category</key>
<string>Code Style</string>
<key>check_name</key>
<string>ShortVariable</string>
<key>description</key>
<string>Avoid variables with short names like j</string>
<key>location</key>
<dict>
<key>col</key>
<integer>9</integer>
<key>file</key>
<string>Main.java</string>
<key>line</key>
<integer>3</integer>
</dict>
<key>severity</key>
<string>warning</string>
</dict>
<dict>
<key>category</key>
<string>Code Style</string>
<key>check_name</key>
<string>ControlStatementBraces</string>
<key>description</key>
<string>This statement should have braces</string>
<key>location</key>
<dict>
<key>col</key>
<integer>7</integer>
<key>file</key>
<string>Main.java</string>
<key>line</key>
<integer>5</integer>
</dict>
<key>severity</key>
<string>warning</string>
</dict>
<dict>
<key>category</key>
<string>Code Style</string>
<key>check_name</key>
<string>ShortVariable</string>
<key>description</key>
<string>Avoid variables with short names like i</string>
<key>location</key>
<dict>
<key>col</key>
<integer>9</integer>
<key>file</key>
<string>Main.java</string>
<key>line</key>
<integer>6</integer>
</dict>
<key>severity</key>
<string>warning</string>
</dict>
</array>
<key>files</key>
<array>
<string>Main.java</string>
</array>
<key>metadata</key>
<dict>
<key>generated_by</key>
<dict>
<key>name</key>
<string>CodeChecker</string>
<key>version</key>
<string>x.y.z</string>
</dict>
</dict>
</dict>
</plist>
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
{
"formatVersion": 0,
"pmdVersion": "7.20.0",
"timestamp": "2026-01-01T18:18:34.271+01:00",
"files": [
{
"filename": "Main.java",
"violations": [
{
"beginline": 1,
"begincolumn": 8,
"endline": 1,
"endcolumn": 13,
"description": "All classes, interfaces, enums and annotations must belong to a named package",
"rule": "NoPackage",
"ruleset": "Code Style",
"priority": 3,
"externalInfoUrl": "https://docs.pmd-code.org/snapshot/pmd_rules_java_codestyle.html#nopackage"
},
{
"beginline": 1,
"begincolumn": 8,
"endline": 1,
"endcolumn": 13,
"description": "Avoid short class names like Main",
"rule": "ShortClassName",
"ruleset": "Code Style",
"priority": 4,
"externalInfoUrl": "https://docs.pmd-code.org/snapshot/pmd_rules_java_codestyle.html#shortclassname"
},
{
"beginline": 3,
"begincolumn": 9,
"endline": 3,
"endcolumn": 10,
"description": "Avoid variables with short names like j",
"rule": "ShortVariable",
"ruleset": "Code Style",
"priority": 3,
"externalInfoUrl": "https://docs.pmd-code.org/snapshot/pmd_rules_java_codestyle.html#shortvariable"
},
{
"beginline": 5,
"begincolumn": 7,
"endline": 5,
"endcolumn": 14,
"description": "This statement should have braces",
"rule": "ControlStatementBraces",
"ruleset": "Code Style",
"priority": 3,
"externalInfoUrl": "https://docs.pmd-code.org/snapshot/pmd_rules_java_codestyle.html#controlstatementbraces"
},
{
"beginline": 6,
"begincolumn": 9,
"endline": 6,
"endcolumn": 10,
"description": "Avoid variables with short names like i",
"rule": "ShortVariable",
"ruleset": "Code Style",
"priority": 3,
"externalInfoUrl": "https://docs.pmd-code.org/snapshot/pmd_rules_java_codestyle.html#shortvariable"
}
]
}
],
"suppressedViolations": [],
"processingErrors": [],
"configurationErrors": []
}
Loading
Loading